diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..f32f6b06f --- /dev/null +++ b/.gitattributes @@ -0,0 +1,11 @@ +# Set the default behavior, in case people don't have core.autocrlf set. +* text=auto + +# Explicitly declare text files you want to always be normalized and converted +# to native line endings on checkout. +*.java text eol=lf +*.json text eol=lf +src/generated/resources/.cache/** text eol=lf + +# Denote all files that are truly binary and should not be modified. +*.png binary diff --git a/.github/actions/build_setup/action.yml b/.github/actions/build_setup/action.yml new file mode 100644 index 000000000..a19adcdf6 --- /dev/null +++ b/.github/actions/build_setup/action.yml @@ -0,0 +1,43 @@ +name: Build Setup +description: Setup for standard Java builds + +inputs: + update-cache: + description: If cache should be updated + required: false + default: 'false' + ref: + description: 'Ref to checkout' + required: false + +runs: + using: 'composite' + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ inputs.ref || github.ref }} + - name: Set up JDK + uses: actions/setup-java@v4 + env: + REF: ${{ inputs.ref || github.ref }} + with: + distribution: temurin + java-version: ${{ contains(env.REF, '1.20.1') && '17' || '21' }} + + - name: Validate Gradle wrapper + uses: gradle/actions/wrapper-validation@v3 + + - name: Grant execute permission for gradlew + shell: bash + run: chmod +x gradlew + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v3 + with: + cache-write-only: ${{ inputs.update-cache }} + generate-job-summary: false + gradle-home-cache-includes: | + caches + notifications + jdks + wrapper diff --git a/.github/workflows/deploy-pages.yml b/.github/workflows/deploy-pages.yml new file mode 100644 index 000000000..f82c93289 --- /dev/null +++ b/.github/workflows/deploy-pages.yml @@ -0,0 +1,56 @@ +name: Publish docs via GitHub Pages +on: + workflow_dispatch: + push: + branches: [1.20.1] + paths: ['docs/**'] + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: 'pages' + cancel-in-progress: false + +jobs: + build: + name: build docs + runs-on: ubuntu-latest + defaults: + run: + working-directory: './docs' + steps: + - uses: actions/checkout@v4 + with: + ref: '1.20.1' + sparse-checkout: './docs' + - uses: actions/setup-python@v4 + with: + python-version: '3.11' + cache: 'pip' + - run: pip install -r ./requirements.txt + - uses: actions/cache@v4 + with: + key: 'mkdocs-cache' + path: './docs/.cache' + - name: Build static files + id: mkdocs + run: mkdocs build + - name: Upload pages as artifact + id: artifact + uses: actions/upload-pages-artifact@v3 + with: + path: './docs/site/' + + deploy: + runs-on: ubuntu-latest + needs: build + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c1afd176a..0595d1f16 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -35,15 +35,22 @@ jobs: - name: Setup Gradle Wrapper run: chmod +x gradlew - - name: Get Version and Platform - id: properties + - name: Get Version + id: gradle_properties uses: christian-draeger/read-properties@1.1.1 with: path: ./gradle.properties - properties: "mod_version minecraft_version" + properties: "mod_version" + + - name: Get minecraft version + id: toml_properties + uses: SebRollen/toml-action@v1.2.0 + with: + file: ./gradle/libs.versions.toml + field: "versions.minecraft" - name: Build Project - run: ./gradlew build + run: ./gradlew build --build-cache - name: Upload Forge Releases (Curse|Modrinth|Github) id: forge_release @@ -54,12 +61,12 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} github-generate-changelog: true - github-tag: "${{ steps.properties.outputs.minecraft_version }}-${{ steps.properties.outputs.mod_version }}" + github-tag: "${{ steps.toml_properties.outputs.value }}-${{ steps.gradle_properties.outputs.mod_version }}" - files: ./build/libs/!(*-@(dev|sources|dev-shadow)).jar - name: "Cosmic Core ${{ steps.properties.outputs.mod_version }}" - version: ${{ steps.properties.outputs.mod_version }} + files: ./build/libs/!(*-@(dev|sources|dev-slim|slim)).jar + name: "Cosmic Core ${{ steps.gradle_properties.outputs.mod_version }}" + version: ${{ steps.gradle_properties.outputs.mod_version }} version-type: ${{ inputs.version_type }} changelog-file: changelog.md loaders: forge - game-versions: ${{ steps.properties.outputs.minecraft_version }} + game-versions: ${{ steps.toml_properties.outputs.value }} diff --git a/.github/workflows/spotless.yml b/.github/workflows/spotless.yml new file mode 100644 index 000000000..83cd6e7ba --- /dev/null +++ b/.github/workflows/spotless.yml @@ -0,0 +1,38 @@ +# Runs formatting requirements +name: Java Formatting + +on: + push: + branches: ['main-1.20.1-forge'] + paths: ['src/main/java/**'] + pull_request: + paths: ['**'] + +concurrency: + group: formatting-${{ github.ref }} + cancel-in-progress: true + +jobs: + formatting: + name: Formatting + runs-on: ubuntu-latest + permissions: + pull-requests: read + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + - name: Check Path Filter + uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + code: + - 'src/main/java/**' + - run: git fetch origin main-1.20.1-forge + if: steps.filter.outputs.code == 'true' + - name: Setup Build + if: steps.filter.outputs.code == 'true' + uses: ./.github/actions/build_setup + - name: Run Spotless Formatting Check with Gradle + if: steps.filter.outputs.code == 'true' + run: ./gradlew spotlessCheck --warning-mode all --build-cache diff --git a/.gitignore b/.gitignore index 0ae2b569b..bb1db2d90 100644 --- a/.gitignore +++ b/.gitignore @@ -28,9 +28,15 @@ bin/ *.DS_Store -# fabric +# runtime folders run/ +run-data/ +runs/ # forge generated resources cache /src/generated/resources/.cache/ +# Agenic Support Tools - Debug Only +/.claude/ +# Personal Notes I Keep in my Local +/docs/ diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index cbe5ad167..000000000 --- a/LICENSE.md +++ /dev/null @@ -1,437 +0,0 @@ -Attribution-NonCommercial-ShareAlike 4.0 International - -======================================================================= - -Creative Commons Corporation ("Creative Commons") is not a law firm and -does not provide legal services or legal advice. Distribution of -Creative Commons public licenses does not create a lawyer-client or -other relationship. Creative Commons makes its licenses and related -information available on an "as-is" basis. Creative Commons gives no -warranties regarding its licenses, any material licensed under their -terms and conditions, or any related information. Creative Commons -disclaims all liability for damages resulting from their use to the -fullest extent possible. - -Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and -conditions that creators and other rights holders may use to share -original works of authorship and other material subject to copyright -and certain other rights specified in the public license below. The -following considerations are for informational purposes only, are not -exhaustive, and do not form part of our licenses. - - Considerations for licensors: Our public licenses are - intended for use by those authorized to give the public - permission to use material in ways otherwise restricted by - copyright and certain other rights. Our licenses are - irrevocable. Licensors should read and understand the terms - and conditions of the license they choose before applying it. - Licensors should also secure all rights necessary before - applying our licenses so that the public can reuse the - material as expected. Licensors should clearly mark any - material not subject to the license. This includes other CC- - licensed material, or material used under an exception or - limitation to copyright. More considerations for licensors: - wiki.creativecommons.org/Considerations_for_licensors - - Considerations for the public: By using one of our public - licenses, a licensor grants the public permission to use the - licensed material under specified terms and conditions. If - the licensor's permission is not necessary for any reason--for - example, because of any applicable exception or limitation to - copyright--then that use is not regulated by the license. Our - licenses grant only permissions under copyright and certain - other rights that a licensor has authority to grant. Use of - the licensed material may still be restricted for other - reasons, including because others have copyright or other - rights in the material. A licensor may make special requests, - such as asking that all changes be marked or described. - Although not required by our licenses, you are encouraged to - respect those requests where reasonable. More considerations - for the public: - wiki.creativecommons.org/Considerations_for_licensees - -======================================================================= - -Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International -Public License - -By exercising the Licensed Rights (defined below), You accept and agree -to be bound by the terms and conditions of this Creative Commons -Attribution-NonCommercial-ShareAlike 4.0 International Public License -("Public License"). To the extent this Public License may be -interpreted as a contract, You are granted the Licensed Rights in -consideration of Your acceptance of these terms and conditions, and the -Licensor grants You such rights in consideration of benefits the -Licensor receives from making the Licensed Material available under -these terms and conditions. - - -Section 1 -- Definitions. - - a. Adapted Material means material subject to Copyright and Similar - Rights that is derived from or based upon the Licensed Material - and in which the Licensed Material is translated, altered, - arranged, transformed, or otherwise modified in a manner requiring - permission under the Copyright and Similar Rights held by the - Licensor. For purposes of this Public License, where the Licensed - Material is a musical work, performance, or sound recording, - Adapted Material is always produced where the Licensed Material is - synched in timed relation with a moving image. - - b. Adapter's License means the license You apply to Your Copyright - and Similar Rights in Your contributions to Adapted Material in - accordance with the terms and conditions of this Public License. - - c. BY-NC-SA Compatible License means a license listed at - creativecommons.org/compatiblelicenses, approved by Creative - Commons as essentially the equivalent of this Public License. - - d. Copyright and Similar Rights means copyright and/or similar rights - closely related to copyright including, without limitation, - performance, broadcast, sound recording, and Sui Generis Database - Rights, without regard to how the rights are labeled or - categorized. For purposes of this Public License, the rights - specified in Section 2(b)(1)-(2) are not Copyright and Similar - Rights. - - e. Effective Technological Measures means those measures that, in the - absence of proper authority, may not be circumvented under laws - fulfilling obligations under Article 11 of the WIPO Copyright - Treaty adopted on December 20, 1996, and/or similar international - agreements. - - f. Exceptions and Limitations means fair use, fair dealing, and/or - any other exception or limitation to Copyright and Similar Rights - that applies to Your use of the Licensed Material. - - g. License Elements means the license attributes listed in the name - of a Creative Commons Public License. The License Elements of this - Public License are Attribution, NonCommercial, and ShareAlike. - - h. Licensed Material means the artistic or literary work, database, - or other material to which the Licensor applied this Public - License. - - i. Licensed Rights means the rights granted to You subject to the - terms and conditions of this Public License, which are limited to - all Copyright and Similar Rights that apply to Your use of the - Licensed Material and that the Licensor has authority to license. - - j. Licensor means the individual(s) or entity(ies) granting rights - under this Public License. - - k. NonCommercial means not primarily intended for or directed towards - commercial advantage or monetary compensation. For purposes of - this Public License, the exchange of the Licensed Material for - other material subject to Copyright and Similar Rights by digital - file-sharing or similar means is NonCommercial provided there is - no payment of monetary compensation in connection with the - exchange. - - l. Share means to provide material to the public by any means or - process that requires permission under the Licensed Rights, such - as reproduction, public display, public performance, distribution, - dissemination, communication, or importation, and to make material - available to the public including in ways that members of the - public may access the material from a place and at a time - individually chosen by them. - - m. Sui Generis Database Rights means rights other than copyright - resulting from Directive 96/9/EC of the European Parliament and of - the Council of 11 March 1996 on the legal protection of databases, - as amended and/or succeeded, as well as other essentially - equivalent rights anywhere in the world. - - n. You means the individual or entity exercising the Licensed Rights - under this Public License. Your has a corresponding meaning. - - -Section 2 -- Scope. - - a. License grant. - - 1. Subject to the terms and conditions of this Public License, - the Licensor hereby grants You a worldwide, royalty-free, - non-sublicensable, non-exclusive, irrevocable license to - exercise the Licensed Rights in the Licensed Material to: - - a. reproduce and Share the Licensed Material, in whole or - in part, for NonCommercial purposes only; and - - b. produce, reproduce, and Share Adapted Material for - NonCommercial purposes only. - - 2. Exceptions and Limitations. For the avoidance of doubt, where - Exceptions and Limitations apply to Your use, this Public - License does not apply, and You do not need to comply with - its terms and conditions. - - 3. Term. The term of this Public License is specified in Section - 6(a). - - 4. Media and formats; technical modifications allowed. The - Licensor authorizes You to exercise the Licensed Rights in - all media and formats whether now known or hereafter created, - and to make technical modifications necessary to do so. The - Licensor waives and/or agrees not to assert any right or - authority to forbid You from making technical modifications - necessary to exercise the Licensed Rights, including - technical modifications necessary to circumvent Effective - Technological Measures. For purposes of this Public License, - simply making modifications authorized by this Section 2(a) - (4) never produces Adapted Material. - - 5. Downstream recipients. - - a. Offer from the Licensor -- Licensed Material. Every - recipient of the Licensed Material automatically - receives an offer from the Licensor to exercise the - Licensed Rights under the terms and conditions of this - Public License. - - b. Additional offer from the Licensor -- Adapted Material. - Every recipient of Adapted Material from You - automatically receives an offer from the Licensor to - exercise the Licensed Rights in the Adapted Material - under the conditions of the Adapter's License You apply. - - c. No downstream restrictions. You may not offer or impose - any additional or different terms or conditions on, or - apply any Effective Technological Measures to, the - Licensed Material if doing so restricts exercise of the - Licensed Rights by any recipient of the Licensed - Material. - - 6. No endorsement. Nothing in this Public License constitutes or - may be construed as permission to assert or imply that You - are, or that Your use of the Licensed Material is, connected - with, or sponsored, endorsed, or granted official status by, - the Licensor or others designated to receive attribution as - provided in Section 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not - licensed under this Public License, nor are publicity, - privacy, and/or other similar personality rights; however, to - the extent possible, the Licensor waives and/or agrees not to - assert any such rights held by the Licensor to the limited - extent necessary to allow You to exercise the Licensed - Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this - Public License. - - 3. To the extent possible, the Licensor waives any right to - collect royalties from You for the exercise of the Licensed - Rights, whether directly or through a collecting society - under any voluntary or waivable statutory or compulsory - licensing scheme. In all other cases the Licensor expressly - reserves any right to collect such royalties, including when - the Licensed Material is used other than for NonCommercial - purposes. - - -Section 3 -- License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the -following conditions. - - a. Attribution. - - 1. If You Share the Licensed Material (including in modified - form), You must: - - a. retain the following if it is supplied by the Licensor - with the Licensed Material: - - i. identification of the creator(s) of the Licensed - Material and any others designated to receive - attribution, in any reasonable manner requested by - the Licensor (including by pseudonym if - designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of - warranties; - - v. a URI or hyperlink to the Licensed Material to the - extent reasonably practicable; - - b. indicate if You modified the Licensed Material and - retain an indication of any previous modifications; and - - c. indicate the Licensed Material is licensed under this - Public License, and include the text of, or the URI or - hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any - reasonable manner based on the medium, means, and context in - which You Share the Licensed Material. For example, it may be - reasonable to satisfy the conditions by providing a URI or - hyperlink to a resource that includes the required - information. - 3. If requested by the Licensor, You must remove any of the - information required by Section 3(a)(1)(A) to the extent - reasonably practicable. - - b. ShareAlike. - - In addition to the conditions in Section 3(a), if You Share - Adapted Material You produce, the following conditions also apply. - - 1. The Adapter's License You apply must be a Creative Commons - license with the same License Elements, this version or - later, or a BY-NC-SA Compatible License. - - 2. You must include the text of, or the URI or hyperlink to, the - Adapter's License You apply. You may satisfy this condition - in any reasonable manner based on the medium, means, and - context in which You Share Adapted Material. - - 3. You may not offer or impose any additional or different terms - or conditions on, or apply any Effective Technological - Measures to, Adapted Material that restrict exercise of the - rights granted under the Adapter's License You apply. - - -Section 4 -- Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that -apply to Your use of the Licensed Material: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right - to extract, reuse, reproduce, and Share all or a substantial - portion of the contents of the database for NonCommercial purposes - only; - - b. if You include all or a substantial portion of the database - contents in a database in which You have Sui Generis Database - Rights, then the database in which You have Sui Generis Database - Rights (but not its individual contents) is Adapted Material, - including for purposes of Section 3(b); and - - c. You must comply with the conditions in Section 3(a) if You Share - all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not -replace Your obligations under this Public License where the Licensed -Rights include other Copyright and Similar Rights. - - -Section 5 -- Disclaimer of Warranties and Limitation of Liability. - - a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE - EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS - AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF - ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, - IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, - WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, - ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT - KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT - ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. - - b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE - TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, - NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, - INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, - COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR - USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR - DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR - IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. - - c. The disclaimer of warranties and limitation of liability provided - above shall be interpreted in a manner that, to the extent - possible, most closely approximates an absolute disclaimer and - waiver of all liability. - - -Section 6 -- Term and Termination. - - a. This Public License applies for the term of the Copyright and - Similar Rights licensed here. However, if You fail to comply with - this Public License, then Your rights under this Public License - terminate automatically. - - b. Where Your right to use the Licensed Material has terminated under - Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided - it is cured within 30 days of Your discovery of the - violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any - right the Licensor may have to seek remedies for Your violations - of this Public License. - - c. For the avoidance of doubt, the Licensor may also offer the - Licensed Material under separate terms or conditions or stop - distributing the Licensed Material at any time; however, doing so - will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public - License. - - -Section 7 -- Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different - terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the - Licensed Material not stated herein are separate from and - independent of the terms and conditions of this Public License. - - -Section 8 -- Interpretation. - - a. For the avoidance of doubt, this Public License does not, and - shall not be interpreted to, reduce, limit, restrict, or impose - conditions on any use of the Licensed Material that could lawfully - be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is - deemed unenforceable, it shall be automatically reformed to the - minimum extent necessary to make it enforceable. If the provision - cannot be reformed, it shall be severed from this Public License - without affecting the enforceability of the remaining terms and - conditions. - - c. No term or condition of this Public License will be waived and no - failure to comply consented to unless expressly agreed to by the - Licensor. - - d. Nothing in this Public License constitutes or may be interpreted - as a limitation upon, or waiver of, any privileges and immunities - that apply to the Licensor or You, including from the legal - processes of any jurisdiction or authority. - -======================================================================= - -Creative Commons is not a party to its public -licenses. Notwithstanding, Creative Commons may elect to apply one of -its public licenses to material it publishes and in those instances -will be considered the “Licensor.” The text of the Creative Commons -public licenses is dedicated to the public domain under the CC0 Public -Domain Dedication. Except for the limited purpose of indicating that -material is shared under a Creative Commons public license or as -otherwise permitted by the Creative Commons policies published at -creativecommons.org/policies, Creative Commons does not authorize the -use of the trademark "Creative Commons" or any other trademark or logo -of Creative Commons without its prior written consent including, -without limitation, in connection with any unauthorized modifications -to any of its public licenses or any other arrangements, -understandings, or agreements concerning use of licensed material. For -the avoidance of doubt, this paragraph does not form part of the -public licenses. - -Creative Commons may be contacted at creativecommons.org. diff --git a/README.md b/README.md new file mode 100644 index 000000000..507823bb8 --- /dev/null +++ b/README.md @@ -0,0 +1,64 @@ +The Core Mod of CosmicFrontiers, holding most things which make it work. + +# Disclaimer and Mixin Transparency Statement + +Generally speaking This isn't relevant, but I will write it here regardless after some conversations today that make me believe transparency is best. +
+ +I am aware that some devs may not agree regarding the use of mixins or a custom pack mod to change mod behavior, this is perfectly acceptable. So i will make it very clear to the average user as well as devs that arrives here due to bug reports regarding this mod or theirs. +## A. Under No Circumstance is this mod Designed, Deployed, or Meant for **EXTERNAL USAGE** outside of the modpack Cosmic Frontiers +I waive the responsibilities of any mod-dev who receieves a report from a user using this mod externally due to pack changes or changes made by this mod. +This however doesn't mean you can just ignore issues, if there's an issue caused by my work and someone reports it, I'd appreciate the issue being referenced back to here so i can fix the problem or resolve the issue entirely! +In summary as long as CosmicCore is to blame for the issue, mod devs are not responsible for direct compatibility with CosmicCore as it is my job as a Pack-Dev to fix that custom content. - This does not apply to cross-mod issues excluding for (example; JEI and Generic Random Mods JEIPlugin) + +## B. Any issues regarding bugs in the modpack `Cosmic Frontiers` must be reported to us firstly. +This is to verify it isn't *OUR FAULT*. +DO NOT BLAME OTHER MODS FOR CAUSING ISSUES IF THEY ARE TARGETED BY A MIXIN OF **ANY KIND** (AD ASTRA, EMI, GTM, LDLIB, TINKERS, ETC), HONESTLY DONT BLAME ANOTHER MOD AT ALL. +Modpacks are insane abominations held together by love, passion, and excessively spent sanity. NEVER take your frustration out on another person. + +In summary, I do not want my pack users to point fingers at others, and I'll take a proactive stance in saying this. +If you are a mod dev reading this due to a user report, Feel free to show them this if deemed appropriate. If you wish to then reach out to me so resolve any problems or make me aware of better solutions or just to tell me to fix it, feel free to reach out to me on my discord. + +## C. For Ease of Developer Access and time saving, below is a short list of mods that are using mixins in cosmiccore. +These devs may take the time to observe how poor of a programmer I am and laugh at my choices. Any help you give can be out of good will and isn't required. If you spot someone using this mod externailly in a random pack that IS NOT CosmicFrontiers and You're the owner of one of these mods, refer them to here. + + `The Big Scary Mixins that'll probably get me glared at, if you're the owner of one of these mods and have a better solution, do tell either via an issue or shoot me a message in my discord!` + + `This section mostly applies to things that modify varibles or overwrites methods entirely` + - AE2 ; Mixins for Style Guide redirections for custom widgets and UI overwrites as well as PatternProvider Behaviors. I unfortunately was not able to find an elegant solution to this within their API, either by my own lack of skill or their lack of extensibility(or readability). + - EMI ; We Directly Mixin into `RecipeScreen.class` to change the size limit of catalyst slots as well as `EmiApi.class` to Alias Buckets/Fluid Containers to Show their Fluid Stack when clicked/checked for recipes on + - Apotheosis ; Hardcoded Recipes for many things that really shouldn't be but I could be wrong - We remove those recipes and replace them with our own. + - Legendary Survival Overhaul ; We mixin into the way damage scaling is handled by Frostbite and Heat Stroke + + `Less Scary Mixins that are less likely to be massive 'toe steppers' as one would like to reference` + - Create ; We mixin into the Diving Helmet to work with "Thin Air". + - Ad Astra ; We Mixin into spacesuits to apply oxygen tanks to our own gear. We Also Hide the "LAND" button for planets that don't need them (Gas Giants, ETC) + - GTCEu:Modern ; We Mixin unto GTValues to change some color values. + - Tinkers Construct ; We Mixin into `ModifiableItem.class` to allow Tinkers Tools to work in GTCEu:Modern Crafting Recipes and consume durability when said recipe is crafted. Prior to this tools just got consumed. + + To Conclude any help or collaboration with mods I tweak would be appreciated, this is here to shield you fron idiotic end users demanding fixes that they should be demanding me fixes for lol. +
+ + +# License +## Code +All Code is issued under LGPL-3.0 unless explicitly stated within the file header +## Assets +### All Files with the extension `.mtl` and `.obj` are All Rights reserved. +### All assets in `resources/assets/cosmiccore/textures` are licensed under All Rights Reserved by default +Exclusions to this rule are as follows + - All files contained in the subfolder(s) `item` are licensed as MIT + - All files contained in the subfolder(s) `block` EXCLUDING `iris` are licensed as MIT + +``` +Human readable format: +You may use code freely under LGPL-3.0, and most assets are licensed under MIT. +You are NOT allowed to use my .mtl or .obj files or associated assets linked to them for any reason. +``` + +Using code/assets from this project requires attribution in both cases and requires particular licensing, please keep that in mind. + +Credits; +Thanks to [Gregtech Modern](https://github.com/GregTechCEu/GregTech-Modern) for plenty of useful code references and invaluable knowledge in learning Java. +Thanks to ULSTICK's [GregTech: Refreshed](https://modrinth.com/resourcepack/gregtech-refreshed) for helping me learn how to make Jappa-style pixel art. +Thanks to TFC Water Flasks for the Air Bladder Texture (Re-used the water bladder texture) diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/CosmicCoreForestryAddon.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/CosmicCoreForestryAddon.java new file mode 100644 index 000000000..5d09967bb --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/CosmicCoreForestryAddon.java @@ -0,0 +1,14 @@ +package com.ghostipedia.cosmiccore; + +import net.minecraft.resources.ResourceLocation; + +import forestry.api.modules.IForestryModule; +import org.jetbrains.annotations.NotNull; + +public class CosmicCoreForestryAddon implements IForestryModule { + + @Override + public @NotNull ResourceLocation getId() { + return CosmicCore.id("core/cosmicore"); + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/EmberRecipeCapability.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/EmberRecipeCapability.java new file mode 100644 index 000000000..ad6ab3a5c --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/EmberRecipeCapability.java @@ -0,0 +1,125 @@ +package com.ghostipedia.cosmiccore.api.capability.recipe; + +import com.ghostipedia.cosmiccore.api.machine.trait.NotifiableEmberContainer; +import com.ghostipedia.cosmiccore.api.recipe.lookup.MapEmberIngredient; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.IRecipeCapabilityHolder; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.content.Content; +import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; +import com.gregtechceu.gtceu.api.recipe.content.SerializerDouble; +import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.AbstractMapIngredient; + +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.network.chat.Component; + +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import org.apache.commons.lang3.mutable.MutableInt; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.List; + +public class EmberRecipeCapability extends RecipeCapability { + + public static final EmberRecipeCapability CAP = new EmberRecipeCapability(); + + protected EmberRecipeCapability() { + super("ember", 0xFFFF9900, true, 12, SerializerDouble.INSTANCE); + } + + @Override + public Double copyInner(Double content) { + return content; + } + + @Override + public Double copyWithModifier(Double content, ContentModifier modifier) { + return modifier.apply(content); + } + + @Override + public @Nullable List getDefaultMapIngredient(Object ingredient) { + List ingredients = new ObjectArrayList<>(1); + if (ingredient instanceof Double ember) ingredients.add(new MapEmberIngredient(ember)); + return ingredients; + } + + @Override + public List compressIngredients(Collection ingredients) { + // TODO: Figure out what it needs to do + return super.compressIngredients(ingredients); + } + + private static double getInputContents(IRecipeCapabilityHolder holder) { + var handlerLists = holder.getCapabilitiesForIO(IO.IN); + if (handlerLists.isEmpty()) return 0d; + + double total = 0d; + + for (var handlerList : handlerLists) { + if (!handlerList.hasCapability(EmberRecipeCapability.CAP)) continue; + var emberHandlers = handlerList.getCapability(EmberRecipeCapability.CAP); + for (var handler : emberHandlers) { + var emberHandler = (NotifiableEmberContainer) handler; + for (var content : handler.getContents()) { + // At most, an ember hatch can contribute the minimum of the max allowed consumption per tick, or + // the current amount stored + total += Math.min((double) content, emberHandler.getMaxConsumption()); + } + } + } + return total; + } + + @Override + public int getMaxParallelByInput(IRecipeCapabilityHolder holder, GTRecipe recipe, int limit, boolean tick) { + if (!holder.hasCapabilityProxies()) return 0; + + var inputs = (tick ? recipe.tickInputs : recipe.inputs).get(this); + if (inputs == null || inputs.isEmpty()) return limit; + + double totalEmberInHatches = getInputContents(holder); + if (totalEmberInHatches == 0) return 0; + + var nonConsumable = 0d; + var consumable = 0d; + for (Content content : inputs) { + double required = (double) content.content; + + if (content.chance == 0) { + nonConsumable += required; + } else { + consumable += required; + } + } + + if (consumable == 0 && nonConsumable == 0) return limit; + + if (nonConsumable > totalEmberInHatches) return 0; + if (consumable == 0) return limit; + return (int) Math.min(limit, (totalEmberInHatches - nonConsumable) / consumable); + } + + @Override + public boolean isRecipeSearchFilter() { + return true; + } + + @Override + public void addXEIInfo(WidgetGroup group, int xOffset, GTRecipe recipe, List contents, boolean perTick, + boolean isInput, MutableInt yOffset) { + double ember = contents.stream().map(Content::getContent).mapToDouble(EmberRecipeCapability.CAP::of).sum(); + if (isInput) { + group.addWidget(new LabelWidget(3 - xOffset, yOffset.addAndGet(10), + Component.translatable("cosmiccore.recipe.ember_in", ember))); + } else { + group.addWidget(new LabelWidget(3 - xOffset, yOffset.addAndGet(10), + Component.translatable("cosmiccore.recipe.ember_out", ember))); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/AdvancedNanoMuscleSpaceSuite.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/AdvancedNanoMuscleSpaceSuite.java similarity index 99% rename from src/main/java/com/ghostipedia/cosmiccore/api/item/armor/AdvancedNanoMuscleSpaceSuite.java rename to _shelved/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/AdvancedNanoMuscleSpaceSuite.java index cd5f98552..769eae4ed 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/AdvancedNanoMuscleSpaceSuite.java +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/AdvancedNanoMuscleSpaceSuite.java @@ -1,6 +1,7 @@ package com.ghostipedia.cosmiccore.api.item.armor; import com.gregtechceu.gtceu.common.item.armor.AdvancedNanoMuscleSuite; + import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/AdvancedQuarkTechSpaceSuite.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/AdvancedQuarkTechSpaceSuite.java similarity index 99% rename from src/main/java/com/ghostipedia/cosmiccore/api/item/armor/AdvancedQuarkTechSpaceSuite.java rename to _shelved/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/AdvancedQuarkTechSpaceSuite.java index 021649df5..0bbe224ad 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/AdvancedQuarkTechSpaceSuite.java +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/AdvancedQuarkTechSpaceSuite.java @@ -1,6 +1,7 @@ package com.ghostipedia.cosmiccore.api.item.armor; import com.gregtechceu.gtceu.common.item.armor.AdvancedQuarkTechSuite; + import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/ISpaceSuite.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/ISpaceSuite.java new file mode 100644 index 000000000..d9b5ab06c --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/ISpaceSuite.java @@ -0,0 +1,99 @@ +package com.ghostipedia.cosmiccore.api.item.armor; + +import com.ghostipedia.cosmiccore.common.airControl.IOxygenProvider; +import com.ghostipedia.cosmiccore.common.data.tag.item.CosmicItemTags; + +import net.minecraft.network.chat.Component; +import net.minecraft.tags.TagKey; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +import earth.terrarium.adastra.common.constants.ConstantComponents; +import earth.terrarium.adastra.common.registry.ModFluids; +import earth.terrarium.adastra.common.utils.FluidUtils; +import earth.terrarium.adastra.common.utils.TooltipUtils; +import earth.terrarium.botarium.common.fluid.FluidConstants; + +import java.util.List; +import java.util.stream.StreamSupport; + +/** + * Interface for CosmicCore space suits that integrate with our oxygen system. + * Oxygen consumption for breathing is now handled by OxygenLogic - this interface + * provides the oxygen and marks items as oxygen providers. + */ +public interface ISpaceSuite extends IOxygenProvider { + + /** + * Tick handler for space suit - handles freezing prevention only. + * Oxygen consumption is handled by OxygenLogic via IOxygenProvider. + */ + default void tickOxygen(Level level, Player player, ItemStack itemStack) { + if (level.isClientSide) return; + if (player.isCreative() || player.isSpectator()) return; + if (!(itemStack.getItem() instanceof SpaceArmorComponentItem)) return; + // Prevent freezing while wearing space suit + player.setTicksFrozen(0); + // NOTE: Oxygen consumption is now handled by OxygenLogic.drainFromOxygenProviders() + } + + // --- IOxygenProvider implementation --- + + @Override + default boolean hasOxygen(ItemStack stack, Player player) { + if (!(stack.getItem() instanceof SpaceArmorComponentItem suit)) return false; + return suit.hasOxygen(player); + } + + @Override + default long consumeOxygen(ItemStack stack, Player player, long amount) { + if (!(stack.getItem() instanceof SpaceArmorComponentItem suit)) return 0; + long before = suit.getFluidContainer(stack).getFirstFluid().getFluidAmount(); + suit.consumeOxygen(stack, amount); + long after = suit.getFluidContainer(stack).getFirstFluid().getFluidAmount(); + return before - after; + } + + @Override + default long getOxygenAmount(ItemStack stack) { + if (!(stack.getItem() instanceof SpaceArmorComponentItem suit)) return 0; + return suit.getFluidContainer(stack).getFirstFluid().getFluidAmount(); + } + + @Override + default long getMaxOxygenCapacity(ItemStack stack) { + if (!(stack.getItem() instanceof SpaceArmorComponentItem suit)) return 0; + return suit.getFluidContainer(stack).getTankCapacity(0); + } + + static boolean hasFullNanoSet(LivingEntity entity) { + return hasFullSet(entity, CosmicItemTags.NANOMUSCLE_SPACE_SUITE); + } + + static boolean hasFullQuantumSet(LivingEntity entity) { + return hasFullSet(entity, CosmicItemTags.QUARKTECH_SPACE_SUITE); + } + + static boolean hasFullSet(LivingEntity entity, TagKey tagKey) { + return StreamSupport.stream(entity.getArmorSlots().spliterator(), false) + .allMatch(itemStack -> itemStack.is(tagKey)); + } + + default void onArmorTick(Level Level, Player player, ItemStack itemStack, ArmorItem.Type type) { + if (type == ArmorItem.Type.CHESTPLATE) this.tickOxygen(Level, player, itemStack); + } + + default void addInfo(ItemStack itemStack, List lines, ArmorItem.Type type) { + if (type == ArmorItem.Type.CHESTPLATE && itemStack.getItem() instanceof SpaceArmorComponentItem suit) { + lines.add(TooltipUtils.getFluidComponent( + FluidUtils.getTank(itemStack), + FluidConstants.fromMillibuckets(suit.getFluidContainer(itemStack).getTankCapacity(0)), + ModFluids.OXYGEN.get())); + TooltipUtils.addDescriptionComponent(lines, ConstantComponents.SPACE_SUIT_INFO); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/NanoMuscleSpaceSuite.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/NanoMuscleSpaceSuite.java similarity index 76% rename from src/main/java/com/ghostipedia/cosmiccore/api/item/armor/NanoMuscleSpaceSuite.java rename to _shelved/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/NanoMuscleSpaceSuite.java index 88b400201..142838cdf 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/NanoMuscleSpaceSuite.java +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/NanoMuscleSpaceSuite.java @@ -1,11 +1,7 @@ package com.ghostipedia.cosmiccore.api.item.armor; import com.gregtechceu.gtceu.common.item.armor.NanoMuscleSuite; -import earth.terrarium.adastra.common.constants.ConstantComponents; -import earth.terrarium.adastra.common.registry.ModFluids; -import earth.terrarium.adastra.common.utils.FluidUtils; -import earth.terrarium.adastra.common.utils.TooltipUtils; -import earth.terrarium.botarium.common.fluid.FluidConstants; + import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ArmorItem; diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/QuarkTechSpaceSuite.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/QuarkTechSpaceSuite.java similarity index 98% rename from src/main/java/com/ghostipedia/cosmiccore/api/item/armor/QuarkTechSpaceSuite.java rename to _shelved/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/QuarkTechSpaceSuite.java index 6a0c546c3..57eef6788 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/QuarkTechSpaceSuite.java +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/QuarkTechSpaceSuite.java @@ -1,6 +1,7 @@ package com.ghostipedia.cosmiccore.api.item.armor; import com.gregtechceu.gtceu.common.item.armor.QuarkTechSuite; + import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ArmorItem; @@ -9,7 +10,7 @@ import java.util.List; -public class QuarkTechSpaceSuite extends QuarkTechSuite implements ISpaceSuite{ +public class QuarkTechSpaceSuite extends QuarkTechSuite implements ISpaceSuite { public QuarkTechSpaceSuite(ArmorItem.Type slot, int energyPerUse, long capacity, int tier) { super(slot, energyPerUse, capacity, tier); diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/SpaceArmorComponentItem.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/SpaceArmorComponentItem.java similarity index 87% rename from src/main/java/com/ghostipedia/cosmiccore/api/item/armor/SpaceArmorComponentItem.java rename to _shelved/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/SpaceArmorComponentItem.java index 150aabd2f..46bd56333 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/SpaceArmorComponentItem.java +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/SpaceArmorComponentItem.java @@ -4,6 +4,13 @@ import com.gregtechceu.gtceu.api.item.armor.IArmorLogic; import com.gregtechceu.gtceu.api.item.component.IDurabilityBar; import com.gregtechceu.gtceu.api.item.component.IItemComponent; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.ItemStack; + import earth.terrarium.adastra.common.tags.ModFluidTags; import earth.terrarium.adastra.common.utils.FluidUtils; import earth.terrarium.botarium.common.fluid.FluidConstants; @@ -14,15 +21,9 @@ import earth.terrarium.botarium.common.fluid.impl.WrappedItemFluidContainer; import earth.terrarium.botarium.common.fluid.utils.ClientFluidHooks; import earth.terrarium.botarium.common.item.ItemStackHolder; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.ArmorMaterial; -import net.minecraft.world.item.ItemStack; - -import java.util.List; -public class SpaceArmorComponentItem extends ArmorComponentItem implements BotariumFluidItem { +public class SpaceArmorComponentItem extends ArmorComponentItem + implements BotariumFluidItem { protected final long tankSize; @@ -36,6 +37,7 @@ public void attachComponents(IItemComponent... components) { super.attachComponents(components); IDurabilityBar durabilityBar = new IDurabilityBar() { + @Override public int getBarColor(ItemStack stack) { return ClientFluidHooks.getFluidColor(FluidUtils.getTank(stack)); @@ -44,7 +46,8 @@ public int getBarColor(ItemStack stack) { @Override public int getBarWidth(ItemStack stack) { var fluidContainer = getFluidContainer(stack); - return (int) (((double) fluidContainer.getFirstFluid().getFluidAmount() / fluidContainer.getTankCapacity(0)) * 13); + return (int) (((double) fluidContainer.getFirstFluid().getFluidAmount() / + fluidContainer.getTankCapacity(0)) * 13); } @Override @@ -69,7 +72,8 @@ public SpaceArmorComponentItem setArmorLogic(IArmorLogic armorLogic) { @Override public WrappedItemFluidContainer getFluidContainer(ItemStack holder) { return new WrappedItemFluidContainer(holder, - new SimpleFluidContainer(FluidConstants.fromMillibuckets(tankSize), 1, (t, f) -> f.is(ModFluidTags.OXYGEN))); + new SimpleFluidContainer(FluidConstants.fromMillibuckets(tankSize), 1, + (t, f) -> f.is(ModFluidTags.OXYGEN))); } public long getOxygenAmount(Entity entity) { @@ -87,7 +91,8 @@ public void consumeOxygen(ItemStack stack, long amount) { ItemStackHolder holder = new ItemStackHolder(stack); var container = FluidContainer.of(holder); if (container == null) return; - FluidHolder extracted = container.extractFluid(container.getFirstFluid().copyWithAmount(FluidConstants.fromMillibuckets(amount)), false); + FluidHolder extracted = container + .extractFluid(container.getFirstFluid().copyWithAmount(FluidConstants.fromMillibuckets(amount)), false); if (holder.isDirty() || extracted.getFluidAmount() > 0) stack.setTag(holder.getStack().getTag()); } } diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/ChemStackMachine.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/ChemStackMachine.java new file mode 100644 index 000000000..3cf62362e --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/ChemStackMachine.java @@ -0,0 +1,60 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; +import com.gregtechceu.gtceu.api.pattern.MultiblockState; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Optional; +import java.util.concurrent.locks.Lock; + +public class ChemStackMachine implements IDisplayUIMachine { + + public static final int MAX_PARALLELS = 8; + private static final double CONVERSION_RATE = 0.5D; + + @Override + public boolean isFormed() { + return false; + } + + @Override + public @NotNull MultiblockState getMultiblockState() { + return null; + } + + @Override + public void asyncCheckPattern(long periodID) {} + + @Override + public void onStructureFormed() {} + + @Override + public void onStructureInvalid() {} + + @Override + public boolean hasFrontFacing() { + return false; + } + + @Override + public List getParts() { + return null; + } + + @Override + public Optional getParallelHatch() { + return Optional.empty(); + } + + @Override + public void onPartUnload() {} + + @Override + public Lock getPatternLock() { + return null; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/MegaAlvearyMultiblockMachine.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/MegaAlvearyMultiblockMachine.java new file mode 100644 index 000000000..c644e54a8 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/MegaAlvearyMultiblockMachine.java @@ -0,0 +1,284 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; +import com.ghostipedia.cosmiccore.common.machine.multiblock.part.BeeHolderPartMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; +import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; + +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.material.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.capability.IFluidHandler; + +import forestry.api.ForestryCapabilities; +import forestry.api.apiculture.genetics.IBee; +import forestry.api.apiculture.genetics.IBeeSpecies; +import forestry.api.genetics.alleles.BeeChromosomes; +import it.unimi.dsi.fastutil.objects.Object2FloatOpenHashMap; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class MegaAlvearyMultiblockMachine extends WorkableElectricMultiblockMachine { + + @Getter + private List beeHolders; + + public MegaAlvearyMultiblockMachine(IMachineBlockEntity holder, Object... args) { + super(holder, args); + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + this.beeHolders = new ArrayList<>(); + for (IMultiPart part : getParts()) { + if (part instanceof BeeHolderPartMachine beeHolder) { + beeHolders.add(beeHolder); + } + } + } + + @Override + public void onStructureInvalid() { + for (IMultiPart part : getParts()) { + if (part instanceof BeeHolderPartMachine beeHolder) { + beeHolder.setLocked(false); + } + } + beeHolders = null; + super.onStructureInvalid(); + } + + private void setHoldersLocked(boolean locked) { + beeHolders.forEach(holder -> holder.setLocked(locked)); + } + + @Override + protected RecipeLogic createRecipeLogic(Object... args) { + return new MegaAlvearyRecipeLogic(this); + } + + @Override + public boolean beforeWorking(@Nullable GTRecipe recipe) { + setHoldersLocked(true); + return super.beforeWorking(recipe); + } + + @Override + public void afterWorking() { + setHoldersLocked(false); + this.recipeLogic.markLastRecipeDirty(); + super.afterWorking(); + } + + public static class MegaAlvearyRecipeLogic extends RecipeLogic { + + public MegaAlvearyRecipeLogic(MegaAlvearyMultiblockMachine machine) { + super(machine); + } + + // Constant now, maybe change to be dependent on bee amount, etc. + private int productivityFluidConsumptionAmount = 10000; + + private Map productivityFluids = null; + + // Lazy getter for productivityFluids so we don't ever have issues with registration order etc. + private Map getProductivityFluids() { + if (productivityFluids == null) { + // To update the productivity values, edit these below. + productivityFluids = new Object2FloatOpenHashMap<>(); + productivityFluids.put(CosmicMaterials.basicNutrientProductionFluid.getFluid(), 8f); + productivityFluids.put(CosmicMaterials.advancedNutrientProductionFluid.getFluid(), 16f); + productivityFluids.put(CosmicMaterials.superNutrientProductionFluid.getFluid(), 32f); + productivityFluids.put(CosmicMaterials.perfectedNutrientProductionFluid.getFluid(), 64f); + + } + return productivityFluids; + } + + // Constant now, maybe change to be dependent on bee amount, etc. + private int overclockFluidConsumptionAmount = 1000; + + private Map overclockFluids = null; + + // Lazy getter for overclockFluids so we don't ever have issues with registration order etc. + private Map getOverclockFluids() { + if (overclockFluids == null) { + // To update the overclock values, edit these below. + overclockFluids = new Object2FloatOpenHashMap<>(); + // These are multipliers, so 0.7f would reduce the recipe time by 30% + overclockFluids.put(CosmicMaterials.basicNutrientOverclockFluid.getFluid(), 0.80f); + overclockFluids.put(CosmicMaterials.advancedNutrientOverclockFluid.getFluid(), 0.60f); + overclockFluids.put(CosmicMaterials.superNutrientOverclockFluid.getFluid(), 0.40f); + overclockFluids.put(CosmicMaterials.perfectedNutrientOverclockFluid.getFluid(), 0.25f); + + } + return overclockFluids; + } + + @Override + public @NotNull Iterator searchRecipe() { + if (!(machine instanceof MegaAlvearyMultiblockMachine)) { + CosmicCore.LOGGER + .error("MegaAlvearyRecipeLogic should only be ran in the MegaAlvearyMultiblockMachine"); + } + var builder = GTRecipeBuilder + .of(CosmicCore.id("bee_recipe"), CosmicRecipeTypes.BEES); + + // ====== Get and process Productivity Fluids ===== + var productivityFluids = getProductivityFluids(); + float productivityMultiplier = 1f; + FluidStack productivityFluid = null; + var fluidHandlers = machine.getCapabilitiesFlat(IO.IN, FluidRecipeCapability.CAP); + for (var handler : fluidHandlers) { + if (!(handler instanceof NotifiableFluidTank fluidHandler)) continue; + for (var content : fluidHandler.getContents()) { + if (!(content instanceof FluidStack stack)) continue; + + // See if this fluid is a Productivity Fluid + float potentialMult = productivityFluids.getOrDefault(stack.getFluid(), -1f); + + // If we don't have a fluid, or this isn't the highest mult, continue. + if (potentialMult == -1f || potentialMult < productivityMultiplier) continue; + + // See if we have enough fluid in this handler + int drained = fluidHandler + .drainInternal(new FluidStack(stack.getFluid(), productivityFluidConsumptionAmount), + IFluidHandler.FluidAction.SIMULATE) + .getAmount(); + if (drained == productivityFluidConsumptionAmount) { + productivityFluid = new FluidStack(stack.getFluid(), productivityFluidConsumptionAmount); + productivityMultiplier = potentialMult; + } + } + } + if (productivityFluid != null) { + // This drains in 1 go at the start. To drain per tick, add .perTick(true).....perTick(false) + builder.inputFluids(productivityFluid); + } + + // ====== Get and process Overclock Fluids ===== + var overclockFluids = getOverclockFluids(); + float overclockMultiplier = 1f; + FluidStack overclockFluid = null; + for (var handler : fluidHandlers) { + if (!(handler instanceof NotifiableFluidTank fluidHandler)) continue; + for (var content : fluidHandler.getContents()) { + if (!(content instanceof FluidStack stack)) continue; + + // See if this fluid is a Productivity Fluid + float potentialMult = overclockFluids.getOrDefault(stack.getFluid(), -1f); + + // If we don't have a fluid, or this isn't the lowest OC, continue. + if (potentialMult == -1f || potentialMult > overclockMultiplier) continue; + + // See if we have enough fluid in this handler + int drained = fluidHandler + .drainInternal(new FluidStack(stack.getFluid(), overclockFluidConsumptionAmount), + IFluidHandler.FluidAction.SIMULATE) + .getAmount(); + if (drained == overclockFluidConsumptionAmount) { + overclockFluid = new FluidStack(stack.getFluid(), overclockFluidConsumptionAmount); + overclockMultiplier = potentialMult; + } + } + } + if (overclockFluid != null) { + // This drains in 1 go at the start. To drain per tick, add .perTick(true).....perTick(false) + builder.inputFluids(overclockFluid); + } + builder.duration((int) (60 * 20 * overclockMultiplier)); + + // ====== Get and process Bees from holders ===== + var alveary = (MegaAlvearyMultiblockMachine) machine; + int totalbees = 0; + Map beeCounter = new HashMap<>(); + for (var holder : alveary.getBeeHolders()) { + for (var content : holder.getHeldBees().getContents()) { + if (!(content instanceof ItemStack stack)) continue; + + // Check if it's a Forestry Handler Item + var optionalCap = stack.getCapability(ForestryCapabilities.INDIVIDUAL_HANDLER_ITEM, + (Direction) null); + if (!optionalCap.isPresent()) continue; + var cap = optionalCap.resolve().get(); + + // Check if it's a bee + var individual = cap.getIndividual(); + if (!(individual instanceof IBee bee)) continue; + var genome = bee.getGenome(); + + IBeeSpecies primary = genome.getActiveValue(BeeChromosomes.SPECIES); + + beeCounter.put(primary, beeCounter.getOrDefault(primary, 0) + 1); + totalbees += 1; + } + } + + // ===== Add outputs from bee species counter ===== + for (var beeEntry : beeCounter.entrySet()) { + for (var product : beeEntry.getKey().getProducts()) { + builder.chancedOutput( + new ItemStack( + product.item(), + (int) (256 * productivityMultiplier * beeEntry.getValue())), + (int) (product.chance() * ChanceLogic.getMaxChancedValue()), + 0); + } + } + + builder.EUt(totalbees * GTValues.V[GTValues.ZPM]); + if (totalbees == 0) { + return Collections.emptyIterator(); + } else { + return Collections.singleton(builder.buildRawRecipe()).iterator(); + } + } + } +} + +// Machine logic rough draft + +// Lock Bee Holders to avoid duping/false caching bees +// Collect ALl bees into a list/map +// Deririve all products and the base yield from all bees contained in holders +// H.O.N.E.Y Runs on flat 5second intervals, No Overclocks +// Can insert fluid to 'boost' yield, similar to how we do it for our Custom ExoticCombustionEngineMachine +// Will consume X Nutrients at the start of the 5s cycle to 'boost' the yield, make sure this is extensible to +// like 4 or 5 fluids for now +// Runs 5 seconds +// Ejects all Products + +// More Info + +// Ignore all stats besides species, we'll assume Maximum Production speed is natively granted by the hive. +// Base Output (PER BEE) sould be 256, so 1 bee is 256 combs of X Type, 4 would be 1024 Combs, etc. +// Feeding Nutrient Fluid to bees at the start of a recipe will uh... Do stuff.. +// Some Nutrients Reduce Time +// Some Nutrients Boost Productivity (Flat Multiplier to all outputs) +// Each Bee Installed in a bee holder will cost 1 ZPM amp - meaning atm the Best In Slot HONEY will draw 64A ZPM +// until V8+ + +// Check out ResearchStationMachine as to how to make the BeeHolderPartMachine lock it's I/O in our custom logic +// I tried to Impl some of it, probably not sufficient. diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/machine/trait/NotifiableEmberContainer.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/machine/trait/NotifiableEmberContainer.java new file mode 100644 index 000000000..18e097a7b --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/api/machine/trait/NotifiableEmberContainer.java @@ -0,0 +1,133 @@ +package com.ghostipedia.cosmiccore.api.machine.trait; + +import com.ghostipedia.cosmiccore.api.capability.recipe.EmberRecipeCapability; +import com.ghostipedia.cosmiccore.common.machine.multiblock.part.EmberHatchPartMachine; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableRecipeHandlerTrait; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; + +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.nbt.CompoundTag; + +import com.rekindled.embers.api.power.IEmberCapability; +import com.rekindled.embers.power.DefaultEmberCapability; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.List; + +public class NotifiableEmberContainer extends NotifiableRecipeHandlerTrait { + + public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(NotifiableEmberContainer.class, + NotifiableRecipeHandlerTrait.MANAGED_FIELD_HOLDER); + + private EmberHatchPartMachine emberHatch; + public IEmberCapability capability = new DefaultEmberCapability() { + + @Override + public void onContentsChanged() { + super.onContentsChanged(); + emberHatch.cachedEmber = getEmber(); + notifyListeners(); + NotifiableEmberContainer.this.notifyListeners(); + } + + /* + * @Override + * public double getEmber() { + * return getTotalContentAmount(); + * } + * + * @Override + * public double addAmount(double value, boolean doAdd) { + * return super.addAmount(value, doAdd); + * } + */ + }; + + @Override + public void saveCustomPersistedData(@NotNull CompoundTag tag, boolean forDrop) { + super.saveCustomPersistedData(tag, forDrop); + capability.writeToNBT(tag); + } + + @Override + public void loadCustomPersistedData(@NotNull CompoundTag tag) { + super.loadCustomPersistedData(tag); + capability.deserializeNBT(tag); + if (capability.getEmberCapacity() == 0) + capability.setEmberCapacity(maxCapacity); + } + + private final IO handlerIO; + + @Persisted + @Getter + private double maxCapacity; + + @Persisted + @Getter + private double maxConsumption; + + public NotifiableEmberContainer(MetaMachine machine, IO io, double maxCapacity, double maxConsumption) { + super(machine); + this.emberHatch = (EmberHatchPartMachine) machine; + this.capability.setEmberCapacity(maxCapacity); + this.capability.setEmber(0.0D); + this.handlerIO = io; + this.maxCapacity = maxCapacity; + this.maxConsumption = maxConsumption; + } + + @Override + public IO getHandlerIO() { + return handlerIO; + } + + @Override + public List handleRecipeInner(IO io, GTRecipe recipe, List left, boolean simulate) { + double ember = left.stream().reduce(0.0D, Double::sum); + if (io == IO.IN) { + var canOutput = Math.min(maxConsumption, capability.getEmber()); + if (!simulate) ember = capability.removeAmount(Math.min(canOutput, ember), true); + ember -= canOutput; + } else if (io == IO.OUT) { + var canInput = maxCapacity - capability.getEmber(); + if (canInput <= 0) return Collections.singletonList(ember); + if (!simulate) ember = capability.addAmount(Math.min(canInput, ember), true); + ember -= canInput; + } + return ember <= 0 ? null : Collections.singletonList(ember); + } + + @Override + public @NotNull List getContents() { + return List.of(capability.getEmber()); + } + + @Override + public double getTotalContentAmount() { + return capability.getEmber(); + } + + @Override + public RecipeCapability getCapability() { + return EmberRecipeCapability.CAP; + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + @Override + public int getSize() { + return 1; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesDefinition.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesDefinition.java new file mode 100644 index 000000000..a837b94dd --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesDefinition.java @@ -0,0 +1,340 @@ +package com.ghostipedia.cosmiccore.bee; + +import com.ghostipedia.cosmiccore.bee.feature.CosmicBeesItems; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; +import com.ghostipedia.cosmiccore.common.item.CosmicBeesHoneyComb; + +import net.minecraft.network.chat.TextColor; + +import forestry.api.apiculture.ForestryBeeSpecies; +import forestry.api.plugin.IApicultureRegistration; + +public class CosmicBeesDefinition { + + public static void defineBees(IApicultureRegistration apicultureRegistration) { + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.LOFTY_OXYGEN, CosmicBeesTaxa.GENUS_LOFTY, + CosmicBeesTaxa.SPECIES_OXYGEN, + true, TextColor.fromRgb(0x8080FF)) + .setBody(TextColor.fromRgb(0x4242FF)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.LOFTY_OXYGEN), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.ABYSSAL, ForestryBeeSpecies.IMPERIAL, 10); + }) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.LOFTY_HYDROGEN, CosmicBeesTaxa.GENUS_LOFTY, + CosmicBeesTaxa.SPECIES_HYDROGEN, + true, TextColor.fromRgb(0x80FFE1)) + .setBody(TextColor.fromRgb(0x4242FF)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.LOFTY_HYDROGEN), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.ABYSSAL, ForestryBeeSpecies.AGRARIAN, 10); + }) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.LOFTY_NITROGEN, CosmicBeesTaxa.GENUS_LOFTY, + CosmicBeesTaxa.SPECIES_NITROGEN, + true, TextColor.fromRgb(0xFF80F9)) + .setBody(TextColor.fromRgb(0x4242FF)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.LOFTY_NITROGEN), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.ABYSSAL, ForestryBeeSpecies.CULTIVATED, 10); + }) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.LOFTY_ARGON, CosmicBeesTaxa.GENUS_LOFTY, + CosmicBeesTaxa.SPECIES_ARGON, + true, TextColor.fromRgb(0x97FF80)) + .setBody(TextColor.fromRgb(0x4242FF)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.LOFTY_ARGON), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.ABYSSAL, ForestryBeeSpecies.COMMON, 10); + }) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.ROSE_POLYMER, CosmicBeesTaxa.GENUS_PLASTID, + CosmicBeesTaxa.SPECIES_ROSE_POLYMER, + true, TextColor.fromRgb(0xFF4E6F)) + .setBody(TextColor.fromRgb(0x5D5D5D)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.ROSE_POLYMER), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.SCULK, ForestryBeeSpecies.COMMON, 10); + }) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.CITRUS_POLYMER, CosmicBeesTaxa.GENUS_PLASTID, + CosmicBeesTaxa.SPECIES_CITRUS_POLYMER, + true, TextColor.fromRgb(0xFF9900)) + .setBody(TextColor.fromRgb(0x5D5D5D)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.CITRUS_POLYMER), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.ICY, CosmicBeesSpecies.ROSE_POLYMER, 35); + }) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.WAXY_POLYMER, CosmicBeesTaxa.GENUS_PLASTID, + CosmicBeesTaxa.SPECIES_WAXY_POLYMER, + true, TextColor.fromRgb(0xA100FF)) + .setBody(TextColor.fromRgb(0x5D5D5D)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.WAXY_POLYMER), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.ICY, CosmicBeesSpecies.ROSE_POLYMER, 35); + }) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.BIOHAZARD, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_WAXY_POLYMER, + true, TextColor.fromRgb(0x00FF33)) + .setBody(TextColor.fromRgb(0x082C00)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.BIOHAZARD), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.EMBITTERED, ForestryBeeSpecies.MARSHY, 35); + }) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.PALE, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_PALE, + true, TextColor.fromRgb(0xC8E7F1)) + .setBody(TextColor.fromRgb(0x3F3F3F)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.PALE), 1) + .addProduct(CosmicItems.PALE_SAW.asStack(), 0.35f) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.PHANTASMAL, ForestryBeeSpecies.EDENIC, 35); + }) + .setGlint(true) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.SOUL, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_SOUL, + true, TextColor.fromRgb(0x3FEBF1)) + .setBody(TextColor.fromRgb(0x3A3A3A)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.SOUL), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.PHANTASMAL, ForestryBeeSpecies.DEMONIC, 35); + }) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.RUNIC, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_SOUL, + true, TextColor.fromRgb(0xA68941)) + .setBody(TextColor.fromRgb(0xA2A2A2)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.SOUL), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.PHANTASMAL, ForestryBeeSpecies.DEMONIC, 35); + }) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.AMBROSIC, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_AMBROSIC, + true, TextColor.fromRgb(0xD7C238)) + .setBody(TextColor.fromRgb(0x314234)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.AMBROSIC), 1) + .addMutations(mutations -> { + mutations.add(ForestryBeeSpecies.UNWEARY, ForestryBeeSpecies.TIPSY, 35); + }) + .setAuthority("Ghostipedia"); + + // TODO - MUTATIONS + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.ABRASIVE, CosmicBeesTaxa.GENUS_INDUSTRIAL, + CosmicBeesTaxa.SPECIES_ABRASIVE, + true, TextColor.fromRgb(0x834500)) + .setBody(TextColor.fromRgb(0x312E2B)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.ABRASIVE), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.ENERGIZED, CosmicBeesTaxa.GENUS_INDUSTRIAL, + CosmicBeesTaxa.SPECIES_ENERGIZED, + true, TextColor.fromRgb(0xD7C238)) + .setBody(TextColor.fromRgb(0x312E2B)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.ENERGIZED), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.SLICK, CosmicBeesTaxa.GENUS_INDUSTRIAL, + CosmicBeesTaxa.SPECIES_SLICK, + true, TextColor.fromRgb(0x251531)) + .setBody(TextColor.fromRgb(0x312E2B)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.SLICK), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.PYROLYTIC, CosmicBeesTaxa.GENUS_INDUSTRIAL, + CosmicBeesTaxa.SPECIES_PYROLYTIC, + true, TextColor.fromRgb(0x5B4B3F)) + .setBody(TextColor.fromRgb(0x312E2B)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.PYROLYTIC), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.LUNAR, CosmicBeesTaxa.GENUS_SOLAR, + CosmicBeesTaxa.SPECIES_LUNAR, + true, TextColor.fromRgb(0x10735F)) + .setBody(TextColor.fromRgb(0x223149)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.LUNAR), 0.75f) + .setAuthority("Ghostipedia"); + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.SOLAR, CosmicBeesTaxa.GENUS_SOLAR, + CosmicBeesTaxa.SPECIES_SOLAR, + true, TextColor.fromRgb(0xF3DC4C)) + .setBody(TextColor.fromRgb(0x223149)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.SOLAR), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.COSMOS, CosmicBeesTaxa.GENUS_SOLAR, + CosmicBeesTaxa.SPECIES_COSMOS, + true, TextColor.fromRgb(0xA276CB)) + .setBody(TextColor.fromRgb(0x223149)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.COSMOS), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.HADAL, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_HADAL, + true, TextColor.fromRgb(0xE0099B)) + .setBody(TextColor.fromRgb(0x720303)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.HADAL), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.SHAMAN, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_SHAMAN, + true, TextColor.fromRgb(0xE0099B)) + .setBody(TextColor.fromRgb(0x720303)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.SHAMAN), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.ASHEN, CosmicBeesTaxa.GENUS_INDUSTRIAL, + CosmicBeesTaxa.SPECIES_ASHEN, + true, TextColor.fromRgb(0x6D6872)) + .setBody(TextColor.fromRgb(0x223149)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.HADAL), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.FRACKING, CosmicBeesTaxa.GENUS_INDUSTRIAL, + CosmicBeesTaxa.SPECIES_FRACKING, + true, TextColor.fromRgb(0xDAD3B8)) + .setBody(TextColor.fromRgb(0x223149)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.FRACKING), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.FATE, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_FATE, + true, TextColor.fromRgb(0x06B64D)) + .setBody(TextColor.fromRgb(0x193D05)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.HADAL), 0.75f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.GRAND_GARDEN, CosmicBeesTaxa.GENUS_LOFTY, + CosmicBeesTaxa.SPECIES_HADAL, + true, TextColor.fromRgb(0x42801D)) + .setBody(TextColor.fromRgb(0x1D5703)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.GRAND_GARDEN), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.ARCHITECT, CosmicBeesTaxa.GENUS_FORGE_KIN, + CosmicBeesTaxa.SPECIES_ARCHITECT, + true, TextColor.fromRgb(0xD0FFE9)) + .setBody(TextColor.fromRgb(0x003588)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.ARCHITECT), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.INQUISITIVE, CosmicBeesTaxa.GENUS_FORGE_KIN, + CosmicBeesTaxa.SPECIES_INQUISITIVE, + true, TextColor.fromRgb(0xDCA260)) + .setBody(TextColor.fromRgb(0x666C77)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.INQUISITIVE), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.HELLSMITH, CosmicBeesTaxa.GENUS_FORGE_KIN, + CosmicBeesTaxa.SPECIES_HELLSMITH, + true, TextColor.fromRgb(0xEA5555)) + .setBody(TextColor.fromRgb(0x640529)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.HELLSMITH), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.RADOXIA, CosmicBeesTaxa.GENUS_FORGE_KIN, + CosmicBeesTaxa.SPECIES_RADOXIA, + true, TextColor.fromRgb(0x4D0E88)) + .setBody(TextColor.fromRgb(0x55647E)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.RADOXIA), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.ABSENT, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_ABSENT, + true, TextColor.fromRgb(0xE1E1E1)) + .setBody(TextColor.fromRgb(0x9A9A9A)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.ABSENT), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.ILLUSIVE, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_ILLUSIVE, + true, TextColor.fromRgb(0xEFFAAC)) + .setBody(TextColor.fromRgb(0x7C92B6)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.ILLUSIVE), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.CONSTRUCTIVE, CosmicBeesTaxa.GENUS_INDUSTRIAL, + CosmicBeesTaxa.SPECIES_CONSTRUCTIVE, + true, TextColor.fromRgb(0xCBA676)) + .setBody(TextColor.fromRgb(0x464922)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.CONSTRUCTIVE), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.PRISMATIC, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_PRISMATIC, + true, TextColor.fromRgb(0x76CB87)) + .setBody(TextColor.fromRgb(0x436CAD)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.PRISMATIC), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.HYDRAULIC, CosmicBeesTaxa.GENUS_INDUSTRIAL, + CosmicBeesTaxa.SPECIES_HYDRAULIC, + true, TextColor.fromRgb(0x715F81)) + .setBody(TextColor.fromRgb(0x0F521F)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.HYDRAULIC), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.COBBLED, CosmicBeesTaxa.GENUS_INDUSTRIAL, + CosmicBeesTaxa.SPECIES_COBBLED, + true, TextColor.fromRgb(0x6A6272)) + .setBody(TextColor.fromRgb(0x323741)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.COBBLED), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.EXHAUSTIVE, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_EXHAUSTIVE, + true, TextColor.fromRgb(0x4F625B)) + .setBody(TextColor.fromRgb(0x3A4350)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.EXHAUSTIVE), 0.9f) + .setAuthority("Ghostipedia"); + + apicultureRegistration + .registerSpecies(CosmicBeesSpecies.VIRTUE, CosmicBeesTaxa.GENUS_ESOTERIC, + CosmicBeesTaxa.SPECIES_VIRTUE, + true, TextColor.fromRgb(0x6BD1D5)) + .setBody(TextColor.fromRgb(0x223149)) + .addProduct(CosmicBeesItems.BEE_COMBS.stack(CosmicBeesHoneyComb.VIRTUE), 0.9f) + .setAuthority("Ghostipedia"); + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesSpecies.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesSpecies.java new file mode 100644 index 000000000..48e819f90 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesSpecies.java @@ -0,0 +1,51 @@ +package com.ghostipedia.cosmiccore.bee; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import net.minecraft.resources.ResourceLocation; + +public class CosmicBeesSpecies { + + public static final ResourceLocation LOFTY_OXYGEN = CosmicCore.id("bee_oxygen"); + public static final ResourceLocation LOFTY_HYDROGEN = CosmicCore.id("bee_hydrogen"); + public static final ResourceLocation LOFTY_NITROGEN = CosmicCore.id("bee_nitrogen"); + public static final ResourceLocation LOFTY_ARGON = CosmicCore.id("bee_argon"); + + public static final ResourceLocation ROSE_POLYMER = CosmicCore.id("bee_rose_polymer"); + public static final ResourceLocation CITRUS_POLYMER = CosmicCore.id("bee_citrus_polymer"); + public static final ResourceLocation WAXY_POLYMER = CosmicCore.id("bee_waxy_polymer"); + + public static final ResourceLocation BIOHAZARD = CosmicCore.id("bee_biohazard"); + public static final ResourceLocation PALE = CosmicCore.id("bee_pale"); + public static final ResourceLocation SOUL = CosmicCore.id("bee_soul"); + public static final ResourceLocation RUNIC = CosmicCore.id("bee_runic"); + public static final ResourceLocation AMBROSIC = CosmicCore.id("bee_ambrosic"); + + public static final ResourceLocation ABRASIVE = CosmicCore.id("bee_abrasive"); + public static final ResourceLocation ENERGIZED = CosmicCore.id("bee_energized"); + public static final ResourceLocation SLICK = CosmicCore.id("bee_slick"); + public static final ResourceLocation PYROLYTIC = CosmicCore.id("bee_pyrolytic"); + + public static final ResourceLocation LUNAR = CosmicCore.id("bee_lunar"); + public static final ResourceLocation SOLAR = CosmicCore.id("bee_solar"); + public static final ResourceLocation COSMOS = CosmicCore.id("bee_cosmos"); + + public static final ResourceLocation HADAL = CosmicCore.id("bee_hadal"); + public static final ResourceLocation SHAMAN = CosmicCore.id("bee_shaman"); + public static final ResourceLocation ASHEN = CosmicCore.id("bee_ashen"); + public static final ResourceLocation FRACKING = CosmicCore.id("bee_fracking"); + public static final ResourceLocation FATE = CosmicCore.id("bee_fate"); + public static final ResourceLocation GRAND_GARDEN = CosmicCore.id("bee_grand_garden"); + public static final ResourceLocation ARCHITECT = CosmicCore.id("bee_architect"); + public static final ResourceLocation INQUISITIVE = CosmicCore.id("bee_inquisitive"); + public static final ResourceLocation HELLSMITH = CosmicCore.id("bee_hellsmith"); + public static final ResourceLocation RADOXIA = CosmicCore.id("bee_radoxia"); + public static final ResourceLocation ABSENT = CosmicCore.id("bee_absent"); + public static final ResourceLocation ILLUSIVE = CosmicCore.id("bee_illusive"); + public static final ResourceLocation CONSTRUCTIVE = CosmicCore.id("bee_constructive"); + public static final ResourceLocation PRISMATIC = CosmicCore.id("bee_prismatic"); + public static final ResourceLocation HYDRAULIC = CosmicCore.id("bee_hydraulic"); + public static final ResourceLocation COBBLED = CosmicCore.id("bee_cobbled"); + public static final ResourceLocation EXHAUSTIVE = CosmicCore.id("bee_exhaustive"); + public static final ResourceLocation VIRTUE = CosmicCore.id("bee_virtue"); +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesTaxa.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesTaxa.java new file mode 100644 index 000000000..5b0d8b382 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesTaxa.java @@ -0,0 +1,62 @@ +package com.ghostipedia.cosmiccore.bee; + +public class CosmicBeesTaxa { + + public static final String SPECIES_WEIGHTY = "Weighty"; + public static final String SPECIES_OXYGEN = "Lofty Oxygen"; + public static final String SPECIES_HYDROGEN = "Lofty Hydrogen"; + public static final String SPECIES_NITROGEN = "Lofty Nitrogen"; + public static final String SPECIES_ARGON = "Lofty Argon"; + public static final String SPECIES_NATURAL_GAS = "Lofty Natural Gas"; + + // Propolyn-W Bees + public static final String SPECIES_ROSE_POLYMER = "Rose Polymer"; + public static final String SPECIES_CITRUS_POLYMER = "Citrus Polymer"; + public static final String SPECIES_WAXY_POLYMER = "Waxy Polymer"; + + // Funny and Misc Bees + public static final String SPECIES_BIOHAZARD = "Biohazad"; // Optional for SGM products + public static final String SPECIES_PALE = "Pale"; // Pale Steel Source - Required Bee + public static final String SPECIES_SOUL = "Soul"; // Malum Spirit Forging Stuff - Required + public static final String SPECIES_RUNIC = "Runic"; // Advanced Botania Nano Runes - Required + public static final String SPECIES_AMBROSIC = "Ambrosic"; // IDK YET LOL Probably ICHOR/ICHORIUM prod - Required + + public static final String SPECIES_HADAL = "Hadal"; + public static final String SPECIES_SHAMAN = "Shaman"; + public static final String SPECIES_ASHEN = "Ashen"; + public static final String SPECIES_FRACKING = "Fracking"; + public static final String SPECIES_FATE = "Fate"; + public static final String SPECIES_GRAND_GARDEN = "Grand Garden"; + public static final String SPECIES_ARCHITECT = "Architect"; + public static final String SPECIES_INQUISITIVE = "Inquisitive"; + public static final String SPECIES_HELLSMITH = "Hellsmith"; + public static final String SPECIES_RADOXIA = "Radoxia"; + public static final String SPECIES_ABSENT = "Absent"; + public static final String SPECIES_ILLUSIVE = "Illusive"; + public static final String SPECIES_CONSTRUCTIVE = "Constructive"; + public static final String SPECIES_PRISMATIC = "Prismatic"; + public static final String SPECIES_HYDRAULIC = "Hydraulic"; + public static final String SPECIES_COBBLED = "Cobbled"; + public static final String SPECIES_EXHAUSTIVE = "Exhaustive"; + public static final String SPECIES_VIRTUE = "Virtue"; + + // Industry Bees + public static final String SPECIES_ABRASIVE = "Abrasive"; // OreProc Bee + public static final String SPECIES_ENERGIZED = "Energized"; // Booster T3 Bee + public static final String SPECIES_SLICK = "Slick"; // Sulfuric Oil Products, the Bee + public static final String SPECIES_PYROLYTIC = "Pyrolytic"; // Charcoal Byproducts, the bee + + // Stellar Bees + public static final String SPECIES_LUNAR = "Lunar"; // Early planet dusts for processing en masse + public static final String SPECIES_SOLAR = "Solar"; // Mid planet dusts for processing en masse + public static final String SPECIES_COSMOS = "Cosmos"; // IDK - Probably for something relating to deep space + + // GENUS + public static final String GENUS_STONY = "Stony"; + public static final String GENUS_LOFTY = "Lofty"; + public static final String GENUS_ESOTERIC = "Esoteric"; + public static final String GENUS_PLASTID = "Plastid"; + public static final String GENUS_SOLAR = "Plastid"; + public static final String GENUS_INDUSTRIAL = "Industrial"; + public static final String GENUS_FORGE_KIN = "Forge Kin"; +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesTaxonomy.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesTaxonomy.java new file mode 100644 index 000000000..8b66726c7 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/bee/CosmicBeesTaxonomy.java @@ -0,0 +1,67 @@ +package com.ghostipedia.cosmiccore.bee; + +import forestry.api.genetics.ForestryTaxa; +import forestry.api.genetics.alleles.BeeChromosomes; +import forestry.api.genetics.alleles.ForestryAlleles; +import forestry.api.plugin.IGeneticRegistration; + +public class CosmicBeesTaxonomy { + + public static void defineTaxa(IGeneticRegistration genetics) { + genetics.defineTaxon(ForestryTaxa.CLASS_INSECTS, ForestryTaxa.ORDER_HYMNOPTERA, order -> { + order.defineSubTaxon(ForestryTaxa.FAMILY_BEES, family -> { + family.defineSubTaxon(CosmicBeesTaxa.GENUS_STONY, genus -> { + genus.setDefaultChromosome(BeeChromosomes.CAVE_DWELLING, ForestryAlleles.TRUE); + genus.setDefaultChromosome(BeeChromosomes.LIFESPAN, ForestryAlleles.LIFESPAN_LONG); + genus.setDefaultChromosome(BeeChromosomes.FERTILITY, ForestryAlleles.FERTILITY_3); + genus.setDefaultChromosome(BeeChromosomes.ACTIVITY, ForestryAlleles.ACTIVITY_CATHEMERAL); + genus.setDefaultChromosome(BeeChromosomes.HUMIDITY_TOLERANCE, ForestryAlleles.TOLERANCE_UP_2); + genus.setDefaultChromosome(BeeChromosomes.FLOWER_TYPE, ForestryAlleles.FLOWER_TYPE_CORAL); + }); + family.defineSubTaxon(CosmicBeesTaxa.GENUS_LOFTY, genus -> { + genus.setDefaultChromosome(BeeChromosomes.CAVE_DWELLING, ForestryAlleles.FALSE); + genus.setDefaultChromosome(BeeChromosomes.LIFESPAN, ForestryAlleles.LIFESPAN_SHORT); + genus.setDefaultChromosome(BeeChromosomes.FERTILITY, ForestryAlleles.FERTILITY_3); + genus.setDefaultChromosome(BeeChromosomes.ACTIVITY, ForestryAlleles.ACTIVITY_DIURNAL); + genus.setDefaultChromosome(BeeChromosomes.HUMIDITY_TOLERANCE, ForestryAlleles.TOLERANCE_UP_2); + genus.setDefaultChromosome(BeeChromosomes.FLOWER_TYPE, ForestryAlleles.FLOWER_TYPE_CORAL); + }); + family.defineSubTaxon(CosmicBeesTaxa.GENUS_PLASTID, genus -> { + genus.setDefaultChromosome(BeeChromosomes.POLLINATION, ForestryAlleles.POLLINATION_FAST); + genus.setDefaultChromosome(BeeChromosomes.SPEED, ForestryAlleles.SPEED_NORMAL); + genus.setDefaultChromosome(BeeChromosomes.LIFESPAN, ForestryAlleles.LIFESPAN_SHORTENED); + genus.setDefaultChromosome(BeeChromosomes.FERTILITY, ForestryAlleles.FERTILITY_2); + genus.setDefaultChromosome(BeeChromosomes.ACTIVITY, ForestryAlleles.ACTIVITY_NOCTURNAL); + genus.setDefaultChromosome(BeeChromosomes.HUMIDITY_TOLERANCE, ForestryAlleles.TOLERANCE_UP_1); + genus.setDefaultChromosome(BeeChromosomes.TEMPERATURE_TOLERANCE, ForestryAlleles.TOLERANCE_UP_1); + }); + family.defineSubTaxon(CosmicBeesTaxa.GENUS_ESOTERIC, genus -> { + genus.setDefaultChromosome(BeeChromosomes.POLLINATION, ForestryAlleles.POLLINATION_SLOWEST); + genus.setDefaultChromosome(BeeChromosomes.LIFESPAN, ForestryAlleles.LIFESPAN_LONGER); + genus.setDefaultChromosome(BeeChromosomes.SPEED, ForestryAlleles.SPEED_FASTEST); + genus.setDefaultChromosome(BeeChromosomes.FERTILITY, ForestryAlleles.FERTILITY_1); + genus.setDefaultChromosome(BeeChromosomes.TOLERATES_RAIN, ForestryAlleles.FALSE); + genus.setDefaultChromosome(BeeChromosomes.ACTIVITY, ForestryAlleles.ACTIVITY_CATHEMERAL); + }); + family.defineSubTaxon(CosmicBeesTaxa.GENUS_INDUSTRIAL, genus -> { + genus.setDefaultChromosome(BeeChromosomes.POLLINATION, ForestryAlleles.POLLINATION_FAST); + genus.setDefaultChromosome(BeeChromosomes.LIFESPAN, ForestryAlleles.LIFESPAN_NORMAL); + genus.setDefaultChromosome(BeeChromosomes.SPEED, ForestryAlleles.SPEED_FASTEST); + genus.setDefaultChromosome(BeeChromosomes.FERTILITY, ForestryAlleles.FERTILITY_2); + genus.setDefaultChromosome(BeeChromosomes.TOLERATES_RAIN, ForestryAlleles.TRUE); + genus.setDefaultChromosome(BeeChromosomes.ACTIVITY, ForestryAlleles.ACTIVITY_METATURNAL); + }); + family.defineSubTaxon(CosmicBeesTaxa.GENUS_FORGE_KIN, genus -> { + genus.setDefaultChromosome(BeeChromosomes.POLLINATION, ForestryAlleles.POLLINATION_SLOWEST); + genus.setDefaultChromosome(BeeChromosomes.LIFESPAN, ForestryAlleles.LIFESPAN_SHORT); + genus.setDefaultChromosome(BeeChromosomes.SPEED, ForestryAlleles.SPEED_FASTEST); + genus.setDefaultChromosome(BeeChromosomes.FERTILITY, ForestryAlleles.FERTILITY_5); + genus.setDefaultChromosome(BeeChromosomes.TOLERATES_RAIN, ForestryAlleles.TRUE); + genus.setDefaultChromosome(BeeChromosomes.CAVE_DWELLING, ForestryAlleles.TRUE); + genus.setDefaultChromosome(BeeChromosomes.ACTIVITY, ForestryAlleles.ACTIVITY_DIURNAL); + }); + }); + + }); + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/bee/feature/CosmicBeesItems.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/bee/feature/CosmicBeesItems.java new file mode 100644 index 000000000..439febaf6 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/bee/feature/CosmicBeesItems.java @@ -0,0 +1,32 @@ +package com.ghostipedia.cosmiccore.bee.feature; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBeesItemHiveFraming; +import com.ghostipedia.cosmiccore.common.data.CosmicGendustryUpgradeType; +import com.ghostipedia.cosmiccore.common.item.CosmicBeesHoneyComb; +import com.ghostipedia.cosmiccore.common.item.CosmicBeesItemHoneyComb; + +import forestry.modules.features.*; +import thedarkcolour.gendustry.item.GendustryUpgradeItem; + +@FeatureProvider +public class CosmicBeesItems { + + public static final IFeatureRegistry REGISTRY = ModFeatureRegistry.get(CosmicCore.id("core/cosmicore")); + public static final FeatureItemGroup BEE_COMBS = REGISTRY + .itemGroup(CosmicBeesItemHoneyComb::new, "bee_comb", CosmicBeesHoneyComb.VALUES); + + public static final FeatureItemGroup COSMIC_UPGRADES = REGISTRY + .itemGroup(GendustryUpgradeItem::new, CosmicGendustryUpgradeType.values()) + .identifier("cosmic_upgrade", FeatureGroup.IdentifierType.SUFFIX).create(); + + public static final FeatureItem FRAME_DECAYING = REGISTRY + .item(() -> new CosmicBeesItemHiveFraming.CosmicBeesItemHiveFrameBuilder(2048) + .setAgeMult(-1000f) + .build(), "frame_decaying"); + + public static final FeatureItem FRAME_WAILING = REGISTRY + .item(() -> new CosmicBeesItemHiveFraming.CosmicBeesItemHiveFrameBuilder(2048) + .setMutationMult(1000f) + .build(), "frame_wailing"); +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/client/CosmicBeesPlugin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/client/CosmicBeesPlugin.java new file mode 100644 index 000000000..499504650 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/client/CosmicBeesPlugin.java @@ -0,0 +1,46 @@ +package com.ghostipedia.cosmiccore.client; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.bee.CosmicBeesDefinition; +import com.ghostipedia.cosmiccore.bee.CosmicBeesTaxonomy; +import com.ghostipedia.cosmiccore.bee.feature.CosmicBeesItems; +import com.ghostipedia.cosmiccore.common.item.CosmicBeesHoneyComb; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; + +import forestry.api.client.plugin.IClientRegistration; +import forestry.api.plugin.IApicultureRegistration; +import forestry.api.plugin.IForestryPlugin; +import forestry.api.plugin.IGeneticRegistration; + +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; + +public class CosmicBeesPlugin implements IForestryPlugin { + + @Override + public ResourceLocation id() { + return CosmicCore.id("core/cosmicore"); + } + + @Override + public void registerApiculture(IApicultureRegistration apiculture) { + CosmicBeesDefinition.defineBees(apiculture); + } + + @Override + public void registerGenetics(IGeneticRegistration genetics) { + CosmicBeesTaxonomy.defineTaxa(genetics); + } + + @Override + public void registerClient(Consumer> registrar) { + registrar.accept(new CosmicCoreClient.CosmicBeesClientRegistration()); + } + + private static Supplier> getHoneyComb(CosmicBeesHoneyComb type) { + return () -> List.of(CosmicBeesItems.BEE_COMBS.stack(type)); + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/HPCAIndicatorRender.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/HPCAIndicatorRender.java new file mode 100644 index 000000000..50864fd9c --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/HPCAIndicatorRender.java @@ -0,0 +1,122 @@ +package com.ghostipedia.cosmiccore.client.renderer.machine; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.electric.hpca.HPCAMachine; +import com.ghostipedia.cosmiccore.common.machine.multiblock.electric.hpca.HPCAModifier; +import com.ghostipedia.cosmiccore.common.machine.multiblock.part.HPCAIndicatorPartMachine; + +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; +import com.gregtechceu.gtceu.client.util.ModelUtils; +import com.gregtechceu.gtceu.client.util.StaticFaceBakery; + +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.BlockModelRotation; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.client.model.data.ModelData; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.serialization.Codec; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +import static com.gregtechceu.gtceu.client.util.StaticFaceBakery.SLIGHTLY_OVER_BLOCK; + +public class HPCAIndicatorRender extends DynamicRender { + + public static final HPCAIndicatorRender INSTANCE = new HPCAIndicatorRender(); + public static final Codec CODEC = Codec.unit(HPCAIndicatorRender.INSTANCE); + public static final DynamicRenderType TYPE = new DynamicRenderType<>( + HPCAIndicatorRender.CODEC); + + private static final Map MODIFIER_SPRITES = new EnumMap<>(HPCAModifier.class); + private static boolean isOverlayListenerInitialized = false; + + private HPCAIndicatorRender() { + if (!isOverlayListenerInitialized) { + ModelUtils.registerAtlasStitchedEventListener(true, InventoryMenu.BLOCK_ATLAS, event -> { + MODIFIER_SPRITES.clear(); + for (HPCAModifier modifier : HPCAModifier.VALUES) { + MODIFIER_SPRITES.put(modifier, event.getAtlas().getSprite(modifier.overlay)); + } + }); + isOverlayListenerInitialized = true; + } + } + + @Override + public @NotNull List getRenderQuads(@Nullable HPCAIndicatorPartMachine machine, + @Nullable BlockAndTintGetter level, + @Nullable BlockPos pos, @Nullable BlockState blockState, + @Nullable Direction side, RandomSource rand, + @NotNull ModelData modelData, @Nullable RenderType renderType) { + if (machine == null) return Collections.emptyList(); + + SortedSet controllers = machine.getControllers(); + if (controllers.isEmpty() || !(controllers.first() instanceof HPCAMachine controller)) { + return Collections.emptyList(); + } + + Direction front = machine.getFrontFacing(); + HPCAModifier modifier = controller.getModifier(machine.getBlockPos()); + + BakedQuad q = StaticFaceBakery.bakeFace(SLIGHTLY_OVER_BLOCK, front, + MODIFIER_SPRITES.get(modifier), BlockModelRotation.X0_Y0, -1, 15, true, false); + return Collections.singletonList(q); + } + + @Override + public @NotNull DynamicRenderType getType() { + return TYPE; + } + + @Override + public void render(HPCAIndicatorPartMachine machine, float partialTick, PoseStack poseStack, + MultiBufferSource buffer, int packedLight, int packedOverlay) { + for (RelativeDirection dir : RelativeDirection.values()) { + + } + } + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext displayContext, PoseStack poseStack, + MultiBufferSource buffer, int packedLight, int packedOverlay) { + super.renderByItem(stack, displayContext, poseStack, buffer, packedLight, packedOverlay); + } + + @Override + public boolean shouldRenderOffScreen(HPCAIndicatorPartMachine machine) { + return false; + } + + @Override + public boolean shouldRender(HPCAIndicatorPartMachine machine, Vec3 cameraPos) { + return true; + } + + @Override + public AABB getRenderBoundingBox(HPCAIndicatorPartMachine machine) { + return super.getRenderBoundingBox(machine); + } + + // @Override + // public @NotNull List getQuads(@Nullable BlockState state, @Nullable Direction side, + // @NotNull RandomSource rand) { + // return super.getQuads(state, side, rand); + // } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBeesItemHiveFraming.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBeesItemHiveFraming.java new file mode 100644 index 000000000..028540eb7 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBeesItemHiveFraming.java @@ -0,0 +1,198 @@ +package com.ghostipedia.cosmiccore.common.data; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; + +import forestry.api.apiculture.IBeeHousing; +import forestry.api.apiculture.IBeeModifier; +import forestry.api.apiculture.genetics.IBee; +import forestry.api.apiculture.genetics.IBeeSpecies; +import forestry.api.apiculture.hives.IHiveFrame; +import forestry.api.genetics.IGenome; +import forestry.api.genetics.IMutation; +import forestry.core.items.ItemForestry; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.text.DecimalFormat; +import java.util.List; + +public class CosmicBeesItemHiveFraming extends ItemForestry implements IHiveFrame { + + private final Modifier beeMod; + + public CosmicBeesItemHiveFraming(CosmicBeesItemHiveFrameBuilder builder) { + super((new Item.Properties()).durability(builder.maxDmg)); + this.beeMod = new Modifier(builder.ageMult, + builder.speedMult, + builder.pollinationMult, + builder.decayMult, + builder.mutationMult, + builder.isRainproof, + builder.isAlwaysSunny, + builder.isHellish); + } + + @Override + public @NotNull ItemStack frameUsed(IBeeHousing iBeeHousing, ItemStack itemStack, IBee iBee, int i) { + return itemStack.hurt(i, iBeeHousing.getWorldObj().getRandom(), null) ? ItemStack.EMPTY : itemStack; + } + + @Override + public IBeeModifier getBeeModifier(ItemStack itemStack) { + return this.beeMod; + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level world, List tooltip, TooltipFlag advanced) { + super.appendHoverText(stack, world, tooltip, advanced); + DecimalFormat FORMAT = new DecimalFormat("#.##"); + if (beeMod.ageMult != 1) { + tooltip.add(Component.translatable("item.cosmicbees.bee.modifier.aging_multiplier") + .withStyle(ChatFormatting.GRAY) + .append(": ") + .append(Component.literal(FORMAT.format(beeMod.ageMult) + "x") + .withStyle(beeMod.ageMult > 1 ? ChatFormatting.RED : ChatFormatting.GREEN))); + } + + if (!stack.isDamaged()) { + tooltip.add(Component.translatable("item.forestry.durability", new Object[] { stack.getMaxDamage() })); + } + } + + private class Modifier implements IBeeModifier { + + private final float ageMult; + private final float speedMult; + private final float pollinationMult; + private final float decayMult; + private final float mutationMult; + private final boolean isRainproof; + private final boolean isAlwaysSunny; + private final boolean isHellish; + + public Modifier(float ageMult, float speedMult, float pollinationMult, float decayMult, float mutationMult, + boolean isRainproof, boolean isAlwaysSunny, boolean isHellish) { + this.ageMult = ageMult; + this.speedMult = speedMult; + this.pollinationMult = pollinationMult; + this.decayMult = decayMult; + this.mutationMult = mutationMult; + this.isRainproof = isRainproof; + this.isAlwaysSunny = isAlwaysSunny; + this.isHellish = isHellish; + } + + @Override + public float modifyMutationChance(IGenome genome, IGenome mate, IMutation mutation, + float currentChance) { + // mult cap is the base mutation chance to the power of 3. ie. 0.06 -> 0.09 -> 0.135 -> 0.203 -> 0.304, + // capped at 0.5 + float multCap = Math.min((float) (mutation.getChance() * (Math.pow(1.5, 4))), 0.5f); + return Math.min(currentChance * mutationMult, multCap); + } + + @Override + public float modifyAging(IGenome genome, @Nullable IGenome mate, float currentAging) { + return currentAging * ageMult; + } + + @Override + public float modifyProductionSpeed(IGenome genome, float currentSpeed) { + return currentSpeed * speedMult; + } + + @Override + public float modifyPollination(IGenome genome, float currentPollination) { + return currentPollination * pollinationMult; + } + + @Override + public float modifyGeneticDecay(IGenome genome, float currentDecay) { + return currentDecay * decayMult; + } + + @Override + public boolean isSealed() { + return isRainproof; + } + + @Override + public boolean isSunlightSimulated() { + return isAlwaysSunny; + } + + @Override + public boolean isHellish() { + return isHellish; + } + } + + public static class CosmicBeesItemHiveFrameBuilder { + + // required params + private int maxDmg = 64; + + // optional params + private float ageMult = 1; + private float speedMult = 1; + private float pollinationMult = 1; + private float decayMult = 1; + private float mutationMult = 1; + private boolean isRainproof = false; + private boolean isAlwaysSunny = false; + private boolean isHellish = false; + + public CosmicBeesItemHiveFrameBuilder(int maxDmg) { + this.maxDmg = maxDmg; + } + + public CosmicBeesItemHiveFrameBuilder setAgeMult(float ageMult) { + this.ageMult = ageMult; + return this; + } + + public CosmicBeesItemHiveFrameBuilder setSpeedMult(float speedMult) { + this.speedMult = speedMult; + return this; + } + + public CosmicBeesItemHiveFrameBuilder setPollinationMult(float pollinationMult) { + this.pollinationMult = pollinationMult; + return this; + } + + public CosmicBeesItemHiveFrameBuilder setDecayMult(float decayMult) { + this.decayMult = decayMult; + return this; + } + + public CosmicBeesItemHiveFrameBuilder setMutationMult(float mutationMult) { + this.mutationMult = mutationMult; + return this; + } + + public CosmicBeesItemHiveFrameBuilder setIsRainproof(boolean isRainproof) { + this.isRainproof = isRainproof; + return this; + } + + public CosmicBeesItemHiveFrameBuilder setIsAlwaysSunny(boolean isAlwaysSunny) { + this.isAlwaysSunny = isAlwaysSunny; + return this; + } + + public CosmicBeesItemHiveFrameBuilder setIsHellish(boolean isHellish) { + this.isHellish = isHellish; + return this; + } + + public CosmicBeesItemHiveFraming build() { + return new CosmicBeesItemHiveFraming(this); + } + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicGendustryUpgradeType.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicGendustryUpgradeType.java new file mode 100644 index 000000000..c3ffb3c84 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicGendustryUpgradeType.java @@ -0,0 +1,35 @@ +package com.ghostipedia.cosmiccore.common.data; + +import forestry.api.core.IItemSubtype; +import thedarkcolour.gendustry.item.IGendustryUpgradeType; + +import java.util.Locale; + +public enum CosmicGendustryUpgradeType implements IItemSubtype, IGendustryUpgradeType { + + WAILING(1, 2048), + DECAYING(1, 2048); + + private final String name; + private final int maxStackSize; + private final int energyCost; + + private CosmicGendustryUpgradeType(int maxStackSize, int energyCost) { + this.name = this.name().toLowerCase(Locale.ENGLISH); + this.maxStackSize = maxStackSize; + this.energyCost = energyCost; + } + + @Override + public String getSerializedName() { + return this.name; + } + + public int maxStackSize() { + return this.maxStackSize; + } + + public int energyCost() { + return this.energyCost; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/item/CosmicBeesHoneyComb.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/item/CosmicBeesHoneyComb.java new file mode 100644 index 000000000..81301585d --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/item/CosmicBeesHoneyComb.java @@ -0,0 +1,83 @@ +package com.ghostipedia.cosmiccore.common.item; + +import net.minecraft.util.StringRepresentable; + +import forestry.api.core.IItemSubtype; + +import java.awt.*; +import java.util.Locale; + +public enum CosmicBeesHoneyComb implements StringRepresentable, IItemSubtype { + + LOFTY_OXYGEN(new Color(0x8080FF), new Color(0x4242FF)), + LOFTY_HYDROGEN(new Color(0x80FFE1), new Color(0x4242FF)), + LOFTY_NITROGEN(new Color(0xFF80F9), new Color(0x4242FF)), + LOFTY_ARGON(new Color(0x97FF80), new Color(0x4242FF)), + + ROSE_POLYMER(new Color(0xFF4E6F), new Color(0x5D5D5D)), + CITRUS_POLYMER(new Color(0xFF9900), new Color(0x5D5D5D)), + WAXY_POLYMER(new Color(0xA100FF), new Color(0x5D5D5D)), + + BIOHAZARD(new Color(0x00FF33), new Color(0x082C00)), + PALE(new Color(0xC8E7F1), new Color(0x3F3F3F)), + SOUL(new Color(0x3FEBF1), new Color(0x3A3A3A)), + RUNIC(new Color(0xA68941), new Color(0xA2A2A2)), + AMBROSIC(new Color(0xD7C238), new Color(0x314234)), + + ABRASIVE(new Color(0x834500), new Color(0x312E2B)), + ENERGIZED(new Color(0xD7C238), new Color(0x312E2B)), + SLICK(new Color(0x251531), new Color(0x312E2B)), + PYROLYTIC(new Color(0x5B4B3F), new Color(0x312E2B)), + LUNAR(new Color(0x10735F), new Color(0x223149)), + SOLAR(new Color(0xF3DC4C), new Color(0x223149)), + COSMOS(new Color(0xA276CB), new Color(0x223149)), + + HADAL(new Color(0x01015B), new Color(0x000000)), + SHAMAN(new Color(0xE0099B), new Color(0x720303)), + ASHEN(new Color(0x6D6872), new Color(0x223149)), + FRACKING(new Color(0xDAD3B8), new Color(0x223149)), + FATE(new Color(0x06B64D), new Color(0x193D05)), + GRAND_GARDEN(new Color(0x42801D), new Color(0x1D5703)), + ARCHITECT(new Color(0xD0FFE9), new Color(0x003588)), + INQUISITIVE(new Color(0xDCA260), new Color(0x666C77)), + HELLSMITH(new Color(0xEA5555), new Color(0x640529)), + RADOXIA(new Color(0x4D0E88), new Color(0x55647E)), + ABSENT(new Color(0xE1E1E1), new Color(0x9A9A9A)), + ILLUSIVE(new Color(0xEFFAAC), new Color(0x7C92B6)), + CONSTRUCTIVE(new Color(0xCBA676), new Color(0x464922)), + PRISMATIC(new Color(0x76CB87), new Color(0x436CAD)), + HYDRAULIC(new Color(0x715F81), new Color(0x0F521F)), + COBBLED(new Color(0x6A6272), new Color(0x323741)), + EXHAUSTIVE(new Color(0x4F625B), new Color(0x3A4350)), + VIRTUE(new Color(0x6BD1D5), new Color(0x223149)), + + ; + + public static final CosmicBeesHoneyComb[] VALUES = values(); + + public final String name; + public final int primaryColor; + public final int secondaryColor; + + CosmicBeesHoneyComb(Color primary, Color secondary) { + this(primary, secondary, null); + } + + CosmicBeesHoneyComb(Color primary, Color secondary, String compatName) { + this.name = toString().toLowerCase(Locale.ENGLISH); + this.primaryColor = primary.getRGB(); + this.secondaryColor = secondary.getRGB(); + } + + @Override + public String getSerializedName() { + return name; + } + + public static CosmicBeesHoneyComb get(int meta) { + if (meta >= VALUES.length) { + meta = 0; + } + return VALUES[meta]; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/item/CosmicBeesItemHoneyComb.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/item/CosmicBeesItemHoneyComb.java new file mode 100644 index 000000000..4988dac2a --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/item/CosmicBeesItemHoneyComb.java @@ -0,0 +1,30 @@ +package com.ghostipedia.cosmiccore.common.item; + +import net.minecraft.world.item.ItemStack; + +import forestry.core.items.ItemForestry; +import forestry.core.items.definitions.IColoredItem; + +public class CosmicBeesItemHoneyComb extends ItemForestry implements IColoredItem { + + private final CosmicBeesHoneyComb type; + + public CosmicBeesItemHoneyComb(CosmicBeesHoneyComb type) { + this.type = type; + } + + public CosmicBeesHoneyComb getType() { + return type; + } + + @Override + public int getColorFromItemStack(ItemStack itemstack, int tintIndex) { + CosmicBeesHoneyComb honeyComb = this.type; + + if (tintIndex == 1) { + return honeyComb.primaryColor; + } else { + return honeyComb.secondaryColor; + } + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/item/CosmicScytheItem.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/item/CosmicScytheItem.java new file mode 100644 index 000000000..2e8f623f7 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/item/CosmicScytheItem.java @@ -0,0 +1,259 @@ +package com.ghostipedia.cosmiccore.common.item; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.IElectricItem; + +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Tier; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.CapabilityManager; +import net.minecraftforge.common.capabilities.CapabilityToken; +import net.minecraftforge.common.capabilities.ICapabilityProvider; +import net.minecraftforge.common.util.LazyOptional; + +import com.sammy.malum.common.enchantment.scythe.AscensionEnchantment; +import com.sammy.malum.common.enchantment.scythe.ReboundEnchantment; +import com.sammy.malum.common.item.curiosities.weapons.scythe.MalumScytheItem; +import com.sammy.malum.registry.common.DamageTypeRegistry; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +import static com.sammy.malum.registry.common.item.EnchantmentRegistry.ASCENSION; +import static com.sammy.malum.registry.common.item.EnchantmentRegistry.REBOUND; + +public class CosmicScytheItem extends MalumScytheItem { + + public static final long CAPACITY = 2_000_000L; + public static final int GT_TIER = GTValues.HV; + public static long DRAIN_RATE = 2048; + + public static final int USE_HIT = 2048; + public static final int USE_SLASH = 2048; + public static final int USE_ASCENSION = 4300; + public static final int USE_REBOUND = 4300; + + @Getter + private final String chargeTag = "gt_charge"; + + public CosmicScytheItem(Tier tier, float attackDamageIn, float attackSpeedIn, Properties builderIn) { + super(tier, attackDamageIn, attackSpeedIn, builderIn.stacksTo(1)); + } + + public long getCharge(ItemStack stack) { + CompoundTag tag = stack.getOrCreateTag(); + return tag.getLong(chargeTag); + } + + public void setCharge(ItemStack stack, long value) { + stack.getOrCreateTag().putLong(chargeTag, (long) Mth.clamp(value, 0L, CAPACITY)); + } + + private boolean tryConsume(ItemStack stack, int eu) { + long cur = getCharge(stack); + if (cur < eu) return false; + setCharge(stack, cur - eu); + return true; + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (stack.getEnchantmentLevel(REBOUND.get()) > 0) { + if (tryConsume(stack, USE_REBOUND)) { + ReboundEnchantment.throwScythe(level, player, hand, stack); + return InteractionResultHolder.success(stack); + } + } + + if (stack.getEnchantmentLevel(ASCENSION.get()) > 0) { + if (tryConsume(stack, USE_ASCENSION)) { + AscensionEnchantment.triggerAscension(level, player, hand, stack); + return InteractionResultHolder.success(stack); + } + } + + player.sendSystemMessage(Component.literal("charge=" + getCharge(stack))); + return super.use(level, player, hand); + } + + @Override + public boolean hurtEnemy(ItemStack stack, LivingEntity target, LivingEntity attacker) { + tryConsume(stack, USE_HIT); + return super.hurtEnemy(stack, target, attacker); + } + + @Override + public void hurtEvent(net.neoforged.neoforge.event.entity.living.LivingHurtEvent event, LivingEntity attacker, + LivingEntity target, ItemStack stack) { + super.hurtEvent(event, attacker, target, stack); + if (event.getSource().is(DamageTypeRegistry.SCYTHE_SWEEP)) { + tryConsume(stack, USE_SLASH); + } + } + + @Override + public boolean isDamageable(ItemStack stack) { + return false; + } + + @Override + public boolean isRepairable(ItemStack stack) { + return false; + } + + @Override + public boolean isBarVisible(ItemStack stack) { + return true; + } + + @Override + public int getBarWidth(ItemStack stack) { + return (int) Math.round(13.0 * getCharge(stack) / (double) CAPACITY); + } + + @Override + public int getBarColor(ItemStack stack) { + return 0x55D8FF; + } + + @Override + public boolean isEnchantable(ItemStack stack) { + return true; + } + + @Override + public int getEnchantmentValue() { + return 14; + } + + // This works! + @Override + public boolean isBookEnchantable(ItemStack stack, ItemStack book) { + return true; + } + + // This *kind of* works, it makes it so the anvil works but NOT the table!?!?!?!? AUGGGGHG + @Override + public boolean canApplyAtEnchantingTable(ItemStack stack, Enchantment enchantment) { + if (enchantment.equals(REBOUND.get())) { + return true; + } + return super.canApplyAtEnchantingTable(stack, enchantment); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltipComponents, + TooltipFlag isAdvanced) { + tooltipComponents.add(Component.translatable("tooltip.gt_scythe.energy", getCharge(stack), CAPACITY)); + tooltipComponents.add(Component.translatable("tooltip.gt_scythe.per_hit", USE_HIT)); + super.appendHoverText(stack, level, tooltipComponents, isAdvanced); + } + + private static final Capability ELECTRIC_CAP = CapabilityManager + .get(new CapabilityToken() {}); + + @Override + public @Nullable ICapabilityProvider initCapabilities(ItemStack stack, @Nullable CompoundTag nbt) { + ICapabilityProvider parent = super.initCapabilities(stack, nbt); + ElectricItemCap electric = new ElectricItemCap(stack); + if (parent == null) return electric; + return new ICapabilityProvider() { + + private final LazyOptional self = LazyOptional.of(() -> electric); + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + if (cap == ELECTRIC_CAP) return self.cast(); + return parent.getCapability(cap, side); + } + }; + } + + public final class ElectricItemCap implements ICapabilityProvider, IElectricItem { + + private final ItemStack stack; + + public ElectricItemCap(ItemStack stack) { + this.stack = stack; + } + + @Override + public boolean canProvideChargeExternally() { + return false; + } + + @Override + public boolean chargeable() { + return true; + } + + @Override + public long charge(long amount, int chargerTier, boolean ignoreTransferLimit, boolean simulate) { + if (chargerTier < GT_TIER) return 0; + long chargeLimit = ignoreTransferLimit ? amount : Math.min(amount, getTransferLimit()); + long currentCharge = CosmicScytheItem.this.getCharge(stack); + long space = CAPACITY - currentCharge; + long accept = Math.min(chargeLimit, space); + + if (!simulate && accept > 0) { + CosmicScytheItem.this.setCharge(stack, currentCharge + accept); + } + return accept; + } + + @Override + public long discharge(long amount, int dischargerTier, boolean ignoreTransferLimit, boolean externally, + boolean simulate) { + if (externally && !canProvideChargeExternally()) return 0; + if (dischargerTier < GT_TIER) return 0; + long dischargeLimit = ignoreTransferLimit ? amount : Math.min(amount, getTransferLimit()); + long currentCharge = CosmicScytheItem.this.getCharge(stack); + long extracted = Math.min(dischargeLimit, currentCharge); + if (!simulate && extracted > 0) CosmicScytheItem.this.setCharge(stack, currentCharge - extracted); + return extracted; + } + + @Override + public long getTransferLimit() { + return DRAIN_RATE; + } + + @Override + public long getMaxCharge() { + return CAPACITY; + } + + @Override + public long getCharge() { + return CosmicScytheItem.this.getCharge(stack); + } + + @Override + public int getTier() { + return GT_TIER; + } + + private final LazyOptional thisSelfWhatDoICallThis = LazyOptional.of(() -> this); + + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability capability, @Nullable Direction side) { + if (capability == ELECTRIC_CAP) return thisSelfWhatDoICallThis.cast(); + return LazyOptional.empty(); + } + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/IndustrialApiaryMachine.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/IndustrialApiaryMachine.java new file mode 100644 index 000000000..fdf5d5c66 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/IndustrialApiaryMachine.java @@ -0,0 +1,283 @@ +package com.ghostipedia.cosmiccore.common.machine; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.IWorkable; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.UITemplate; +import com.gregtechceu.gtceu.api.gui.fancy.TabsWidget; +import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.WorkableTieredMachine; +import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CombinedDirectionalFancyConfigurator; +import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; +import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; +import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.widget.*; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.core.Direction; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +import forestry.api.ForestryCapabilities; +import forestry.api.apiculture.genetics.IBee; +import forestry.api.apiculture.genetics.IBeeSpecies; +import forestry.api.genetics.alleles.BeeChromosomes; +import forestry.api.genetics.alleles.ForestryAlleles; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +// TOOD: IAutoOutputItem +// Just wanna make it work first ngl +public class IndustrialApiaryMachine extends WorkableTieredMachine implements IFancyUIMachine, IMachineLife, IWorkable { + + @Getter + private int beeTier; + + @Getter + @Setter + protected int beeProduct; + + // TODO; Might need more vars for the math behind the logic, but these i put in for the TL keys + + @Getter + private int machineTier; + + @Getter + private int duration; + + @Persisted + @Getter + protected final NotifiableFluidTank tank; + + @Persisted + @Getter + protected final NotifiableItemStackHandler itemCacheIn; + + @Getter + int productionAmplifier; + protected boolean allowInputFromOutputSideItems; + + public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + IndustrialApiaryMachine.class, WorkableTieredMachine.MANAGED_FIELD_HOLDER); + + public IndustrialApiaryMachine(IMachineBlockEntity holder, int beeTier) { + super(holder, beeTier, (ignored) -> 0); + this.beeTier = beeTier; + this.tank = createTank(); + this.itemCacheIn = createStorageCache(); + } + + @Override + public @NotNull ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + protected NotifiableFluidTank createTank(Object... args) { + return new NotifiableFluidTank(this, 1, 16000, IO.BOTH); + } + + // For Input i tems + protected NotifiableItemStackHandler createStorageCache(Object... args) { + return new NotifiableItemStackHandler(this, 1, IO.IN, IO.IN); + } + + // Attempting to set the non-override from 9 to 12 (with override) + @Override + protected @NotNull NotifiableItemStackHandler createExportItemHandler(Object... args) { + return new NotifiableItemStackHandler(this, 12, IO.OUT, IO.OUT); + } + + @Override + public ModularUI createUI(Player entityPlayer) { + // spotless:off + + var text = new WidgetGroup(0, 0, 176, 164); + text.addWidget(new LabelWidget(9, 5, "gui.cosmiccore.iapiary")); //Note: canTakeItems would probably be what we want to lock? idk can we do that dynamically??? + int groupOutX = 113; + int groupOutY = 7; + var group = new WidgetGroup(0, 0, 176, 164); + //TODO: canTakeItems would probably be what we want to lock when running? idk can we do that dynamically??? We want to lock the queen to this Ind.Apiary to avoid people cycling them across several manually or otherwise! + group.addWidget(new SlotWidget(getItemCacheIn().storage, 0, 8, groupOutY+15, true, true).setBackground(GuiTextures.SLOT)); + //TODO : PROGRESS WIDGET, I'm assuming we'll have a way to track progress in recipeLogic and then make the bar show// between the input slot and the outputs group.addWidget(new ProgressWidget()); + group.addWidget(new SlotWidget(this.exportItems, 0, groupOutX, groupOutY, true, false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems, 1, groupOutX + 18, groupOutY, true, false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems, 2, groupOutX + 36, groupOutY, true, false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems, 3, groupOutX, groupOutY + 18, true, false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems, 4, groupOutX + 18, groupOutY + 18, true, false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems, 5, groupOutX + 36, groupOutY + 18, true, false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems, 6, groupOutX, groupOutY + 36, true, false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems, 7, groupOutX + 18, groupOutY + 36, true, false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems, 8, groupOutX + 36, groupOutY + 36, true, false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems,9,groupOutX,groupOutY + 54,true,false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems,10,groupOutX + 18,groupOutY + 54,true,false).setBackground(GuiTextures.SLOT)); + group.addWidget(new SlotWidget(this.exportItems,11,groupOutX + 36,groupOutY + 54,true,false).setBackground(GuiTextures.SLOT)); + group.addWidget(new DraggableScrollableWidgetGroup(6, 46, 104, 34).setBackground(GuiTextures.BACKGROUND_INVERSE)); + + + return new ModularUI(176, 164, this, entityPlayer) + .background(GuiTextures.BACKGROUND) + .widget(group) + .widget(text) + .widget(UITemplate.bindPlayerInventory(entityPlayer.getInventory(), GuiTextures.SLOT, 7, 84, true)); + // spotless:on + } + + @Override + public void attachSideTabs(TabsWidget sideTabs) { + var directionalConfigurator = CombinedDirectionalFancyConfigurator.of(self(), self()); + if (directionalConfigurator != null) + sideTabs.attachSubTab(directionalConfigurator); + } + + // TODO: HELP IM SCARED + @Override + protected @NotNull RecipeLogic createRecipeLogic(Object @NotNull... args) { + return new IndustrialApiaryMachine.BeeRecipeLogic(this); + } + + @Override + public boolean shouldWeatherOrTerrainExplosion() { + return false; + } + + public static class BeeRecipeLogic extends RecipeLogic { + + int beeTier; + public int beeProduct; + + public BeeRecipeLogic(IndustrialApiaryMachine machine) { + super(machine); + this.beeTier = machine.getTier(); + } + + // Just doing production Mult now + private final List productionMultipliers = List.of(0.25f, 0.5f, 0.75f, 1f, 1.25f, 2.5f, 4f); + + @Override + public @NotNull Iterator searchRecipe() { + var itemHandlers = machine.getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP); + for (var handler : itemHandlers) { + if (!(handler instanceof NotifiableItemStackHandler itemHandler)) continue; + for (var content : itemHandler.getContents()) { + if (!(content instanceof ItemStack stack)) continue; + + // Check if it's a Forestry Handler Item + var optionalCap = stack.getCapability(ForestryCapabilities.INDIVIDUAL_HANDLER_ITEM, + (Direction) null); + if (!optionalCap.isPresent()) continue; + var cap = optionalCap.resolve().get(); + + // Check if it's a bee + var individual = cap.getIndividual(); + if (!(individual instanceof IBee bee)) continue; + var genome = bee.getGenome(); + + // Generate recipe from bee + // TODO: Implement the rest of the logic + // TODO: Do we also want to do stuff with secondary species? reject if not equal? output a mix of + // both? + IBeeSpecies primary = genome.getActiveValue(BeeChromosomes.SPECIES); + IBeeSpecies secondary = genome.getInactiveValue(BeeChromosomes.SPECIES); + + // Forestry Genome Values: + + var lifespan = genome.getActiveAllele(BeeChromosomes.LIFESPAN); + // List.of(LIFESPAN_SHORTEST, LIFESPAN_SHORTER, LIFESPAN_SHORT, LIFESPAN_SHORTENED, LIFESPAN_NORMAL, + // LIFESPAN_ELONGATED, LIFESPAN_LONG, LIFESPAN_LONGER, LIFESPAN_LONGEST, LIFESPAN_IMMORTAL); + + var production = genome.getActiveAllele(BeeChromosomes.SPEED); + // List.of(SPEED_SLOWEST, SPEED_SLOWER, SPEED_SLOW, SPEED_NORMAL, SPEED_FAST, SPEED_FASTER, + // SPEED_FASTEST); + var productionIndex = ForestryAlleles.DEFAULT_SPEEDS.indexOf(production); + var productionMultiplier = productionMultipliers.get(productionIndex); + + // For other forestry genome values, see ForestryAlleles.java + + // Define the builder, add the outputs dynamically + var builder = GTRecipeBuilder + .of(CosmicCore.id("bee_recipe"), CosmicRecipeTypes.BEES) + .EUt(GTValues.VA[GTValues.LV]) + .duration((int) (20 * 480)); + + for (var product : primary.getProducts()) { + builder.chancedOutput( + new ItemStack( + product.item(), + (int) (16 + (productionMultiplier * 8) + (beeTier * 16))), + (int) (product.chance() * ChanceLogic.getMaxChancedValue()), + 0); + } + return Collections.singleton(builder.buildRawRecipe()).iterator(); + } + } + return Collections.emptyIterator(); + } + } + + // TODO: + // Grab Species, Lifespan, Production Speed, Flower(?) + + // By default, all I-Apiary runs are 60 seconds (Regardless of tier, tier will be used elsewhere) + + // Lifespan modifies this duration + /* + * Longest - 3x + * Longer - 2.5 + * Long - 1.5 + * Normal - 1 + * Short - 0.75 + * Shorter - 0.5 + * Shortest - 0.25 + */ + + // Production Speed Modifies the total Comb output (more on that below) + /* + * Fastest - 2x + * Faster - 1.5x + * Fast - 1.25x + * Normal - 1 + * Slow - 0.75 + * Slower - 0.5 + * Slowest - 0.25 + */ + + // To Determine how many combs are rewarded + + // Base Speed (60 seconds) always yields 20 combs + // Lifespan adds a linear multi, 3x Duration = 6x Yield (20 -> 120 combs) + // Production Speed adds a multiplier to the base value (20 * 2.5) + // Machine Tier adds a Flat Bonus to the default ( Extra +10 per tier ) + + // This is a math fiasco Idk how to solve so leaving my best examples on how the logic should work + + // The End result is basically, you stick a queen in an input slot, the queen gets locked to that slot, and the + // machine runs, ideally i don't want to have to make the player 'cycle' the queen once it's in because that just + // feels obnoxious! + + // TODO: Current Issues + // Fix UI text to not crash UI loading - can't reproduce! + // Tweak values (see above todo) - values tweaked + // Decide about second species - Don't do anything with them + // Re-implement IAutoOutputItem - will need help + // No configurable output for the output + // The UI doesn't have that top bar piece of the EIO selector thingy and idk where it is :cri: +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/HPCAGridHandler.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/HPCAGridHandler.java new file mode 100644 index 000000000..b033f9d09 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/HPCAGridHandler.java @@ -0,0 +1,436 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.electric.hpca; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.electric.hpca.componentWrappers.HPCAComponentHatchWrapper; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.IHPCAComponentHatch; +import com.gregtechceu.gtceu.api.capability.IHPCAComputationProvider; +import com.gregtechceu.gtceu.api.capability.IHPCACoolantProvider; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.utils.GTTransferUtils; + +import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; +import com.lowdragmc.lowdraglib.syncdata.IManaged; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.field.FieldManagedStorage; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.material.Fluid; +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; + +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public class HPCAGridHandler implements IManaged { + + @Getter + private final FieldManagedStorage syncStorage = new FieldManagedStorage(this); + + @Nullable + private final HPCAMachine controller; + + // structure info + private IHPCAComponentHatch[] components = new IHPCAComponentHatch[0]; + private final Set coolantProviders = new ObjectOpenHashSet<>(); + private final Set computationProviders = new ObjectOpenHashSet<>(); + private int numBridges; + + // transaction info + /** How much CWU/t is currently allocated for this tick. */ + @Getter + private int allocatedCWUt; + + @Getter + @DescSynced + private int arrayLength; + + @Getter + @DescSynced + private boolean isArrayComplete; + + // cached gui info + // holding these values past the computation clear because GUI is too "late" to read the state in time + @DescSynced + protected long cachedEUt; + @DescSynced + protected int cachedCWUt; + + public HPCAGridHandler(@Nullable HPCAMachine controller) { + this.controller = controller; + } + + public void onStructureFormed(Collection components, int arrayLength) { + reset(); + this.arrayLength = arrayLength; + this.components = new IHPCAComponentHatch[3 * arrayLength]; + this.isArrayComplete = components.size() == arrayLength * 3; + + int i = 0; + for (var comp : components) this.components[i++] = comp; + + for (HPCAComponentHatchWrapper component : components) { + var coolantProvider = component.getHPCACoolantProvider(); + if (coolantProvider != null) this.coolantProviders.add(coolantProvider); + var computationProvider = component.getHPCAComputationProvider(); + if (computationProvider != null) this.computationProviders.add(computationProvider); + if (component.isBridge()) this.numBridges++; + } + } + + public void onStructureInvalid() { + reset(); + } + + private void reset() { + clearComputationCache(); + components = new IHPCAComponentHatch[0]; + coolantProviders.clear(); + computationProviders.clear(); + numBridges = 0; + arrayLength = 0; + } + + void clearComputationCache() { + allocatedCWUt = 0; + } + + public void tick() { + if (cachedCWUt != allocatedCWUt) + cachedCWUt = allocatedCWUt; + cachedEUt = getCurrentEUt(); + if (allocatedCWUt != 0) + allocatedCWUt = 0; + } + + /** + * Calculate the temperature differential this tick given active computation and consume coolant. + * + * @param coolantTank The tank to drain coolant from. + * @param forceCoolWithActive Whether active coolers should forcibly cool even if temperature is already + * decreasing due to passive coolers. Used when the HPCA is running very hot. + * @return The temperature change, can be positive or negative. + */ + public double calculateTemperatureChange(IFluidHandler coolantTank, boolean forceCoolWithActive) { + // calculate temperature increase + int maxCWUt = Math.max(1, getMaxCWUt()); // avoids dividing by 0 and the behavior is no different + int maxCoolingDemand = getMaxCoolingDemand(); + + // temperature increase is proportional to the amount of actively used computation + // a * (b / c) + int temperatureIncrease = (int) Math.round(1.0 * maxCoolingDemand * allocatedCWUt / maxCWUt); + + // calculate temperature decrease + long maxPassiveCooling = 0; + long maxActiveCooling = 0; + int maxCoolantDrain = 0; + + for (var coolantProvider : coolantProviders) { + if (coolantProvider.isActiveCooler()) { + maxActiveCooling += coolantProvider.getCoolingAmount(); + maxCoolantDrain += coolantProvider.getMaxCoolantPerTick(); + } else { + maxPassiveCooling += coolantProvider.getCoolingAmount(); + } + } + + double temperatureChange = temperatureIncrease - maxPassiveCooling; + // quick exit if no active cooling/coolant drain is present + if (maxActiveCooling == 0 && maxCoolantDrain == 0) { + return temperatureChange; + } + if (forceCoolWithActive || maxActiveCooling <= temperatureChange) { + // try to fully utilize active coolers + FluidStack coolantStack = GTTransferUtils.drainFluidAccountNotifiableList(coolantTank, + getCoolantStack(maxCoolantDrain), IFluidHandler.FluidAction.EXECUTE); + if (!coolantStack.isEmpty()) { + long coolantDrained = coolantStack.getAmount(); + if (coolantDrained == maxCoolantDrain) { + // coolant requirement was fully met + temperatureChange -= maxActiveCooling; + } else { + // coolant requirement was only partially met, cool proportional to fluid amount drained + // a * (b / c) + temperatureChange -= maxActiveCooling * (1.0 * coolantDrained / maxCoolantDrain); + } + } + } else if (temperatureChange > 0) { + // try to partially utilize active coolers to stabilize to zero + double temperatureToDecrease = Math.min(temperatureChange, maxActiveCooling); + int coolantToDrain = Math.max(1, (int) (maxCoolantDrain * (temperatureToDecrease / maxActiveCooling))); + FluidStack coolantStack = GTTransferUtils.drainFluidAccountNotifiableList(coolantTank, + getCoolantStack(coolantToDrain), IFluidHandler.FluidAction.EXECUTE); + if (!coolantStack.isEmpty()) { + int coolantDrained = coolantStack.getAmount(); + if (coolantDrained == coolantToDrain) { + // successfully stabilized to zero + return 0; + } else { + // coolant requirement was only partially met, cool proportional to fluid amount drained + // a * (b / c) + temperatureChange -= temperatureToDecrease * (1.0 * coolantDrained / coolantToDrain); + } + } + } + return temperatureChange; + } + + /** + * Get the coolant stack for this HPCA. Eventually this could be made more diverse with different + * coolants from different Active Cooler components, but currently it is just a fixed Fluid. + */ + public FluidStack getCoolantStack(int amount) { + return new FluidStack(getCoolant(), amount); + } + + private Fluid getCoolant() { + return GTMaterials.PCBCoolant.getFluid(); + } + + /** + * Roll a 1/200 chance to damage a HPCA component marked as damageable. Randomly selects the component. + * If called every tick, this succeeds on average once every 10 seconds. + */ + public void attemptDamageHPCA() { + // 1% chance each tick to damage a component if running too hot + if (GTValues.RNG.nextInt(200) == 0) { + // randomize which component is actually damaged + List candidates = new ArrayList<>(); + for (var component : components) { + if (component == null) continue; + if (component.canBeDamaged()) { + candidates.add(component); + } + } + if (!candidates.isEmpty()) { + candidates.get(GTValues.RNG.nextInt(candidates.size())).setDamaged(true); + } + } + } + + /** Allocate computation on a given request. Allocates for one tick. */ + public int allocateCWUt(int cwut, boolean simulate) { + if (!isArrayComplete) return 0; + int maxCWUt = getMaxCWUt(); + int availableCWUt = maxCWUt - this.allocatedCWUt; + int toAllocate = Math.min(cwut, availableCWUt); + if (!simulate) { + this.allocatedCWUt += toAllocate; + } + return toAllocate; + } + + /** The maximum amount of CWUs (Compute Work Units) created per tick. */ + public int getMaxCWUt() { + int maxCWUt = 0; + for (var computationProvider : computationProviders) { + maxCWUt += computationProvider.getCWUPerTick(); + } + return maxCWUt; + } + + /** The current EU/t this HPCA should use, considering passive drain, current computation, etc.. */ + public long getCurrentEUt() { + if (!isArrayComplete) return 0L; + long maximumCWUt = Math.max(1, getMaxCWUt()); // behavior is no different setting this to 1 if it is 0 + long maximumEUt = getMaxEUt(); + long upkeepEUt = getUpkeepEUt(); + + if (maximumEUt == upkeepEUt) { + return maximumEUt; + } + + // energy draw is proportional to the amount of actively used computation + // a + c(b - a) / d + return upkeepEUt + ((maximumEUt - upkeepEUt) * allocatedCWUt / maximumCWUt); + } + + /** The amount of EU/t this HPCA uses just to stay on with 0 output computation. */ + public long getUpkeepEUt() { + long upkeepEUt = 0; + for (var component : components) { + if (component == null) continue; + upkeepEUt += component.getUpkeepEUt(); + } + return upkeepEUt; + } + + /** The maximum EU/t that this HPCA could ever use with the given configuration. */ + public long getMaxEUt() { + long maximumEUt = 0; + for (var component : components) { + if (component == null) continue; + maximumEUt += component.getMaxEUt(); + } + return maximumEUt; + } + + /** Whether this HPCA has a Bridge to allow connecting to other HPCA's */ + public boolean hasHPCABridge() { + return numBridges > 0; + } + + /** Whether this HPCA has any cooling providers which are actively cooled. */ + public boolean hasActiveCoolers() { + for (var coolantProvider : coolantProviders) { + if (coolantProvider.isActiveCooler()) return true; + } + return false; + } + + /** How much cooling this HPCA can provide. NOT related to coolant fluid consumption. */ + public int getMaxCoolingAmount() { + int maxCooling = 0; + for (var coolantProvider : coolantProviders) { + maxCooling += coolantProvider.getCoolingAmount(); + } + return maxCooling; + } + + /** How much cooling this HPCA can require. NOT related to coolant fluid consumption. */ + public int getMaxCoolingDemand() { + int maxCooling = 0; + for (var computationProvider : computationProviders) { + maxCooling += computationProvider.getCoolingPerTick(); + } + return maxCooling; + } + + /** How much coolant this HPCA can consume in a tick, in mB/t. */ + public int getMaxCoolantDemand() { + int maxCoolant = 0; + for (var coolantProvider : coolantProviders) { + maxCoolant += coolantProvider.getMaxCoolantPerTick(); + } + return maxCoolant; + } + + public void addInfo(List textList) { + // Max Computation + MutableComponent data = Component.literal(Integer.toString(getMaxCWUt())).withStyle(ChatFormatting.AQUA); + textList.add(Component.translatable("gtceu.multiblock.hpca.info_max_computation", data) + .withStyle(ChatFormatting.GRAY)); + + // Cooling + ChatFormatting coolingColor = getMaxCoolingAmount() < getMaxCoolingDemand() ? ChatFormatting.RED : + ChatFormatting.GREEN; + data = Component.literal(Integer.toString(getMaxCoolingDemand())).withStyle(coolingColor); + textList.add(Component.translatable("gtceu.multiblock.hpca.info_max_cooling_demand", data) + .withStyle(ChatFormatting.GRAY)); + + data = Component.literal(Integer.toString(getMaxCoolingAmount())).withStyle(coolingColor); + textList.add(Component.translatable("gtceu.multiblock.hpca.info_max_cooling_available", data) + .withStyle(ChatFormatting.GRAY)); + + // Coolant Required + if (getMaxCoolantDemand() > 0) { + data = Component.translatable("gtceu.universal.liters", getMaxCoolantDemand()) + .withStyle(ChatFormatting.YELLOW).append(" "); + Component coolantName = Component.translatable("gtceu.multiblock.hpca.info_coolant_name") + .withStyle(ChatFormatting.YELLOW); + data.append(coolantName); + } else { + data = Component.literal("0").withStyle(ChatFormatting.GREEN); + } + textList.add(Component.translatable("gtceu.multiblock.hpca.info_max_coolant_required", data) + .withStyle(ChatFormatting.GRAY)); + + // Bridging + if (numBridges > 0) { + textList.add(Component.translatable("gtceu.multiblock.hpca.info_bridging_enabled") + .withStyle(ChatFormatting.GREEN)); + } else { + textList.add(Component.translatable("gtceu.multiblock.hpca.info_bridging_disabled") + .withStyle(ChatFormatting.RED)); + } + } + + public void addWarnings(List textList) { + List warnings = new ArrayList<>(); + if (numBridges > 1) { + warnings.add(Component.translatable("gtceu.multiblock.hpca.warning_multiple_bridges") + .withStyle(ChatFormatting.GRAY)); + } + if (computationProviders.isEmpty()) { + warnings.add(Component.translatable("gtceu.multiblock.hpca.warning_no_computation") + .withStyle(ChatFormatting.GRAY)); + } + if (getMaxCoolingDemand() > getMaxCoolingAmount()) { + warnings.add(Component.translatable("gtceu.multiblock.hpca.warning_low_cooling") + .withStyle(ChatFormatting.GRAY)); + } + if (!warnings.isEmpty()) { + textList.add(Component.translatable("gtceu.multiblock.hpca.warning_structure_header") + .withStyle(ChatFormatting.YELLOW)); + textList.addAll(warnings); + } + } + + public void addErrors(List textList) { + if (Arrays.stream(components).filter(Objects::nonNull).anyMatch(IHPCAComponentHatch::isDamaged)) { + textList.add( + Component.translatable("gtceu.multiblock.hpca.error_damaged").withStyle(ChatFormatting.RED)); + } + if (Arrays.stream(components).anyMatch(Objects::isNull)) { + textList.add( + Component.translatable("cosmiccore.multiblock.hpca.incomplete-array") + .withStyle(ChatFormatting.RED)); + } + } + + public ResourceTexture getComponentTexture(int index) { + if (components.length <= index || components[index] == null) { + return GuiTextures.BLANK_TRANSPARENT; + } + return components[index].getComponentIcon(); + } + + public void tryGatherClientComponents(Level world, BlockPos pos, Direction frontFacing, + Direction upwardsFacing, boolean flip) { + Direction relativeUp = RelativeDirection.UP.getRelative(frontFacing, upwardsFacing, flip); + + BlockPos testPos = pos + .relative(frontFacing.getOpposite(), arrayLength) + .relative(relativeUp, 3); + + this.components = new IHPCAComponentHatch[3 * arrayLength]; + + for (int i = 0; i < 3; i++) { + for (int j = 0; j < arrayLength; j++) { + var index = i * arrayLength + j; + BlockPos tempPos = testPos.relative(frontFacing, j).relative(relativeUp.getOpposite(), i); + BlockEntity be = world.getBlockEntity(tempPos); + if (be instanceof IHPCAComponentHatch hatch) { + components[index] = hatch; + } else if (be instanceof BlockEntityCreationInfo machineBE) { + MetaMachine machine = machineBE; + if (machine instanceof IHPCAComponentHatch hatch) { + components[index] = hatch; + } + } else components[index] = null; + } + } + } + + public void clearClientComponents() { + components = new IHPCAComponentHatch[0]; + } + + + @Override + public void onChanged() { + controller.onChanged(); + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/HPCAMachine.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/HPCAMachine.java new file mode 100644 index 000000000..4752424da --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/HPCAMachine.java @@ -0,0 +1,371 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.electric.hpca; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.electric.hpca.componentWrappers.HPCAComponentHatchWrapper; +import com.ghostipedia.cosmiccore.common.machine.multiblock.part.HPCAIndicatorPartMachine; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.IControllable; +import com.gregtechceu.gtceu.api.capability.IEnergyContainer; +import com.gregtechceu.gtceu.api.capability.IHPCAComponentHatch; +import com.gregtechceu.gtceu.api.capability.IOpticalComputationProvider; +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.util.TimedProgressSupplier; +import com.gregtechceu.gtceu.api.gui.widget.ExtendedProgressWidget; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.misc.EnergyContainerList; +import com.gregtechceu.gtceu.api.transfer.fluid.FluidHandlerList; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.FormattingUtil; +import com.gregtechceu.gtceu.utils.GTUtil; + +import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; +import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; +import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; +import com.lowdragmc.lowdraglib.gui.widget.*; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.DropSaved; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.server.TickTask; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; + +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.function.Supplier; + +public class HPCAMachine extends WorkableElectricMultiblockMachine + implements IOpticalComputationProvider, IControllable, IDropSaveMachine { + + + public static final int MIN_COMPONENTS_SLICES = 3; + public static final int MAX_COMPONENTS_SLICES = 15; + private static final double IDLE_TEMPERATURE = 200; + private static final double DAMAGE_TEMPERATURE = 1000; + + private IMaintenanceMachine maintenance; + private IEnergyContainer energyContainer; + private IFluidHandler coolantHandler; + @Persisted + @DescSynced + private final HPCAGridHandler hpcaHandler; + + private boolean hasNotEnoughEnergy; + + @Persisted + private double temperature = IDLE_TEMPERATURE; // start at idle temperature + private final TimedProgressSupplier progressSupplier; + + @Nullable + protected TickableSubscription tickSubs; + + @Persisted + @DescSynced + @DropSaved + private long seed = 0L; + private HPCAModifier[] hpcaModifiers; + + @Override + public void onMachinePlaced(@Nullable LivingEntity player, ItemStack stack) { + super.onMachinePlaced(player, stack); + if (seed == 0L) this.seed = GTValues.RNG.nextLong(); + } + + public HPCAMachine(BlockEntityCreationInfo holder, Object... args) { + super(holder, args); + this.energyContainer = new EnergyContainerList(new ArrayList<>()); + this.progressSupplier = new TimedProgressSupplier(200, 47, false); + this.hpcaHandler = new HPCAGridHandler(this); + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + List energyContainers = new ArrayList<>(); + List coolantContainers = new ArrayList<>(); + List componentHatches = new ArrayList<>(); + + int indicatorCounter = 0; + + Map ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", Long2ObjectMaps::emptyMap); + for (IMultiPart part : getParts()) { + var pos = part.self().getBlockPos(); + IO io = ioMap.getOrDefault(pos.asLong(), IO.BOTH); + if (part instanceof IHPCAComponentHatch componentHatch) { + componentHatches.add( + new HPCAComponentHatchWrapper(componentHatch, getColumnModifier(pos), getRowModifier(pos))); + } + if (part instanceof IMaintenanceMachine maintenanceMachine) + maintenance = maintenanceMachine; + if (part instanceof HPCAIndicatorPartMachine) indicatorCounter++; + if (io == IO.NONE || io == IO.OUT) continue; + var handlerLists = part.getRecipeHandlers(); + for (var handlerList : handlerLists) { + if (!handlerList.isValid(io)) continue; + handlerList.getCapability(EURecipeCapability.CAP).stream() + .filter(IEnergyContainer.class::isInstance) + .map(IEnergyContainer.class::cast) + .forEach(energyContainers::add); + handlerList.getCapability(FluidRecipeCapability.CAP).stream() + .filter(IFluidHandler.class::isInstance) + .map(IFluidHandler.class::cast) + .forEach(coolantContainers::add); + } + } + this.energyContainer = new EnergyContainerList(energyContainers); + this.coolantHandler = new FluidHandlerList(coolantContainers); + this.hpcaHandler.onStructureFormed(componentHatches, indicatorCounter - 3); + + if (getLevel() instanceof ServerLevel serverLevel) + serverLevel.getServer().tell(new TickTask(0, this::updateTickSubscription)); + } + + @Override + public void onLoad() { + super.onLoad(); + if (getLevel() instanceof ServerLevel serverLevel) { + serverLevel.getServer().tell(new TickTask(0, this::updateTickSubscription)); + } + } + + @Override + public void onUnload() { + super.onUnload(); + if (tickSubs != null) { + tickSubs.unsubscribe(); + tickSubs = null; + } + } + + protected void updateTickSubscription() { + if (isFormed) { + tickSubs = subscribeServerTick(tickSubs, this::tick); + } else if (tickSubs != null) { + tickSubs.unsubscribe(); + tickSubs = null; + } + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + this.energyContainer = new EnergyContainerList(new ArrayList<>()); + this.hpcaHandler.onStructureInvalid(); + } + + @Override + public int requestCWUt(int cwut, boolean simulate, @NotNull Collection seen) { + seen.add(this); + return isActive() && isWorkingEnabled() && !hasNotEnoughEnergy ? hpcaHandler.allocateCWUt(cwut, simulate) : 0; + } + + @Override + public int getMaxCWUt(@NotNull Collection seen) { + seen.add(this); + return isActive() && isWorkingEnabled() ? hpcaHandler.getMaxCWUt() : 0; + } + + @Override + public boolean canBridge(@NotNull Collection seen) { + seen.add(this); + return !isFormed() || hpcaHandler.hasHPCABridge(); + } + + public void tick() { + if (isWorkingEnabled()) consumeEnergy(); + if (isActive()) { + // forcibly use active coolers at full rate if temperature is half-way to damaging temperature + double midpoint = (DAMAGE_TEMPERATURE - IDLE_TEMPERATURE) / 2; + double temperatureChange = hpcaHandler.calculateTemperatureChange(coolantHandler, temperature >= midpoint) / + 2.0; + if (temperature + temperatureChange <= IDLE_TEMPERATURE) { + temperature = IDLE_TEMPERATURE; + } else { + temperature += temperatureChange; + } + if (temperature >= DAMAGE_TEMPERATURE) { + hpcaHandler.attemptDamageHPCA(); + } + hpcaHandler.tick(); + } else { + hpcaHandler.clearComputationCache(); + // passively cool (slowly) if not active + temperature = Math.max(IDLE_TEMPERATURE, temperature - 0.25); + } + } + + private void consumeEnergy() { + long energyToConsume = hpcaHandler.getCurrentEUt(); + boolean hasMaintenance = ConfigHolder.INSTANCE.machines.enableMaintenance && this.maintenance != null; + if (hasMaintenance) { + // 10% more energy per maintenance problem + energyToConsume += maintenance.getNumMaintenanceProblems() * energyToConsume / 10; + } + + if (this.hasNotEnoughEnergy && energyContainer.getInputPerSec() > 19L * energyToConsume) { + this.hasNotEnoughEnergy = false; + } + + if (this.energyContainer.getEnergyStored() >= energyToConsume) { + if (!hasNotEnoughEnergy) { + long consumed = this.energyContainer.removeEnergy(energyToConsume); + if (consumed == energyToConsume) { + getRecipeLogic().setStatus(RecipeLogic.Status.WORKING); + } else { + this.hasNotEnoughEnergy = true; + getRecipeLogic().setStatus(RecipeLogic.Status.WAITING); + } + } + } else { + this.hasNotEnoughEnergy = true; + getRecipeLogic().setStatus(RecipeLogic.Status.WAITING); + } + } + + @Override + public Widget createUIWidget() { + var width = Math.max((8 + 15 * hpcaHandler.getArrayLength()), 182); + WidgetGroup builder = new WidgetGroup(0, 0, width + 8, 117 + 8); + builder.addWidget(new DraggableScrollableWidgetGroup(4, 4, width, 117).setBackground(getScreenTexture()) + .addWidget(new LabelWidget(4, 5, self().getBlockState().getBlock().getDescriptionId())) + .addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) + .textSupplier(this.getLevel().isClientSide ? null : this::addDisplayText).setMaxWidthLimit(200) + .clickHandler(this::handleDisplayClick))); + builder.setBackground(GuiTextures.BACKGROUND_INVERSE); + + int startX = 4 + (width - 15 * hpcaHandler.getArrayLength()) / 2; + int startY = 59; + + var texture = new ResourceTexture( + "cosmiccore:textures/gui/widget/hpca/component_outline_" + hpcaHandler.getArrayLength() + ".png"); + + // Create the hover grid + builder.addWidget(new ExtendedProgressWidget( + () -> hpcaHandler.getAllocatedCWUt() > 0 ? progressSupplier.getAsDouble() : 0, + startX, 57, 15 * hpcaHandler.getArrayLength() + 2, 47, texture) + .setServerTooltipSupplier(hpcaHandler::addInfo) + .setFillDirection(ProgressTexture.FillDirection.LEFT_TO_RIGHT)); + + startX += 2; + + // we need to know what components we have on the client + if (getLevel().isClientSide) { + if (isFormed) { + hpcaHandler.tryGatherClientComponents(this.getLevel(), this.getBlockPos(), this.getFrontFacing(), + this.getUpwardsFacing(), this.isFlipped); + } else { + hpcaHandler.clearClientComponents(); + } + } + + for (int i = 0; i < 3; i++) { + for (int j = 0; j < hpcaHandler.getArrayLength(); j++) { + final int index = i * hpcaHandler.getArrayLength() + j; + Supplier textureSupplier = () -> hpcaHandler.getComponentTexture(index); + builder.addWidget(new ImageWidget(startX + (15 * j), startY + (15 * i), 13, 13, textureSupplier)); + } + } + + builder.addWidget(new ComponentPanelWidget(8, 108, this.hpcaHandler::addErrors) + .textSupplier(this.getLevel().isClientSide ? null : this.hpcaHandler::addErrors).setMaxWidthLimit(200)); + + return builder; + } + + @Override + public void addDisplayText(List textList) { + MultiblockDisplayText.builder(textList, isFormed()) + .setWorkingStatus(true, hpcaHandler.getAllocatedCWUt() > 0) // transform into two-state system for + // display + .setWorkingStatusKeys( + "gtceu.multiblock.idling", + "gtceu.multiblock.idling", + "gtceu.multiblock.data_bank.providing") + .addCustom(tl -> { + if (isFormed()) { + // Energy Usage + tl.add(Component.translatable( + "gtceu.multiblock.hpca.energy", + FormattingUtil.formatNumbers(hpcaHandler.cachedEUt), + FormattingUtil.formatNumbers(hpcaHandler.getMaxEUt()), + GTValues.VNF[GTUtil.getTierByVoltage(hpcaHandler.getMaxEUt())]) + .withStyle(ChatFormatting.GRAY)); + + // Provided Computation + Component cwutInfo = Component.literal( + hpcaHandler.cachedCWUt + " / " + hpcaHandler.getMaxCWUt() + " CWU/t") + .withStyle(ChatFormatting.AQUA); + tl.add(Component.translatable( + "gtceu.multiblock.hpca.computation", + cwutInfo).withStyle(ChatFormatting.GRAY)); + } + }) + .addWorkingStatusLine(); + } + + private ChatFormatting getDisplayTemperatureColor() { + if (temperature < 500) { + return ChatFormatting.GREEN; + } else if (temperature < 750) { + return ChatFormatting.YELLOW; + } + return ChatFormatting.RED; + } + + + private int getModifierIndex(BlockPos pos) { + var index = 0; + var verticalDelta = Math.abs(pos.getY() - getBlockPos().getY()); + var horizontalDelta = Math.abs(pos.getX() - getBlockPos().getX()) + Math.abs(pos.getZ() - getBlockPos().getZ()); + if (verticalDelta < 4) index = verticalDelta; + else index = horizontalDelta + 3; + return index - 1; + } + + public HPCAModifier[] getModifierState() { + if (hpcaModifiers != null) return hpcaModifiers; + var state = new HPCAModifier[MAX_COMPONENTS_SLICES + 3]; + + var seededRandom = RandomSource.create(this.seed); + for (int i = 0; i < state.length; i++) state[i] = HPCAModifier.getRandomModifier(seededRandom); + this.hpcaModifiers = state; + return this.hpcaModifiers; + } + + public HPCAModifier getColumnModifier(BlockPos pos) { + var state = getModifierState(); + var horizontalDelta = Math.abs(pos.getX() - getBlockPos().getX()) + Math.abs(pos.getZ() - getBlockPos().getZ()); + if (horizontalDelta > MAX_COMPONENTS_SLICES) throw new IllegalStateException(); + return state[horizontalDelta + 3 - 1]; + } + + public HPCAModifier getRowModifier(BlockPos pos) { + var state = getModifierState(); + var verticalDelta = Math.abs(pos.getY() - getBlockPos().getY()); + if (verticalDelta > 3) throw new IllegalStateException(); + return state[verticalDelta - 1]; + } + + public HPCAModifier getModifier(BlockPos pos) { + var state = getModifierState(); + return state[getModifierIndex(pos)]; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/HPCAModifier.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/HPCAModifier.java new file mode 100644 index 000000000..82c00e765 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/HPCAModifier.java @@ -0,0 +1,25 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.electric.hpca; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; + +public enum HPCAModifier { + + RED(CosmicCore.id("block/overlay/machine/hpca/indicator_red")), + YELLOW(CosmicCore.id("block/overlay/machine/hpca/indicator_yellow")), + GREEN(CosmicCore.id("block/overlay/machine/hpca/indicator_green")); + + public static final HPCAModifier[] VALUES = values(); + + public final ResourceLocation overlay; + + HPCAModifier(ResourceLocation overlay) { + this.overlay = overlay; + } + + public static HPCAModifier getRandomModifier(RandomSource random) { + return VALUES[random.nextInt(VALUES.length)]; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/componentWrappers/AbstractHPCAComponentHatchWrapper.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/componentWrappers/AbstractHPCAComponentHatchWrapper.java new file mode 100644 index 000000000..31624587d --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/componentWrappers/AbstractHPCAComponentHatchWrapper.java @@ -0,0 +1,55 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.electric.hpca.componentWrappers; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.electric.hpca.HPCAModifier; + +import com.gregtechceu.gtceu.api.capability.IHPCAComponentHatch; + +import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; + +public abstract class AbstractHPCAComponentHatchWrapper implements IHPCAComponentHatch { + + protected final HPCAModifier columnModifier; + protected final HPCAModifier rowModifier; + protected final T hpcaComponent; + + public AbstractHPCAComponentHatchWrapper(T component, HPCAModifier columnModifier, HPCAModifier rowModifier) { + this.hpcaComponent = component; + this.columnModifier = columnModifier; + this.rowModifier = rowModifier; + } + + @Override + public int getMaxEUt() { + return hpcaComponent.getMaxEUt(); + } + + @Override + public boolean isDamaged() { + return hpcaComponent.isDamaged(); + } + + @Override + public void setDamaged(boolean damaged) { + hpcaComponent.setDamaged(damaged); + } + + @Override + public int getUpkeepEUt() { + return hpcaComponent.getUpkeepEUt(); + } + + @Override + public boolean canBeDamaged() { + return hpcaComponent.canBeDamaged(); + } + + @Override + public boolean isBridge() { + return hpcaComponent.isBridge(); + } + + @Override + public ResourceTexture getComponentIcon() { + return hpcaComponent.getComponentIcon(); + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/componentWrappers/HPCAComponentHatchWrapper.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/componentWrappers/HPCAComponentHatchWrapper.java new file mode 100644 index 000000000..e5dc9258b --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/componentWrappers/HPCAComponentHatchWrapper.java @@ -0,0 +1,32 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.electric.hpca.componentWrappers; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.electric.hpca.HPCAModifier; + +import com.gregtechceu.gtceu.api.capability.IHPCAComponentHatch; +import com.gregtechceu.gtceu.api.capability.IHPCAComputationProvider; +import com.gregtechceu.gtceu.api.capability.IHPCACoolantProvider; + +public class HPCAComponentHatchWrapper extends AbstractHPCAComponentHatchWrapper { + + public HPCAComponentHatchWrapper(IHPCAComponentHatch component, HPCAModifier columnModifier, + HPCAModifier rowModifier) { + super(component, columnModifier, rowModifier); + } + + public HPCACoolantProviderWrapper getHPCACoolantProvider() { + if (hpcaComponent instanceof IHPCACoolantProvider coolantProvider) + return new HPCACoolantProviderWrapper(coolantProvider, columnModifier, rowModifier); + return null; + } + + public HPCAComputationProviderWrapper getHPCAComputationProvider() { + if (hpcaComponent instanceof IHPCAComputationProvider computationProvider) + return new HPCAComputationProviderWrapper(computationProvider, columnModifier, rowModifier); + return null; + } + + @Override + public void setActive(boolean active) { + active = true; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/componentWrappers/HPCAComputationProviderWrapper.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/componentWrappers/HPCAComputationProviderWrapper.java new file mode 100644 index 000000000..b3f06beca --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/componentWrappers/HPCAComputationProviderWrapper.java @@ -0,0 +1,47 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.electric.hpca.componentWrappers; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.electric.hpca.HPCAModifier; + +import com.gregtechceu.gtceu.api.capability.IHPCAComputationProvider; + +public class HPCAComputationProviderWrapper extends AbstractHPCAComponentHatchWrapper + implements IHPCAComputationProvider { + + public HPCAComputationProviderWrapper(IHPCAComputationProvider component, HPCAModifier columnModifier, + HPCAModifier rowModifier) { + super(component, columnModifier, rowModifier); + } + + @Override + public int getCWUPerTick() { + double cwuAmount = this.hpcaComponent.getCWUPerTick(); + + // handle column modifier + if (this.columnModifier == HPCAModifier.YELLOW) cwuAmount *= 1.5; + + // handle row modifier + if (this.rowModifier == HPCAModifier.YELLOW) cwuAmount *= 1.5; + + return (int) Math.floor(cwuAmount); + } + + @Override + public int getCoolingPerTick() { + double coolingAmount = this.hpcaComponent.getCoolingPerTick(); + + // handle column modifier + if (this.columnModifier == HPCAModifier.RED) coolingAmount *= 3; + else if (this.columnModifier == HPCAModifier.YELLOW) coolingAmount *= 1.5; + + // handle row modifier + if (this.rowModifier == HPCAModifier.RED) coolingAmount *= 1.5; + else if (this.columnModifier == HPCAModifier.YELLOW) coolingAmount *= 1.25; + + return (int) Math.floor(coolingAmount); + } + + @Override + public void setActive(boolean active) { + active = true; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/componentWrappers/HPCACoolantProviderWrapper.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/componentWrappers/HPCACoolantProviderWrapper.java new file mode 100644 index 000000000..4c5f2da25 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/hpca/componentWrappers/HPCACoolantProviderWrapper.java @@ -0,0 +1,52 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.electric.hpca.componentWrappers; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.electric.hpca.HPCAModifier; + +import com.gregtechceu.gtceu.api.capability.IHPCACoolantProvider; + +public class HPCACoolantProviderWrapper extends AbstractHPCAComponentHatchWrapper + implements IHPCACoolantProvider { + + public HPCACoolantProviderWrapper(IHPCACoolantProvider component, HPCAModifier columnModifier, + HPCAModifier rowModifier) { + super(component, columnModifier, rowModifier); + } + + @Override + public int getCoolingAmount() { + double coolingAmount = this.hpcaComponent.getCoolingAmount(); + + // handle column modifier + if (this.columnModifier == HPCAModifier.RED) coolingAmount *= 0.95; + else if (this.columnModifier == HPCAModifier.GREEN) coolingAmount *= 3; + + // handle row modifier + if (this.rowModifier == HPCAModifier.RED) coolingAmount *= 0.95; + else if (this.rowModifier == HPCAModifier.GREEN) coolingAmount *= 3; + + return (int) Math.floor(coolingAmount); + } + + @Override + public boolean isActiveCooler() { + return this.hpcaComponent.isActiveCooler(); + } + + @Override + public int getMaxCoolantPerTick() { + double maxCoolant = this.hpcaComponent.getMaxCoolantPerTick(); + + // handle column modifier + if (this.columnModifier == HPCAModifier.GREEN) maxCoolant *= 1.5; + + // handle row modifier + if (this.rowModifier == HPCAModifier.GREEN) maxCoolant *= 1.5; + + return (int) Math.floor(maxCoolant); + } + + @Override + public void setActive(boolean active) { + active = true; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MegaProductionAlveary.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MegaProductionAlveary.java new file mode 100644 index 000000000..be4e506cd --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MegaProductionAlveary.java @@ -0,0 +1,69 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.MegaAlvearyMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import net.minecraft.world.level.block.Blocks; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; + +public class MegaProductionAlveary { + + public final static MultiblockMachineDefinition MEGA_PRODUCTION_ALVEARY = REGISTRATE + .multiblock("honey_alveary", + MegaAlvearyMultiblockMachine::new) + .langValue("§eHyper Optimized Nectar Extraction Yard [HONEY]") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(GTRecipeTypes.DUMMY_RECIPES) // IDK HOW WE GET RID OF THIS? I THOUGHT WE COULD! + .appearanceBlock(CASING_STEEL_SOLID) + .partAppearance((controller, part, side) -> CASING_STEEL_SOLID.getDefaultState()) + .recipeModifiers() // No modifiers, forcefully remove default list + // spotless:off + .pattern(definition -> FactoryBlockPattern.start(RelativeDirection.LEFT,RelativeDirection.UP,RelativeDirection.FRONT) + .aisle(" AAAAA ", " AAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAAAAAAA ", " AAAAAAAAA ", " AAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAAAAAAAAA ", " AAAAAAAAAAA ", " AAAAAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle("AAAAAAA AAAAAAAAAAA ", "AAAAAAA AAAAAAAAAAA ", " B B AAAAAAAAA ", " B B ", " B B ", " B B ", " B B ", "BBBBBBB ", " B B ", " B B ", " B B ", " B B ", " B B ", "BBBBBBB ", " B B ", " B B ", " ", " ", " ") + .aisle("ACCCCCAAAAAAAAAAAAAA", "ACCCCCAAAAAAAAAAAAAA", " CCCCC AAAAAAAAAAA ", " CCCCC ", " CCCCC DDDDDDD ", " CCCCC DEEEEED ", " CCCCC DDDDDDD ", "BCCCCCB B B ", " CCCCC DDDDDDD ", " CCCCC DEEEEED ", " CCCCC DDDDDDD ", " CCCCC B B ", " CCCCC DDDDDDD ", "BCCCCCB DEEEEED ", " CCCCC DDDDDDD ", " CCCCC B B ", " DDDDDDD ", " DEEEEED ", " DDDDDDD ") + .aisle("ACCCCCAAAAAAAAAAAAAA", "ACCCCCAAAAAAAAAAAAAA", " CCCCC AAAAAAAAAAA ", " CCCCC B B ", " CCCCC BDDDDDDDB ", " CCCCC BEFFFFFEB ", " CCCCC BDDDDDDDB ", "BCCCCCBBBBBBBBBBBB ", " CCCCC BDDDDDDDB ", " CCCCC BEFFFFFEB ", " CCCCC BDDDDDDDB ", " CCCCC BBBBBBBBB ", " CCCCC BDDDDDDDB ", "BCCCCCBBBBEFFFFFEB ", " CCCCC BDDDDDDDB ", " CCCCC BBBBBBBBB ", " BDDDDDDDB ", " BEFFFFFEB ", " BDDDDDDDB ") + .aisle("ACCCCCAAAAAAAAAAAAAA", "ACCCCCAAAAAAAAAAAAAA", " CCCCC AAAAAAAAAAA ", " CCCCC ", " CCCCC DDDDDDD ", " CCCCC EFFFFFE ", " CCCCC DDDDDDD ", "BCCCCCB B B ", " CCCCC DDDDDDD ", " CCCCC EFFFFFE ", " CCCCC DDDDDDD ", " CCCCC B B ", " CCCCC DDDDDDD ", "BCCCCCB EFFFFFE ", " CCCCC DDDDDDD ", " CCCCC B B ", " DDDDDDD ", " EFFFFFE ", " DDDDDDD ") + .aisle("ACCCCCAAAAAAAAAAAAAA", "ACCCCCAAAAAAAAAAAAAA", " CCCCC AAAAAAAAAAA ", " CCCCC B B ", " CCCCC BDDDDDDDB ", " CCCCC BEFFFFFEB ", " CCCCC BDDDDDDDB ", "BCCCCCBBBBBBBBBBBB ", " CCCCC BDDDDDDDB ", " CCCCC BEFFFFFEB ", " CCCCC BDDDDDDDB ", " CCCCC BBBBBBBBB ", " CCCCC BDDDDDDDB ", "BCCCCCBBBBEFFFFFEB ", " CCCCC BDDDDDDDB ", " CCCCC BBBBBBBBB ", " BDDDDDDDB ", " BEFFFFFEB ", " BDDDDDDDB ") + .aisle("ACCCCCAAAAAAAAAAAAAA", "ACCCCCAAAAAAAAAAAAAA", " CCCCC AAAAAAAAAAA ", " CCCCC ", " CCCCC DDDDDDD ", " CCCCC DGGEGGD ", " CCCCC DDDDDDD ", "BCCCCCB B B ", " CCCCC DDDDDDD ", " CCCCC DGGEGGD ", " CCCCC DDDDDDD ", " CCCCC B B ", " CCCCC DDDDDDD ", "BCCCCCB DGGEGGD ", " CCCCC DDDDDDD ", " CCCCC B B ", " DDDDDDD ", " DGGEGGD ", " DDDDDDD ") + .aisle("AAAAAAAAAAAAAAAAAAA ", "AAAAAAAAAAAAAAAAAAA ", " B B AAAAAAAAA ", " B B ", " B B ", " B B ", " B B ", "BBBBBBB ", " B B ", " B B ", " B B ", " B B ", " B B ", "BBBBBBB ", " B B ", " B B ", " ", " ", " ") + .aisle(" AAAAAAAAAAA ", " AAAAAAAAAAA ", " AAAAAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAAAAAAA ", " AAAAAAAAA ", " AAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAAA ", " AAQAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(CASING_STEEL_SOLID.get()) + .or(abilities(PartAbility.INPUT_ENERGY,PartAbility.INPUT_LASER).setExactLimit(1)) // Can take laser for when expandable vertically (NYI until V8) + .or(abilities(PartAbility.IMPORT_FLUIDS).setMinGlobalLimited(1,1).setMaxGlobalLimited(3)) // For Nutrient Boosters + .or(abilities(PartAbility.EXPORT_ITEMS).setMinGlobalLimited(1,1).setMaxGlobalLimited(3)) // For Exporting the Products + .or(abilities(PartAbility.EXPORT_FLUIDS).setMinGlobalLimited(1,1).setMaxGlobalLimited(3)) //If we want to do some output waste? idk + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('B', frames(GTMaterials.Neutronium)) + .where('C', blocks(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.get())) + .where('D', blocks(REINFORCED_DAWNSTONE_CASING.get())) // Frame of the hives + .where('E', blocks(CASING_GRATE.get())) // GRATES + .where('F', blocks(Blocks.HONEYCOMB_BLOCK)) // THE COMBS YAYYYY + .where('G', ability(CosmicPartAbility.BEE_HOLDER)) // The Bee Holders + .build()) + // spotless:on + .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_solid_steel"), + GTCEu.id("block/multiblock/power_substation")) + .register(); + + public static void init() {} +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/AlvearyBeeHousing.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/AlvearyBeeHousing.java new file mode 100644 index 000000000..b9dbef8d0 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/AlvearyBeeHousing.java @@ -0,0 +1,158 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.bee; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.phys.Vec3; + +import com.mojang.authlib.GameProfile; +import forestry.api.apiculture.IBeeHousing; +import forestry.api.apiculture.IBeeListener; +import forestry.api.apiculture.IBeeModifier; +import forestry.api.apiculture.IBeekeepingLogic; +import forestry.api.core.HumidityType; +import forestry.api.core.IError; +import forestry.api.core.IErrorLogic; +import forestry.api.core.TemperatureType; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.Set; + +/** + * Per-thread IBeeHousing implementation. + * Delegates climate/modifiers to the parent machine, inventory to AlvearyBeeInventory. + * Does NOT use BeekeepingLogic — we own the tick loop ourselves. + */ +public class AlvearyBeeHousing implements IBeeHousing { + + private final MechanicalAlvearyMachine machine; + private final AlvearyBeeInventory beeInventory; + + public AlvearyBeeHousing(MechanicalAlvearyMachine machine, AlvearyBeeInventory inventory) { + this.machine = machine; + this.beeInventory = inventory; + } + + @Override + public Iterable getBeeModifiers() { + var composite = machine.getModifierComposite(); + if (composite == null) return Collections.emptyList(); + return Collections.singletonList(composite); + } + + @Override + public Iterable getBeeListeners() { + return Collections.emptyList(); + } + + @Override + public AlvearyBeeInventory getBeeInventory() { + return beeInventory; + } + + @Override + public IBeekeepingLogic getBeekeepingLogic() { + throw new UnsupportedOperationException("Mechanical Alveary uses custom tick logic"); + } + + @Override + public int getBlockLightValue() { + var level = machine.getLevel(); + if (level == null) return 15; + return level.getMaxLocalRawBrightness(machine.getPos().above()); + } + + @Override + public boolean canBlockSeeTheSky() { + var composite = machine.getModifierComposite(); + if (composite != null && composite.isSunlightSimulated()) return true; + var level = machine.getLevel(); + if (level == null) return false; + return level.canSeeSkyFromBelowWater(machine.getPos().above(3)); + } + + @Override + public boolean isRaining() { + var composite = machine.getModifierComposite(); + if (composite != null && composite.isSealed()) return false; + var level = machine.getLevel(); + if (level == null) return false; + return level.isRainingAt(machine.getPos().above(3)); + } + + @Override + public Level getWorldObj() { + return machine.getLevel(); + } + + @Override + public Holder getBiome() { + var level = machine.getLevel(); + if (level == null) throw new IllegalStateException("Level not available"); + return level.getBiome(machine.getPos()); + } + + @Override + public TemperatureType temperature() { + var climate = machine.getClimateState(); + if (climate == null) return TemperatureType.NORMAL; + return climate.getEffectiveTemperature(); + } + + @Override + public HumidityType humidity() { + var climate = machine.getClimateState(); + if (climate == null) return HumidityType.NORMAL; + return climate.getEffectiveHumidity(); + } + + @Nullable + @Override + public GameProfile getOwner() { + return null; + } + + @Override + public Vec3 getBeeFXCoordinates() { + var pos = machine.getPos(); + return new Vec3(pos.getX() + 0.5, pos.getY() + 1.5, pos.getZ() + 0.5); + } + + @Override + public BlockPos getCoordinates() { + return machine.getPos(); + } + + @Override + public IErrorLogic getErrorLogic() { + return DUMMY_ERROR_LOGIC; + } + + private static final IErrorLogic DUMMY_ERROR_LOGIC = new IErrorLogic() { + + @Override + public boolean setCondition(boolean condition, IError error) { + return false; + } + + @Override + public boolean contains(IError error) { + return false; + } + + @Override + public Set getErrors() { + return Collections.emptySet(); + } + + @Override + public boolean hasErrors() { + return false; + } + + @Override + public void clearErrors() {} + }; +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/AlvearyBeeInventory.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/AlvearyBeeInventory.java new file mode 100644 index 000000000..a18d05f80 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/AlvearyBeeInventory.java @@ -0,0 +1,64 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.bee; + +import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; + +import net.minecraft.world.item.ItemStack; + +import forestry.api.apiculture.IBeeHousingInventory; + +/** + * Wraps a thread's colored input/output bus as IBeeHousingInventory. + * Input bus: slot 0 = queen, slot 1 = drone. + * Output bus: addProduct deposits via insertItemInternal to bypass IO filtering. + */ +public class AlvearyBeeInventory implements IBeeHousingInventory { + + private final NotifiableItemStackHandler inputHandler; + private final NotifiableItemStackHandler outputHandler; + + public AlvearyBeeInventory(IRecipeHandler inputRecipeHandler, IRecipeHandler outputRecipeHandler) { + this.inputHandler = extractHandler(inputRecipeHandler); + this.outputHandler = extractHandler(outputRecipeHandler); + } + + private static NotifiableItemStackHandler extractHandler(IRecipeHandler handler) { + if (handler instanceof NotifiableItemStackHandler notifiable) { + return notifiable; + } + throw new IllegalArgumentException( + "Recipe handler is not NotifiableItemStackHandler: " + handler.getClass().getName()); + } + + @Override + public ItemStack getQueen() { + return inputHandler.getStackInSlot(0); + } + + @Override + public ItemStack getDrone() { + return inputHandler.getStackInSlot(1); + } + + @Override + public void setQueen(ItemStack stack) { + inputHandler.setStackInSlot(0, stack); + } + + @Override + public void setDrone(ItemStack stack) { + inputHandler.setStackInSlot(1, stack); + } + + @Override + public boolean addProduct(ItemStack product, boolean all) { + if (product.isEmpty()) return true; + + ItemStack remaining = product.copy(); + for (int i = 0; i < outputHandler.getSlots(); i++) { + remaining = outputHandler.insertItemInternal(i, remaining, false); + if (remaining.isEmpty()) return true; + } + return false; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/AlvearyClimateState.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/AlvearyClimateState.java new file mode 100644 index 000000000..17b05d081 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/AlvearyClimateState.java @@ -0,0 +1,55 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.bee; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; + +import forestry.api.IForestryApi; +import forestry.api.climate.IClimateManager; +import forestry.api.climate.IClimateProvider; +import forestry.api.core.HumidityType; +import forestry.api.core.TemperatureType; +import lombok.Getter; + +@Getter +public class AlvearyClimateState { + + private final TemperatureType baseTemperature; + private final HumidityType baseHumidity; + private final TemperatureType effectiveTemperature; + private final HumidityType effectiveHumidity; + + private AlvearyClimateState(TemperatureType baseTemp, HumidityType baseHumid, + TemperatureType effectiveTemp, HumidityType effectiveHumid) { + this.baseTemperature = baseTemp; + this.baseHumidity = baseHumid; + this.effectiveTemperature = effectiveTemp; + this.effectiveHumidity = effectiveHumid; + } + + public static AlvearyClimateState create(Level level, BlockPos controllerPos, + AlvearyModifierComposite modifiers) { + IClimateManager climateManager = IForestryApi.INSTANCE.getClimateManager(); + IClimateProvider provider = climateManager.createClimateProvider(level, controllerPos); + + TemperatureType baseTemp = provider.temperature(); + HumidityType baseHumid = provider.humidity(); + + int tempOffset = modifiers.getTemperatureOffset(); + TemperatureType effectiveTemp; + if (tempOffset >= 0) { + effectiveTemp = baseTemp.up(tempOffset); + } else { + effectiveTemp = baseTemp.down(-tempOffset); + } + + int humidOffset = modifiers.getHumidityOffset(); + HumidityType effectiveHumid; + if (humidOffset >= 0) { + effectiveHumid = baseHumid.up(humidOffset); + } else { + effectiveHumid = baseHumid.down(-humidOffset); + } + + return new AlvearyClimateState(baseTemp, baseHumid, effectiveTemp, effectiveHumid); + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/AlvearyModifierComposite.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/AlvearyModifierComposite.java new file mode 100644 index 000000000..c9fd74578 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/AlvearyModifierComposite.java @@ -0,0 +1,172 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.bee; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.part.AlvearyModifierPartMachine; + +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; + +import net.minecraft.core.Vec3i; + +import forestry.api.apiculture.IBeeModifier; +import forestry.api.apiculture.genetics.IBeeSpecies; +import forestry.api.genetics.IGenome; +import forestry.api.genetics.IMutation; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +@Getter +public class AlvearyModifierComposite implements IBeeModifier { + + // Climate + private final int heaterCount; + private final int coolerCount; + private final int humidifierCount; + private final int dryerCount; + + // Production + private final int productivityCount; + private final int sieveCount; + private final int weatherproofCount; + private final int lightingCount; + + // Breeding + private final int mutagenicCount; + private final int accelerantCount; + private final int longevityCount; + private final int stabiliserCount; + + // Utility + private final int territoryCount; + private final int sealingCount; + + private AlvearyModifierComposite(int heaterCount, int coolerCount, int humidifierCount, int dryerCount, + int productivityCount, int sieveCount, int weatherproofCount, int lightingCount, + int mutagenicCount, int accelerantCount, int longevityCount, int stabiliserCount, + int territoryCount, int sealingCount) { + this.heaterCount = heaterCount; + this.coolerCount = coolerCount; + this.humidifierCount = humidifierCount; + this.dryerCount = dryerCount; + this.productivityCount = productivityCount; + this.sieveCount = sieveCount; + this.weatherproofCount = weatherproofCount; + this.lightingCount = lightingCount; + this.mutagenicCount = mutagenicCount; + this.accelerantCount = accelerantCount; + this.longevityCount = longevityCount; + this.stabiliserCount = stabiliserCount; + this.territoryCount = territoryCount; + this.sealingCount = sealingCount; + } + + public static AlvearyModifierComposite fromParts(Iterable parts) { + int heater = 0, cooler = 0, humidifier = 0, dryer = 0; + int productivity = 0, sieve = 0, weatherproof = 0, lighting = 0; + int mutagenic = 0, accelerant = 0, longevity = 0, stabiliser = 0; + int territory = 0, sealing = 0; + + for (IMultiPart part : parts) { + if (!(part instanceof AlvearyModifierPartMachine modifier)) continue; + + switch (modifier.getModifierType()) { + case HEATER -> heater++; + case COOLER -> cooler++; + case HUMIDIFIER -> humidifier++; + case DRYER -> dryer++; + case PRODUCTIVITY -> productivity++; + case SIEVE -> sieve++; + case WEATHERPROOF -> weatherproof++; + case LIGHTING -> lighting++; + case MUTAGENIC -> mutagenic++; + case ACCELERANT -> accelerant++; + case LONGEVITY -> longevity++; + case STABILISER -> stabiliser++; + case TERRITORY -> territory++; + case SEALING -> sealing++; + } + } + + return new AlvearyModifierComposite( + heater, cooler, humidifier, dryer, + productivity, sieve, weatherproof, lighting, + mutagenic, accelerant, longevity, stabiliser, + territory, sealing); + } + + public int getTemperatureOffset() { + return heaterCount - coolerCount; + } + + public int getHumidityOffset() { + return humidifierCount - dryerCount; + } + + public int getTotalModifierCount() { + return heaterCount + coolerCount + humidifierCount + dryerCount + productivityCount + sieveCount + + weatherproofCount + lightingCount + mutagenicCount + accelerantCount + longevityCount + + stabiliserCount + territoryCount + sealingCount; + } + + // IBeeModifier + + @Override + public float modifyProductionSpeed(IGenome genome, float currentSpeed) { + return currentSpeed * (1.0f + 0.2f * productivityCount); + } + + @Override + public float modifyMutationChance(IGenome genome, IGenome mate, IMutation mutation, + float currentChance) { + if (stabiliserCount > 0) return 0f; + float modified = currentChance * (1.0f + 0.15f * mutagenicCount); + float cap = Math.min((float) (mutation.getChance() * Math.pow(1.5, 4)), 0.5f); + return Math.min(modified, cap); + } + + @Override + public float modifyAging(IGenome genome, @Nullable IGenome mate, float currentAging) { + float factor = 1.0f; + if (accelerantCount > 0) factor += 0.5f * accelerantCount; + if (longevityCount > 0) factor *= 1.0f / (1.0f + 0.3f * longevityCount); + return currentAging * factor; + } + + @Override + public float modifyPollination(IGenome genome, float currentPollination) { + return currentPollination * (1.0f + 0.5f * sieveCount); + } + + @Override + public float modifyGeneticDecay(IGenome genome, float currentDecay) { + return currentDecay; + } + + @Override + public Vec3i modifyTerritory(IGenome genome, Vec3i currentModifier) { + if (territoryCount <= 0) return currentModifier; + float scale = 1.0f + 0.5f * territoryCount; + return new Vec3i( + Math.round(currentModifier.getX() * scale), + currentModifier.getY(), + Math.round(currentModifier.getZ() * scale)); + } + + @Override + public boolean isSealed() { + return weatherproofCount > 0; + } + + @Override + public boolean isAlwaysActive(IGenome genome) { + return true; + } + + @Override + public boolean isSunlightSimulated() { + return lightingCount > 0; + } + + @Override + public boolean isHellish() { + return false; // Determined by climate state, not modifier directly + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/AlvearyModifierType.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/AlvearyModifierType.java new file mode 100644 index 000000000..87fa43cf0 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/AlvearyModifierType.java @@ -0,0 +1,34 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.bee; + +import lombok.Getter; + +@Getter +public enum AlvearyModifierType { + + // Climate + HEATER("heater", "Heater"), + COOLER("cooler", "Cooler"), + HUMIDIFIER("humidifier", "Humidifier"), + DRYER("dryer", "Dryer"), + // Production + PRODUCTIVITY("productivity", "Productivity"), + SIEVE("sieve", "Sieve"), + WEATHERPROOF("weatherproof", "Weatherproof"), + LIGHTING("lighting", "Lighting"), + // Breeding + MUTAGENIC("mutagenic", "Mutagenic"), + ACCELERANT("accelerant", "Accelerant"), + LONGEVITY("longevity", "Longevity"), + STABILISER("stabiliser", "Stabiliser"), + // Utility + TERRITORY("territory", "Territory"), + SEALING("sealing", "Sealing"); + + private final String id; + private final String displayName; + + AlvearyModifierType(String id, String displayName) { + this.id = id; + this.displayName = displayName; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/AlvearyQueenThread.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/AlvearyQueenThread.java new file mode 100644 index 000000000..f8f874c9b --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/AlvearyQueenThread.java @@ -0,0 +1,282 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.bee; + +import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; + +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +import forestry.api.IForestryApi; +import forestry.api.apiculture.IBeeModifier; +import forestry.api.apiculture.genetics.BeeLifeStage; +import forestry.api.apiculture.genetics.IBee; +import forestry.api.core.IProduct; +import forestry.api.genetics.capability.IIndividualHandlerItem; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +@Getter +public class AlvearyQueenThread { + + private static final int WORK_CYCLE_TICKS = 550; + private static final int BREED_TICKS = 100; + + private final MechanicalAlvearyMachine machine; + private final int threadIndex; + private final int color; + private final List inputHandlers; + private final List outputHandlers; + + @Nullable + private AlvearyBeeHousing housing; + @lombok.Setter + private int workCounter; + @lombok.Setter + private int breedCounter; + private boolean hasActiveQueen; + @Nullable + private String activeSpeciesName; + private int queenHealth; + private int queenMaxHealth; + + public AlvearyQueenThread(MechanicalAlvearyMachine machine, int threadIndex, int color, + List inputHandlers, + List outputHandlers) { + this.machine = machine; + this.threadIndex = threadIndex; + this.color = color; + this.inputHandlers = inputHandlers; + this.outputHandlers = outputHandlers; + initHousing(); + } + + private void initHousing() { + var input = getItemInputHandler(); + var output = getItemOutputHandler(); + if (input != null && output != null) { + try { + var inventory = new AlvearyBeeInventory(input, output); + this.housing = new AlvearyBeeHousing(machine, inventory); + } catch (IllegalArgumentException ignored) {} + } + } + + @Nullable + public IRecipeHandler getItemInputHandler() { + for (RecipeHandlerList handler : inputHandlers) { + var itemHandlers = handler.getHandlerMap().get(ItemRecipeCapability.CAP); + if (itemHandlers != null && !itemHandlers.isEmpty()) { + return itemHandlers.get(0); + } + } + return null; + } + + @Nullable + public IRecipeHandler getItemOutputHandler() { + for (RecipeHandlerList handler : outputHandlers) { + var itemHandlers = handler.getHandlerMap().get(ItemRecipeCapability.CAP); + if (itemHandlers != null && !itemHandlers.isEmpty()) { + return itemHandlers.get(0); + } + } + return null; + } + + public void tick() { + if (housing == null) return; + + var level = machine.getLevel(); + if (level == null || level.isClientSide()) return; + + AlvearyBeeInventory inventory = housing.getBeeInventory(); + ItemStack queenStack = inventory.getQueen(); + + if (queenStack.isEmpty()) { + resetState(); + return; + } + + var handlerItem = IIndividualHandlerItem.get(queenStack); + if (handlerItem == null || !(handlerItem.getIndividual() instanceof IBee bee)) { + resetState(); + return; + } + + var stage = handlerItem.getStage(); + + if (stage == BeeLifeStage.PRINCESS) { + tickBreed(bee, queenStack, inventory); + } else if (stage == BeeLifeStage.QUEEN) { + tickQueen(bee, queenStack, level, inventory); + } + } + + private void tickBreed(IBee princess, ItemStack princessStack, AlvearyBeeInventory inventory) { + ItemStack droneStack = inventory.getDrone(); + if (droneStack.isEmpty()) { + hasActiveQueen = false; + activeSpeciesName = princess.getSpecies().getDisplayName().getString(); + breedCounter = 0; + return; + } + + var droneHandler = IIndividualHandlerItem.get(droneStack); + if (droneHandler == null || !(droneHandler.getIndividual() instanceof IBee drone)) { + breedCounter = 0; + return; + } + + breedCounter++; + hasActiveQueen = false; + activeSpeciesName = princess.getSpecies().getDisplayName().getString(); + + if (breedCounter >= BREED_TICKS) { + breedCounter = 0; + princess.setMate(drone.getGenome()); + ItemStack queenStack = princess.createStack(BeeLifeStage.QUEEN); + inventory.setQueen(queenStack); + + droneStack.shrink(1); + if (droneStack.isEmpty()) { + inventory.setDrone(ItemStack.EMPTY); + } + } + } + + private void tickQueen(IBee queen, ItemStack queenStack, Level level, AlvearyBeeInventory inventory) { + if (!queen.isAlive()) { + killQueen(queen, inventory); + return; + } + + hasActiveQueen = true; + activeSpeciesName = queen.getSpecies().getDisplayName().getString(); + queenHealth = queen.getHealth(); + queenMaxHealth = queen.getMaxHealth(); + + workCounter++; + if (workCounter >= WORK_CYCLE_TICKS) { + workCounter = 0; + + produceWithPity(queen, level.getRandom(), inventory); + + IBeeModifier modifier = IForestryApi.INSTANCE.getHiveManager().createBeeHousingModifier(housing); + float aging = modifier.modifyAging(queen.getGenome(), queen.getMate(), 1.0f); + queen.age(level, aging); + + inventory.setQueen(queen.createStack(BeeLifeStage.QUEEN)); + + if (!queen.isAlive()) { + killQueen(queen, inventory); + } + } + } + + private void killQueen(IBee queen, AlvearyBeeInventory inventory) { + if (queen.getMate() == null) { + queen.setMate(queen.getGenome()); + } + + IBee princess = queen.spawnPrincess(housing); + if (princess != null) { + ItemStack princessStack = princess.createStack(BeeLifeStage.PRINCESS); + inventory.addProduct(princessStack, false); + } + + List drones = queen.spawnDrones(housing); + for (IBee drone : drones) { + ItemStack droneStack = drone.createStack(BeeLifeStage.DRONE); + inventory.addProduct(droneStack, false); + } + + inventory.setQueen(ItemStack.EMPTY); + resetState(); + } + + private void resetState() { + hasActiveQueen = false; + activeSpeciesName = null; + workCounter = 0; + breedCounter = 0; + queenHealth = 0; + queenMaxHealth = 0; + } + + private void produceWithPity(IBee queen, RandomSource random, AlvearyBeeInventory inventory) { + var composite = machine.getModifierComposite(); + int productivityCount = composite != null ? composite.getProductivityCount() : 0; + float multiplier = 1 + productivityCount; + + var species = queen.getSpecies(); + + for (IProduct product : species.getProducts()) { + produceProduct(product, multiplier, random, inventory); + } + + if (species.isJubilant(queen.getGenome(), housing)) { + for (IProduct specialty : species.getSpecialties()) { + produceProduct(specialty, multiplier, random, inventory); + } + } + } + + private void produceProduct(IProduct product, float multiplier, RandomSource random, + AlvearyBeeInventory inventory) { + float totalChance = product.chance() * multiplier; + int guaranteed = (int) totalChance; + float remainder = totalChance - guaranteed; + + int count = guaranteed; + if (random.nextFloat() < remainder) { + count++; + } + + for (int i = 0; i < count; i++) { + inventory.addProduct(product.createRandomStack(random), false); + } + } + + public int getProgressPercent() { + if (hasActiveQueen) { + return (int) ((workCounter / (float) WORK_CYCLE_TICKS) * 100); + } + if (breedCounter > 0) { + return (int) ((breedCounter / (float) BREED_TICKS) * 100); + } + return 0; + } + + public int getLifecyclePercent() { + if (queenMaxHealth <= 0) return 0; + return (int) (((queenMaxHealth - queenHealth) / (float) queenMaxHealth) * 100); + } + + public String getStatusText() { + if (housing == null) return "No I/O"; + if (!hasActiveQueen && activeSpeciesName == null) return "Idle"; + if (!hasActiveQueen && activeSpeciesName != null && breedCounter > 0) return "Breeding"; + if (!hasActiveQueen && activeSpeciesName != null) return "Waiting for Drone"; + return "Working"; + } + + public String getColorName() { + if (color == -1) return "Unpainted"; + for (DyeColor dye : DyeColor.values()) { + if (dye.getMapColor().col == color) { + String name = dye.getName().replace("_", " "); + StringBuilder result = new StringBuilder(); + for (String word : name.split(" ")) { + result.append(Character.toUpperCase(word.charAt(0))).append(word.substring(1)).append(" "); + } + return result.toString().trim(); + } + } + return "Color #" + Integer.toHexString(color); + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/MechanicalAlveary.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/MechanicalAlveary.java new file mode 100644 index 000000000..d1c06ee8d --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/MechanicalAlveary.java @@ -0,0 +1,109 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.bee; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; +import com.gregtechceu.gtceu.api.pattern.error.PatternStringError; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import com.lowdragmc.lowdraglib.utils.BlockInfo; + +import net.minecraft.network.chat.Component; +import net.minecraft.world.level.block.Block; + +import java.util.Map; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; + +public class MechanicalAlveary { + + private static Map coreBlockTiersCache; + + private static Map getCoreBlockTiers() { + if (coreBlockTiersCache == null) { + coreBlockTiersCache = Map.of( + GTBlocks.MACHINE_CASING_LV.get(), GTValues.LV, + GTBlocks.MACHINE_CASING_MV.get(), GTValues.MV, + GTBlocks.MACHINE_CASING_HV.get(), GTValues.HV, + GTBlocks.MACHINE_CASING_EV.get(), GTValues.EV); + } + return coreBlockTiersCache; + } + + public static final MultiblockMachineDefinition MECHANICAL_ALVEARY = REGISTRATE + .multiblock("mechanical_alveary", MechanicalAlvearyMachine::new) + .langValue("Mechanical Alveary") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(GTRecipeTypes.DUMMY_RECIPES) + .recipeModifiers() + .appearanceBlock(CosmicBlocks.ALVEARY_CASING) + .tooltipBuilder((stack, list) -> { + list.add(Component.literal("A GT-powered bee housing with climate control.")); + list.add(Component.literal("Internal core block determines tier and max queens.")); + list.add(Component.literal("LV=1, MV=2, HV=3, EV=4 queens.")); + list.add(Component.literal("Use colored buses to isolate queen I/O.")); + list.add(Component.literal("Wall casings can be swapped for modifier casings.")); + }) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle("AAA", "AAA", "AAA", "BBB") + .aisle("AAA", "ACA", "AAA", "BBB") + .aisle("AAA", "ADA", "AAA", "BBB") + .where('D', controller(blocks(definition.getBlock()))) + .where('C', tieredCorePredicate()) + .where('A', alvearyWallPredicate()) + .where('B', blocks(CosmicBlocks.IRON_PLATED_DEEPSLATE_BLOCK.slab().get())) + .build()) + // spotless:on + .workableCasingModel( + CosmicCore.id("block/casings/solid/alveary_casing"), + CosmicCore.id("block/multiblock/dawnforge")) + .register(); + + /** + * Predicate for the center core block. Accepts LV-EV GT machine casings. + * Sets "AlvearyTier" in the match context for the machine to read on structure formation. + */ + private static TraceabilityPredicate tieredCorePredicate() { + return new TraceabilityPredicate( + blockWorldState -> { + var blockState = blockWorldState.getBlockState(); + Integer tier = getCoreBlockTiers().get(blockState.getBlock()); + if (tier == null) { + blockWorldState.setError( + new PatternStringError("cosmiccore.mechanical_alveary.error.invalid_core")); + return false; + } + Object existing = blockWorldState.getMatchContext().getOrPut("AlvearyTier", tier); + if (!existing.equals(tier)) { + blockWorldState.setError( + new PatternStringError("cosmiccore.mechanical_alveary.error.mismatched_core")); + return false; + } + return true; + }, + () -> getCoreBlockTiers().keySet().stream() + .map(block -> new BlockInfo(block.defaultBlockState(), null)) + .toArray(BlockInfo[]::new)); + } + + private static TraceabilityPredicate alvearyWallPredicate() { + return blocks(CosmicBlocks.ALVEARY_CASING.get()) + .or(abilities(CosmicPartAbility.ALVEARY_MODIFIER)) + .or(abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1).setMaxGlobalLimited(2)) + .or(abilities(PartAbility.IMPORT_ITEMS).setMinGlobalLimited(1)) + .or(abilities(PartAbility.EXPORT_ITEMS).setMinGlobalLimited(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1)); + } + + public static void init() {} +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/MechanicalAlvearyMachine.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/MechanicalAlvearyMachine.java new file mode 100644 index 000000000..e2bce021b --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/bee/MechanicalAlvearyMachine.java @@ -0,0 +1,361 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.bee; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.common.machine.multiblock.part.ItemBusPartMachine; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; + +import forestry.api.core.HumidityType; +import forestry.api.core.TemperatureType; +import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class MechanicalAlvearyMachine extends WorkableElectricMultiblockMachine { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + MechanicalAlvearyMachine.class, WorkableElectricMultiblockMachine.MANAGED_FIELD_HOLDER); + + @Persisted + @DescSynced + @Getter + private int tier = GTValues.LV; + + @Persisted + @DescSynced + @Getter + private int maxQueens = 1; + + @Persisted + @DescSynced + @Getter + private int activeQueenCount = 0; + + @Nullable + @Getter + private AlvearyModifierComposite modifierComposite; + + @Nullable + @Getter + private AlvearyClimateState climateState; + + @Getter + private final List queenThreads = new ArrayList<>(); + + @Nullable + private TickableSubscription threadTickSubscription; + + @Persisted + private int[] savedColors = new int[0]; + @Persisted + private int[] savedWorkCounters = new int[0]; + @Persisted + private int[] savedBreedCounters = new int[0]; + + public MechanicalAlvearyMachine(IMachineBlockEntity holder) { + super(holder); + } + + @Override + @NotNull + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } + + @Override + protected RecipeLogic createRecipeLogic(Object... args) { + return new RecipeLogic(this) { + + @Override + public void serverTick() {} + }; + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + + var tierObj = getMultiblockState().getMatchContext().get("AlvearyTier"); + if (tierObj instanceof Integer t) { + this.tier = t; + this.maxQueens = t - GTValues.LV + 1; + } + + modifierComposite = AlvearyModifierComposite.fromParts(getParts()); + + var level = getLevel(); + if (level != null) { + climateState = AlvearyClimateState.create(level, getPos(), modifierComposite); + } + + createQueenThreads(); + updateThreadSubscription(); + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + saveThreadProgress(); + activeQueenCount = 0; + modifierComposite = null; + climateState = null; + queenThreads.clear(); + + if (threadTickSubscription != null) { + threadTickSubscription.unsubscribe(); + threadTickSubscription = null; + } + } + + private void saveThreadProgress() { + int size = queenThreads.size(); + savedColors = new int[size]; + savedWorkCounters = new int[size]; + savedBreedCounters = new int[size]; + for (int i = 0; i < size; i++) { + AlvearyQueenThread thread = queenThreads.get(i); + savedColors[i] = thread.getColor(); + savedWorkCounters[i] = thread.getWorkCounter(); + savedBreedCounters[i] = thread.getBreedCounter(); + } + } + + private void restoreThreadProgress() { + for (AlvearyQueenThread thread : queenThreads) { + int color = thread.getColor(); + for (int i = 0; i < savedColors.length; i++) { + if (savedColors[i] == color) { + thread.setWorkCounter(savedWorkCounters[i]); + thread.setBreedCounter(savedBreedCounters[i]); + break; + } + } + } + } + + /** + * Partition I/O handlers by paint color and create one AlvearyQueenThread per matched pair, + * up to maxQueens. Both input AND output are color-isolated (diverges from MultithreadedMachine). + */ + private void createQueenThreads() { + queenThreads.clear(); + + Int2ObjectMap> inputsByColor = new Int2ObjectLinkedOpenHashMap<>(); + Int2ObjectMap> outputsByColor = new Int2ObjectLinkedOpenHashMap<>(); + + for (IMultiPart part : getParts()) { + if (!(part instanceof ItemBusPartMachine)) continue; + + for (RecipeHandlerList handlerList : part.getRecipeHandlers()) { + IO io = handlerList.getHandlerIO(); + if (io == IO.NONE) continue; + + boolean hasItem = handlerList.hasCapability(ItemRecipeCapability.CAP); + if (!hasItem) continue; + + int color = handlerList.getColor(); + + if (io == IO.IN || io == IO.BOTH) { + inputsByColor.computeIfAbsent(color, k -> new ArrayList<>()).add(handlerList); + } + if (io == IO.OUT || io == IO.BOTH) { + outputsByColor.computeIfAbsent(color, k -> new ArrayList<>()).add(handlerList); + } + } + } + + int threadIndex = 0; + for (Int2ObjectMap.Entry> entry : inputsByColor.int2ObjectEntrySet()) { + if (threadIndex >= maxQueens) break; + + int color = entry.getIntKey(); + List inputs = entry.getValue(); + List outputs = outputsByColor.getOrDefault(color, List.of()); + + if (outputs.isEmpty()) continue; + + queenThreads.add(new AlvearyQueenThread(this, threadIndex, color, inputs, outputs)); + threadIndex++; + } + + restoreThreadProgress(); + } + + private void updateThreadSubscription() { + if (isFormed() && !queenThreads.isEmpty()) { + threadTickSubscription = subscribeServerTick(threadTickSubscription, this::tickQueenThreads); + } else if (threadTickSubscription != null) { + threadTickSubscription.unsubscribe(); + threadTickSubscription = null; + } + } + + private void tickQueenThreads() { + if (!isFormed() || !isWorkingEnabled()) return; + + if (hasMaintenanceProblems()) return; + + var energyContainer = getEnergyContainer(); + if (energyContainer == null) return; + + int active = 0; + for (AlvearyQueenThread thread : List.copyOf(queenThreads)) { + long euPerTick = GTValues.VA[tier]; + if (energyContainer.getEnergyStored() < euPerTick) break; + + thread.tick(); + if (thread.isHasActiveQueen()) { + energyContainer.removeEnergy(euPerTick); + active++; + } + } + this.activeQueenCount = active; + } + + private boolean hasMaintenanceProblems() { + for (IMultiPart part : getParts()) { + if (part instanceof IMaintenanceMachine maintenance) { + return maintenance.hasMaintenanceProblems(); + } + } + return false; + } + + @Override + public void addDisplayText(List textList) { + MultiblockDisplayText.builder(textList, isFormed()) + .addCustom(l -> { + l.add(Component.literal("Tier: ") + .withStyle(ChatFormatting.GRAY) + .append(Component.literal(GTValues.VNF[tier]) + .withStyle(ChatFormatting.WHITE))); + l.add(Component.literal("Max Queens: ") + .withStyle(ChatFormatting.GRAY) + .append(Component.literal(String.valueOf(maxQueens)) + .withStyle(ChatFormatting.GOLD))); + l.add(Component.literal("Threads: ") + .withStyle(ChatFormatting.GRAY) + .append(Component.literal(queenThreads.size() + "/" + maxQueens) + .withStyle(queenThreads.isEmpty() ? ChatFormatting.RED : ChatFormatting.GREEN))); + + if (modifierComposite != null && modifierComposite.getTotalModifierCount() > 0) { + l.add(Component.literal("Modifier Casings: ") + .withStyle(ChatFormatting.GRAY) + .append(Component.literal( + String.valueOf(modifierComposite.getTotalModifierCount())) + .withStyle(ChatFormatting.AQUA))); + } + + if (climateState != null) { + var baseTemp = climateState.getBaseTemperature(); + var effectiveTemp = climateState.getEffectiveTemperature(); + var baseHumid = climateState.getBaseHumidity(); + var effectiveHumid = climateState.getEffectiveHumidity(); + + var tempText = Component.literal("Temp: ") + .withStyle(ChatFormatting.GRAY) + .append(Component.literal(effectiveTemp.name()) + .withStyle(temperatureColor(effectiveTemp))); + if (baseTemp != effectiveTemp) { + tempText.append(Component.literal(" (" + baseTemp.name() + ")") + .withStyle(ChatFormatting.DARK_GRAY)); + } + l.add(tempText); + + var humidText = Component.literal("Humidity: ") + .withStyle(ChatFormatting.GRAY) + .append(Component.literal(effectiveHumid.name()) + .withStyle(humidityColor(effectiveHumid))); + if (baseHumid != effectiveHumid) { + humidText.append(Component.literal(" (" + baseHumid.name() + ")") + .withStyle(ChatFormatting.DARK_GRAY)); + } + l.add(humidText); + } + + if (activeQueenCount > 0) { + l.add(Component.literal("Active Queens: ") + .withStyle(ChatFormatting.GRAY) + .append(Component.literal(String.valueOf(activeQueenCount)) + .withStyle(ChatFormatting.GOLD))); + } + + if (!queenThreads.isEmpty()) { + l.add(Component.literal("--- Threads ---") + .withStyle(ChatFormatting.DARK_GRAY)); + for (AlvearyQueenThread thread : queenThreads) { + String status = thread.getStatusText(); + String species = thread.getActiveSpeciesName(); + var line = Component.literal(" [" + thread.getColorName() + "] ") + .withStyle(ChatFormatting.YELLOW); + if (species != null) { + line.append(Component.literal(species + " ") + .withStyle(ChatFormatting.WHITE)); + } + ChatFormatting statusColor = switch (status) { + case "Working" -> ChatFormatting.GREEN; + case "Breeding" -> ChatFormatting.LIGHT_PURPLE; + case "Waiting for Drone" -> ChatFormatting.GOLD; + default -> ChatFormatting.GRAY; + }; + line.append(Component.literal(status).withStyle(statusColor)); + + int progress = thread.getProgressPercent(); + if (progress > 0) { + line.append(Component.literal(" " + progress + "%") + .withStyle(ChatFormatting.AQUA)); + } + l.add(line); + + if (thread.isHasActiveQueen()) { + int lifecycle = thread.getLifecyclePercent(); + int hp = thread.getQueenHealth(); + int maxHp = thread.getQueenMaxHealth(); + l.add(Component.literal(" Life: " + hp + "/" + maxHp + + " (" + lifecycle + "% aged)") + .withStyle(ChatFormatting.DARK_GRAY)); + } + } + } + }); + } + + private static ChatFormatting temperatureColor(TemperatureType temp) { + return switch (temp) { + case ICY -> ChatFormatting.AQUA; + case COLD -> ChatFormatting.BLUE; + case NORMAL -> ChatFormatting.GREEN; + case WARM -> ChatFormatting.YELLOW; + case HOT -> ChatFormatting.RED; + case HELLISH -> ChatFormatting.DARK_RED; + }; + } + + private static ChatFormatting humidityColor(HumidityType humid) { + return switch (humid) { + case ARID -> ChatFormatting.YELLOW; + case NORMAL -> ChatFormatting.GREEN; + case DAMP -> ChatFormatting.DARK_AQUA; + }; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/AlvearyModifierPartMachine.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/AlvearyModifierPartMachine.java new file mode 100644 index 000000000..fbbed810b --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/AlvearyModifierPartMachine.java @@ -0,0 +1,57 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.part; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.bee.AlvearyModifierType; + +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.common.machine.multiblock.part.hpca.HPCAComponentPartMachine; + +import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import lombok.Getter; + +import javax.annotation.ParametersAreNonnullByDefault; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +public class AlvearyModifierPartMachine extends HPCAComponentPartMachine { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + AlvearyModifierPartMachine.class, HPCAComponentPartMachine.MANAGED_FIELD_HOLDER); + + @Getter + private final AlvearyModifierType modifierType; + + public AlvearyModifierPartMachine(IMachineBlockEntity holder, AlvearyModifierType modifierType) { + super(holder); + this.modifierType = modifierType; + } + + @Override + public boolean isAdvanced() { + return false; + } + + @Override + public ResourceTexture getComponentIcon() { + return GuiTextures.HPCA_ICON_EMPTY_COMPONENT; + } + + @Override + public int getUpkeepEUt() { + return 0; + } + + @Override + public boolean canBeDamaged() { + return false; + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/BeeHolderPartMachine.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/BeeHolderPartMachine.java new file mode 100644 index 000000000..1e7152a1c --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/BeeHolderPartMachine.java @@ -0,0 +1,113 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.part; + +import com.ghostipedia.cosmiccore.api.CosmicGuiTextures; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; +import com.gregtechceu.gtceu.api.gui.widget.BlockableSlotWidget; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; +import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +import forestry.api.ForestryCapabilities; +import forestry.api.apiculture.genetics.IBee; +import forestry.api.genetics.IIndividual; +import forestry.api.genetics.capability.IIndividualHandlerItem; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.NotNull; + +public class BeeHolderPartMachine extends MultiblockPartMachine implements IMachineLife, IFancyUIMachine { + + @Persisted + @Getter + private final BeeHolderHandler heldBees; + @Getter + @Setter + @Persisted + @DescSynced + public boolean isLocked; + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder( + BeeHolderPartMachine.class, MultiblockPartMachine.MANAGED_FIELD_HOLDER); + + public BeeHolderPartMachine(IMachineBlockEntity holder) { + super(holder); + heldBees = new BeeHolderHandler(this); + } + + public class BeeHolderHandler extends NotifiableItemStackHandler { + + public BeeHolderHandler(MetaMachine machine) { + super(machine, 4, IO.IN, IO.BOTH, size -> new CustomItemStackHandler(size) { + + @Override + public int getSlotLimit(int slot) { + return 4; + } + }); + } + + @Override + public int getSlotLimit(int slot) { + return 4; + } + + @Override + public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate) { + if (!isLocked()) { + return super.extractItem(slot, amount, simulate); + } + return ItemStack.EMPTY; + } + + @Override + public boolean isItemValid(int slot, @NotNull ItemStack stack) { + var optionalForgeCap = stack.getCapability(ForestryCapabilities.INDIVIDUAL_HANDLER_ITEM, null); + if (!optionalForgeCap.isPresent()) return false; + IIndividualHandlerItem cap = optionalForgeCap.resolve().get(); + IIndividual individual = cap.getIndividual(); + return individual instanceof IBee bee; + } + } + + @Override + public Widget createUIWidget() { + return new WidgetGroup(0, 0, 176, 65) + .addWidget(new ImageWidget(8, 5, 160, 60, CosmicGuiTextures.BEE_HOLDER_OVERLAY)) + .addWidget(new BlockableSlotWidget(heldBees, 0, 37, 26).setIsBlocked(this::isLocked) + .setBackground(GuiTextures.SLOT, CosmicGuiTextures.BEE_OVERLAY)) + .addWidget(new BlockableSlotWidget(heldBees, 1, 65, 26).setIsBlocked(this::isLocked) + .setBackground(GuiTextures.SLOT, CosmicGuiTextures.BEE_OVERLAY)) + .addWidget(new BlockableSlotWidget(heldBees, 2, 93, 26).setIsBlocked(this::isLocked) + .setBackground(GuiTextures.SLOT, CosmicGuiTextures.BEE_OVERLAY)) + .addWidget(new BlockableSlotWidget(heldBees, 3, 121, 26).setIsBlocked(this::isLocked) + .setBackground(GuiTextures.SLOT, CosmicGuiTextures.BEE_OVERLAY)); + } + + @Override + public ModularUI createUI(Player entityPlayer) { + return new ModularUI(176, 65, this, entityPlayer).widget(new FancyMachineUIWidget(this, 176, 65)); + } + + @Override + public ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/EmberHatchPartMachine.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/EmberHatchPartMachine.java new file mode 100644 index 000000000..805464532 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/EmberHatchPartMachine.java @@ -0,0 +1,73 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.part; + +import com.ghostipedia.cosmiccore.api.machine.trait.NotifiableEmberContainer; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; + +import net.minecraft.client.resources.language.I18n; +import net.minecraft.network.chat.Component; + +import org.jetbrains.annotations.NotNull; + +public class EmberHatchPartMachine extends TieredIOPartMachine { + + protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(EmberHatchPartMachine.class, + TieredIOPartMachine.MANAGED_FIELD_HOLDER); + + // Cache that updates when emberContainer.capability updates, synced for the UI + @DescSynced + @Persisted + public double cachedEmber = 0; + + @Persisted + public final NotifiableEmberContainer emberContainer; + + public EmberHatchPartMachine(IMachineBlockEntity holder, int tier, IO io) { + super(holder, tier, io); + this.emberContainer = new NotifiableEmberContainer(this, io, getMaxCapacity(tier), getMaxConsumption(tier)); + } + + @Override + public Widget createUIWidget() { + var group = new WidgetGroup(0, 0, 128, 63); + + group.addWidget(new ImageWidget(4, 4, 120, 55, GuiTextures.DISPLAY)); + group.addWidget(new LabelWidget(8, 8, + Component + .translatable("gui.cosmiccore.ember_hatch.label." + (this.io == IO.IN ? "import" : "export")))); + + group.addWidget( + new LabelWidget(8, 18, + () -> I18n.get("gui.cosmiccore.ember_hatch.ember", + FormattingUtil.formatNumbers(cachedEmber))) + .setClientSideWidget()); + + group.setBackground(GuiTextures.BACKGROUND_INVERSE); + return group; + } + + public static double getMaxCapacity(int tier) { + return 1000 * Math.pow(4, tier); + } + + public static double getMaxConsumption(int tier) { + return 500 * Math.pow(4, tier); + } + + @Override + public @NotNull ManagedFieldHolder getFieldHolder() { + return MANAGED_FIELD_HOLDER; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/HPCAIndicatorPartMachine.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/HPCAIndicatorPartMachine.java new file mode 100644 index 000000000..f5bed9695 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/HPCAIndicatorPartMachine.java @@ -0,0 +1,20 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.part; + +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; + +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.BlockHitResult; + +public class HPCAIndicatorPartMachine extends MultiblockPartMachine { + + public HPCAIndicatorPartMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + @Override + public boolean shouldOpenUI(Player player, InteractionHand hand, BlockHitResult hit) { + return false; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/ember/CosmicEmberEmitterBlock.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/ember/CosmicEmberEmitterBlock.java new file mode 100644 index 000000000..52b15cd68 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/ember/CosmicEmberEmitterBlock.java @@ -0,0 +1,59 @@ +package com.ghostipedia.cosmiccore.ember; + +import com.ghostipedia.cosmiccore.common.data.CosmicBlockEntities; +import com.ghostipedia.cosmiccore.ember.blockentity.CosmicEmberEmitterBlockEntity; + +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +import com.rekindled.embers.block.EmberEmitterBlock; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class CosmicEmberEmitterBlock extends EmberEmitterBlock { + + @Getter + private int tier; + + public CosmicEmberEmitterBlock(Properties properties, int tier) { + super(properties); + this.tier = tier; + } + + @Override + public BlockEntityTicker getTicker(Level pLevel, BlockState pState, + BlockEntityType pBlockEntityType) { + return pLevel.isClientSide ? null : createTickerHelper(pBlockEntityType, + CosmicBlockEntities.COSMIC_EMBER_EMITTER_BE.get(tier).get(), CosmicEmberEmitterBlockEntity::serverTick); + } + + @Override + public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { + return new CosmicEmberEmitterBlockEntity(CosmicBlockEntities.COSMIC_EMBER_EMITTER_BE.get(tier).get(), pPos, + pState, tier); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable BlockGetter level, List tooltip, + TooltipFlag flag) { + long capacity = (long) (250 * Math.pow(4, tier + 2)); + long transfer = (long) (250 * Math.pow(4, tier)); + tooltip.add(Component.translatable("cosmiccore.ember.capacity", + Component.literal(FormattingUtil.formatNumberReadable(capacity)).withStyle(ChatFormatting.GOLD))); + tooltip.add(Component.translatable("cosmiccore.ember.transfer", + Component.literal(FormattingUtil.formatNumberReadable(transfer)).withStyle(ChatFormatting.GOLD))); + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/ember/CosmicEmberReceptorBlock.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/ember/CosmicEmberReceptorBlock.java new file mode 100644 index 000000000..18e8afa72 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/ember/CosmicEmberReceptorBlock.java @@ -0,0 +1,61 @@ +package com.ghostipedia.cosmiccore.ember; + +import com.ghostipedia.cosmiccore.common.data.CosmicBlockEntities; +import com.ghostipedia.cosmiccore.ember.blockentity.CosmicEmberReceptorBlockEntity; + +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityTicker; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +import com.rekindled.embers.block.EmberReceiverBlock; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +import static com.ghostipedia.cosmiccore.common.data.CosmicBlockEntities.COSMIC_EMBER_RECEIVER_BE; + +public class CosmicEmberReceptorBlock extends EmberReceiverBlock { + + @Getter + private int tier; + + public CosmicEmberReceptorBlock(Properties properties, int tier) { + super(properties); + this.tier = tier; + } + + @Override + public BlockEntityTicker getTicker(Level pLevel, BlockState pState, + BlockEntityType pBlockEntityType) { + return pLevel.isClientSide ? null : createTickerHelper(pBlockEntityType, + COSMIC_EMBER_RECEIVER_BE.get(tier).get(), CosmicEmberReceptorBlockEntity::serverTick); + } + + @Override + public BlockEntity newBlockEntity(BlockPos pPos, BlockState pState) { + return new CosmicEmberReceptorBlockEntity(CosmicBlockEntities.COSMIC_EMBER_RECEIVER_BE.get(tier).get(), pPos, + pState, tier); + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable BlockGetter level, List tooltip, + TooltipFlag flag) { + long transfer = (long) (250 * Math.pow(4, tier)); + long capacity = (long) (250 * Math.pow(4, tier + 2)); + tooltip.add(Component.translatable("cosmiccore.ember.capacity", + Component.literal(FormattingUtil.formatNumberReadable(capacity)).withStyle(ChatFormatting.GOLD))); + tooltip.add(Component.translatable("cosmiccore.ember.transfer", + Component.literal(FormattingUtil.formatNumberReadable(transfer)).withStyle(ChatFormatting.GOLD))); + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/ember/ICosmicEmberStats.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/ember/ICosmicEmberStats.java new file mode 100644 index 000000000..7db89631c --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/ember/ICosmicEmberStats.java @@ -0,0 +1,8 @@ +package com.ghostipedia.cosmiccore.ember; + +public interface ICosmicEmberStats { + + double transfer(); + + double pull(); +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/ember/blockentity/CosmicEmberEmitterBlockEntity.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/ember/blockentity/CosmicEmberEmitterBlockEntity.java new file mode 100644 index 000000000..07100e596 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/ember/blockentity/CosmicEmberEmitterBlockEntity.java @@ -0,0 +1,106 @@ +package com.ghostipedia.cosmiccore.ember.blockentity; + +import com.ghostipedia.cosmiccore.ember.ICosmicEmberStats; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.phys.Vec3; + +import com.rekindled.embers.RegistryManager; +import com.rekindled.embers.api.capabilities.EmbersCapabilities; +import com.rekindled.embers.api.power.IEmberCapability; +import com.rekindled.embers.api.power.IEmberPacketReceiver; +import com.rekindled.embers.blockentity.EmberEmitterBlockEntity; +import com.rekindled.embers.datagen.EmbersSounds; +import com.rekindled.embers.entity.EmberPacketEntity; +import com.rekindled.embers.util.Misc; +import lombok.Getter; + +import java.util.HashSet; + +public class CosmicEmberEmitterBlockEntity extends EmberEmitterBlockEntity implements ICosmicEmberStats { + + @Getter + private int tier; + + @Override + public double transfer() { + return 250 * Math.pow(4, tier); + } + + @Override + public double pull() { + return 50 * Math.pow(4, tier); + } + + public CosmicEmberEmitterBlockEntity(BlockEntityType type, BlockPos pPos, BlockState pBlockState, int tier) { + super(type, pPos, pBlockState); + capability.setEmberCapacity(250 * Math.pow(4, tier + 2)); + this.tier = tier; + } + + public static CosmicEmberEmitterBlockEntity create(BlockEntityType type, BlockPos pPos, BlockState pBlockState, + int tier) { + return new CosmicEmberEmitterBlockEntity(type, pPos, pBlockState, tier); + } + + public static void serverTick(Level level, BlockPos pos, BlockState state, + CosmicEmberEmitterBlockEntity blockEntity) { + blockEntity.ticksExisted++; + Direction facing = state.getValue(BlockStateProperties.FACING); + BlockEntity attachedTile = level.getBlockEntity(pos.relative(facing, -1)); + if (blockEntity.ticksExisted % 5 == 0 && attachedTile != null) { + IEmberCapability cap = attachedTile.getCapability(EmbersCapabilities.EMBER_CAPABILITY, facing).orElse(null); + if (cap != null) { + if (cap.getEmber() > 0 && + blockEntity.capability.getEmber() < blockEntity.capability.getEmberCapacity()) { + double removed = cap.removeAmount(blockEntity.pull(), true); + blockEntity.capability.addAmount(removed, true); + } + } + } + if ((blockEntity.ticksExisted + blockEntity.offset) % 20 == 0 && blockEntity.canSendBurst() && + blockEntity.capability.getEmber() > PULL_RATE) { + BlockEntity targetTile = level.getBlockEntity(blockEntity.target); + if (targetTile instanceof IEmberPacketReceiver) { + if (((IEmberPacketReceiver) targetTile).hasRoomFor(blockEntity.transfer())) { + EmberPacketEntity packet = RegistryManager.EMBER_PACKET.get().create(blockEntity.level); + Vec3 velocity = getBurstVelocity(facing); + packet.initCustom(pos, blockEntity.target, velocity.x, velocity.y, velocity.z, + Math.min(blockEntity.transfer(), blockEntity.capability.getEmber())); + blockEntity.capability + .removeAmount(Math.min(blockEntity.transfer(), blockEntity.capability.getEmber()), true); + blockEntity.level.addFreshEntity(packet); + level.playSound(null, pos, EmbersSounds.EMBER_EMIT.get(), SoundSource.BLOCKS, 1.0f, 1.0f); + } + } + } + } + + @Override + public boolean canSendBurst() { + if (target != null && level.isLoaded(target) && !level.isClientSide) { + if (trajectoryChunks == null) { + trajectoryChunks = new HashSet(); + Misc.calculateTrajectoryChunks(trajectoryChunks, worldPosition, target, + getEmittingDirection(level.getBlockState(worldPosition).getValue(BlockStateProperties.FACING))); + } + if (level instanceof ServerLevel serverLevel) { + for (ChunkPos chunk : trajectoryChunks) { + if (!serverLevel.isNaturalSpawningAllowed(chunk)) + return false; + } + } + return true; + } + return false; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/ember/blockentity/CosmicEmberReceptorBlockEntity.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/ember/blockentity/CosmicEmberReceptorBlockEntity.java new file mode 100644 index 000000000..9ad5cbb3a --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/ember/blockentity/CosmicEmberReceptorBlockEntity.java @@ -0,0 +1,59 @@ +package com.ghostipedia.cosmiccore.ember.blockentity; + +import com.ghostipedia.cosmiccore.ember.ICosmicEmberStats; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; + +import com.rekindled.embers.api.capabilities.EmbersCapabilities; +import com.rekindled.embers.api.power.IEmberCapability; +import com.rekindled.embers.blockentity.EmberReceiverBlockEntity; +import lombok.Getter; + +public class CosmicEmberReceptorBlockEntity extends EmberReceiverBlockEntity implements ICosmicEmberStats { + + @Getter + private int tier; + + @Override + public double transfer() { + return 250 * Math.pow(4, tier); + } + + // Unused + @Override + public double pull() { + return 0; + } + + public CosmicEmberReceptorBlockEntity(BlockEntityType type, BlockPos pPos, BlockState pBlockState, int tier) { + super(type, pPos, pBlockState); + capability.setEmberCapacity(250 * Math.pow(4, tier + 2)); + this.tier = tier; + } + + public static CosmicEmberReceptorBlockEntity create(BlockEntityType type, BlockPos pPos, BlockState pBlockState, + int tier) { + return new CosmicEmberReceptorBlockEntity(type, pPos, pBlockState, tier); + } + + public static void serverTick(Level level, BlockPos pos, BlockState state, + CosmicEmberReceptorBlockEntity blockEntity) { + blockEntity.ticksExisted++; + Direction facing = state.getValue(BlockStateProperties.FACING); + BlockEntity attachedTile = level.getBlockEntity(pos.relative(facing, -1)); + if (blockEntity.ticksExisted % 2 == 0 && attachedTile != null) { + IEmberCapability cap = attachedTile.getCapability(EmbersCapabilities.EMBER_CAPABILITY, facing).orElse(null); + if (cap != null && cap.getEmber() < cap.getEmberCapacity() && blockEntity.capability.getEmber() > 0) { + double added = cap.addAmount(Math.min(blockEntity.transfer(), blockEntity.capability.getEmber()), true); + blockEntity.capability.removeAmount(added, true); + } + + } + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/jade/CCJadePlugin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/jade/CCJadePlugin.java new file mode 100644 index 000000000..ec10d8005 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/jade/CCJadePlugin.java @@ -0,0 +1,34 @@ +package com.ghostipedia.cosmiccore.integration.jade; + +import com.ghostipedia.cosmiccore.integration.jade.provider.DroneMaintenanceInterfaceProvider; +import com.ghostipedia.cosmiccore.integration.jade.provider.DroneStationProvider; +import com.ghostipedia.cosmiccore.integration.jade.provider.PCBParallelProvider; +import com.ghostipedia.cosmiccore.integration.jade.provider.StellarModuleProvider; + +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; + +import snownee.jade.api.IWailaClientRegistration; +import snownee.jade.api.IWailaCommonRegistration; +import snownee.jade.api.IWailaPlugin; +import snownee.jade.api.WailaPlugin; + +@WailaPlugin +public class CCJadePlugin implements IWailaPlugin { + + @Override + public void register(IWailaCommonRegistration registration) { + registration.registerBlockDataProvider(new DroneStationProvider(), BlockEntity.class); + registration.registerBlockDataProvider(new DroneMaintenanceInterfaceProvider(), BlockEntity.class); + registration.registerBlockDataProvider(new PCBParallelProvider(), BlockEntity.class); + registration.registerBlockDataProvider(new StellarModuleProvider(), BlockEntity.class); + } + + @Override + public void registerClient(IWailaClientRegistration registration) { + registration.registerBlockComponent(new DroneStationProvider(), Block.class); + registration.registerBlockComponent(new DroneMaintenanceInterfaceProvider(), Block.class); + registration.registerBlockComponent(new PCBParallelProvider(), Block.class); + registration.registerBlockComponent(new StellarModuleProvider(), Block.class); + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/jade/provider/DroneMaintenanceInterfaceProvider.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/jade/provider/DroneMaintenanceInterfaceProvider.java new file mode 100644 index 000000000..6e26fe411 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/jade/provider/DroneMaintenanceInterfaceProvider.java @@ -0,0 +1,76 @@ +package com.ghostipedia.cosmiccore.integration.jade.provider; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.part.DroneMaintenanceInterfacePartMachine; +import com.ghostipedia.cosmiccore.api.misc.DroneStationConnection; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.integration.jade.provider.CapabilityBlockProvider; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; + +import org.jetbrains.annotations.Nullable; +import snownee.jade.api.BlockAccessor; +import snownee.jade.api.ITooltip; +import snownee.jade.api.config.IPluginConfig; + +public class DroneMaintenanceInterfaceProvider extends CapabilityBlockProvider { + + public DroneMaintenanceInterfaceProvider() { + super(CosmicCore.id("drone_maintenance_interface")); + } + + @Nullable + @Override + protected DroneMaintenanceInterfacePartMachine getCapability(Level level, BlockPos blockPos, + @Nullable Direction direction) { + if (MetaMachine.getMachine(level, + blockPos) instanceof DroneMaintenanceInterfacePartMachine droneMaintenanceInterface) { + return droneMaintenanceInterface; + } + return null; + } + + @Override + protected void write(CompoundTag compoundTag, DroneMaintenanceInterfacePartMachine droneInterface) { + boolean isConnected = droneInterface.hasConnection(); + compoundTag.putBoolean("isConnected", isConnected); + if (isConnected) { + DroneStationConnection connection = droneInterface.getConnection(); + compoundTag.putLong("connectionX", connection.droneStationPos.getX()); + compoundTag.putLong("connectionY", connection.droneStationPos.getY()); + compoundTag.putLong("connectionZ", connection.droneStationPos.getZ()); + } + } + + @Override + protected void addTooltip(CompoundTag compoundTag, ITooltip iTooltip, Player player, BlockAccessor blockAccessor, + BlockEntity blockEntity, IPluginConfig iPluginConfig) { + if (compoundTag.contains("isConnected", Tag.TAG_BYTE)) { + if (compoundTag.getBoolean("isConnected")) { + long xPos = compoundTag.getLong("connectionX"); + long yPos = compoundTag.getLong("connectionY"); + long zPos = compoundTag.getLong("connectionZ"); + iTooltip.add(Component + .translatable("cosmiccore.multiblock.drone_maintenance_interface.connection_location", + xPos, + yPos, + zPos) + .setStyle(Style.EMPTY.withColor(ChatFormatting.GREEN))); + + } else { + iTooltip.add(Component.translatable("cosmiccore.multiblock.drone_maintenance_interface.no_connection") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + } + } + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/jade/provider/DroneStationProvider.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/jade/provider/DroneStationProvider.java new file mode 100644 index 000000000..688c20d94 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/jade/provider/DroneStationProvider.java @@ -0,0 +1,88 @@ +package com.ghostipedia.cosmiccore.integration.jade.provider; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.multiblock.DroneStationMachine; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.integration.jade.provider.CapabilityBlockProvider; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; + +import org.jetbrains.annotations.Nullable; +import snownee.jade.api.BlockAccessor; +import snownee.jade.api.ITooltip; +import snownee.jade.api.config.IPluginConfig; + +public class DroneStationProvider extends CapabilityBlockProvider { + + public DroneStationProvider() { + super(CosmicCore.id("drone_station")); + } + + @Nullable + @Override + protected DroneStationMachine getCapability(Level level, BlockPos blockPos, @Nullable Direction direction) { + if (MetaMachine.getMachine(level, blockPos) instanceof MultiblockControllerMachine controller) { + if (controller instanceof DroneStationMachine maintenanceMachine) { + return maintenanceMachine; + } + } + return null; + } + + @Override + protected void write(CompoundTag compoundTag, DroneStationMachine droneStation) { + compoundTag.putLong("connections", droneStation.connections.size()); + if (droneStation.currentTier == null) { + compoundTag.putString("currentTier", "cosmiccore.multiblock.drone_station_machine.tier.5"); + } else { + compoundTag.putString("currentTier", toKey(droneStation.currentTier.ordinal())); + } + } + + private String toTitleCase(String input) { + if (input == null || input.isEmpty()) { + return input; + } + // Upper‐case the first character, lower‐case the rest + String first = input.substring(0, 1).toUpperCase(); + String rest = input.substring(1).toLowerCase(); + return first + rest; + } + + private String toKey(int input) { + return "cosmiccore.multiblock.drone_station_machine.tier." + input; + } + + @Override + protected void addTooltip(CompoundTag compoundTag, ITooltip iTooltip, Player player, BlockAccessor blockAccessor, + BlockEntity blockEntity, IPluginConfig iPluginConfig) { + if (compoundTag.contains("connections", Tag.TAG_LONG)) { + long amount = compoundTag.getLong("connections"); + if (amount > 0) { + iTooltip.add(Component.translatable("cosmiccore.multiblock.drone_station_machine.drone_amount", amount) + .setStyle(Style.EMPTY.withColor(ChatFormatting.GREEN))); + + } else { + iTooltip.add(Component.translatable("cosmiccore.multiblock.drone_station_machine.no_drones") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + } + } + if (compoundTag.contains("currentTier")) { + iTooltip.add(Component + .translatable("cosmiccore.multiblock.drone_station_machine.current_tier", + Component.translatable(compoundTag.getString("currentTier"))) + .setStyle(Style.EMPTY.withColor(ChatFormatting.GREEN))); + } + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/jade/provider/PCBParallelProvider.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/jade/provider/PCBParallelProvider.java new file mode 100644 index 000000000..a48626b93 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/jade/provider/PCBParallelProvider.java @@ -0,0 +1,70 @@ +package com.ghostipedia.cosmiccore.integration.jade.provider; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.PCBFoundryMachine; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.capability.IParallelHatch; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; + +import snownee.jade.api.*; +import snownee.jade.api.config.IPluginConfig; + +public class PCBParallelProvider implements IBlockComponentProvider, IServerDataProvider { + + private static final ResourceLocation UID = CosmicCore.id("pcb_parallel"); + private static final String DATA_KEY = UID.toString(); + + @Override + public ResourceLocation getUid() { + return UID; + } + + @Override + public void appendServerData(CompoundTag data, BlockAccessor accessor) { + if (!(accessor.getBlockEntity() instanceof MetaMachine be)) return; + var machine = be; + + if (machine instanceof IParallelHatch hatch && + hatch instanceof ParallelHatchPartMachine part && + part.getControllers().size() == 1 && + part.getControllers().first() instanceof PCBFoundryMachine) { + CompoundTag tag = new CompoundTag(); + tag.putInt("parallel", hatch.getCurrentParallel() * 4); + data.put(DATA_KEY, tag); + return; + } + + if (machine instanceof PCBFoundryMachine foundry && machine instanceof MultiblockControllerMachine controller) { + CompoundTag tag = new CompoundTag(); + var logic = foundry.getRecipeLogic(); + if (logic.isActive() && logic.getLastRecipe() != null) { + tag.putInt("parallel", logic.getLastRecipe().parallels); + tag.putBoolean("exact", true); + } else { + controller.getParallelHatch().ifPresent(h -> tag.putInt("parallel", h.getCurrentParallel() * 4)); + } + if (tag.contains("parallel")) data.put(DATA_KEY, tag); + } + } + + @Override + public void appendTooltip(ITooltip tooltip, BlockAccessor accessor, IPluginConfig config) { + CompoundTag tag = accessor.getServerData().getCompound(DATA_KEY); + if (tag.isEmpty() || !tag.contains("parallel")) return; + + int parallel = tag.getInt("parallel"); + if (parallel <= 1) return; + + String key = tag.getBoolean("exact") ? "gtceu.multiblock.parallel.exact" : "gtceu.multiblock.parallel"; + tooltip.add(Component.translatable(key, + Component.literal(FormattingUtil.formatNumbers(parallel)).withStyle(ChatFormatting.DARK_PURPLE))); + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/jade/provider/StellarModuleProvider.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/jade/provider/StellarModuleProvider.java new file mode 100644 index 000000000..b6dd76d02 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/jade/provider/StellarModuleProvider.java @@ -0,0 +1,260 @@ +package com.ghostipedia.cosmiccore.integration.jade.provider; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarIrisProvider; +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.integration.jade.GTElementHelper; +import com.gregtechceu.gtceu.utils.FormattingUtil; +import com.gregtechceu.gtceu.utils.GTUtil; + +import net.minecraft.ChatFormatting; +import net.minecraft.Util; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.*; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.fluids.FluidStack; + +import snownee.jade.api.*; +import snownee.jade.api.config.IPluginConfig; +import snownee.jade.api.fluid.JadeFluidObject; +import snownee.jade.api.ui.BoxStyle; +import snownee.jade.api.ui.IElementHelper; +import snownee.jade.util.FluidTextHelper; + +import java.awt.Color; + +public class StellarModuleProvider implements IBlockComponentProvider, IServerDataProvider { + + private static final ResourceLocation UID = CosmicCore.id("stellar_module"); + private static final String DATA_KEY = UID.toString(); + + @Override + public ResourceLocation getUid() { + return UID; + } + + @Override + public void appendServerData(CompoundTag data, BlockAccessor accessor) { + if (!(accessor.getBlockEntity() instanceof MetaMachine be)) return; + if (!(be instanceof StellarBaseModule module)) return; + + CompoundTag tag = new CompoundTag(); + writeModuleData(tag, module); + data.put(DATA_KEY, tag); + } + + private void writeModuleData(CompoundTag tag, StellarBaseModule module) { + IStellarIrisProvider iris = module.getStellarIris(); + boolean connected = iris != null && iris.isFormed(); + boolean canProcess = connected && iris.canProcess(); + + tag.putBoolean("connected", connected); + tag.putBoolean("canProcess", canProcess); + tag.putBoolean("wirelessAvailable", module.isWirelessEnergyAvailable()); + tag.putLong("energyPerTick", module.getEnergyConsumedPerTick()); + + if (iris != null) { + tag.putString("stage", iris.getStage().toString()); + if (canProcess) tag.putDouble("speedBonus", iris.getSpeedBonus()); + } + + RecipeLogic logic = module.getRecipeLogic(); + tag.putBoolean("active", logic.isActive()); + tag.putInt("progress", logic.getProgress()); + tag.putInt("maxProgress", logic.getMaxProgress()); + + GTRecipe recipe = logic.getLastRecipe(); + if (logic.isWorking() && recipe != null) { + tag.putBoolean("working", true); + if (recipe.parallels > 1) tag.putInt("recipeParallels", recipe.parallels); + writeRecipeOutputs(tag, recipe); + } + } + + private void writeRecipeOutputs(CompoundTag tag, GTRecipe recipe) { + int recipeTier = RecipeHelper.getPreOCRecipeEuTier(recipe); + int chanceTier = recipeTier + recipe.ocLevel; + var chanceFunc = recipe.getType().getChanceFunction(); + + ListTag itemTags = new ListTag(); + for (var item : recipe.getOutputContents(ItemRecipeCapability.CAP)) { + var stacks = ItemRecipeCapability.CAP.of(item.content).getItems(); + if (stacks.length == 0 || stacks[0].isEmpty()) continue; + + var itemTag = new CompoundTag(); + GTUtil.saveItemStack(stacks[0], itemTag); + if (item.chance < item.maxChance) { + double adjusted = (double) stacks[0].getCount() * recipe.parallels * + chanceFunc.getBoostedChance(item, recipeTier, chanceTier) / item.maxChance; + itemTag.putInt("Count", Math.max(1, (int) Math.round(adjusted))); + } + itemTags.add(itemTag); + } + if (!itemTags.isEmpty()) tag.put("outputItems", itemTags); + + ListTag fluidTags = new ListTag(); + for (var fluid : recipe.getOutputContents(FluidRecipeCapability.CAP)) { + FluidStack[] stacks = FluidRecipeCapability.CAP.of(fluid.content).getStacks(); + if (stacks.length == 0 || stacks[0].isEmpty()) continue; + + var fluidTag = new CompoundTag(); + stacks[0].writeToNBT(fluidTag); + if (fluid.chance < fluid.maxChance) { + double adjusted = (double) stacks[0].getAmount() * recipe.parallels * + chanceFunc.getBoostedChance(fluid, recipeTier, chanceTier) / fluid.maxChance; + fluidTag.putInt("Amount", Math.max(1, (int) Math.round(adjusted))); + } + fluidTags.add(fluidTag); + } + if (!fluidTags.isEmpty()) tag.put("outputFluids", fluidTags); + } + + @Override + public void appendTooltip(ITooltip tooltip, BlockAccessor accessor, IPluginConfig config) { + CompoundTag tag = accessor.getServerData().getCompound(DATA_KEY); + if (tag.isEmpty() || !tag.contains("connected")) return; + + boolean connected = tag.getBoolean("connected"); + boolean canProcess = tag.getBoolean("canProcess"); + + if (!connected) { + tooltip.add(Component.translatable("cosmiccore.jade.stellar_module.not_connected") + .withStyle(ChatFormatting.RED)); + } else if (!canProcess) { + tooltip.add(Component.translatable("cosmiccore.jade.stellar_module.iris_not_ready") + .withStyle(ChatFormatting.YELLOW)); + addStageInfo(tooltip, tag, ChatFormatting.GRAY); + } else { + tooltip.add(Component.translatable("cosmiccore.jade.stellar_module.connected") + .withStyle(ChatFormatting.GREEN)); + addStageInfo(tooltip, tag, ChatFormatting.AQUA); + if (tag.contains("speedBonus")) { + tooltip.add(Component.translatable("cosmiccore.jade.stellar_module.speed_bonus", + String.format("%.1fx", tag.getDouble("speedBonus"))).withStyle(ChatFormatting.GREEN)); + } + } + + if (!tag.getBoolean("wirelessAvailable")) { + tooltip.add(Component.translatable("cosmiccore.jade.stellar_module.no_wireless") + .withStyle(ChatFormatting.RED)); + } else { + long eu = tag.getLong("energyPerTick"); + if (eu > 0) { + tooltip.add(Component.translatable("cosmiccore.jade.stellar_module.energy_usage", + formatEnergy(eu)).withStyle(ChatFormatting.YELLOW)); + } + } + + addProgressBar(tooltip, tag); + addParallelInfo(tooltip, tag); + addOutputs(tooltip, tag); + } + + private void addStageInfo(ITooltip tooltip, CompoundTag tag, ChatFormatting color) { + if (tag.contains("stage")) { + tooltip.add(Component.translatable("cosmiccore.jade.stellar_module.stage", + tag.getString("stage")).withStyle(color)); + } + } + + private void addProgressBar(ITooltip tooltip, CompoundTag tag) { + if (!tag.getBoolean("active")) return; + + int progress = tag.getInt("progress"); + int max = tag.getInt("maxProgress"); + if (max <= 0) return; + + Component text = max < 20 ? Component.translatable("gtceu.jade.progress_tick", progress, max) : + Component.translatable("gtceu.jade.progress_sec", Math.round(progress / 20f), Math.round(max / 20f)); + + IElementHelper helper = tooltip.getElementHelper(); + float hue = (System.currentTimeMillis() % 3000) / 3000f; + int rainbow = Color.HSBtoRGB(hue, 0.8f, 1f) | 0xFF000000; + + tooltip.add(helper.progress( + max == 0 ? 0 : (float) progress / max, + text, + helper.progressStyle().color(rainbow).textColor(-1), + Util.make(BoxStyle.DEFAULT, s -> s.borderColor = 0xFF555555), + true)); + } + + private void addParallelInfo(ITooltip tooltip, CompoundTag tag) { + if (!tag.contains("recipeParallels")) return; + tooltip.add(Component.translatable("gtceu.multiblock.parallel.exact", + Component.literal(FormattingUtil.formatNumbers(tag.getInt("recipeParallels"))) + .withStyle(ChatFormatting.DARK_PURPLE))); + } + + private void addOutputs(ITooltip tooltip, CompoundTag tag) { + if (!tag.getBoolean("working")) return; + + boolean hasHeader = false; + if (tag.contains("outputItems", Tag.TAG_LIST)) { + ListTag items = tag.getList("outputItems", Tag.TAG_COMPOUND); + if (!items.isEmpty()) { + tooltip.add(Component.translatable("gtceu.top.recipe_output")); + hasHeader = true; + addItemOutputs(tooltip, items); + } + } + + if (tag.contains("outputFluids", Tag.TAG_LIST)) { + ListTag fluids = tag.getList("outputFluids", Tag.TAG_COMPOUND); + if (!fluids.isEmpty()) { + if (!hasHeader) tooltip.add(Component.translatable("gtceu.top.recipe_output")); + addFluidOutputs(tooltip, fluids); + } + } + } + + private void addItemOutputs(ITooltip tooltip, ListTag items) { + IElementHelper helper = tooltip.getElementHelper(); + for (Tag t : items) { + if (!(t instanceof CompoundTag itemTag)) continue; + ItemStack stack = GTUtil.loadItemStack(itemTag); + if (stack.isEmpty()) continue; + + int count = stack.getCount(); + stack.setCount(1); + tooltip.add(helper.smallItem(stack)); + tooltip.append(CommonComponents.space() + .append(String.valueOf(count)) + .append(Component.translatable("gtceu.gui.content.times_item", + ComponentUtils.wrapInSquareBrackets(stack.getItem().getDescription()) + .withStyle(ChatFormatting.WHITE)))); + } + } + + private void addFluidOutputs(ITooltip tooltip, ListTag fluids) { + for (Tag t : fluids) { + if (!(t instanceof CompoundTag fluidTag)) continue; + FluidStack stack = FluidStack.loadFluidStackFromNBT(fluidTag); + if (stack.isEmpty()) continue; + + tooltip.add(GTElementHelper.smallFluid(JadeFluidObject.of(stack.getFluid(), stack.getAmount()))); + tooltip.append(CommonComponents.space() + .append(FluidTextHelper.getUnicodeMillibuckets(stack.getAmount(), true)) + .append(CommonComponents.space()) + .append(ComponentUtils.wrapInSquareBrackets(stack.getDisplayName()) + .withStyle(ChatFormatting.WHITE))); + } + } + + private String formatEnergy(long eu) { + if (eu >= 1_000_000_000) return String.format("%.1fG EU/t", eu / 1e9); + if (eu >= 1_000_000) return String.format("%.1fM EU/t", eu / 1e6); + if (eu >= 1000) return String.format("%.1fk EU/t", eu / 1e3); + return eu + " EU/t"; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/journeymap/CosmicJourneymapPlugin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/journeymap/CosmicJourneymapPlugin.java new file mode 100644 index 000000000..847f57cf7 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/journeymap/CosmicJourneymapPlugin.java @@ -0,0 +1,46 @@ +package com.ghostipedia.cosmiccore.integration.journeymap; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import journeymap.client.api.ClientPlugin; +import journeymap.client.api.IClientAPI; +import journeymap.client.api.IClientPlugin; +import journeymap.client.api.event.ClientEvent; +import journeymap.client.api.event.RegistryEvent; +import lombok.Getter; + +import java.util.EnumSet; + +@ClientPlugin +public class CosmicJourneymapPlugin implements IClientPlugin { + + @Getter + private static IClientAPI api; + @Getter + private static boolean active = false; + @Getter + private static PredictedVeinOptions options; + + @Override + public void initialize(IClientAPI jmClientApi) { + api = jmClientApi; + active = true; + jmClientApi.subscribe(CosmicCore.MOD_ID, EnumSet.of(ClientEvent.Type.REGISTRY)); + CosmicCore.LOGGER.info("CosmicCore JourneyMap integration initialized"); + } + + @Override + public String getModId() { + return CosmicCore.MOD_ID; + } + + @Override + public void onEvent(ClientEvent event) { + if (event.type == ClientEvent.Type.REGISTRY) { + RegistryEvent registryEvent = (RegistryEvent) event; + if (registryEvent.getRegistryType() == RegistryEvent.RegistryType.OPTIONS) { + options = new PredictedVeinOptions(); + } + } + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/journeymap/PredictedVeinOptions.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/journeymap/PredictedVeinOptions.java new file mode 100644 index 000000000..89cfa9afd --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/journeymap/PredictedVeinOptions.java @@ -0,0 +1,33 @@ +package com.ghostipedia.cosmiccore.integration.journeymap; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import journeymap.client.api.option.BooleanOption; +import journeymap.client.api.option.OptionCategory; + +public class PredictedVeinOptions { + + private final BooleanOption predictedVeinsOption; + + public PredictedVeinOptions() { + final OptionCategory category = new OptionCategory(CosmicCore.MOD_ID, "cosmiccore.journeymap.options"); + predictedVeinsOption = new BooleanOption( + category, + "predicted_veins", + "cosmiccore.journeymap.options.predicted_veins", + true); + } + + public boolean showPredictedVeins() { + return predictedVeinsOption.get(); + } + + public void togglePredictedVeins(boolean active) { + predictedVeinsOption.set(active); + if (!active) { + PredictedVeinRenderer.hideAllMarkers(); + } else { + PredictedVeinRenderer.showAllMarkers(); + } + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/journeymap/PredictedVeinRenderer.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/journeymap/PredictedVeinRenderer.java new file mode 100644 index 000000000..96071f0b5 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/journeymap/PredictedVeinRenderer.java @@ -0,0 +1,218 @@ +package com.ghostipedia.cosmiccore.integration.journeymap; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.worldgen.survey.VeinSurveyUtil.VeinInfo; + +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; + +import com.mojang.blaze3d.platform.NativeImage; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import journeymap.client.api.IClientAPI; +import journeymap.client.api.display.DisplayType; +import journeymap.client.api.display.MarkerOverlay; +import journeymap.client.api.model.MapImage; + +import java.util.Map; + +public class PredictedVeinRenderer { + + private static final Map predictedMarkers = new Object2ObjectOpenHashMap<>(); + private static final int PREDICTED_VEIN_COLOR = 0x80808080; + private static NativeImage questionMarkImage; + + public static String getMarkerId(VeinInfo vein) { + BlockPos center = vein.center(); + return "predicted_vein@[" + center.getX() + "," + center.getZ() + "]"; + } + + public static boolean addPredictedVein(ResourceKey dim, VeinInfo vein) { + if (!CosmicJourneymapPlugin.isActive()) { + return false; + } + + IClientAPI api = CosmicJourneymapPlugin.getApi(); + if (api == null || !api.playerAccepts(CosmicCore.MOD_ID, DisplayType.Image)) { + return false; + } + + String id = getMarkerId(vein); + if (predictedMarkers.containsKey(id)) { + return false; + } + + MarkerOverlay marker = createPredictedMarker(id, dim, vein); + if (marker == null) { + return false; + } + + predictedMarkers.put(id, marker); + + try { + api.show(marker); + } catch (Exception e) { + CosmicCore.LOGGER.error("Failed to show predicted vein marker: {}", vein.getVeinName(), e); + } + + return true; + } + + public static boolean removePredictedVein(VeinInfo vein) { + return removePredictedVein(getMarkerId(vein)); + } + + public static boolean removePredictedVein(String id) { + MarkerOverlay marker = predictedMarkers.remove(id); + if (marker == null) { + return false; + } + + IClientAPI api = CosmicJourneymapPlugin.getApi(); + if (api != null) { + api.remove(marker); + } + return true; + } + + public static void removePredictedVeinsAt(BlockPos pos) { + String idPrefix = "predicted_vein@[" + pos.getX() + "," + pos.getZ() + "]"; + var toRemove = predictedMarkers.keySet().stream() + .filter(id -> id.equals(idPrefix)) + .toList(); + + for (String id : toRemove) { + removePredictedVein(id); + } + } + + public static void removePredictedVeinsInArea(BlockPos center, int radius) { + var toRemove = predictedMarkers.entrySet().stream() + .filter(entry -> { + BlockPos markerPos = entry.getValue().getPoint(); + int dx = markerPos.getX() - center.getX(); + int dz = markerPos.getZ() - center.getZ(); + return Math.sqrt(dx * dx + dz * dz) <= radius; + }) + .map(Map.Entry::getKey) + .toList(); + + for (String id : toRemove) { + removePredictedVein(id); + } + } + + public static void clear() { + IClientAPI api = CosmicJourneymapPlugin.getApi(); + if (api != null) { + predictedMarkers.values().forEach(api::remove); + } + predictedMarkers.clear(); + } + + public static void hideAllMarkers() { + IClientAPI api = CosmicJourneymapPlugin.getApi(); + if (api != null) { + predictedMarkers.values().forEach(api::remove); + } + } + + public static void showAllMarkers() { + IClientAPI api = CosmicJourneymapPlugin.getApi(); + if (api != null) { + predictedMarkers.values().forEach(marker -> { + try { + api.show(marker); + } catch (Exception e) { + CosmicCore.LOGGER.error("Failed to show predicted vein marker", e); + } + }); + } + } + + private static MarkerOverlay createPredictedMarker(String id, ResourceKey dim, VeinInfo vein) { + BlockPos center = vein.center(); + + NativeImage image = getOrCreateQuestionMarkImage(); + if (image == null) { + return null; + } + + MapImage mapImage = new MapImage(image) + .centerAnchors() + .setDisplayWidth(20) + .setDisplayHeight(20) + .setOpacity(0.7f); + + MarkerOverlay marker = new MarkerOverlay(CosmicCore.MOD_ID, id, center, mapImage); + + String tooltip = "? " + vein.getVeinName() + " (Predicted)\n" + + "Position: " + center.getX() + ", " + center.getZ() + "\n" + + "This vein has not been confirmed.\n" + + "Visit the area to verify."; + + marker.setDimension(dim) + .setLabel("?") + .setTitle(tooltip); + + return marker; + } + + private static NativeImage getOrCreateQuestionMarkImage() { + if (questionMarkImage != null) { + return questionMarkImage; + } + + int size = 16; + questionMarkImage = new NativeImage(NativeImage.Format.RGBA, size, size, false); + + int gray = 0xFF808080; + int darkGray = 0xFF404040; + int center = size / 2; + int radius = size / 2 - 1; + + for (int x = 0; x < size; x++) { + for (int y = 0; y < size; y++) { + int dx = x - center; + int dy = y - center; + double dist = Math.sqrt(dx * dx + dy * dy); + + if (dist <= radius && dist > radius - 2) { + questionMarkImage.setPixelRGBA(x, y, darkGray); + } else if (dist <= radius - 2) { + questionMarkImage.setPixelRGBA(x, y, gray); + } else { + questionMarkImage.setPixelRGBA(x, y, 0); + } + } + } + + drawQuestionMark(questionMarkImage, center, center, 0xFFFFFFFF); + + return questionMarkImage; + } + + private static void drawQuestionMark(NativeImage image, int cx, int cy, int color) { + image.setPixelRGBA(cx - 1, cy - 4, color); + image.setPixelRGBA(cx, cy - 4, color); + image.setPixelRGBA(cx + 1, cy - 4, color); + image.setPixelRGBA(cx + 2, cy - 3, color); + image.setPixelRGBA(cx + 2, cy - 2, color); + image.setPixelRGBA(cx + 1, cy - 1, color); + image.setPixelRGBA(cx, cy, color); + image.setPixelRGBA(cx, cy + 2, color); + } + + public static int getMarkerCount() { + return predictedMarkers.size(); + } + + public static boolean hasMarker(VeinInfo vein) { + return predictedMarkers.containsKey(getMarkerId(vein)); + } + + public static boolean hasMarkerAt(BlockPos pos) { + String id = "predicted_vein@[" + pos.getX() + "," + pos.getZ() + "]"; + return predictedMarkers.containsKey(id); + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/kjs/CosmicCoreKubeJSPlugin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/kjs/CosmicCoreKubeJSPlugin.java new file mode 100644 index 000000000..497962965 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/kjs/CosmicCoreKubeJSPlugin.java @@ -0,0 +1,87 @@ +package com.ghostipedia.cosmiccore.integration.kjs; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.capability.souls.SoulType; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; +import com.ghostipedia.cosmiccore.common.data.CosmicMachines; +import com.ghostipedia.cosmiccore.common.data.materials.CosmicElements; +import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; +import com.ghostipedia.cosmiccore.common.data.worldgen.CosmicWorldGenLayers; +import com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.BranchingVeinGenerator; +import com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.ClusterVeinGenerator; +import com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.FractureVeinGenerator; +import com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.LensVeinGenerator; +import com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.ShellVeinGenerator; +import com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.StringerVeinGenerator; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; +import com.ghostipedia.cosmiccore.integration.kjs.recipe.CosmicCoreRecipeSchema; +import com.ghostipedia.cosmiccore.integration.kjs.recipe.components.CosmicRecipeComponent; + +import com.gregtechceu.gtceu.api.registry.GTRegistries; + +import dev.latvian.mods.kubejs.KubeJSPlugin; +import dev.latvian.mods.kubejs.recipe.schema.RecipeComponentFactoryRegistryEvent; +import dev.latvian.mods.kubejs.recipe.schema.RegisterRecipeSchemasEvent; +import dev.latvian.mods.kubejs.script.BindingsEvent; +import dev.latvian.mods.kubejs.script.ScriptType; +import dev.latvian.mods.kubejs.util.ClassFilter; + +public class CosmicCoreKubeJSPlugin extends KubeJSPlugin { + + @Override + public void initStartup() { + super.initStartup(); + } + + @Override + public void init() { + super.init(); + } + + @Override + public void registerClasses(ScriptType type, ClassFilter filter) { + super.registerClasses(type, filter); + // allow user to access all gtceu classes by importing them. + filter.allow("com.ghostipedia.cosmiccore"); + } + + @Override + public void registerRecipeSchemas(RegisterRecipeSchemasEvent event) { + for (var entry : GTRegistries.RECIPE_TYPES.entries()) { + event.register(entry.getKey(), CosmicCoreRecipeSchema.SCHEMA); + } + } + + @Override + public void registerRecipeComponents(RecipeComponentFactoryRegistryEvent event) { + event.register("cosmicSoulIn", CosmicRecipeComponent.SOUL_IN); + event.register("cosmicSoulOut", CosmicRecipeComponent.SOUL_OUT); + + } + + @Override + public void registerBindings(BindingsEvent event) { + super.registerBindings(event); + event.add("CosmicMaterials", CosmicMaterials.class); + event.add("CosmicElements", CosmicElements.class); + event.add("CosmicBlocks", CosmicBlocks.class); + event.add("CosmicMachines", CosmicMachines.class); + event.add("CosmicItems", CosmicItems.class); + event.add("CosmicRecipeTypes", CosmicRecipeTypes.class); + event.add("CosmicSoulTypes", SoulType.class); + + // Vein generators for custom ore vein definitions + event.add("FractureVeinGenerator", FractureVeinGenerator.class); + event.add("BranchingVeinGenerator", BranchingVeinGenerator.class); + event.add("LensVeinGenerator", LensVeinGenerator.class); + event.add("ClusterVeinGenerator", ClusterVeinGenerator.class); + event.add("StringerVeinGenerator", StringerVeinGenerator.class); + event.add("ShellVeinGenerator", ShellVeinGenerator.class); + + // World gen layers for dimension targeting + event.add("CosmicWorldGenLayers", CosmicWorldGenLayers.class); + + event.add("CosmicCore", CosmicCore.class); + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/kjs/recipe/CosmicCoreRecipeSchema.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/kjs/recipe/CosmicCoreRecipeSchema.java new file mode 100644 index 000000000..5b65cb442 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/kjs/recipe/CosmicCoreRecipeSchema.java @@ -0,0 +1,61 @@ +package com.ghostipedia.cosmiccore.integration.kjs.recipe; + +import com.ghostipedia.cosmiccore.api.capability.recipe.SoulRecipeCapability; +import com.ghostipedia.cosmiccore.api.capability.recipe.SterileRecipeCapability; +import com.ghostipedia.cosmiccore.api.capability.souls.SoulType; +import com.ghostipedia.cosmiccore.api.recipe.ingredient.SoulIngredient; +import com.ghostipedia.cosmiccore.common.recipe.condition.TitanCondition; + +import com.gregtechceu.gtceu.integration.kjs.recipe.GTRecipeSchema; +import com.gregtechceu.gtceu.integration.kjs.recipe.components.GTRecipeComponents; + +import dev.latvian.mods.kubejs.recipe.schema.RecipeSchema; +import lombok.experimental.Accessors; + +import static com.gregtechceu.gtceu.integration.kjs.recipe.GTRecipeSchema.*; + +public interface CosmicCoreRecipeSchema { + + @SuppressWarnings({ "unused", "UnusedReturnValue" }) + @Accessors(chain = true, fluent = true) + class CosmicRecipeJS extends GTRecipeSchema.GTRecipeJS { + + public GTRecipeSchema.GTRecipeJS soulInput(SoulType type, int souls) { + return this.input(SoulRecipeCapability.CAP, SoulIngredient.of(type, souls)); + } + + public GTRecipeSchema.GTRecipeJS soulOutput(SoulType type, int souls) { + return this.output(SoulRecipeCapability.CAP, SoulIngredient.of(type, souls)); + } + + public GTRecipeSchema.GTRecipeJS titanTier(int tier) { + return this.addCondition(new TitanCondition(tier)); + } + + public GTRecipeSchema.GTRecipeJS sterileInput(GTRecipeComponents.FluidIngredientJS stack) { + return this.input(SterileRecipeCapability.CAP, stack.ingredient()); + } + + public GTRecipeSchema.GTRecipeJS magnetStats(int minField, int decayRate, boolean perTick) { + this.addData("min_field", minField); + this.addData("decay_rate", decayRate); + this.addDataBool("per_tick", perTick); + return this; + } + + public GTRecipeSchema.GTRecipeJS magnetStats(int minField, int decayRate) { + this.addData("min_field", minField); + this.addData("decay_rate", decayRate); + this.addDataBool("per_tick", true); + return this; + } + + // TODO(embers): emberInput / emberOutput shelved with Embers (bead cosmiccore-42.14) + } + + RecipeSchema SCHEMA = new RecipeSchema(CosmicRecipeJS.class, CosmicRecipeJS::new, DURATION, DATA, CONDITIONS, + ALL_INPUTS, ALL_TICK_INPUTS, ALL_OUTPUTS, ALL_TICK_OUTPUTS, + INPUT_CHANCE_LOGICS, OUTPUT_CHANCE_LOGICS, TICK_INPUT_CHANCE_LOGICS, TICK_OUTPUT_CHANCE_LOGICS, CATEGORY) + .constructor((recipe, schemaType, keys, from) -> recipe.id(from.getValue(recipe, ID)), ID) + .constructor(DURATION, CONDITIONS, ALL_INPUTS, ALL_OUTPUTS, ALL_TICK_INPUTS, ALL_TICK_OUTPUTS); +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/kjs/recipe/components/CosmicRecipeComponent.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/kjs/recipe/components/CosmicRecipeComponent.java new file mode 100644 index 000000000..838b250b4 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/integration/kjs/recipe/components/CosmicRecipeComponent.java @@ -0,0 +1,52 @@ +package com.ghostipedia.cosmiccore.integration.kjs.recipe.components; + +import com.ghostipedia.cosmiccore.api.capability.recipe.SoulRecipeCapability; +import com.ghostipedia.cosmiccore.api.recipe.ingredient.SoulIngredient; + +import com.gregtechceu.gtceu.integration.kjs.recipe.components.ContentJS; + +import com.google.gson.JsonElement; +import com.mojang.serialization.JsonOps; +import dev.latvian.mods.kubejs.recipe.RecipeJS; +import dev.latvian.mods.kubejs.recipe.component.NumberComponent; +import dev.latvian.mods.kubejs.recipe.component.RecipeComponent; +import dev.latvian.mods.rhino.Wrapper; + +public class CosmicRecipeComponent { + + // TODO(embers): EMBER_IN / EMBER_OUT recipe components shelved with Embers (bead cosmiccore-42.14) + + public static final RecipeComponent SOUL_STACK = new RecipeComponent<>() { + + @Override + public Class componentClass() { + return SoulIngredient.class; + } + + @Override + public String componentType() { + return "soul_stack"; + } + + @Override + public JsonElement write(RecipeJS recipeJS, SoulIngredient soulIngredient) { + return SoulIngredient.CODEC.encodeStart(JsonOps.INSTANCE, soulIngredient).result().orElse(null); + } + + @Override + public SoulIngredient read(RecipeJS recipeJS, Object o) { + if (o instanceof Wrapper w) o = w.unwrap(); + if (o == null) return null; + + if (o instanceof SoulIngredient soulIngredient) { + return soulIngredient; + } + return null; + } + }; + + public static final ContentJS SOUL_IN = new ContentJS<>(SOUL_STACK, SoulRecipeCapability.CAP, + false); + public static final ContentJS SOUL_OUT = new ContentJS<>(SOUL_STACK, SoulRecipeCapability.CAP, + true); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/AdAstraOverlayScreenMixin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/AdAstraOverlayScreenMixin.java similarity index 99% rename from src/main/java/com/ghostipedia/cosmiccore/mixin/AdAstraOverlayScreenMixin.java rename to _shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/AdAstraOverlayScreenMixin.java index e4e5f7c56..08390d8e1 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/AdAstraOverlayScreenMixin.java +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/AdAstraOverlayScreenMixin.java @@ -1,14 +1,16 @@ package com.ghostipedia.cosmiccore.mixin; import com.ghostipedia.cosmiccore.api.item.armor.SpaceArmorComponentItem; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; + import com.mojang.blaze3d.vertex.PoseStack; import earth.terrarium.adastra.api.systems.PlanetData; import earth.terrarium.adastra.client.config.AdAstraConfigClient; import earth.terrarium.adastra.client.screens.player.OverlayScreen; import earth.terrarium.adastra.client.utils.ClientData; import earth.terrarium.adastra.common.items.armor.SpaceSuitItem; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiGraphics; import org.spongepowered.asm.mixin.Debug; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -59,5 +61,4 @@ private static void render(GuiGraphics graphics, float partialTick, CallbackInfo poseStack.popPose(); } } - } diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/AdAstraSpaceSuitItemMixin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/AdAstraSpaceSuitItemMixin.java new file mode 100644 index 000000000..197a7cb27 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/AdAstraSpaceSuitItemMixin.java @@ -0,0 +1,44 @@ +package com.ghostipedia.cosmiccore.mixin; + +import com.ghostipedia.cosmiccore.api.item.armor.SpaceArmorComponentItem; +import com.ghostipedia.cosmiccore.common.airControl.OxygenLogic; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemStack; + +import earth.terrarium.adastra.common.items.armor.SpaceSuitItem; +import org.spongepowered.asm.mixin.Debug; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Debug(export = true) +@Mixin(value = SpaceSuitItem.class, remap = false) +public abstract class AdAstraSpaceSuitItemMixin { + + /** + * @author MrQuentinet + * @reason In order for the GTArmor to work with AdAstra oxygen I needed to change the way the oxygen check is done. + */ + @Overwrite + public static long getOxygenAmount(Entity entity) { + if (!(entity instanceof LivingEntity livingEntity)) return 0; + var stack = livingEntity.getItemBySlot(EquipmentSlot.CHEST); + if (stack.getItem() instanceof SpaceSuitItem suit) { + return suit.getFluidContainer(stack).getFirstFluid().getFluidAmount(); + } else if (stack.getItem() instanceof SpaceArmorComponentItem suit) { + return suit.getFluidContainer(stack).getFirstFluid().getFluidAmount(); + } else return 0; + } + + @Inject(method = "consumeOxygen", at = @At("HEAD"), cancellable = true) + private void cosmiccore$preventDoubleOxygenConsumption(ItemStack stack, long amount, CallbackInfo ci) { + if (!OxygenLogic.isConsumeBypass()) { + ci.cancel(); + } + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/ApothSmithingCategoryMixin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/ApothSmithingCategoryMixin.java new file mode 100644 index 000000000..c03bd3f78 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/ApothSmithingCategoryMixin.java @@ -0,0 +1,29 @@ +package com.ghostipedia.cosmiccore.mixin; + +import net.minecraft.world.item.crafting.SmithingRecipe; + +import dev.shadowsoffire.apotheosis.adventure.compat.ApothSmithingCategory; +import mezz.jei.api.gui.builder.IRecipeLayoutBuilder; +import mezz.jei.api.recipe.IFocusGroup; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = ApothSmithingCategory.class, remap = false) +public abstract class ApothSmithingCategoryMixin { + + @Shadow + public abstract boolean isHandled(SmithingRecipe recipe); + + @Inject(method = "setRecipe(Lmezz/jei/api/gui/builder/IRecipeLayoutBuilder;Lnet/minecraft/world/item/crafting/SmithingRecipe;Lmezz/jei/api/recipe/IFocusGroup;)V", + at = @At("HEAD"), + cancellable = true) + public void cosmicCore$injectSetRecipe(IRecipeLayoutBuilder builder, SmithingRecipe recipe, IFocusGroup focuses, + CallbackInfo ci) { + if (!isHandled(recipe)) { + ci.cancel(); + } + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/ApotheosisRecipeHelperMixin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/ApotheosisRecipeHelperMixin.java new file mode 100644 index 000000000..ca2fae1e2 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/ApotheosisRecipeHelperMixin.java @@ -0,0 +1,22 @@ +package com.ghostipedia.cosmiccore.mixin; + +import dev.shadowsoffire.placebo.recipe.RecipeHelper; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@SuppressWarnings("deprecation") +@Mixin(value = RecipeHelper.RecipeFactory.class, remap = false) +public class ApotheosisRecipeHelperMixin { + + @Inject(method = "addShaped", at = @At("HEAD"), cancellable = true) + public void cosmicCore$injectAddShaped(CallbackInfo ci) { + ci.cancel(); + } + + @Inject(method = "addShapeless", at = @At("HEAD"), cancellable = true) + public void cosmicCore$injectAddShapeless(CallbackInfo ci) { + ci.cancel(); + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/GendustryJEIPluginMixin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/GendustryJEIPluginMixin.java new file mode 100644 index 000000000..79a5de397 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/GendustryJEIPluginMixin.java @@ -0,0 +1,20 @@ +package com.ghostipedia.cosmiccore.mixin; + +import mezz.jei.api.registration.ISubtypeRegistration; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import thedarkcolour.gendustry.compat.jei.GendustryJeiPlugin; +import thedarkcolour.gendustry.registry.GItems; + +@Mixin(value = GendustryJeiPlugin.class, remap = false) +public class GendustryJEIPluginMixin { + + /** + * @author - Ghostipedia + * @reason - TMRV Visual Compat for CosmicCore and Frontiers, the subtypeInterpreter doesn't work. + */ + @Overwrite + public void registerItemSubtypes(ISubtypeRegistration registration) { + registration.useNbtForSubtypes(GItems.GENE_SAMPLE.asItem()); + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/IndustrialApiaryBeeModifierMixin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/IndustrialApiaryBeeModifierMixin.java new file mode 100644 index 000000000..7d9b5f94a --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/IndustrialApiaryBeeModifierMixin.java @@ -0,0 +1,183 @@ +package com.ghostipedia.cosmiccore.mixin; + +import com.ghostipedia.cosmiccore.common.data.CosmicGendustryUpgradeType; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +import forestry.core.inventory.IInventoryAdapter; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import thedarkcolour.gendustry.item.EliteGendustryUpgradeType; +import thedarkcolour.gendustry.item.GendustryUpgradeItem; +import thedarkcolour.gendustry.item.GendustryUpgradeType; +import thedarkcolour.gendustry.item.IGendustryUpgradeType; + +@Mixin(targets = "thedarkcolour.gendustry.blockentity.IndustrialApiaryBeeModifier", remap = false) +class IndustrialApiaryBeeModifierMixin { + + @Shadow + float territory; + @Shadow + float mutation; + @Shadow + float lifespan; + @Shadow + float productivity; + @Shadow + float pollination; + @Shadow + int throttle; + @Shadow + int fertility; + @Shadow + int temperature; + @Shadow + int humidity; + @Shadow + boolean automated; + @Shadow + boolean stabilized; + @Shadow + boolean weatherproof; + @Shadow + boolean lighting; + @Shadow + boolean sky; + @Shadow + boolean nether; + @Shadow + boolean scrubber; + @Shadow + boolean sieve; + + @Shadow + private void reset() { + this.territory = 1f; + this.mutation = 1f; + this.lifespan = 1f; + this.productivity = 1f; + this.pollination = 1f; + this.throttle = 0; + this.fertility = 0; + this.temperature = 0; + this.humidity = 0; + this.automated = false; + this.stabilized = false; + this.weatherproof = false; + this.lighting = false; + this.sky = false; + this.nether = false; + this.scrubber = false; + this.sieve = false; + } + + /** + * @author - Ghostipedia + * @reason - I need More Upgrades and this is hardcoded and socalizing with people scares me when i need things. + */ + @Overwrite + public int recalculate(IInventoryAdapter inventory) { + this.reset(); + int energyCost = 0; + + for (int i = 0; i < 4; ++i) { + ItemStack stack = inventory.getItem(2 + i); + Item item = stack.getItem(); + int count = stack.getCount(); + if (item instanceof GendustryUpgradeItem upgrade) { + IGendustryUpgradeType upgradeType = upgrade.getType(); + energyCost += upgradeType.energyCost() * count; + if (upgradeType instanceof GendustryUpgradeType) { + GendustryUpgradeType type = (GendustryUpgradeType) upgradeType; + switch (type) { + case AUTOMATION: + this.automated = true; + break; + case HEATER: + this.temperature += count; + break; + case COOLER: + this.temperature -= count; + break; + case HUMIDIFIER: + this.humidity += count; + break; + case DRYER: + this.humidity -= count; + break; + case POLLINATION: + this.pollination += 0.25F * (float) count; + break; + case SCRUBBER: + this.scrubber = true; + break; + case NETHER: + this.nether = true; + break; + case LIFESPAN: + this.lifespan += 2.0F * (float) count; + break; + case LIGHTING: + this.lighting = true; + break; + case PRODUCTIVITY: + this.productivity += 0.25F * (float) count; + break; + case WEATHERPROOF: + this.weatherproof = true; + break; + case SIEVE: + this.sieve = true; + break; + case SKY: + this.sky = true; + break; + case STABILIZER: + this.stabilized = true; + break; + case TERRITORY: + this.territory += 0.25F * (float) count; + } + } else if (upgradeType instanceof EliteGendustryUpgradeType) { + EliteGendustryUpgradeType type = (EliteGendustryUpgradeType) upgradeType; + switch (type) { + case MUTATION: + this.mutation += 0.25F; + break; + case ACTIVITY_SIMULATOR: + this.lighting = true; + this.sky = true; + this.weatherproof = true; + break; + case PRODUCTIVITY: + this.productivity += 0.25F * (float) count; + this.throttle += 15 * count; + break; + case TERRITORY: + this.territory += 0.25F * (float) count; + break; + case YOUTH: + this.mutation -= 0.2F * (float) count; + break; + case FERTILITY: + this.fertility += count; + } + } else if (upgradeType instanceof CosmicGendustryUpgradeType) { + CosmicGendustryUpgradeType type = (CosmicGendustryUpgradeType) upgradeType; + switch (type) { + case WAILING: + this.mutation = 1000F; + break; + case DECAYING: + this.lifespan = 1000f; + this.throttle = 10000; + } + } + } + } + + return energyCost; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/MAE2GTIntegrationMixin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/MAE2GTIntegrationMixin.java new file mode 100644 index 000000000..81896c376 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/MAE2GTIntegrationMixin.java @@ -0,0 +1,24 @@ +package com.ghostipedia.cosmiccore.mixin; + +import net.neoforged.bus.api.IEventBus; + +import org.spongepowered.asm.mixin.Debug; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import stone.mae2.integration.GregTechIntegration; + +@Debug(export = true) +@Mixin(value = GregTechIntegration.class, remap = false) +public abstract class MAE2GTIntegrationMixin { + + @Inject(method = "init", + at = @At(value = "INVOKE", + target = "Lnet/minecraftforge/eventbus/api/IEventBus;addListener(Ljava/util/function/Consumer;)V"), + cancellable = true, + remap = false) + private static void init(IEventBus bus, CallbackInfo callbackInfo) { + callbackInfo.cancel(); + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/adastra/AdAstraFluidOptimizationMixin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/adastra/AdAstraFluidOptimizationMixin.java new file mode 100644 index 000000000..f06a0b9a2 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/adastra/AdAstraFluidOptimizationMixin.java @@ -0,0 +1,42 @@ +package com.ghostipedia.cosmiccore.mixin.adastra; + +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; + +import earth.terrarium.adastra.common.systems.TemperatureApiImpl; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.Set; + +/** + * Optimizes Ad Astra's fluid hooks by short-circuiting temperature checks + * for vanilla dimensions where these calculations are unnecessary. + * + * Ad Astra hooks into FlowingFluid to check temperature on every fluid tick, + * which is extremely expensive during worldgen. This mixin bypasses those checks + * for dimensions that don't need planet physics. + */ +@Mixin(value = TemperatureApiImpl.class, remap = false) +public class AdAstraFluidOptimizationMixin { + + @Unique + private static final Set> cosmiccore$VANILLA_DIMENSIONS = Set.of( + Level.OVERWORLD, + Level.NETHER, + Level.END); + + @Inject(method = "isLiveable(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)Z", + at = @At("HEAD"), + cancellable = true) + private void cosmiccore$skipLiveableCheckForVanillaDimensions(Level level, BlockPos pos, + CallbackInfoReturnable cir) { + if (level != null && cosmiccore$VANILLA_DIMENSIONS.contains(level.dimension())) { + cir.setReturnValue(true); + } + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/adastra/AdAstraGravityOptimizationMixin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/adastra/AdAstraGravityOptimizationMixin.java new file mode 100644 index 000000000..e268011e7 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/adastra/AdAstraGravityOptimizationMixin.java @@ -0,0 +1,42 @@ +package com.ghostipedia.cosmiccore.mixin.adastra; + +import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; + +import earth.terrarium.adastra.common.systems.GravityApiImpl; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.Set; + +/** + * Optimizes Ad Astra's fluid hooks by short-circuiting gravity checks + * for vanilla dimensions where these calculations are unnecessary. + * + * Ad Astra hooks into FlowingFluid to check gravity on every fluid spread, + * which is extremely expensive during worldgen. This mixin bypasses those checks + * for dimensions that don't need planet physics, returning normal Earth gravity (1.0f). + */ +@Mixin(value = GravityApiImpl.class, remap = false) +public class AdAstraGravityOptimizationMixin { + + @Unique + private static final Set> cosmiccore$VANILLA_DIMENSIONS = Set.of( + Level.OVERWORLD, + Level.NETHER, + Level.END); + + @Inject(method = "getGravity(Lnet/minecraft/world/level/Level;Lnet/minecraft/core/BlockPos;)F", + at = @At("HEAD"), + cancellable = true) + private void cosmiccore$skipGravityCheckForVanillaDimensions(Level level, BlockPos pos, + CallbackInfoReturnable cir) { + if (level != null && cosmiccore$VANILLA_DIMENSIONS.contains(level.dimension())) { + cir.setReturnValue(1.0f); + } + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/eudisplay/EUAddAppearanceMixin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/eudisplay/EUAddAppearanceMixin.java new file mode 100644 index 000000000..4c9e4e733 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/eudisplay/EUAddAppearanceMixin.java @@ -0,0 +1,40 @@ +package com.ghostipedia.cosmiccore.mixin.ae2.eudisplay; + +import net.minecraft.network.chat.Component; + +import appeng.api.config.PowerUnits; +import appeng.api.config.Setting; +import appeng.api.config.Settings; +import appeng.client.gui.Icon; +import appeng.client.gui.widgets.SettingToggleButton; +import appeng.client.gui.widgets.SettingToggleButton.IHandler; +import appeng.core.localization.ButtonToolTips; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +// Reasoning: The Appearance map is used to get +// appearances for buttons. This Enum adds +// the EU power unit so that it appears +// correctly in controller and network tool UI. +@Mixin(value = SettingToggleButton.class, remap = false) +public abstract class EUAddAppearanceMixin> { + + @Invoker("registerApp") + private static > void invokeRegisterApp(Icon icon, Setting setting, E val, + ButtonToolTips title, Component... tooltipLines) { + throw new AssertionError(); + } + + @Inject(method = "", at = @At("TAIL"), remap = false) + private void cosCore$registerEUPowerUnit(Setting setting, T val, + IHandler> onPress, CallbackInfo ci) { + if (setting == Settings.POWER_UNITS) { + PowerUnits eu = PowerUnits.valueOf("EU"); + invokeRegisterApp(Icon.POWER_UNIT_EU, Settings.POWER_UNITS, eu, ButtonToolTips.PowerUnits, + eu.textComponent()); + } + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/eudisplay/EUAddPowerUnitMixin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/eudisplay/EUAddPowerUnitMixin.java new file mode 100644 index 000000000..4587fd910 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/eudisplay/EUAddPowerUnitMixin.java @@ -0,0 +1,48 @@ +package com.ghostipedia.cosmiccore.mixin.ae2.eudisplay; + +import appeng.api.config.PowerUnits; +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.gen.Invoker; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.Arrays; + +// Reasoning: The Power Unit enum is used to store +// the different power units and their lang/conversion +// factors in AE2. We want to add EU to this. +@Debug(export = true) +@Mixin(value = PowerUnits.class, remap = false) +public class EUAddPowerUnitMixin { + + @Unique + private static PowerUnits cosCore$EU_UNIT; + + @Invoker(value = "", remap = false) + private static PowerUnits cosCore$invokeConstructor(String internalName, int ordinal, String unlocalizedName, + String textRepresentation) { + throw new AssertionError(); + } + + @ModifyReturnValue(method = "values", at = @At("RETURN"), remap = false) + private static PowerUnits[] cosCore$addEUToValues(PowerUnits[] original) { + if (cosCore$EU_UNIT == null) { + cosCore$EU_UNIT = cosCore$invokeConstructor("EU", original.length, "gui.ae2.units.eu", "EU"); + // Conversion ratio of EU to AE = EU to FE * FE to AE; + float FEtoAE = 0.5f; + float EUtoFE = 4f; + cosCore$EU_UNIT.conversionRatio = EUtoFE * FEtoAE; + } + + for (PowerUnits unit : original) { + if (unit == cosCore$EU_UNIT) { + return original; + } + } + + PowerUnits[] newArray = Arrays.copyOf(original, original.length + 1); + newArray[original.length] = cosCore$EU_UNIT; + + return newArray; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/eudisplay/EUAddSettingMixin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/eudisplay/EUAddSettingMixin.java new file mode 100644 index 000000000..84de36b9c --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/ae2/eudisplay/EUAddSettingMixin.java @@ -0,0 +1,38 @@ +package com.ghostipedia.cosmiccore.mixin.ae2.eudisplay; + +import appeng.api.config.PowerUnits; +import appeng.api.config.Setting; +import com.google.common.collect.ImmutableSet; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.EnumSet; + +// Reasoning: The Setting enum contains all the possible settings to +// loop through (which is why the deprecated RF, which is a valid Power Unit, +// isn't an option when you click the button). We want to add EU to this list. +@Mixin(value = Setting.class, remap = false) +public abstract class EUAddSettingMixin> { + + @Shadow + @Final + @Mutable + private ImmutableSet values; + + @Inject(method = "*", at = @At("RETURN")) + private void cosCore$onInit(String name, Class enumClass, EnumSet originalValues, CallbackInfo ci) { + if (enumClass.equals(PowerUnits.class)) { + EnumSet union = EnumSet.copyOf(originalValues); + + T eu = (T) PowerUnits.valueOf("EU"); + union.add(eu); + + this.values = ImmutableSet.copyOf(union); + } + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/client/AdAstraPlanetsScreenMixin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/client/AdAstraPlanetsScreenMixin.java new file mode 100644 index 000000000..364d4eae3 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/client/AdAstraPlanetsScreenMixin.java @@ -0,0 +1,106 @@ +package com.ghostipedia.cosmiccore.mixin.client; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.misc.PlanetKeys; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.level.Level; + +import earth.terrarium.adastra.api.planets.Planet; +import earth.terrarium.adastra.client.screens.PlanetsScreen; +import earth.terrarium.adastra.common.constants.ConstantComponents; +import earth.terrarium.adastra.common.menus.PlanetsMenu; +import org.apache.commons.lang3.text.WordUtils; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.Set; + +import static earth.terrarium.adastra.client.screens.PlanetsScreen.SELECTION_MENU; +import static earth.terrarium.adastra.client.screens.PlanetsScreen.SMALL_SELECTION_MENU; + +@Mixin(value = PlanetsScreen.class, remap = false) +public class AdAstraPlanetsScreenMixin extends AbstractContainerScreen { + + @Unique + Set> noLand = Set.of(PlanetKeys.SUN, PlanetKeys.SATURN, PlanetKeys.JUPITER); // Add the planets + // where the land + // button should not + // show up + // ex: Planet.MOON + + @Unique + private static final ResourceLocation SELECTION_MENU_NOLAND = CosmicCore + .id("textures/gui/sprites/planets/selection_menu_noland.png"); + @Shadow + private Planet selectedPlanet; + @Shadow + private int pageIndex; + @Shadow + private @Nullable ResourceLocation selectedSolarSystem; + + public AdAstraPlanetsScreenMixin(PlanetsMenu menu, Inventory playerInventory, Component title) { + super(menu, playerInventory, title); + } + + @Inject(method = "createSelectedPlanetButtons", at = @At("HEAD"), cancellable = true) + private void createSelectedPlanetButtons(CallbackInfo ci) { + if (this.selectedPlanet == null) return; + if (noLand.contains(selectedPlanet.dimension())) ci.cancel(); + } + + /** + * @author Kolja + * @reason Removes the outline of the land button where it should not show up + */ + @Overwrite(remap = false) + protected void renderBg(GuiGraphics graphics, float partialTick, int mouseX, int mouseY) { + if (this.pageIndex == 2) { + if (noLand.contains(selectedPlanet.dimension())) { + graphics.blit(SELECTION_MENU_NOLAND, 7, this.height / 2 - 88, 0.0F, 0.0F, 209, 177, 209, 177); + graphics.drawCenteredString(this.font, ConstantComponents.SPACE_STATION, 163, this.height / 2 - 15, + 16777215); + } else { + graphics.blit(SELECTION_MENU, 7, this.height / 2 - 88, 0.0F, 0.0F, 209, 177, 209, 177); + graphics.drawCenteredString(this.font, ConstantComponents.SPACE_STATION, 163, this.height / 2 - 15, + 16777215); + } + } else { + graphics.blit(SMALL_SELECTION_MENU, 7, this.height / 2 - 88, 0.0F, 0.0F, 105, 177, 105, 177); + } + + if (this.pageIndex == 2 && this.selectedPlanet != null) { + MutableComponent title = Component.translatableWithFallback( + "planet.%s.%s".formatted(this.selectedPlanet.dimension().location().getNamespace(), + this.selectedPlanet.dimension().location().getPath()), + this.title(this.selectedPlanet.dimension().location().getPath())); + graphics.drawCenteredString(this.font, title, 57, this.height / 2 - 60, 16777215); + } else if (this.pageIndex == 1 && this.selectedSolarSystem != null) { + MutableComponent title = Component + .translatableWithFallback( + "solar_system.%s.%s".formatted(this.selectedSolarSystem.getNamespace(), + this.selectedSolarSystem.getPath()), + this.title(this.selectedSolarSystem.getPath())); + graphics.drawCenteredString(this.font, title, 57, this.height / 2 - 60, 16777215); + } else { + graphics.drawCenteredString(this.font, ConstantComponents.CATALOG, 57, this.height / 2 - 60, 16777215); + } + } + + @Unique + private String title(String string) { + return WordUtils.capitalizeFully(string.replace("_", " ")); + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/embers/EmberDialBlockMixin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/embers/EmberDialBlockMixin.java new file mode 100644 index 000000000..138fa7671 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/embers/EmberDialBlockMixin.java @@ -0,0 +1,35 @@ +package com.ghostipedia.cosmiccore.mixin.embers; + +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.api.distmarker.OnlyIn; + +import com.llamalad7.mixinextras.sugar.Local; +import com.rekindled.embers.block.EmberDialBlock; +import com.rekindled.embers.blockentity.EmberDialBlockEntity; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.ArrayList; + +@Mixin(value = EmberDialBlock.class, remap = false) +public class EmberDialBlockMixin { + + @OnlyIn(Dist.CLIENT) + @Inject(method = "getBEData", + at = @At(value = "INVOKE", + target = "Lcom/rekindled/embers/block/EmberDialBlock;formatEmber(DD)Lnet/minecraft/network/chat/MutableComponent;"), + cancellable = true) + public void formatEmber(Direction facing, ArrayList text, BlockEntity blockEntity, int maxLines, + CallbackInfo ci, @Local EmberDialBlockEntity dial) { + text.add(Component.translatable("embers.tooltip.emberdial.ember", FormattingUtil.formatNumbers(dial.ember), + FormattingUtil.formatNumbers(dial.capacity))); + ci.cancel(); + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/EmiApiMixin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/EmiApiMixin.java new file mode 100644 index 000000000..659f3e650 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/EmiApiMixin.java @@ -0,0 +1,61 @@ +package com.ghostipedia.cosmiccore.mixin.emi; + +import com.ghostipedia.cosmiccore.utils.FluidUtilities; + +import com.gregtechceu.gtceu.api.item.ComponentItem; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.world.item.BucketItem; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.Fluids; + +import dev.emi.emi.api.EmiApi; +import dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.api.stack.EmiStack; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +// Credits ; GTOCore - Thank you for this amazing mixin! + +@Mixin(value = EmiApi.class, remap = false) +public abstract class EmiApiMixin { + + @ModifyVariable(method = "displayUses", + at = @At(value = "INVOKE", + target = "Ldev/emi/emi/api/stack/EmiIngredient;isEmpty()Z"), + remap = false, + argsOnly = true) + private static EmiIngredient modifyDisplayUses(EmiIngredient stack) { + return stack.isEmpty() ? stack : cosmicCore$getBucketFluid(stack); + } + + @ModifyVariable(method = "displayRecipes", + at = @At(value = "INVOKE", + target = "Ljava/util/List;size()I"), + remap = false, + argsOnly = true) + private static EmiIngredient modifyDisplayRecipes(EmiIngredient stack) { + return stack.getEmiStacks().size() != 1 ? stack : cosmicCore$getBucketFluid(stack); + } + + @Unique + private static EmiIngredient cosmicCore$getBucketFluid(EmiIngredient stack) { + if (stack instanceof EmiStack emiStack) { + Fluid fluid = Fluids.EMPTY; + if (emiStack.getKey() instanceof BucketItem bucketItem) { + fluid = bucketItem.getFluid(); + } else if (emiStack.getKey() instanceof ComponentItem && emiStack.hasNbt()) { + CompoundTag nbt = emiStack.getNbt(); + if (nbt.contains("Fluid", Tag.TAG_COMPOUND)) { + var fluidTag = nbt.getCompound("Fluid"); + var fluidName = fluidTag.getString("FluidName"); + fluid = FluidUtilities.getFluid(fluidName); + } + } + return fluid == Fluids.EMPTY ? stack : EmiStack.of(fluid); + } + return stack; + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockEntityMixin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockEntityMixin.java new file mode 100644 index 000000000..e7ef7fb33 --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachineBlockEntityMixin.java @@ -0,0 +1,38 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.part.EmberHatchPartMachine; + +import com.gregtechceu.gtceu.api.blockentity.MetaMachineBlockEntity; +import com.gregtechceu.gtceu.api.machine.MetaMachine; + +import net.minecraft.core.Direction; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.util.LazyOptional; + +import com.rekindled.embers.api.capabilities.EmbersCapabilities; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Debug; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Debug(export = true) +@Mixin(value = MetaMachineBlockEntity.class, remap = false) + +public class MetaMachineBlockEntityMixin { + + @Inject(method = "getCapability(Lcom/gregtechceu/gtceu/api/machine/MetaMachine;Lnet/minecraftforge/common/capabilities/Capability;Lnet/minecraft/core/Direction;)Lnet/minecraftforge/common/util/LazyOptional;", + at = @At("TAIL"), + cancellable = true) + private static void injectCapability(MetaMachine machine, + @NotNull Capability cap, + @Nullable Direction side, + CallbackInfoReturnable> cir) { + if (cap == EmbersCapabilities.EMBER_CAPABILITY && machine instanceof EmberHatchPartMachine emberHatch) { + cir.setReturnValue(EmbersCapabilities.EMBER_CAPABILITY.orEmpty(cap, + LazyOptional.of(() -> emberHatch.emberContainer.capability))); + } + } +} diff --git a/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/lso/TemperatureCapabilityMixin.java b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/lso/TemperatureCapabilityMixin.java new file mode 100644 index 000000000..c3da514ca --- /dev/null +++ b/_shelved/src/main/java/com/ghostipedia/cosmiccore/mixin/lso/TemperatureCapabilityMixin.java @@ -0,0 +1,94 @@ +package com.ghostipedia.cosmiccore.mixin.lso; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.player.Player; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.*; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import sfiomn.legendarysurvivaloverhaul.api.temperature.ITemperatureCapability; +import sfiomn.legendarysurvivaloverhaul.api.temperature.TemperatureEnum; +import sfiomn.legendarysurvivaloverhaul.common.capabilities.temperature.TemperatureCapability; + +@Mixin(value = TemperatureCapability.class, remap = false) +public abstract class TemperatureCapabilityMixin implements ITemperatureCapability { + + @Unique + private int cosmiccore$badTimeTimer = 0; + + @Inject(method = "applyDangerousEffects", at = @At("HEAD")) + private void cosmiccore$trackBadTime(Player player, TemperatureEnum tempEnum, CallbackInfo ci) { + // make the player's time alive worse if they're too hot or colds for too long + cosmiccore$badTimeTimer += switch (tempEnum) { + // Bad Timer Increases while under the effect of something deadly + case HEAT_STROKE -> this.getTemperatureLevel() >= TemperatureEnum.HEAT_STROKE.getMiddle() ? 2 : 0; + case FROSTBITE -> this.getTemperatureLevel() < TemperatureEnum.FROSTBITE.getMiddle() ? 2 : 0; + case HOT, COLD -> -2; // The Player is not 'taking damage' in this state, thus we want to decay the damage + // tracker. + // . + case NORMAL -> -4; // Survivable Environment, decrease bad Timer WAY FASTER to avoid getting punched with + // really nasty + // damage + }; + cosmiccore$badTimeTimer = Math.max(cosmiccore$badTimeTimer, 0); + } + + @ModifyExpressionValue(method = "applyDangerousEffects", + at = @At(value = "NEW", + target = "net/minecraft/world/effect/MobEffectInstance", + remap = true)) + private MobEffectInstance cosmiccore$modifyDangerousEffects(MobEffectInstance effect, Player player, + TemperatureEnum tempEnum) { + // change this to give more/less time before the inevitable + final int MAX_FREE_TIME_SECONDS = 60; + int extra = cosmiccore$badTimeTimer - MAX_FREE_TIME_SECONDS; + if (extra <= 0) { + return effect; + } + // add +1 level of effect for every 10 seconds over the damage threshold + int amplifier = extra / 10; + return new MobEffectInstance(effect.getEffect(), effect.getDuration(), effect.getAmplifier() + amplifier); + } + + // this target is funny :3 + // Don't think about it too hard, ok? + @ModifyExpressionValue(method = "applyDangerousEffects", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/entity/player/Player;hasEffect(Lnet/minecraft/world/effect/MobEffect;)Z", + remap = true), + slice = @Slice( + from = @At("HEAD"), + to = @At(value = "RETURN", ordinal = 1))) + // This method patches the effect to be reapplied every time applyDangerousEffects is called. + // It works fine, because MC doesn't error when existing effects are reapplied and instead modifies them + // to match the new effect. + private boolean cosmiccore$alwaysApplyEffect(boolean original) { + // returns false because it's inverted in the if statement. And I can't change that. + // see https://github.com/SpongePowered/Mixin/issues/365#issuecomment-539464542 for an explanation. + return false; + } + + // someone should PR this. Not me though :) + @ModifyConstant(method = "writeNBT", constant = @Constant(stringValue = "ticktimer")) + private String cosmiccore$fixSaveDataBug(String original) { + return "tickTimer"; + } + + @Inject(method = "writeNBT", at = @At("RETURN")) + private void cosmiccore$saveTime(CallbackInfoReturnable cir) { + CompoundTag tag = cir.getReturnValue(); + tag.putInt("badTimeTimer", cosmiccore$badTimeTimer); + } + + @Inject(method = "readNBT", at = @At("RETURN")) + private void cosmiccore$loadTime(CompoundTag compound, CallbackInfo ci) { + if (compound.contains("badTimeTimer")) { + cosmiccore$badTimeTimer = compound.getInt("badTimeTimer"); + } + } +} diff --git a/build.gradle b/build.gradle index ee59b95af..cd10b66f6 100644 --- a/build.gradle +++ b/build.gradle @@ -1,226 +1,62 @@ plugins { - id "dev.architectury.loom" version "1.3-SNAPSHOT" + id "java-library" + id 'eclipse' + id 'idea' id "maven-publish" -} -base { - archivesName = project.archives_base_name + alias libs.plugins.modDevGradle + alias libs.plugins.spotless + alias libs.plugins.lombok } -version = project.mod_version -group = project.maven_group +group = maven_group +version = mod_version +boolean isCI = System.getenv("CI") != null java { - sourceCompatibility = targetCompatibility = JavaVersion.VERSION_17 + toolchain.languageVersion = JavaLanguageVersion.of(21) } -loom { - // use this if you are using the official mojang mappings - // and want loom to stop warning you about their license - silentMojangMappingsLicense() - - // since loom 0.10, you are **required** to use the - // "forge" block to configure forge-specific features, - // such as the mixinConfigs array or datagen - forge { - // specify the mixin configs used in this mod - // this will be added to the jar manifest as well! - mixinConfigs = [ - "cosmiccore.mixins.json" - ] - - // missing access transformers? - // don't worry, you can still use them! - // note that your AT *MUST* be located at - // src/main/resources/META-INF/accesstransformer.cfg - // to work as there is currently no config option to change this. - // also, any names used in your access transformer will need to be - // in SRG mapped ("func_" / "field_" with MCP class names) to work! - // (both of these things may be subject to change in the future) - - dataGen{ - mod(mod_id) - } - } - - runConfigs.named("data").configure { - programArg("--existing=" + file("src/main/resources").absolutePath) - programArgs("--client", "--server") +// Force re-resolution of snapshot/changing modules (ldlib snapshots, etc.) +configurations.all { + // cc-tweaked-1.21.1-forge is a Forge jar that leaks in transitively via KubeJS. It is not a NeoForge + // build and not part of the pack, and its Forge-style onServerStarted tab rebuild is what first exposed + // the creative-tab duplicate (now fixed properly in CosmicCreativeModeTabs#deduplicating). Dropping the + // stray Forge jar regardless; add a NeoForge ComputerCraft explicitly if it is ever actually wanted. + exclude group: 'cc.tweaked' + resolutionStrategy { + cacheChangingModulesFor 0, 'seconds' + // Create transitively pulls an old JEI (19.21.0.247); gtceu/kubejs require >= 19.25.x. + // Force the JEI runtime to the catalog-pinned version. + def jeiVersion = forge.versions.jei.get() + force "mezz.jei:jei-1.21.1-common-api:${jeiVersion}" + force "mezz.jei:jei-1.21.1-neoforge-api:${jeiVersion}" + force "mezz.jei:jei-1.21.1-neoforge:${jeiVersion}" } } -repositories { - mavenCentral() - - // Ad Astra - maven { - url "https://maven.teamresourceful.com/repository/maven-public/" - } - maven { - name 'FirstDarkDev' - url "https://maven.firstdarkdev.xyz/snapshots/" - } - maven { - name 'Quilt' - url 'https://maven.quiltmc.org/repository/release/' - } - maven { - name = 'ParchmentMC' - url = 'https://maven.parchmentmc.org' - } - maven { - url "https://maven.saps.dev/releases/" - content { - includeGroup "dev.latvian.mods" - } +sourceSets { + // Include resources generated by data generators. + main.resources { + srcDir 'src/generated/resources' } - maven { // Registrate - url = "https://maven.tterrag.com/" - content { - // need to be specific here due to version overlaps - includeGroup("com.jozufozu.flywheel") - includeGroup("com.tterrag.registrate") - includeGroup("com.simibubi.create") - } - } - maven { - // Patchouli, JEI - name = "BlameJared" - url = "https://maven.blamejared.com/" - } - maven { - url = "https://maven.theillusivec4.top/" - } - maven { - url "https://cursemaven.com/" - content { - includeGroup "curse.maven" - } - } // Curse Forge File - maven { - name = 'GeckoLib' - url 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/' - } - maven { - name "tterrag maven" - url "https://maven.tterrag.com/" - } - } -dependencies { - minecraft "com.mojang:minecraft:${project.minecraft_version}" - forge "net.minecraftforge:forge:${project.minecraft_version}-${project.forge_version}" - // layered mappings - Mojmap names, parchment and QM docs and parameters - mappings loom.layered { - it.mappings("org.quiltmc:quilt-mappings:${project.minecraft_version}+build.${project.quilt_mappings}:intermediary-v2") - it.parchment("org.parchmentmc.data:parchment-${project.minecraft_version}:${project.parchment_mappings}@zip") - it.officialMojangMappings { nameSyntheticMembers = false } - } - - modCompileOnly("mezz.jei:jei-${project.minecraft_version}-forge-api:${project.jei_version}") { transitive = false } - modCompileOnly("mezz.jei:jei-${project.minecraft_version}-common-api:${project.jei_version}") { transitive = false } - - - - modImplementation("com.gregtechceu.gtceu:gtceu-${project.minecraft_version}:${project.gtceu_version}") { transitive = false } - modImplementation("com.lowdragmc.ldlib:ldlib-forge-${project.minecraft_version}:${project.ldlib_version}") { transitive = false } - modImplementation("com.tterrag.registrate:Registrate:${project.registrate_version}") - modImplementation("dev.latvian.mods:kubejs-forge:${project.kubejs_version}") +apply from: "$rootDir/gradle/scripts/jars.gradle" +apply from: "$rootDir/gradle/scripts/moddevgradle.gradle" +apply from: "$rootDir/gradle/scripts/repositories.gradle" +apply from: "$rootDir/dependencies.gradle" +apply from: "$rootDir/gradle/scripts/resources.gradle" +apply from: "$rootDir/gradle/scripts/spotless.gradle" - // Ad Astra - forgeRuntimeLibrary("com.teamresourceful:yabn:1.0.3") // Cause architectury is kinda dumb with some java libs - forgeRuntimeLibrary("com.teamresourceful:bytecodecs:1.0.2") // Cause architectury is kinda dumb with some java libs - modImplementation("com.teamresourceful.resourcefullib:resourcefullib-forge-${project.minecraft_version}:${project.resourcefullib_version}") - modImplementation("com.teamresourceful.resourcefulconfig:resourcefulconfig-forge-${project.minecraft_version}:${project.resourcefulconfig_version}") - modImplementation("earth.terrarium.botarium:botarium-forge-${project.minecraft_version}:${project.botarium_version}") - modImplementation("earth.terrarium.adastra:ad_astra-forge-${project.minecraft_version}:${ad_astra_version}") {transitive false} // issue with create mod so not transitive - - // Blood Magic //TODO: Find real repo url - //modImplementation("com.wayoftime.bloodmagic:BloodMagic:${project.minecraft_version}-${project.blood_magic_version}") - // modCompileOnly("curse.maven:blood-magic-224791:4779713") // API - // modRuntimeOnly("curse.maven:blood-magic-224791:4779711") // Runtime to test in game - modImplementation("curse.maven:blood-magic-224791:4779711") - - - //modImplementation("curse.maven:cold-sweat-506194:4805548") - modImplementation('software.bernie.geckolib:geckolib-forge-1.20.1:4.2.2') - modCompileOnly("com.jozufozu.flywheel:flywheel-forge-1.20.1:0.6.10-7") - modCompileOnly("curse.maven:create-328085:4762216") - modCompileOnly("curse.maven:new-thin-air-878379:4848005") - modImplementation("curse.maven:puzzles-lib-495476:4924184") - - modRuntimeOnly("curse.maven:jade-324717:4973483") - modRuntimeOnly("vazkii.patchouli:Patchouli:${project.minecraft_version}-${project.patchouli_version}-FORGE") - modRuntimeOnly("top.theillusivec4.curios:curios-forge:${project.curios_version}+${project.minecraft_version}") - modRuntimeOnly("dev.toma.configuration:configuration-forge-${project.minecraft_version}:${project.configuration_version}") - modRuntimeOnly("mezz.jei:jei-${project.minecraft_version}-forge:${project.jei_version}") { transitive = false } - - // Mixin Extras - implementation(annotationProcessor("io.github.llamalad7:mixinextras-common:${project.mixinextras_version}")) - implementation(include("io.github.llamalad7:mixinextras-forge:${project.mixinextras_version}")) - annotationProcessor 'org.spongepowered:mixin:0.8.5:processor' - - // lombok - compileOnly 'org.projectlombok:lombok:1.18.32' - annotationProcessor 'org.projectlombok:lombok:1.18.32' -} - -processResources { - // define properties that can be used during resource processing - inputs.property "version", project.version - - // this will replace the property "${version}" in your mods.toml - // with the version you've defined in your gradle.properties - filesMatching("META-INF/mods.toml") { - expand "version": project.version - } -} - -tasks.withType(JavaCompile) { - // ensure that the encoding is set to UTF-8, no matter what the system default is - // this fixes some edge cases with special characters not displaying correctly - // see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html - // If Javadoc is generated, this must be specified in that task too. +tasks.withType(JavaCompile).configureEach { options.encoding = "UTF-8" - options.release = 17 -} - -java { - // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task - // if it is present. - // If you remove this line, sources will not be generated. - withSourcesJar() -} - -jar { - // add some additional metadata to the jar manifest - manifest { - attributes([ - "Specification-Title" : project.mod_id, - "Specification-Vendor" : project.mod_author, - "Specification-Version" : "1", - "Implementation-Title" : project.name, - "Implementation-Version" : version, - "Implementation-Vendor" : project.mod_author, - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") - ]) - } + options.compilerArgs << "-Xlint:-removal" + options.compilerArgs << "-Aquiet=true" + options.compilerArgs << "-Xmaxerrs" << "100000" + options.compilerArgs << "-Xmaxwarns" << "100000" } -// configure the maven publication -publishing { - publications { - mavenJava(MavenPublication) { - from components.java - } - } - - // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. - repositories { - // Add repositories to publish to here. - // Notice: This block does NOT have the same function as the block in the top level. - // The repositories here will be used for publishing your artifact, not for - // retrieving dependencies. - } +lombok { + version = "1.18.38" } diff --git a/changelog.md b/changelog.md index 97cf5950c..af3fa89ac 100644 --- a/changelog.md +++ b/changelog.md @@ -1 +1,6 @@ -Fixes Turtle Helmets bypassing Air Restrictions +# Cosmic Core 0.8.9 +# DO NOT MANUALLY UPDATE COSMIC CORE FOR FRONTIERS **I WILL NOT WORK** + +Bees, oh so many bees +module hatch updates +uhhhh, yeah. \ No newline at end of file diff --git a/dependencies.gradle b/dependencies.gradle new file mode 100644 index 000000000..93287e3ae --- /dev/null +++ b/dependencies.gradle @@ -0,0 +1,95 @@ +dependencies { + compileOnly(libs.jetbrains.annotations) + + // GTCEu — core dependency. Bundles (jarJar) LDLib + Registrate + Configuration at runtime, + // so those are declared compileOnly here and provided by GTCEu in dev/prod. + implementation(files("libs/gtceu-1.21.1-8.0.0.jar")) + compileOnly(forge.ldlib) + compileOnly(forge.registrate) + compileOnly(forge.configuration) + + // KubeJS (real, in-use scripts) + implementation(forge.kubejs) + implementation(forge.rhino) + implementation(forge.architectury) + + // Recipe Viewers — pack runs EMI + TMRV (no JEI at runtime); JEI kept compileOnly for its API. + // TMRV is a runtime-only viewer bridge shipped by the pack; CC compiles nothing against it. + compileOnly(forge.bundles.jei) + implementation(forge.emi) + + // WAILA-likes + implementation(forge.jade) + + // Curios + compileOnly(variantOf(forge.curios) { classifier("api") }) + runtimeOnly(forge.curios) + + // AE2 stack (upstream, matching the pack) + implementation(forge.ae2) + implementation(forge.guideme) + implementation(forge.ae2wtlib) + implementation(forge.clothconfig) + + // Create + compileOnly(variantOf(forge.create) { classifier("slim") }) + compileOnly(forge.ponder) + compileOnly(forge.flywheel.api) + runtimeOnly(forge.create) { + // Create's published metadata leaks optional integrations as runtime deps. The pack uses Xaero's, + // not JourneyMap, and the bundled JourneyMap beta is incompatible with our compile-time journeymap-api + // (it expects journeymap.api.v2...PluginHelper, absent in 2.0.0-SNAPSHOT) -> NoClassDefFoundError on init. + exclude group: 'maven.modrinth', module: 'journeymap' + } + runtimeOnly(forge.flywheel.impl) + + // Magic / content mods + implementation(forge.malum) + implementation(forge.lodestone) + implementation(forge.occultism) { + // Occultism pulls SmartBrainLib under net.tslat.smartbrainlib; the Modrinth jar below provides the same classes. + exclude group: 'net.tslat.smartbrainlib' + } + implementation(forge.modonomicon) + implementation(forge.smartbrainlib) + implementation(forge.geckolib) + + // Apotheosis (modular on 1.21.1) + // Placebo is provided transitively by the Apothic mods as dev.shadowsoffire:Placebo. Declaring it + // separately as maven.modrinth:placebo put two distinct coordinates of the same mod on the classpath, + // so Placebo loaded twice and double-registered (placebo:button_click, enchanting_stats). CC has no + // direct Placebo usage, so let Apothic supply the single canonical copy. + implementation(forge.apothicattributes) + implementation(forge.apothicenchanting) + implementation(forge.apothicspawners) + + // Patchouli + implementation(forge.patchouli) + + // Legendary Survival Overhaul + implementation(forge.lso) + + // Teams + implementation(forge.ftblibrary) + implementation(forge.ftbteams) + + // Resourceful Lib + implementation(forge.resourcefullib) + + // JourneyMap API — pack uses Xaero's; integration compiles against the API and no-ops at runtime. + compileOnly(forge.journeymap.api) + + // Dev tooling + runtimeOnly(forge.effortless) + + // ---- DROPPED for the 1.21.1 port (no NeoForge build / pack chose alternatives) ---- + // Forestry CE + Gendustry CE -> no 1.21.1 (bee system shelved, see bead cosmiccore-42.2) + // Embers Rekindled -> no 1.21.1 (ember system shelved) + // Ad Astra -> no 1.21.1 (isolate+no-op now, Stellaris later, bead cosmiccore-42.13) + // Embeddium + Oculus -> pack uses Sodium + Iris + // Travel Anchors + LibX -> not in pack + // New Thin Air -> discontinued + // Modern AE2 Additions, ModKit, WorldEdit, World Stripper -> dropped + // botarium / yabn / byteCodecs / resourcefulConfig -> Ad Astra stack, dropped with AA + // Expanded AE 2.1.1 -> core mixin hard-refs Advanced AE (not in pack); CC has no code dep on it +} diff --git a/dev/emi/emi/runtime/EmiFavorite.class b/dev/emi/emi/runtime/EmiFavorite.class new file mode 100644 index 000000000..c883e0fe7 Binary files /dev/null and b/dev/emi/emi/runtime/EmiFavorite.class differ diff --git a/docs/CARGO_MOTHS.md b/docs/CARGO_MOTHS.md new file mode 100644 index 000000000..fd6552b22 --- /dev/null +++ b/docs/CARGO_MOTHS.md @@ -0,0 +1,226 @@ +# Cargo Moths System + +## Current Status: **IN PROGRESS** + +Last updated: Debug output removed, core functionality working. + +--- + +## 1. Overview + +The Cargo Moths system provides local (same-dimension) item and fluid transport using a whimsical moth-based logistics network. Unlike the cross-dimensional linking system, Cargo Moths are designed for short-range automation within a single dimension. + +### Design Philosophy +- **No power required** - Moths work for free! +- **Scalable capacity** - Add more moth homes to increase throughput +- **Tiered progression** - Different beehive types provide different speeds/capacities +- **Feeding bonuses** - Optional honey/oil feeding for multipliers + +--- + +## 2. What's Implemented + +### 2.1 Core Components + +| Component | File | Status | +|-----------|------|--------| +| `MothCargoStation` | `common/machine/multiblock/multi/MothCargoStation.java` | ✅ Complete | +| `MothCargoStationMachine` | `common/machine/multiblock/multi/logic/MothCargoStationMachine.java` | ✅ Complete | +| `MothCargoDropOff` | `common/machine/multiblock/multi/MothCargoDropOff.java` | ✅ Complete | +| `MothCargoDropOffMachine` | `common/machine/multiblock/multi/logic/MothCargoDropOffMachine.java` | ✅ Complete | +| `LinkedWorkableMultiblockMachine` | `api/machine/multiblock/LinkedWorkableMultiblockMachine.java` | ✅ Complete | + +### 2.2 Feature Checklist + +- [x] Multiblock structure definitions +- [x] Datastick-based linking (reuses cross-dimensional linking infrastructure) +- [x] Same-dimension restriction +- [x] Item transfer from Station to Drop Off +- [x] Fluid transfer from Station to Drop Off +- [x] Tiered moth homes (Forestry beehives) +- [x] Cycle time based on moth tier +- [x] Capacity based on moth count × tier multiplier +- [x] Distribution modes (DIRECT, FILL_FIRST, ROUND_ROBIN) +- [x] GUI display (moth homes, cycle time, capacity, linked drop-offs) +- [x] Screwdriver to cycle distribution mode +- [ ] Feeding bonuses (honey/oil multipliers) + +--- + +## 3. Multiblock Structures + +### 3.1 Moth Cargo Station (Sender) + +Tower structure: 3×3 footprint, 6 blocks tall + +``` +Layer 0 (bottom): Layer 1-4: Layer 5 (top): +C C C C M C C C C +C C C C M C C C C +C Q C C M C C C C +``` + +Where: +- `C` = Steel Solid Casing (or input/output buses/hatches, maintenance hatch) +- `M` = Moth Home (Forestry beehive) OR Steel Solid Casing +- `Q` = Controller + +**Moth homes only go in the center column** (up to 4 can be placed). + +Allowed hatches: +- 1 Maintenance Hatch (required) +- Up to 4 Item Input Buses +- Up to 4 Item Output Buses +- Up to 4 Fluid Input Hatches +- Up to 4 Fluid Output Hatches + +### 3.2 Moth Cargo Drop Off (Receiver) + +Simple 3×3×2 structure: + +``` +Layer 0 (bottom): Layer 1 (top): +C C C C C C +C Q C C C C +C C C C C C +``` + +Where: +- `C` = Steel Solid Casing (or output buses/hatches, maintenance hatch) +- `Q` = Controller + +Allowed hatches: +- 1 Maintenance Hatch (required) +- Up to 4 Item Output Buses +- Up to 4 Fluid Output Hatches + +--- + +## 4. Moth Home Tiers + +Moth homes use Forestry beehive blocks: + +| Tier | Block | Cycle Time | Moths per Home | +|------|-------|------------|----------------| +| T1 | `forestry:beehive_forest` | 60s | 1 | +| T2 | `forestry:beehive_lush` | 30s | 2 | +| T3 | `forestry:beehive_desert` | 15s | 4 | +| T4 | `forestry:beehive_end` | 5s | 8 | + +**All moth homes must be the same tier.** Mixed tiers will trigger a warning. + +### Capacity Calculation + +``` +Items per cycle = Total Moths × 64 × Feeding Multiplier +Fluids per cycle = Total Moths × 1000mB × Feeding Multiplier +Total Moths = Moth Home Count × Moths per Home (by tier) +``` + +Example: 4× T3 beehives = 4 × 4 = 16 moths = 1024 items per cycle (every 15s) + +--- + +## 5. Distribution Modes + +Cycle through modes with screwdriver on the controller. + +| Mode | Behavior | +|------|----------| +| `DIRECT` | Ships to first linked drop-off only (1:1) | +| `FILL_FIRST` | Fills each drop-off in order until full, then moves to next | +| `ROUND_ROBIN` | Distributes evenly across all linked drop-offs | + +--- + +## 6. Feeding Bonuses (TODO) + +Planned multipliers for feeding moths: + +| Feed Item | Multiplier | +|-----------|------------| +| Regular Honey | 2× | +| Lofty Honey | 4× | +| Pale Oil | 8× | + +Feed is consumed per cycle from the Station's input bus. + +--- + +## 7. GUI Information + +The Station GUI displays: +- Moth Homes count and tier +- Total Moths +- Cycle Time (seconds) +- Distribution Mode +- Linked Drop-Offs count +- Capacity per cycle (items and fluids) + +The Drop Off GUI displays: +- Structure status +- Number of stations linked to it + +--- + +## 8. Linking + +Uses the same datastick-based linking as the cross-dimensional system: + +1. Shift+right-click the Moth Cargo Station with a datastick to copy link data +2. Right-click a Moth Cargo Drop Off to establish the link + +**Restrictions:** +- Same dimension only (moths can't fly between dimensions!) +- Station can link to up to 16 Drop Offs (1:N) +- Drop Off can receive from up to 16 Stations (N:1) + +--- + +## 9. How It Works + +1. Every tick, the Station checks if enough time has passed since the last cycle +2. When cycle time is reached: + - Get all linked, formed Drop Offs + - Calculate item/fluid capacity based on moths and feeding multiplier + - Extract items from Station's input buses (using internal methods to bypass IO checks) + - Insert items into Drop Off's output buses (using internal methods to bypass IO checks) + - Same process for fluids + - Consume feeding materials (TODO) + +The internal extraction/insertion methods bypass GTCEu's IO direction checks, which is the same pattern used by DroneStationMachine. + +--- + +## 10. File Structure + +``` +src/main/java/com/ghostipedia/cosmiccore/ +├── api/machine/multiblock/ +│ └── LinkedWorkableMultiblockMachine.java # Base class (no power requirement) +└── common/machine/multiblock/multi/ + ├── MothCargoStation.java # Station multiblock definition + ├── MothCargoDropOff.java # Drop Off multiblock definition + └── logic/ + ├── MothCargoStationMachine.java # Station logic (shipping cycles) + └── MothCargoDropOffMachine.java # Drop Off logic (receives items) +``` + +--- + +## 11. Known Limitations + +1. **Forestry dependency** - Falls back to vanilla beehive if Forestry not loaded +2. **No visual feedback** - No moth entity/particle flying between stations +3. **No feeding implementation** - Multiplier is always 1× currently +4. **No chunk loading** - Both Station and Drop Off must be loaded + +--- + +## 12. Future Work + +- [ ] Implement feeding bonuses (honey/oil consumption and multipliers) +- [ ] Add moth particle effects during transfers +- [ ] Consider cross-dimension variant (interdimensional moths?) +- [ ] Add JEI/EMI integration showing capacity calculations +- [ ] Custom textures/models for the multiblocks diff --git a/docs/CROSS_DIMENSIONAL_LINKING.md b/docs/CROSS_DIMENSIONAL_LINKING.md new file mode 100644 index 000000000..56f3cdbc2 --- /dev/null +++ b/docs/CROSS_DIMENSIONAL_LINKING.md @@ -0,0 +1,318 @@ +# Cross-Dimensional Multiblock Linking System + +## Current Status: **IMPLEMENTED & TESTED** + +Last updated: Session implementing partner query utilities and recipe conditions. + +--- + +## 1. Overview + +This system enables multiblock machines to communicate across dimensions using GTCEu's datastick as the linking mechanism. Links are persisted in SavedData and support role-based access control. + +### Use Cases +- **Star Ladder**: Manufacturing chains spanning multiple dimensions +- **Cross-dimensional recipes**: "Recipe requires partner in Sun Orbit with Solar Plasma" +- **Remote resource access**: Query partner's inventory/fluids/energy +- **Dimension-gated progression**: Certain recipes only available when linked to specific dimensions + +--- + +## 2. What's Implemented + +### 2.1 Core Infrastructure + +| Component | File | Status | +|-----------|------|--------| +| `ILinkedMultiblock` | `api/capability/ILinkedMultiblock.java` | ✅ Complete | +| `LinkEntry` | `api/data/savedData/LinkEntry.java` | ✅ Complete | +| `LinkedMultiblockSavedData` | `api/data/savedData/LinkedMultiblockSavedData.java` | ✅ Complete | +| `LinkedMultiblockHelper` | `common/machine/multiblock/LinkedMultiblockHelper.java` | ✅ Complete | +| `LinkedWorkableElectricMultiblockMachine` | `api/machine/multiblock/LinkedWorkableElectricMultiblockMachine.java` | ✅ Complete | + +### 2.2 Test Multiblock + +| Component | File | Status | +|-----------|------|--------| +| `LinkTestStation` | `common/machine/multiblock/multi/LinkTestStation.java` | ✅ Complete | +| `LinkTestStationMachine` | `common/machine/multiblock/multi/logic/LinkTestStationMachine.java` | ✅ Complete | + +### 2.3 Recipe Conditions + +| Condition | File | Description | +|-----------|------|-------------| +| `LinkedPartnerCondition` | `common/recipe/condition/LinkedPartnerCondition.java` | Requires N linked partners, optionally formed/working | +| `LinkedPartnerDimensionCondition` | `common/recipe/condition/LinkedPartnerDimensionCondition.java` | Requires partner in specific dimension | +| `LinkedPartnerDimensionItemCondition` | `common/recipe/condition/LinkedPartnerDimensionItemCondition.java` | Requires partner in dimension with specific item | +| `LinkedPartnerDimensionFluidCondition` | `common/recipe/condition/LinkedPartnerDimensionFluidCondition.java` | Requires partner in dimension with specific fluid | + +### 2.4 Partner Query Utilities + +Methods in `LinkedMultiblockHelper`: +- `queryPartner()` - Generic query with chunk loading +- `getPartnerItemHandlers()` / `getPartnerFluidHandlers()` / `getPartnerEnergyHandlers()` +- `partnerHasItem()` / `partnerHasFluid()` +- `getPartnerEnergyStored()` +- `isPartnerFormed()` / `isPartnerWorking()` + +Convenience methods in `LinkedWorkableElectricMultiblockMachine`: +- `partnerHasItem()` / `partnerHasFluid()` / `getPartnerEnergyStored()` +- `isPartnerFormed()` / `isPartnerWorking()` +- `anyPartnerHasItem()` / `anyPartnerHasFluid()` / `anyPartnerWorking()` +- `countFormedPartners()` + +--- + +## 3. How to Use + +### 3.1 Linking Machines + +1. **Copy link data**: Shift+right-click a linkable multiblock with a datastick +2. **Paste/establish link**: Right-click another linkable multiblock with the datastick +3. The system validates ownership, roles, and compatibility before establishing the link + +### 3.2 Creating a Linkable Multiblock + +Extend `LinkedWorkableElectricMultiblockMachine`: + +```java +public class MyLinkedMachine extends LinkedWorkableElectricMultiblockMachine { + + public MyLinkedMachine(IMachineBlockEntity holder, Object... args) { + super(holder, args); + } + + @Override + public LinkRole getLinkRole() { + return LinkRole.PEER; // or CONTROLLER, REMOTE + } + + @Override + public int getMaxPartners() { + return 4; // default + } + + @Override + public boolean canLinkTo(GlobalPos partner, ILinkedMultiblock partnerMachine) { + // Custom validation (e.g., only link to specific machine types) + return true; + } + + @Override + public void onLinkEstablished(GlobalPos partner) { + super.onLinkEstablished(partner); + // React to new link + } + + @Override + public void onLinkBroken(GlobalPos partner) { + super.onLinkBroken(partner); + // Cleanup when link breaks + } +} +``` + +### 3.3 Using Recipe Conditions + +```java +// Requires at least 1 linked partner +.addCondition(new LinkedPartnerCondition(1)) + +// Requires 2 partners, at least 1 formed +.addCondition(new LinkedPartnerCondition(2, true, false)) + +// Requires partner in specific dimension +.addCondition(new LinkedPartnerDimensionCondition("frontiers:sun_orbit")) + +// Requires partner in dimension with specific item +.addCondition(new LinkedPartnerDimensionItemCondition("frontiers:sun_orbit", Items.BUCKET, 1)) + +// Requires partner in dimension with specific fluid (1000mB) +.addCondition(new LinkedPartnerDimensionFluidCondition("frontiers:sun_orbit", SolarPlasma.getFluid(), 1000)) +``` + +### 3.4 Querying Partner Resources + +From within a `LinkedWorkableElectricMultiblockMachine`: + +```java +// Check if any partner has a specific item +if (anyPartnerHasItem(stack -> stack.is(Items.DIAMOND))) { + // ... +} + +// Check specific partner +for (GlobalPos partner : getLinkedPartners()) { + if (partnerHasFluid(partner, fluid -> fluid.getFluid().is(Fluids.LAVA))) { + // Partner has lava + } + + long energy = getPartnerEnergyStored(partner); + boolean working = isPartnerWorking(partner); +} + +// Custom queries +String partnerName = queryPartner(partner, machine -> + machine.getDefinition().getName()); +``` + +--- + +## 4. Link Roles + +### Role Types + +| Role | Can Query Partners | Can Be Queried | +|------|-------------------|----------------| +| `PEER` | ✅ | ✅ | +| `CONTROLLER` | ✅ | ❌ | +| `REMOTE` | ❌ | ✅ | + +### Role Negotiation + +When two machines link, their declared roles are negotiated: + +| A's Role | B's Role | Result | A's Effective | B's Effective | +|----------|----------|--------|---------------|---------------| +| PEER | PEER | ✅ Valid | PEER | PEER | +| PEER | CONTROLLER | ✅ Valid | REMOTE | CONTROLLER | +| PEER | REMOTE | ✅ Valid | CONTROLLER | REMOTE | +| CONTROLLER | REMOTE | ✅ Valid | CONTROLLER | REMOTE | +| CONTROLLER | CONTROLLER | ❌ Reject | - | - | +| REMOTE | REMOTE | ❌ Reject | - | - | + +--- + +## 5. Test Recipes + +The Link Test Station includes these recipes for testing: + +| Recipe | Input | Output | Condition | +|--------|-------|--------|-----------| +| `link_test_basic` | 1x Iron Ingot | 9x Iron Nugget | None | +| `link_test_linked` | 1x Gold Ingot | 1x Diamond | 1 linked partner | +| `link_test_formed_partner` | 1x Emerald | 1x Nether Star | 1 formed partner | +| `link_test_moon_partner` | 4x Lapis | 1x Ender Pearl | Partner in `ad_astra:moon` | +| `link_test_overworld_partner` | 4x Redstone | 4x Glowstone | Partner in `minecraft:overworld` | +| `link_test_dimension_item` | 8x Coal | 1x Diamond | Partner in Overworld with Diamond | +| `link_test_dimension_fluid` | 1x Sponge | 1x Wet Sponge | Partner in Overworld with Water | + +--- + +## 6. Translation Keys + +```properties +# Link operations +cosmiccore.datastick.link_copied=Link: %s +cosmiccore.link.copied=Link data copied from %s +cosmiccore.link.established=Link established: %s ↔ %s + +# Errors +cosmiccore.link.not_ready=Machine not ready for linking +cosmiccore.link.invalid_data=Invalid link data on datastick +cosmiccore.link.cannot_self_link=Cannot link a machine to itself +cosmiccore.link.partner_not_loaded=Partner machine must be loaded to establish link +cosmiccore.link.partner_missing=Partner machine no longer exists +cosmiccore.link.not_linkable=Target machine does not support linking +cosmiccore.link.different_owner=Cannot link machines owned by different teams +cosmiccore.link.incompatible_roles=Incompatible link roles: %s cannot link to %s +cosmiccore.link.limit_reached_self=This machine has reached its link limit +cosmiccore.link.limit_reached_partner=Partner machine has reached its link limit +cosmiccore.link.incompatible_self=This machine cannot link to that type +cosmiccore.link.incompatible_partner=Partner machine cannot link to this type +cosmiccore.link.already_linked=These machines are already linked + +# Recipe conditions +cosmiccore.recipe.condition.linked_partner.tooltip=Requires %s linked partner(s) +cosmiccore.recipe.condition.linked_partner.formed=Requires %s linked partner(s) with valid structure +cosmiccore.recipe.condition.linked_partner.working=Requires %s linked partner(s) actively working +cosmiccore.recipe.condition.linked_partner_dimension.tooltip=Requires linked partner in %s +cosmiccore.recipe.condition.linked_partner_dimension_item.tooltip=Requires %sx %s in partner in %s +cosmiccore.recipe.condition.linked_partner_dimension_fluid.tooltip=Requires %smB %s in partner in %s +``` + +--- + +## 7. File Structure + +``` +src/main/java/com/ghostipedia/cosmiccore/ +├── api/ +│ ├── capability/ +│ │ └── ILinkedMultiblock.java # Interface for linkable machines +│ ├── data/savedData/ +│ │ ├── LinkEntry.java # Single link record +│ │ └── LinkedMultiblockSavedData.java # Persistence layer +│ └── machine/multiblock/ +│ └── LinkedWorkableElectricMultiblockMachine.java # Base class +├── common/ +│ ├── machine/multiblock/ +│ │ ├── LinkedMultiblockHelper.java # Utilities, chunk loading, queries +│ │ └── multi/ +│ │ ├── LinkTestStation.java # Test multiblock registration +│ │ └── logic/ +│ │ └── LinkTestStationMachine.java # Test multiblock logic +│ └── recipe/condition/ +│ ├── CosmicConditions.java # Condition registration +│ ├── LinkedPartnerCondition.java +│ ├── LinkedPartnerDimensionCondition.java +│ ├── LinkedPartnerDimensionItemCondition.java +│ └── LinkedPartnerDimensionFluidCondition.java +└── gtbridge/ + ├── CosmicRecipeTypes.java # LINK_TEST_RECIPES type + └── CosmicCoreRecipes.java # Test recipes +``` + +--- + +## 8. Security Notes + +1. **Ownership is always verified at runtime** - Never trust datastick NBT for ownership +2. **Partner must be loaded for link validation** - Prevents linking to arbitrary positions +3. **Role negotiation prevents privilege escalation** - CONTROLLER+CONTROLLER rejected +4. **Chunk loading is capped** - MAX_FORCED_CHUNKS_PER_MACHINE = 4 + +--- + +## 9. Known Limitations + +1. **Partner must be loaded to establish link** - No config option for force-load during linking yet +2. **No GUI for link management** - Links can only be viewed via machine display text +3. **No visual feedback** - No particles/beams between linked machines +4. **No admin commands** - No way to inspect/remove links via commands + +--- + +## 10. Future Work + +### Phase 2: Recipe Integration +- [ ] Cross-dimensional ingredient consumption (consume from partner's inputs) +- [ ] Cross-dimensional output insertion (insert into partner's outputs) +- [ ] Recipe modifier based on partner state + +### Phase 3: Quality of Life +- [ ] Config option for force-load during linking +- [ ] Link management GUI +- [ ] Visual feedback (particles, beams) +- [ ] Admin commands (`/cosmiccore link list/remove/info`) + +### Phase 4: Advanced Features +- [ ] Energy/fluid transfer between linked machines +- [ ] Item teleportation through links +- [ ] Wireless redstone/data through links + +--- + +## 11. Testing Checklist + +- [x] Basic linking between two machines (same dimension) +- [x] Cross-dimensional linking (Overworld ↔ Moon) +- [x] Link persistence across server restart +- [x] Link broken when machine destroyed +- [x] Role negotiation (PEER+PEER, PEER+CONTROLLER, etc.) +- [x] Partner limit enforcement +- [x] Recipe condition: LinkedPartnerCondition +- [x] Recipe condition: LinkedPartnerDimensionCondition +- [x] Recipe condition: LinkedPartnerDimensionItemCondition +- [x] Recipe condition: LinkedPartnerDimensionFluidCondition +- [x] Partner query utilities (items, fluids, energy, formed, working) diff --git a/gradle.properties b/gradle.properties index 4bc92b6e1..cc94c4b83 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,42 +1,18 @@ -# Done to increase the memory available to gradle. -org.gradle.jvmargs=-Xmx4G - -# tell architectury loom that this project is a forge project. -# this will enable us to use the "forge" dependency. -# using archloom without this is possible and will give you a -# "standard" loom installation with some extra features. -loom.platform=forge - -# Base properties -# minecraft version -minecraft_version=1.20.1 -# forge version, latest version can be found on https://files.minecraftforge.net/ -forge_version=47.2.17 -# yarn, latest version can be found on https://fabricmc.net/develop/ -parchment_mappings=2023.09.03 -quilt_mappings=23 +org.gradle.jvmargs = -Xmx6G +org.gradle.java.installations.auto-download=false +org.gradle.parallel = true +org.gradle.caching = true +# NeoForge 1.21.1 requires Java 21 to run/launch. Pin the Gradle daemon JVM to a JDK 21 +# so the dev-launch (runClient/runServer/runData) boots on 21 regardless of the IDE's Gradle-JVM setting. +org.gradle.java.home=C:/Program Files/Zulu/zulu-21 # Mod Properties -mod_version=0.2.7.a -maven_group=com.ghostipedia.frontiers -archives_base_name=cosmic-core -mod_id=cosmiccore -mod_author=Ghostipedia - -# Dependencies -gtceu_version=1.2.3.a -ldlib_version=1.0.25.l -registrate_version=MC1.20-1.3.3 -kubejs_version=2001.6.4-build.120 -patchouli_version=81 -curios_version=5.4.3 -configuration_version=2.2.0 -jei_version=15.3.0.4 -mixinextras_version=0.2.0 -# Ad Astra -ad_astra_version=1.15.18 -botarium_version=2.3.3 -resourcefullib_version=2.1.23 -resourcefulconfig_version=2.1.2 -yabn_version=1.0.3 -bytecodecs_version=1.0.2 +mod_id = cosmiccore +mod_name = Cosmic Core +mod_version = 0.14.0 +mod_description = The Core of Cosmic Frontiers! +mod_authors = Ghostipedia +mod_license = Code : LGPL-3.0 , Assets: Refer to Github. +mod_url = https://github.com/Frontiers-PackForge/CosmicCore/ +mod_issue_tracker = https://github.com/Frontiers-PackForge/CosmicCore/issues/ +maven_group = com.ghostipedia.frontiers diff --git a/gradle/forge.versions.toml b/gradle/forge.versions.toml new file mode 100644 index 000000000..80bfef962 --- /dev/null +++ b/gradle/forge.versions.toml @@ -0,0 +1,93 @@ +[versions] +# --- shared GTCEu ecosystem (coordinates verbatim from GregTech-Modern 1.21 forge.versions.toml) --- +# gtceu itself comes from the local flat jar in libs/ (gtceu-1.21.1-8.0.0.jar); version kept for mods.toml placeholder +gtceu = "8.0.0" +ldlib = "1.0.35.a" +registrate = "MC1.21-1.3.0+67" +configuration = "3.1.1-neoforge" + +jei = "19.25.1.328" +emi = "1.1.24+1.21.1" +ae2 = "19.2.17" +guideme = "21.1.16" +ae2wtlib = "19.5.0" +kubejs = "2101.7.2-build.368" +rhino = "2101.2.7-build.85" +architectury = "13.0.8" +clothconfig = "15.0.140" +create = "6.0.8-168" # compileOnly; pack runtime ships 6.0.10 +ponder = "1.0.64" +flywheel = "1.0.5" +curios = "9.5.1+1.21.1" +ftblibrary = "2101.1.32" +ftbteams = "2101.1.10" +resourcefullib = "3.0.12" +tmrv = "0.8.1+mc.21.1" + +## content mods (versions verified resolvable for NeoForge 1.21.1) ## +malum = "1.8.2" +lodestone = "1.8.2" +occultism = "1.221.0" +modonomicon = "1.120.1" +# Modrinth version ID for SmartBrainLib 1.16.11 on the MC 1.21.1 / NeoForge build +# (the bare "1.16.11" coordinate resolves to the MC 1.21.9 build, which NeoForge 21.1 rejects). +smartbrainlib = "O5EpeqI3" +geckolib = "4.8.4" +patchouli = "1.21.1-93-NEOFORGE" +# Placebo intentionally omitted: provided transitively by the Apothic mods as dev.shadowsoffire:Placebo. +# Declaring maven.modrinth:placebo too put two coordinates of the same mod on the classpath (double-load). +apothicattributes = "1.21.1-2.9.1" +apothicenchanting = "1.21.1-1.5.3" +apothicspawners = "1.21.1-1.3.4" +lso = "1.21.1-2.4.2" +jade = "15.10.5+neoforge" +journeymapapi = "2.0.0-1.21.1-SNAPSHOT" +effortless = "4.1" + +[libraries] +gtceu = { module = "com.gregtechceu.gtceu:gtceu-1.21.1", version.ref = "gtceu" } +ldlib = { module = "com.lowdragmc.ldlib:ldlib-neoforge-1.21.1", version.ref = "ldlib" } +registrate = { module = "com.tterrag.registrate:Registrate", version.ref = "registrate" } +configuration = { module = "dev.toma.configuration:configuration-1.21.1", version.ref = "configuration" } + +jei-common-api = { module = "mezz.jei:jei-1.21.1-common-api", version.ref = "jei" } +jei-neoforge-api = { module = "mezz.jei:jei-1.21.1-neoforge-api", version.ref = "jei" } +jei-neoforge-impl = { module = "mezz.jei:jei-1.21.1-neoforge", version.ref = "jei" } +emi = { module = "dev.emi:emi-neoforge", version.ref = "emi" } +tmrv = { module = "maven.modrinth:toomanyrecipeviewers", version.ref = "tmrv" } + +ae2 = { module = "org.appliedenergistics:appliedenergistics2", version.ref = "ae2" } +guideme = { module = "org.appliedenergistics:guideme", version.ref = "guideme" } +ae2wtlib = { module = "de.mari_023:ae2wtlib", version.ref = "ae2wtlib" } +ae2wtlib-api = { module = "de.mari_023:ae2wtlib_api", version.ref = "ae2wtlib" } +kubejs = { module = "dev.latvian.mods:kubejs-neoforge", version.ref = "kubejs" } +rhino = { module = "dev.latvian.mods:rhino", version.ref = "rhino" } +architectury = { module = "dev.architectury:architectury-neoforge", version.ref = "architectury" } +clothconfig = { module = "me.shedaniel.cloth:cloth-config-neoforge", version.ref = "clothconfig" } +create = { module = "com.simibubi.create:create-1.21.1", version.ref = "create" } +ponder = { module = "net.createmod.ponder:Ponder-NeoForge-1.21.1", version.ref = "ponder" } +flywheel-api = { module = "dev.engine-room.flywheel:flywheel-neoforge-api-1.21.1", version.ref = "flywheel" } +flywheel-impl = { module = "dev.engine-room.flywheel:flywheel-neoforge-1.21.1", version.ref = "flywheel" } +curios = { module = "top.theillusivec4.curios:curios-neoforge", version.ref = "curios" } +ftblibrary = { module = "dev.ftb.mods:ftb-library-neoforge", version.ref = "ftblibrary" } +ftbteams = { module = "dev.ftb.mods:ftb-teams-neoforge", version.ref = "ftbteams" } +resourcefullib = { module = "com.teamresourceful.resourcefullib:resourcefullib-neoforge-1.21", version.ref = "resourcefullib" } + +malum = { module = "maven.modrinth:malum", version.ref = "malum" } +lodestone = { module = "maven.modrinth:lodestonelib", version.ref = "lodestone" } +occultism = { module = "com.klikli_dev:occultism-1.21.1-neoforge", version.ref = "occultism" } +modonomicon = { module = "com.klikli_dev:modonomicon-1.21.1-neoforge", version.ref = "modonomicon" } +smartbrainlib = { module = "maven.modrinth:smartbrainlib", version.ref = "smartbrainlib" } +geckolib = { module = "software.bernie.geckolib:geckolib-neoforge-1.21.1", version.ref = "geckolib" } +patchouli = { module = "vazkii.patchouli:Patchouli", version.ref = "patchouli" } +apothicattributes = { module = "dev.shadowsoffire:ApothicAttributes", version.ref = "apothicattributes" } +apothicenchanting = { module = "dev.shadowsoffire:ApothicEnchanting", version.ref = "apothicenchanting" } +apothicspawners = { module = "dev.shadowsoffire:ApothicSpawners", version.ref = "apothicspawners" } +lso = { module = "maven.modrinth:legendary-survival-overhaul", version.ref = "lso" } +jade = { module = "maven.modrinth:jade", version.ref = "jade" } +journeymap-api = { module = "info.journeymap:journeymap-api-neoforge", version.ref = "journeymapapi" } +effortless = { module = "maven.modrinth:effortless-building", version.ref = "effortless" } + +[bundles] +jei = ["jei-common-api", "jei-neoforge-api", "jei-neoforge-impl"] +kjs = ["kubejs", "rhino", "architectury"] diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 000000000..9d74bd824 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,21 @@ +[versions] +minecraft = "1.21.1" +neoForge = "21.1.215" +loader = "4" +parchment = "2024.11.17" # https://parchmentmc.org/docs/getting-started +spotless = "8.1.0" +modDevGradle = "2.0.119" +lombok = "8.14" +jetbrains-annotations = "26.0.1" +mixin = "0.8.7" + +[libraries] +minecraft = { module = "com.mojang:minecraft", version.ref = "minecraft" } +neoForge = { module = "net.neoforged:neoforge", version.ref = "neoForge" } +jetbrains-annotations = { module = "org.jetbrains:annotations", version.ref = "jetbrains-annotations" } +mixin = { module = "org.spongepowered:mixin", version.ref = "mixin" } + +[plugins] +modDevGradle = { id = "net.neoforged.moddev", version.ref = "modDevGradle" } +spotless = { id = "com.diffplug.spotless", version.ref = "spotless" } +lombok = { id = "io.freefair.lombok", version.ref = "lombok" } diff --git a/gradle/scripts/jars.gradle b/gradle/scripts/jars.gradle new file mode 100644 index 000000000..417273483 --- /dev/null +++ b/gradle/scripts/jars.gradle @@ -0,0 +1,21 @@ +base { + archivesName = "${mod_id}-${libs.versions.minecraft.get()}" +} + +java { + withSourcesJar() +} + +afterEvaluate { + tasks.withType(org.gradle.jvm.tasks.Jar).configureEach { + destinationDirectory = file('build/libs/') + manifest.attributes([ + 'Specification-Title' : mod_name, + 'Specification-Version': mod_version, + 'Specification-Vendor' : mod_authors, + 'Implementation-Title' : base.archivesName.get(), + 'Implementation-Version': version, + 'Implementation-Vendor': mod_authors, + ]) + } +} diff --git a/gradle/scripts/moddevgradle.gradle b/gradle/scripts/moddevgradle.gradle new file mode 100644 index 000000000..b3c0b8933 --- /dev/null +++ b/gradle/scripts/moddevgradle.gradle @@ -0,0 +1,75 @@ +neoForge { + // Specify NeoForge version + version = libs.versions.neoForge.get() + + parchment { + minecraftVersion = libs.versions.minecraft.get() + mappingsVersion = libs.versions.parchment.get() + } + + // Access Transformers are auto-detected at src/main/resources/META-INF/accesstransformer.cfg + + mods { + // define mod <-> source bindings + "${mod_id}" { + sourceSet(sourceSets.main) + } + } + + runs { + client { + client() + sourceSet = sourceSets.main + ideName = "Client" + + gameDirectory.set(file("runs/client")) + systemProperty('neoforge.enabledGameTestNamespaces', project.mod_id) + } + + client2 { + client() + sourceSet = sourceSets.main + ideName = "Client (2)" + + programArguments.addAll('--username', 'YoungOnion') + gameDirectory.set(file("runs/client2")) + systemProperty('neoforge.enabledGameTestNamespaces', project.mod_id) + } + + server { + server() + sourceSet = sourceSets.main + ideName = "Server" + + gameDirectory.set(file("runs/server")) + programArgument '--nogui' + systemProperty('neoforge.enabledGameTestNamespaces', project.mod_id) + } + + data { + data() + sourceSet = sourceSets.main + ideName = "Data Generation" + + gameDirectory.set(file("runs/data")) + programArguments.addAll('--mod', project.mod_id) + programArguments.addAll('--all') + programArguments.addAll('--output', file('src/generated/resources/').getAbsolutePath()) + programArguments.addAll('--existing', file('src/main/resources/').getAbsolutePath()) + programArguments.addAll('--existing-mod', 'gtceu') + } + + configureEach { + systemProperty 'forge.logging.markers', 'REGISTRIES' + logLevel = org.slf4j.event.Level.INFO + } + } +} + +// IDEA no longer automatically downloads sources/javadoc jars for dependencies, so we need to explicitly enable the behavior. +idea { + module { + downloadSources = true + downloadJavadoc = true + } +} diff --git a/gradle/scripts/repositories.gradle b/gradle/scripts/repositories.gradle new file mode 100644 index 000000000..d6c51792a --- /dev/null +++ b/gradle/scripts/repositories.gradle @@ -0,0 +1,110 @@ +repositories { + mavenLocal() + mavenCentral() + + maven { // GTCEu + name = 'GTCEu Maven' + url = 'https://maven.gtceu.com' + content { includeGroup 'com.gregtechceu.gtceu' } + } + maven { // AE2 (upstream), GuideME, AE2WTLib (Mari023), JEI mirror + name = "ModMaven" + url = "https://modmaven.dev/" + content { + includeGroup 'org.appliedenergistics' + includeGroup 'de.mari_023' + includeGroup 'mezz.jei' + } + } + maven { // LDLib, Shimmer + name = "FirstDarkDev" + url = "https://maven.firstdark.dev/snapshots" + } + maven { // JEI, Patchouli + name = "BlameJared" + url = "https://maven.blamejared.com/" + } + exclusiveContent { // Create, Ponder, Flywheel + forRepository { maven { url = "https://maven.createmod.net" } } + filter { + includeGroup("net.createmod.ponder") + includeGroup("com.simibubi.create") + includeGroupAndSubgroups("dev.engine-room") + } + } + exclusiveContent { // Configuration + forRepository { maven { url = "https://repo.repsy.io/mvn/toma/public" } } + filter { includeGroup("dev.toma.configuration") } + } + exclusiveContent { // KubeJS and Rhino + forRepository { maven { url = "https://maven.latvian.dev/releases" } } + filter { + includeGroup("dev.latvian.mods") + includeGroup("dev.latvian.apps") + } + } + exclusiveContent { // FTB mods + forRepository { maven { url = "https://maven.ftb.dev/releases/" } } + filter { includeGroup("dev.ftb.mods") } + } + exclusiveContent { // EMI + forRepository { maven { url = "https://maven.terraformersmc.com/releases/" } } + filter { includeGroup("dev.emi") } + } + exclusiveContent { // architectury, cloth-config + forRepository { maven { url = "https://maven.shedaniel.me/" } } + filter { + includeGroupAndSubgroups("me.shedaniel") + includeGroup("dev.architectury") + } + } + exclusiveContent { // registrate + forRepository { maven { url = "https://mvn.devos.one/snapshots/" } } + filter { includeGroup("com.tterrag.registrate") } + } + exclusiveContent { // Curios + forRepository { maven { url = "https://maven.theillusivec4.top/" } } + filter { includeGroup('top.theillusivec4.curios') } + } + maven { // Apotheosis / Shadows of Fire + name = "Shadows of Fire" + url = "https://maven.shadowsoffire.dev/releases" + } + maven { // GeckoLib + name = 'GeckoLib' + url = 'https://dl.cloudsmith.io/public/geckolib3/geckolib/maven/' + content { + includeGroupByRegex("software\\.bernie.*") + includeGroup("com.eliotlash.mclib") + } + } + maven { // Occultism, Modonomicon + name = "Klikli" + url = "https://dl.cloudsmith.io/public/klikli-dev/mods/maven/" + content { includeGroup("com.klikli_dev") } + } + exclusiveContent { // JourneyMap API + forRepository { maven { url = "https://jm.gserv.me/repository/maven-public/" } } + filter { includeGroup("info.journeymap") } + } + exclusiveContent { // KubeJS transitive (animated-gif-lib-for-java) + forRepository { maven { url = "https://jitpack.io/" } } + filter { includeGroup("com.github.rtyley") } + } + exclusiveContent { // CC: Tweaked (KubeJS transitive) + forRepository { maven { url = "https://maven.squiddev.cc" } } + filter { includeGroup("cc.tweaked") } + } + exclusiveContent { // Team Resourceful (resourcefullib) + forRepository { maven { url = "https://maven.teamresourceful.com/repository/maven-public/" } } + filter { includeGroupAndSubgroups("com.teamresourceful") } + } + exclusiveContent { // Modrinth maven (content mods) + forRepository { maven { url = "https://api.modrinth.com/maven/" } } + filter { includeGroup("maven.modrinth") } + } + exclusiveContent { // Curseforge maven + forRepository { maven { url = "https://cursemaven.com/" } } + filter { includeGroup("curse.maven") } + } +} diff --git a/gradle/scripts/resources.gradle b/gradle/scripts/resources.gradle new file mode 100644 index 000000000..53184198d --- /dev/null +++ b/gradle/scripts/resources.gradle @@ -0,0 +1,49 @@ +String getConfig(String key) { + return project.properties.get(key) +} + +def mod_id = getConfig("mod_id") +def mod_license = getConfig("mod_license") +def mod_name = getConfig("mod_name") +def mod_description = getConfig("mod_description") +def mod_url = getConfig("mod_url") +def mod_issue_tracker = getConfig("mod_issue_tracker") + +// Create run-folders for non-client configs to avoid pollution of dev envs +tasks.matching { it.name.startsWith('prepare') }.configureEach { + doFirst { + mkdir('runs') + mkdir('runs/server') + mkdir('runs/data') + } +} + +// This block of code expands all declared replace properties in the specified resource targets. +// A missing property will result in an error. Properties are expanded using ${} Groovy notation. +var generateModMetadata = tasks.register("generateModMetadata", ProcessResources) { + var replaceProperties = [ + version : mod_version, + mod_id : mod_id, + minecraft_version : libs.versions.minecraft.get(), + neo_version : libs.versions.neoForge.get(), + loader_version : libs.versions.loader.get(), + ldlib_version : forge.versions.ldlib.get(), + gtceu_version : forge.versions.gtceu.get(), + mod_license : mod_license, + mod_name : mod_name, + mod_authors : mod_authors, + mod_description : mod_description, + mod_url : mod_url, + mod_issue_tracker : mod_issue_tracker + ] + inputs.properties replaceProperties + expand replaceProperties + from "src/main/templates" + into "build/generated/sources/modMetadata" +} + +// Include the output of "generateModMetadata" as an input directory for the build +// this works with both building through Gradle and the IDE. +sourceSets.main.resources.srcDir generateModMetadata +// To avoid having to run "generateModMetadata" manually, make it run on every project reload +neoForge.ideSyncTask generateModMetadata diff --git a/gradle/scripts/spotless.gradle b/gradle/scripts/spotless.gradle new file mode 100644 index 000000000..1abc83283 --- /dev/null +++ b/gradle/scripts/spotless.gradle @@ -0,0 +1,26 @@ +// Spotless auto-formatter +// See https://github.com/diffplug/spotless/tree/main/plugin-gradle +// Can be locally toggled via spotless:off/spotless:on comments +spotless { + encoding 'UTF-8' + + format 'misc', { + target '.gitignore' + + trimTrailingWhitespace() + leadingTabsToSpaces(4) + endWithNewline() + } + java { + target 'src/main/java/**/*.java', 'src/test/java/**/*.java' + + def orderFile = file("$rootDir/spotless/spotless.importorder") + def formatFile = file("$rootDir/spotless/spotless.eclipseformat.xml") + + toggleOffOn() + importOrderFile(orderFile) + removeUnusedImports('cleanthat-javaparser-unnecessaryimport') + endWithNewline() + eclipse('4.31').configFile(formatFile) + } +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index ccebba771..e6441136f 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 744c64d12..94113f200 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.11-bin.zip networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/libs/gtceu-1.21.1-8.0.0-sources.jar b/libs/gtceu-1.21.1-8.0.0-sources.jar new file mode 100644 index 000000000..272c55e2d Binary files /dev/null and b/libs/gtceu-1.21.1-8.0.0-sources.jar differ diff --git a/libs/gtceu-1.21.1-8.0.0.jar b/libs/gtceu-1.21.1-8.0.0.jar new file mode 100644 index 000000000..71bf55672 Binary files /dev/null and b/libs/gtceu-1.21.1-8.0.0.jar differ diff --git a/settings.gradle b/settings.gradle index 606cfc1d7..f8456699f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,10 +1,24 @@ pluginManagement { - // when using additional gradle plugins like shadow, - // add their repositories to this list! repositories { - maven { url "https://maven.fabricmc.net/" } - maven { url "https://maven.architectury.dev/" } - maven { url "https://files.minecraftforge.net/maven/" } + mavenCentral() gradlePluginPortal() + maven { url = 'https://maven.neoforged.net/releases' } } } + +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0' +} + +dependencyResolutionManagement { + repositories { + mavenCentral() + } + versionCatalogs { + forge { + from(files("gradle/forge.versions.toml")) + } + } +} + +rootProject.name = "${mod_id}" diff --git a/spotless/spotless.eclipseformat.xml b/spotless/spotless.eclipseformat.xml new file mode 100644 index 000000000..8db01de42 --- /dev/null +++ b/spotless/spotless.eclipseformat.xml @@ -0,0 +1,400 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spotless/spotless.importorder b/spotless/spotless.importorder new file mode 100644 index 000000000..602e0ae55 --- /dev/null +++ b/spotless/spotless.importorder @@ -0,0 +1,8 @@ +0=com.ghostipedia +1=com.gregtechceu +2=com.lowdragmc +3=net +4= +5=java +6=javax +7=\# \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/alternator_flux_coiling.json b/src/generated/resources/assets/cosmiccore/blockstates/alternator_flux_coiling.json new file mode 100644 index 000000000..ce68fd5dd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/alternator_flux_coiling.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/alternator_flux_coiling" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/alveary_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/alveary_casing.json new file mode 100644 index 000000000..dce50a093 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/alveary_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/alveary_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/arcane_crucible.json b/src/generated/resources/assets/cosmiccore/blockstates/arcane_crucible.json new file mode 100644 index 000000000..80380715d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/arcane_crucible.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/arcane_crucible" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/arcane_crucible" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/arcane_crucible" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/arcane_crucible" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/arcane_crucible", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/arcane_distillery.json b/src/generated/resources/assets/cosmiccore/blockstates/arcane_distillery.json new file mode 100644 index 000000000..adf7a7d6b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/arcane_distillery.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/arcane_distillery", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/arcane_distillery", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/arcane_distillery", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/arcane_distillery", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/arcane_distillery" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/arcane_distillery" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/arcane_distillery" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/arcane_distillery" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/arcane_distillery", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/arcane_distillery", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/arcane_distillery", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/arcane_distillery", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/arcane_distillery", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/arcane_distillery", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/arcane_distillery", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/arcane_distillery", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/atmo_pump.json b/src/generated/resources/assets/cosmiccore/blockstates/atmo_pump.json new file mode 100644 index 000000000..11242d63e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/atmo_pump.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/atmo_pump", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/atmo_pump", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/atmo_pump", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/atmo_pump", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/atmo_pump" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/atmo_pump" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/atmo_pump" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/atmo_pump" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/atmo_pump", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/atmo_pump", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/atmo_pump", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/atmo_pump", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/atmo_pump", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/atmo_pump", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/atmo_pump", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/atmo_pump", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/atomic_reconstructor.json b/src/generated/resources/assets/cosmiccore/blockstates/atomic_reconstructor.json new file mode 100644 index 000000000..e9e574209 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/atomic_reconstructor.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/atomic_reconstructor" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/atomic_reconstructor" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/atomic_reconstructor" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/atomic_reconstructor" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/atomic_reconstructor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/bichromal_nevramite_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/bichromal_nevramite_casing.json new file mode 100644 index 000000000..4584651da --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/bichromal_nevramite_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/bichromal_nevramite_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/biovat.json b/src/generated/resources/assets/cosmiccore/blockstates/biovat.json new file mode 100644 index 000000000..8448de0d6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/biovat.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/biovat", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/biovat", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/biovat", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/biovat", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/biovat" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/biovat" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/biovat" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/biovat" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/biovat", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/biovat", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/biovat", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/biovat", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/biovat", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/biovat", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/biovat", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/biovat", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/blank_rune.json b/src/generated/resources/assets/cosmiccore/blockstates/blank_rune.json new file mode 100644 index 000000000..f30a9b971 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/blank_rune.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/blank_rune" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/bolted_heavy_frame_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/bolted_heavy_frame_casing.json new file mode 100644 index 000000000..e57937fe6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/bolted_heavy_frame_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/bolted_heavy_frame_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/botanical_simulation_complex.json b/src/generated/resources/assets/cosmiccore/blockstates/botanical_simulation_complex.json new file mode 100644 index 000000000..4a5ae3943 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/botanical_simulation_complex.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/botanical_simulation_complex", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/botanical_simulation_complex", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/botanical_simulation_complex", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/botanical_simulation_complex", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/botanical_simulation_complex" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/botanical_simulation_complex" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/botanical_simulation_complex" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/botanical_simulation_complex" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/botanical_simulation_complex", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/botanical_simulation_complex", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/botanical_simulation_complex", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/botanical_simulation_complex", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/botanical_simulation_complex", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/botanical_simulation_complex", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/botanical_simulation_complex", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/botanical_simulation_complex", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/capacitor_array.json b/src/generated/resources/assets/cosmiccore/blockstates/capacitor_array.json new file mode 100644 index 000000000..e767d8e3b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/capacitor_array.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/capacitor_array", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/capacitor_array", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/capacitor_array", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/capacitor_array", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/capacitor_array" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/capacitor_array" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/capacitor_array" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/capacitor_array" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/capacitor_array", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/capacitor_array", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/capacitor_array", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/capacitor_array", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/capacitor_array", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/capacitor_array", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/capacitor_array", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/capacitor_array", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/causal_fabric_coil_block.json b/src/generated/resources/assets/cosmiccore/blockstates/causal_fabric_coil_block.json new file mode 100644 index 000000000..a044f1917 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/causal_fabric_coil_block.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "cosmiccore:block/causal_fabric_coil_block" + }, + "active=true": { + "model": "cosmiccore:block/causal_fabric_coil_block_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/chromatic_distillation_plant.json b/src/generated/resources/assets/cosmiccore/blockstates/chromatic_distillation_plant.json new file mode 100644 index 000000000..f1565148f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/chromatic_distillation_plant.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/chromatic_distillation_plant", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/chromatic_distillation_plant", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/chromatic_distillation_plant", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/chromatic_distillation_plant", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/chromatic_distillation_plant" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/chromatic_distillation_plant" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/chromatic_distillation_plant" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/chromatic_distillation_plant" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/chromatic_distillation_plant", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/chromatic_distillation_plant", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/chromatic_distillation_plant", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/chromatic_distillation_plant", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/chromatic_distillation_plant", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/chromatic_distillation_plant", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/chromatic_distillation_plant", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/chromatic_distillation_plant", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/chromatic_flotation_plant.json b/src/generated/resources/assets/cosmiccore/blockstates/chromatic_flotation_plant.json new file mode 100644 index 000000000..78bc29ecf --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/chromatic_flotation_plant.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/chromatic_flotation_plant", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/chromatic_flotation_plant", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/chromatic_flotation_plant", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/chromatic_flotation_plant", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/chromatic_flotation_plant" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/chromatic_flotation_plant" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/chromatic_flotation_plant" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/chromatic_flotation_plant" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/chromatic_flotation_plant", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/chromatic_flotation_plant", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/chromatic_flotation_plant", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/chromatic_flotation_plant", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/chromatic_flotation_plant", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/chromatic_flotation_plant", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/chromatic_flotation_plant", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/chromatic_flotation_plant", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/cinder_hearth.json b/src/generated/resources/assets/cosmiccore/blockstates/cinder_hearth.json new file mode 100644 index 000000000..d1c209734 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/cinder_hearth.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/cinder_hearth" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/cinder_hearth" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/cinder_hearth" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/cinder_hearth" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/cinder_hearth", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/component_assembly_line.json b/src/generated/resources/assets/cosmiccore/blockstates/component_assembly_line.json new file mode 100644 index 000000000..fb6f153dc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/component_assembly_line.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/component_assembly_line", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/component_assembly_line", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/component_assembly_line", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/component_assembly_line", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/component_assembly_line" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/component_assembly_line" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/component_assembly_line" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/component_assembly_line" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/component_assembly_line", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/component_assembly_line", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/component_assembly_line", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/component_assembly_line", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/component_assembly_line", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/component_assembly_line", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/component_assembly_line", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/component_assembly_line", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/cosmic_me_assemblyline_bus.json b/src/generated/resources/assets/cosmiccore/blockstates/cosmic_me_assemblyline_bus.json new file mode 100644 index 000000000..cecb18188 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/cosmic_me_assemblyline_bus.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_bus", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_bus", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_bus" + }, + "facing=south": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_bus", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_bus", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_bus", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/cosmic_me_assemblyline_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/cosmic_me_assemblyline_hatch.json new file mode 100644 index 000000000..e012842c4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/cosmic_me_assemblyline_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/cosmic_me_assemblyline_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/creative_thermal.json b/src/generated/resources/assets/cosmiccore/blockstates/creative_thermal.json new file mode 100644 index 000000000..88fd58d54 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/creative_thermal.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/machine/creative_thermal" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/crop_holder.json b/src/generated/resources/assets/cosmiccore/blockstates/crop_holder.json new file mode 100644 index 000000000..05c9dacbd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/crop_holder.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/crop_holder", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/crop_holder", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/crop_holder" + }, + "facing=south": { + "model": "cosmiccore:block/machine/crop_holder", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/crop_holder", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/crop_holder", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/cryogenic_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/cryogenic_casing.json new file mode 100644 index 000000000..7cbe201f1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/cryogenic_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/cryogenic_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/cryogenics_chamber.json b/src/generated/resources/assets/cosmiccore/blockstates/cryogenics_chamber.json new file mode 100644 index 000000000..2f0ada870 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/cryogenics_chamber.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/cryogenics_chamber", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/cryogenics_chamber", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/cryogenics_chamber", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/cryogenics_chamber", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/cryogenics_chamber" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/cryogenics_chamber" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/cryogenics_chamber" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/cryogenics_chamber" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/cryogenics_chamber", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/cryogenics_chamber", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/cryogenics_chamber", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/cryogenics_chamber", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/cryogenics_chamber", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/cryogenics_chamber", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/cryogenics_chamber", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/cryogenics_chamber", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/cyclozine_chemically_repelling_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/cyclozine_chemically_repelling_casing.json new file mode 100644 index 000000000..3136bb375 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/cyclozine_chemically_repelling_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/cyclozine_chemically_repelling_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/cyclozine_chemically_repelling_pipe.json b/src/generated/resources/assets/cosmiccore/blockstates/cyclozine_chemically_repelling_pipe.json new file mode 100644 index 000000000..945f50431 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/cyclozine_chemically_repelling_pipe.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/cyclozine_chemically_repelling_pipe" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/cyclozine_high_rigidity_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/cyclozine_high_rigidity_casing.json new file mode 100644 index 000000000..be7e0a451 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/cyclozine_high_rigidity_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/cyclozine_high_rigidity_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/dawn_forge.json b/src/generated/resources/assets/cosmiccore/blockstates/dawn_forge.json new file mode 100644 index 000000000..e795d3cb0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/dawn_forge.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dawn_forge", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/dawn_forge", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dawn_forge", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dawn_forge", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dawn_forge" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/dawn_forge" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dawn_forge" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dawn_forge" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dawn_forge", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/dawn_forge", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dawn_forge", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dawn_forge", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dawn_forge", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/dawn_forge", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dawn_forge", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dawn_forge", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/dawnforge_eclipsed.json b/src/generated/resources/assets/cosmiccore/blockstates/dawnforge_eclipsed.json new file mode 100644 index 000000000..05be0365e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/dawnforge_eclipsed.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dawnforge_eclipsed" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/dawnforge_eclipsed" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dawnforge_eclipsed" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dawnforge_eclipsed" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dawnforge_eclipsed", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/dimensional_energy_capacitor.json b/src/generated/resources/assets/cosmiccore/blockstates/dimensional_energy_capacitor.json new file mode 100644 index 000000000..6f409193d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/dimensional_energy_capacitor.json @@ -0,0 +1,114 @@ +{ + "variants": { + "facing=down,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "x": 90 + }, + "facing=down,upwards_facing=north": { + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "x": 90 + }, + "facing=down,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "x": 90 + }, + "facing=down,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "x": 90 + }, + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dimensional_energy_capacitor" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/dimensional_energy_capacitor" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dimensional_energy_capacitor" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dimensional_energy_capacitor" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "y": 180 + }, + "facing=up,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "x": 270 + }, + "facing=up,upwards_facing=north": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "x": 270 + }, + "facing=up,upwards_facing=south": { + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "x": 270 + }, + "facing=up,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "x": 270 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dimensional_energy_capacitor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/dimensional_energy_interface.json b/src/generated/resources/assets/cosmiccore/blockstates/dimensional_energy_interface.json new file mode 100644 index 000000000..7cdc24827 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/dimensional_energy_interface.json @@ -0,0 +1,114 @@ +{ + "variants": { + "facing=down,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "x": 90 + }, + "facing=down,upwards_facing=north": { + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "x": 90 + }, + "facing=down,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "x": 90 + }, + "facing=down,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "x": 90 + }, + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dimensional_energy_interface" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/dimensional_energy_interface" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dimensional_energy_interface" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dimensional_energy_interface" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "y": 180 + }, + "facing=up,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "x": 270 + }, + "facing=up,upwards_facing=north": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "x": 270 + }, + "facing=up,upwards_facing=south": { + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "x": 270 + }, + "facing=up,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "x": 270 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dimensional_energy_interface", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/diving_bell.json b/src/generated/resources/assets/cosmiccore/blockstates/diving_bell.json new file mode 100644 index 000000000..909af79be --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/diving_bell.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/diving_bell", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/diving_bell", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/diving_bell", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/diving_bell", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/diving_bell" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/diving_bell" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/diving_bell" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/diving_bell" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/diving_bell", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/diving_bell", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/diving_bell", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/diving_bell", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/diving_bell", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/diving_bell", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/diving_bell", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/diving_bell", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/diving_bell_escape_pad.json b/src/generated/resources/assets/cosmiccore/blockstates/diving_bell_escape_pad.json new file mode 100644 index 000000000..e450a47dc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/diving_bell_escape_pad.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/diving_bell_escape_pad" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/dreamers_basin.json b/src/generated/resources/assets/cosmiccore/blockstates/dreamers_basin.json new file mode 100644 index 000000000..40f78118b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/dreamers_basin.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dreamers_basin" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/dreamers_basin" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dreamers_basin" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dreamers_basin" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/dreamers_basin", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/drone_maintenance_interface.json b/src/generated/resources/assets/cosmiccore/blockstates/drone_maintenance_interface.json new file mode 100644 index 000000000..967262173 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/drone_maintenance_interface.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/drone_maintenance_interface", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/drone_maintenance_interface", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/drone_maintenance_interface" + }, + "facing=south": { + "model": "cosmiccore:block/machine/drone_maintenance_interface", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/drone_maintenance_interface", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/drone_maintenance_interface", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/drone_station.json b/src/generated/resources/assets/cosmiccore/blockstates/drone_station.json new file mode 100644 index 000000000..246e8ac96 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/drone_station.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/drone_station", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/drone_station", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/drone_station", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/drone_station", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/drone_station" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/drone_station" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/drone_station" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/drone_station" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/drone_station", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/drone_station", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/drone_station", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/drone_station", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/drone_station", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/drone_station", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/drone_station", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/drone_station", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/drygmy_grove.json b/src/generated/resources/assets/cosmiccore/blockstates/drygmy_grove.json new file mode 100644 index 000000000..411bc30ed --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/drygmy_grove.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/drygmy_grove", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/drygmy_grove", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/drygmy_grove", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/drygmy_grove", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/drygmy_grove" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/drygmy_grove" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/drygmy_grove" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/drygmy_grove" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/drygmy_grove", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/drygmy_grove", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/drygmy_grove", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/drygmy_grove", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/drygmy_grove", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/drygmy_grove", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/drygmy_grove", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/drygmy_grove", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/dyson_solar_cell.json b/src/generated/resources/assets/cosmiccore/blockstates/dyson_solar_cell.json new file mode 100644 index 000000000..71d992467 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/dyson_solar_cell.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/dyson_solar_cell" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ethersteel_plated_ash_tiles.json b/src/generated/resources/assets/cosmiccore/blockstates/ethersteel_plated_ash_tiles.json new file mode 100644 index 000000000..92ad4d808 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ethersteel_plated_ash_tiles.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/ethersteel_plated_ash_tiles" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_biolab.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_biolab.json new file mode 100644 index 000000000..071cadf4c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_biolab.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/ev_biolab", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ev_biolab" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ev_biolab", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ev_biolab", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_calx_reactor.json new file mode 100644 index 000000000..fcba339d8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/ev_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ev_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ev_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ev_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_mana_leaching_tub.json new file mode 100644 index 000000000..b9c311a73 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/ev_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ev_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ev_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ev_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_roaster.json new file mode 100644 index 000000000..a37b59a14 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/ev_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ev_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ev_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ev_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_thermomagnitizer.json new file mode 100644 index 000000000..2951d593e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/ev_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ev_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ev_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ev_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_vacuum_bubbler.json new file mode 100644 index 000000000..85291ef07 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/ev_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ev_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ev_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ev_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ev_wireless_charger.json b/src/generated/resources/assets/cosmiccore/blockstates/ev_wireless_charger.json new file mode 100644 index 000000000..a4f7ea148 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ev_wireless_charger.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/ev_wireless_charger", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ev_wireless_charger" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ev_wireless_charger", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ev_wireless_charger", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/extreme_combustion_engine_cc.json b/src/generated/resources/assets/cosmiccore/blockstates/extreme_combustion_engine_cc.json new file mode 100644 index 000000000..1336edabd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/extreme_combustion_engine_cc.json @@ -0,0 +1,114 @@ +{ + "variants": { + "facing=down,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "x": 90 + }, + "facing=down,upwards_facing=north": { + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "x": 90 + }, + "facing=down,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "x": 90 + }, + "facing=down,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "x": 90 + }, + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "y": 180 + }, + "facing=up,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "x": 270 + }, + "facing=up,upwards_facing=north": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "x": 270 + }, + "facing=up,upwards_facing=south": { + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "x": 270 + }, + "facing=up,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "x": 270 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/extreme_combustion_engine_cc", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/fulgorinth_prime_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/fulgorinth_prime_casing.json new file mode 100644 index 000000000..0c8050b49 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/fulgorinth_prime_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/fulgorinth_prime_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/fusion_grade_magnet.json b/src/generated/resources/assets/cosmiccore/blockstates/fusion_grade_magnet.json new file mode 100644 index 000000000..b8c5c60f6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/fusion_grade_magnet.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "cosmiccore:block/fusion_grade_magnet" + }, + "active=true": { + "model": "cosmiccore:block/fusion_grade_magnet_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/gilded_pthanterum_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/gilded_pthanterum_casing.json new file mode 100644 index 000000000..4ff6c247d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/gilded_pthanterum_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/gilded_pthanterum_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/heat_fan.json b/src/generated/resources/assets/cosmiccore/blockstates/heat_fan.json new file mode 100644 index 000000000..9a47a6201 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/heat_fan.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "cosmiccore:block/variant/heat_fan" + }, + "active=true": { + "model": "cosmiccore:block/variant/heat_fan_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/heavy_assembler.json b/src/generated/resources/assets/cosmiccore/blockstates/heavy_assembler.json new file mode 100644 index 000000000..086e3fe9c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/heavy_assembler.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/heavy_assembler", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/heavy_assembler", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/heavy_assembler", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/heavy_assembler", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/heavy_assembler" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/heavy_assembler" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/heavy_assembler" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/heavy_assembler" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/heavy_assembler", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/heavy_assembler", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/heavy_assembler", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/heavy_assembler", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/heavy_assembler", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/heavy_assembler", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/heavy_assembler", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/heavy_assembler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/heavy_frost_proof_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/heavy_frost_proof_casing.json new file mode 100644 index 000000000..8c05c1554 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/heavy_frost_proof_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/heavy_frost_proof_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hellfire_foundry.json b/src/generated/resources/assets/cosmiccore/blockstates/hellfire_foundry.json new file mode 100644 index 000000000..928e4cb60 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hellfire_foundry.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/hellfire_foundry", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/hellfire_foundry", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hellfire_foundry", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/hellfire_foundry", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/hellfire_foundry" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/hellfire_foundry" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hellfire_foundry" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/hellfire_foundry" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/hellfire_foundry", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/hellfire_foundry", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hellfire_foundry", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/hellfire_foundry", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/hellfire_foundry", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/hellfire_foundry", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hellfire_foundry", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/hellfire_foundry", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hemophagic_transfuser.json b/src/generated/resources/assets/cosmiccore/blockstates/hemophagic_transfuser.json new file mode 100644 index 000000000..15f1713f0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hemophagic_transfuser.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/hemophagic_transfuser", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/hemophagic_transfuser", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hemophagic_transfuser", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/hemophagic_transfuser", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/hemophagic_transfuser" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/hemophagic_transfuser" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hemophagic_transfuser" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/hemophagic_transfuser" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/hemophagic_transfuser", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/hemophagic_transfuser", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hemophagic_transfuser", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/hemophagic_transfuser", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/hemophagic_transfuser", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/hemophagic_transfuser", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hemophagic_transfuser", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/hemophagic_transfuser", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/high_powered_magnet.json b/src/generated/resources/assets/cosmiccore/blockstates/high_powered_magnet.json new file mode 100644 index 000000000..dbc827862 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/high_powered_magnet.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "cosmiccore:block/high_powered_magnet" + }, + "active=true": { + "model": "cosmiccore:block/high_powered_magnet_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/high_pressure_assembler.json b/src/generated/resources/assets/cosmiccore/blockstates/high_pressure_assembler.json new file mode 100644 index 000000000..ab98aef7d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/high_pressure_assembler.json @@ -0,0 +1,114 @@ +{ + "variants": { + "facing=down,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/high_pressure_assembler", + "x": 90 + }, + "facing=down,upwards_facing=north": { + "model": "cosmiccore:block/machine/high_pressure_assembler", + "x": 90 + }, + "facing=down,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/high_pressure_assembler", + "x": 90 + }, + "facing=down,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/high_pressure_assembler", + "x": 90 + }, + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/high_pressure_assembler", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/high_pressure_assembler", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/high_pressure_assembler", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/high_pressure_assembler", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/high_pressure_assembler" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/high_pressure_assembler" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/high_pressure_assembler" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/high_pressure_assembler" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/high_pressure_assembler", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/high_pressure_assembler", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/high_pressure_assembler", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/high_pressure_assembler", + "y": 180 + }, + "facing=up,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/high_pressure_assembler", + "x": 270 + }, + "facing=up,upwards_facing=north": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/high_pressure_assembler", + "x": 270 + }, + "facing=up,upwards_facing=south": { + "model": "cosmiccore:block/machine/high_pressure_assembler", + "x": 270 + }, + "facing=up,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/high_pressure_assembler", + "x": 270 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/high_pressure_assembler", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/high_pressure_assembler", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/high_pressure_assembler", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/high_pressure_assembler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/high_temperature_fission_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/high_temperature_fission_casing.json new file mode 100644 index 000000000..6bfebb849 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/high_temperature_fission_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/high_temperature_fission_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/high_tolerance_rhenium_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/high_tolerance_rhenium_casing.json new file mode 100644 index 000000000..102cda016 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/high_tolerance_rhenium_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/high_tolerance_rhenium_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/highly_conductive_fission_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/highly_conductive_fission_casing.json new file mode 100644 index 000000000..22335848a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/highly_conductive_fission_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/highly_conductive_fission_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/highly_flexible_reinforced_trinavine_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/highly_flexible_reinforced_trinavine_casing.json new file mode 100644 index 000000000..b9dcdb83e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/highly_flexible_reinforced_trinavine_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/highly_flexible_reinforced_trinavine_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hp_steam_bender.json b/src/generated/resources/assets/cosmiccore/blockstates/hp_steam_bender.json new file mode 100644 index 000000000..362b75757 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hp_steam_bender.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/hp_steam_bender", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hp_steam_bender" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hp_steam_bender", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hp_steam_bender", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hp_steam_wiremill.json b/src/generated/resources/assets/cosmiccore/blockstates/hp_steam_wiremill.json new file mode 100644 index 000000000..72018b219 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hp_steam_wiremill.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/hp_steam_wiremill", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hp_steam_wiremill" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hp_steam_wiremill", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hp_steam_wiremill", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/huge_sterilization_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/huge_sterilization_hatch.json new file mode 100644 index 000000000..531a5384a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/huge_sterilization_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/huge_sterilization_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/huge_sterilization_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/huge_sterilization_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/huge_sterilization_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/huge_sterilization_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/huge_sterilization_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_calx_reactor.json new file mode 100644 index 000000000..f0b726512 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/hv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_energy_output_hatch_16a.json new file mode 100644 index 000000000..7952d70dd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_energy_output_hatch_16a.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_16a", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_16a", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_16a" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_16a", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hv_energy_output_hatch_16a", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_16a", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_energy_output_hatch_4a.json new file mode 100644 index 000000000..f43011a94 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_energy_output_hatch_4a.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_4a", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_4a", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_4a" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_4a", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hv_energy_output_hatch_4a", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_energy_output_hatch_4a", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_input_hatch_4x.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_input_hatch_4x.json new file mode 100644 index 000000000..be441a126 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_input_hatch_4x.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/hv_input_hatch_4x", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/hv_input_hatch_4x", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_input_hatch_4x" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_input_hatch_4x", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hv_input_hatch_4x", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_input_hatch_4x", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_mana_leaching_tub.json new file mode 100644 index 000000000..d7aac6524 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/hv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_output_hatch_4x.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_output_hatch_4x.json new file mode 100644 index 000000000..93e479393 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_output_hatch_4x.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/hv_output_hatch_4x", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/hv_output_hatch_4x", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_output_hatch_4x" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_output_hatch_4x", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/hv_output_hatch_4x", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_output_hatch_4x", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_roaster.json new file mode 100644 index 000000000..3909c1e62 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/hv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_thermomagnitizer.json new file mode 100644 index 000000000..5ed8b2ba8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/hv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_vacuum_bubbler.json new file mode 100644 index 000000000..5132087f0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/hv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/hv_wireless_charger.json b/src/generated/resources/assets/cosmiccore/blockstates/hv_wireless_charger.json new file mode 100644 index 000000000..3dd3d239b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/hv_wireless_charger.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/hv_wireless_charger", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/hv_wireless_charger" + }, + "facing=south": { + "model": "cosmiccore:block/machine/hv_wireless_charger", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/hv_wireless_charger", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/industrial_chemical_vat.json b/src/generated/resources/assets/cosmiccore/blockstates/industrial_chemical_vat.json new file mode 100644 index 000000000..a4e298fe3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/industrial_chemical_vat.json @@ -0,0 +1,114 @@ +{ + "variants": { + "facing=down,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "x": 90 + }, + "facing=down,upwards_facing=north": { + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "x": 90 + }, + "facing=down,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "x": 90 + }, + "facing=down,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "x": 90 + }, + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/industrial_chemical_vat" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/industrial_chemical_vat" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/industrial_chemical_vat" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/industrial_chemical_vat" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "y": 180 + }, + "facing=up,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "x": 270 + }, + "facing=up,upwards_facing=north": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "x": 270 + }, + "facing=up,upwards_facing=south": { + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "x": 270 + }, + "facing=up,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "x": 270 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/industrial_chemical_vat", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/industrial_primitive_blast_furnace.json b/src/generated/resources/assets/cosmiccore/blockstates/industrial_primitive_blast_furnace.json new file mode 100644 index 000000000..6cdff5558 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/industrial_primitive_blast_furnace.json @@ -0,0 +1,114 @@ +{ + "variants": { + "facing=down,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "x": 90 + }, + "facing=down,upwards_facing=north": { + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "x": 90 + }, + "facing=down,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "x": 90 + }, + "facing=down,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "x": 90 + }, + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "y": 180 + }, + "facing=up,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "x": 270 + }, + "facing=up,upwards_facing=north": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "x": 270 + }, + "facing=up,upwards_facing=south": { + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "x": 270 + }, + "facing=up,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "x": 270 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/industrial_primitive_blast_furnace", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iron_plated_deepslate_tile.json b/src/generated/resources/assets/cosmiccore/blockstates/iron_plated_deepslate_tile.json new file mode 100644 index 000000000..1cbcbaa30 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iron_plated_deepslate_tile.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/iron_plated_deepslate_tile" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iron_plated_deepslate_tile_slab.json b/src/generated/resources/assets/cosmiccore/blockstates/iron_plated_deepslate_tile_slab.json new file mode 100644 index 000000000..235463b8a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iron_plated_deepslate_tile_slab.json @@ -0,0 +1,13 @@ +{ + "variants": { + "type=bottom": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_slab" + }, + "type=double": { + "model": "cosmiccore:block/iron_plated_deepslate_tile" + }, + "type=top": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_slab_top" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iron_plated_deepslate_tile_stairs.json b/src/generated/resources/assets/cosmiccore/blockstates/iron_plated_deepslate_tile_stairs.json new file mode 100644 index 000000000..f45c30cd6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iron_plated_deepslate_tile_stairs.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs" + }, + "facing=east,half=top,shape=inner_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "cosmiccore:block/iron_plated_deepslate_tile_stairs", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..19fc75c25 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_16a_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/iv_16a_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/iv_16a_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_16a_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_16a_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/iv_16a_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_16a_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..7455750c0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_16a_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/iv_16a_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/iv_16a_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_16a_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_16a_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/iv_16a_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_16a_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..92f2f6dc8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_4a_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/iv_4a_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/iv_4a_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_4a_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_4a_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/iv_4a_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_4a_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..4ccac4e69 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_4a_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/iv_4a_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/iv_4a_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_4a_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_4a_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/iv_4a_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_4a_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_biolab.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_biolab.json new file mode 100644 index 000000000..041567767 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_biolab.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/iv_biolab", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_biolab" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_biolab", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_biolab", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_calx_reactor.json new file mode 100644 index 000000000..33d6e601f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/iv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_mana_leaching_tub.json new file mode 100644 index 000000000..105d394fe --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/iv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_naquahine_mini_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_naquahine_mini_reactor.json new file mode 100644 index 000000000..d39dfb50b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_naquahine_mini_reactor.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/iv_naquahine_mini_reactor", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/iv_naquahine_mini_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_naquahine_mini_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_naquahine_mini_reactor", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/iv_naquahine_mini_reactor", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_naquahine_mini_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_roaster.json new file mode 100644 index 000000000..e0cfef356 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/iv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_soul_input_hatch.json new file mode 100644 index 000000000..6a08789ed --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_soul_input_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/iv_soul_input_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/iv_soul_input_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_soul_input_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_soul_input_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/iv_soul_input_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_soul_input_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_soul_output_hatch.json new file mode 100644 index 000000000..c082e8bab --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_soul_output_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/iv_soul_output_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/iv_soul_output_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_soul_output_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_soul_output_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/iv_soul_output_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_soul_output_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_thermia_export_hatch.json new file mode 100644 index 000000000..042c324c0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_thermia_export_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/iv_thermia_export_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/iv_thermia_export_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_thermia_export_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_thermia_export_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/iv_thermia_export_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_thermia_export_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_thermia_import_hatch.json new file mode 100644 index 000000000..1dbc4cc32 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_thermia_import_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/iv_thermia_import_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/iv_thermia_import_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_thermia_import_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_thermia_import_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/iv_thermia_import_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_thermia_import_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_thermomagnitizer.json new file mode 100644 index 000000000..82f57db35 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/iv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_vacuum_bubbler.json new file mode 100644 index 000000000..5f76f403f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/iv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_wireless_charger.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_wireless_charger.json new file mode 100644 index 000000000..571ab55d2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_wireless_charger.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/iv_wireless_charger", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_wireless_charger" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_wireless_charger", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_wireless_charger", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_wireless_energy_dynamo.json new file mode 100644 index 000000000..cc9f81bb5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/iv_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/iv_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/iv_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/iv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/iv_wireless_energy_hatch.json new file mode 100644 index 000000000..0003e011d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/iv_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/iv_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/iv_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/iv_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/iv_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/iv_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/iv_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/large_combustion_engine_cc.json b/src/generated/resources/assets/cosmiccore/blockstates/large_combustion_engine_cc.json new file mode 100644 index 000000000..d69f05ebf --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/large_combustion_engine_cc.json @@ -0,0 +1,114 @@ +{ + "variants": { + "facing=down,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "x": 90 + }, + "facing=down,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "x": 90 + }, + "facing=down,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "x": 90 + }, + "facing=down,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "x": 90 + }, + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_combustion_engine_cc" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_combustion_engine_cc" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_combustion_engine_cc" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_combustion_engine_cc" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "y": 180 + }, + "facing=up,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "x": 270 + }, + "facing=up,upwards_facing=north": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "x": 270 + }, + "facing=up,upwards_facing=south": { + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "x": 270 + }, + "facing=up,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "x": 270 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_combustion_engine_cc", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/large_laminator.json b/src/generated/resources/assets/cosmiccore/blockstates/large_laminator.json new file mode 100644 index 000000000..0e94a27bf --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/large_laminator.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_laminator", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_laminator", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_laminator", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_laminator", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_laminator" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_laminator" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_laminator" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_laminator" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_laminator", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_laminator", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_laminator", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_laminator", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_laminator", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_laminator", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_laminator", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_laminator", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/large_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/large_roaster.json new file mode 100644 index 000000000..143eec80e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/large_roaster.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_roaster", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_roaster", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_roaster", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_roaster", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_roaster" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_roaster" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_roaster" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_roaster" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_roaster", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_roaster", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_roaster", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_roaster", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_roaster", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_roaster", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_roaster", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/large_spooling_machine.json b/src/generated/resources/assets/cosmiccore/blockstates/large_spooling_machine.json new file mode 100644 index 000000000..56432c284 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/large_spooling_machine.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_spooling_machine", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_spooling_machine", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_spooling_machine", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_spooling_machine", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_spooling_machine" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_spooling_machine" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_spooling_machine" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_spooling_machine" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_spooling_machine", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_spooling_machine", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_spooling_machine", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_spooling_machine", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/large_spooling_machine", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/large_spooling_machine", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/large_spooling_machine", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/large_spooling_machine", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/larva.json b/src/generated/resources/assets/cosmiccore/blockstates/larva.json new file mode 100644 index 000000000..69eb010f3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/larva.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/larva", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/larva", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/larva", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/larva", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/larva" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/larva" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/larva" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/larva" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/larva", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/larva", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/larva", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/larva", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/larva", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/larva", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/larva", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/larva", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/light_dawnstone_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/light_dawnstone_casing.json new file mode 100644 index 000000000..0f7568e96 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/light_dawnstone_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/light_dawnstone_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/light_ritual_stone.json b/src/generated/resources/assets/cosmiccore/blockstates/light_ritual_stone.json new file mode 100644 index 000000000..02c0290ed --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/light_ritual_stone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/light_ritual_stone" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/link_test_station.json b/src/generated/resources/assets/cosmiccore/blockstates/link_test_station.json new file mode 100644 index 000000000..25e39f304 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/link_test_station.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/link_test_station", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/link_test_station", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/link_test_station", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/link_test_station", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/link_test_station" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/link_test_station" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/link_test_station" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/link_test_station" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/link_test_station", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/link_test_station", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/link_test_station", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/link_test_station", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/link_test_station", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/link_test_station", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/link_test_station", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/link_test_station", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/living_igniclad_coil_block.json b/src/generated/resources/assets/cosmiccore/blockstates/living_igniclad_coil_block.json new file mode 100644 index 000000000..900a20a71 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/living_igniclad_coil_block.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "cosmiccore:block/living_igniclad_coil_block" + }, + "active=true": { + "model": "cosmiccore:block/living_igniclad_coil_block_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/livingrock_tiles.json b/src/generated/resources/assets/cosmiccore/blockstates/livingrock_tiles.json new file mode 100644 index 000000000..2fdb53c4f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/livingrock_tiles.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/livingrock_tiles" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lp_steam_bender.json b/src/generated/resources/assets/cosmiccore/blockstates/lp_steam_bender.json new file mode 100644 index 000000000..a13d45c51 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lp_steam_bender.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/lp_steam_bender", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lp_steam_bender" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lp_steam_bender", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lp_steam_bender", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lp_steam_wiremill.json b/src/generated/resources/assets/cosmiccore/blockstates/lp_steam_wiremill.json new file mode 100644 index 000000000..46269a23e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lp_steam_wiremill.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/lp_steam_wiremill", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lp_steam_wiremill" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lp_steam_wiremill", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lp_steam_wiremill", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ludicrious_intake.json b/src/generated/resources/assets/cosmiccore/blockstates/ludicrious_intake.json new file mode 100644 index 000000000..d15b63886 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ludicrious_intake.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "cosmiccore:block/variant/ludicrious_intake" + }, + "active=true": { + "model": "cosmiccore:block/variant/ludicrious_intake_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ludicrous_combustion_engine_cc.json b/src/generated/resources/assets/cosmiccore/blockstates/ludicrous_combustion_engine_cc.json new file mode 100644 index 000000000..a6a25fab0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ludicrous_combustion_engine_cc.json @@ -0,0 +1,114 @@ +{ + "variants": { + "facing=down,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "x": 90 + }, + "facing=down,upwards_facing=north": { + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "x": 90 + }, + "facing=down,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "x": 90 + }, + "facing=down,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "x": 90 + }, + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "y": 180 + }, + "facing=up,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "x": 270 + }, + "facing=up,upwards_facing=north": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "x": 270 + }, + "facing=up,upwards_facing=south": { + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "x": 270 + }, + "facing=up,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "x": 270 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ludicrous_combustion_engine_cc", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lunar_sheer_hammer.json b/src/generated/resources/assets/cosmiccore/blockstates/lunar_sheer_hammer.json new file mode 100644 index 000000000..09a2c8963 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lunar_sheer_hammer.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/lunar_sheer_hammer", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/lunar_sheer_hammer", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/lunar_sheer_hammer", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/lunar_sheer_hammer", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/lunar_sheer_hammer" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/lunar_sheer_hammer" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/lunar_sheer_hammer" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/lunar_sheer_hammer" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/lunar_sheer_hammer", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/lunar_sheer_hammer", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/lunar_sheer_hammer", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/lunar_sheer_hammer", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/lunar_sheer_hammer", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/lunar_sheer_hammer", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/lunar_sheer_hammer", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/lunar_sheer_hammer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..360ac21ee --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_16a_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/luv_16a_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/luv_16a_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_16a_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_16a_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/luv_16a_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_16a_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..9db95ce4a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_16a_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/luv_16a_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/luv_16a_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_16a_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_16a_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/luv_16a_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_16a_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..9650650ea --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_4a_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/luv_4a_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/luv_4a_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_4a_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_4a_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/luv_4a_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_4a_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..0de0e5b8f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_4a_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/luv_4a_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/luv_4a_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_4a_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_4a_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/luv_4a_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_4a_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_biolab.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_biolab.json new file mode 100644 index 000000000..8f0c5f819 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_biolab.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/luv_biolab", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_biolab" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_biolab", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_biolab", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_calx_reactor.json new file mode 100644 index 000000000..f8b6a5ec2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/luv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_mana_leaching_tub.json new file mode 100644 index 000000000..25d2b0f89 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/luv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_naquahine_mini_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_naquahine_mini_reactor.json new file mode 100644 index 000000000..07daf2f1a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_naquahine_mini_reactor.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/luv_naquahine_mini_reactor", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/luv_naquahine_mini_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_naquahine_mini_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_naquahine_mini_reactor", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/luv_naquahine_mini_reactor", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_naquahine_mini_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_roaster.json new file mode 100644 index 000000000..79e21db3f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/luv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_soul_input_hatch.json new file mode 100644 index 000000000..ad5448ae4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_soul_input_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/luv_soul_input_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/luv_soul_input_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_soul_input_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_soul_input_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/luv_soul_input_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_soul_input_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_soul_output_hatch.json new file mode 100644 index 000000000..4328cb739 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_soul_output_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/luv_soul_output_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/luv_soul_output_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_soul_output_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_soul_output_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/luv_soul_output_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_soul_output_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_thermia_export_hatch.json new file mode 100644 index 000000000..ed28a5b20 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_thermia_export_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/luv_thermia_export_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/luv_thermia_export_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_thermia_export_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_thermia_export_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/luv_thermia_export_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_thermia_export_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_thermia_import_hatch.json new file mode 100644 index 000000000..d2ad9e7ad --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_thermia_import_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/luv_thermia_import_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/luv_thermia_import_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_thermia_import_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_thermia_import_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/luv_thermia_import_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_thermia_import_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_thermomagnitizer.json new file mode 100644 index 000000000..bd86a86be --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/luv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_vacuum_bubbler.json new file mode 100644 index 000000000..aa4aff0d0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/luv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_wireless_charger.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_wireless_charger.json new file mode 100644 index 000000000..6bfd650eb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_wireless_charger.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/luv_wireless_charger", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_wireless_charger" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_wireless_charger", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_wireless_charger", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_wireless_energy_dynamo.json new file mode 100644 index 000000000..215e3181d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/luv_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/luv_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/luv_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/luv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/luv_wireless_energy_hatch.json new file mode 100644 index 000000000..2dfcaab70 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/luv_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/luv_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/luv_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/luv_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/luv_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/luv_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/luv_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_calx_reactor.json new file mode 100644 index 000000000..9d7107fa4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/lv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_energy_output_hatch_16a.json new file mode 100644 index 000000000..6618dda73 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_energy_output_hatch_16a.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_16a", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_16a", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_16a" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_16a", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/lv_energy_output_hatch_16a", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_16a", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_energy_output_hatch_4a.json new file mode 100644 index 000000000..60381d7ec --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_energy_output_hatch_4a.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_4a", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_4a", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_4a" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_4a", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/lv_energy_output_hatch_4a", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lv_energy_output_hatch_4a", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_mana_leaching_tub.json new file mode 100644 index 000000000..dd4def7c4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/lv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_roaster.json new file mode 100644 index 000000000..7dbc7e2d0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/lv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_thermomagnitizer.json new file mode 100644 index 000000000..c35534033 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/lv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/lv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/lv_vacuum_bubbler.json new file mode 100644 index 000000000..68aec3986 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/lv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/lv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/lv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/lv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/lv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/machine_casing_gearbox_naquadria.json b/src/generated/resources/assets/cosmiccore/blockstates/machine_casing_gearbox_naquadria.json new file mode 100644 index 000000000..c1e366546 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/machine_casing_gearbox_naquadria.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/machine_casing_gearbox_naquadria" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/machine_casing_gearbox_pthanterum.json b/src/generated/resources/assets/cosmiccore/blockstates/machine_casing_gearbox_pthanterum.json new file mode 100644 index 000000000..d9f891b67 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/machine_casing_gearbox_pthanterum.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/machine_casing_gearbox_pthanterum" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mana_etching_factory.json b/src/generated/resources/assets/cosmiccore/blockstates/mana_etching_factory.json new file mode 100644 index 000000000..15c1d9568 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mana_etching_factory.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/mana_etching_factory" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/mana_etching_factory" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mana_etching_factory" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/mana_etching_factory" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/mana_etching_factory", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mantle_bore.json b/src/generated/resources/assets/cosmiccore/blockstates/mantle_bore.json new file mode 100644 index 000000000..abd3c8f65 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mantle_bore.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/mantle_bore", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/mantle_bore", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mantle_bore", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/mantle_bore", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/mantle_bore" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/mantle_bore" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mantle_bore" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/mantle_bore" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/mantle_bore", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/mantle_bore", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mantle_bore", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/mantle_bore", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/mantle_bore", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/mantle_bore", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mantle_bore", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/mantle_bore", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/moth_cargo_drop_off.json b/src/generated/resources/assets/cosmiccore/blockstates/moth_cargo_drop_off.json new file mode 100644 index 000000000..a3e5a11d8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/moth_cargo_drop_off.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/moth_cargo_drop_off" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/moth_cargo_drop_off" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/moth_cargo_drop_off" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/moth_cargo_drop_off" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/moth_cargo_drop_off", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/moth_cargo_station.json b/src/generated/resources/assets/cosmiccore/blockstates/moth_cargo_station.json new file mode 100644 index 000000000..9862d9543 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/moth_cargo_station.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/moth_cargo_station" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/moth_cargo_station" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/moth_cargo_station" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/moth_cargo_station" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/moth_cargo_station", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t1.json b/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t1.json new file mode 100644 index 000000000..be5db13cb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t1.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/moth_home_t1" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t2.json b/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t2.json new file mode 100644 index 000000000..882ad3152 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t2.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/moth_home_t2" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t3.json b/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t3.json new file mode 100644 index 000000000..0b8f14236 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t3.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/moth_home_t3" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t4.json b/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t4.json new file mode 100644 index 000000000..68c29d60a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/moth_home_t4.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/moth_home_t4" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/moth_station_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/moth_station_casing.json new file mode 100644 index 000000000..c5eccc13d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/moth_station_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/moth_station_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/multi_purpose_interstellar_grade_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/multi_purpose_interstellar_grade_casing.json new file mode 100644 index 000000000..1dfdaf2c0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/multi_purpose_interstellar_grade_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/multi_purpose_interstellar_grade_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_calx_reactor.json new file mode 100644 index 000000000..9ac8192d0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/mv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/mv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/mv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/mv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_energy_output_hatch_16a.json new file mode 100644 index 000000000..c3aff3955 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_energy_output_hatch_16a.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_16a", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_16a", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_16a" + }, + "facing=south": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_16a", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mv_energy_output_hatch_16a", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_16a", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_energy_output_hatch_4a.json new file mode 100644 index 000000000..dd71a93b2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_energy_output_hatch_4a.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_4a", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_4a", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_4a" + }, + "facing=south": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_4a", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/mv_energy_output_hatch_4a", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/mv_energy_output_hatch_4a", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_mana_leaching_tub.json new file mode 100644 index 000000000..76d28dbe0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/mv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/mv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/mv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/mv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_roaster.json new file mode 100644 index 000000000..8f99093ab --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/mv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/mv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/mv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/mv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_thermomagnitizer.json new file mode 100644 index 000000000..b5402d532 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/mv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/mv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/mv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/mv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/mv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/mv_vacuum_bubbler.json new file mode 100644 index 000000000..28ddd4a95 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/mv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/mv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/mv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/mv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/mv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/naquadah_pressure_resistant_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/naquadah_pressure_resistant_casing.json new file mode 100644 index 000000000..e70c31191 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/naquadah_pressure_resistant_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/naquadah_pressure_resistant_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/naquadric_superalloy_coil_block.json b/src/generated/resources/assets/cosmiccore/blockstates/naquadric_superalloy_coil_block.json new file mode 100644 index 000000000..58a83863d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/naquadric_superalloy_coil_block.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "cosmiccore:block/naquadric_superalloy_coil_block" + }, + "active=true": { + "model": "cosmiccore:block/naquadric_superalloy_coil_block_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/naquahine_pressure_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/naquahine_pressure_reactor.json new file mode 100644 index 000000000..c59f30549 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/naquahine_pressure_reactor.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/naquahine_pressure_reactor", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/naquahine_pressure_reactor", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/naquahine_pressure_reactor", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/naquahine_pressure_reactor", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/naquahine_pressure_reactor" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/naquahine_pressure_reactor" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/naquahine_pressure_reactor" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/naquahine_pressure_reactor" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/naquahine_pressure_reactor", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/naquahine_pressure_reactor", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/naquahine_pressure_reactor", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/naquahine_pressure_reactor", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/naquahine_pressure_reactor", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/naquahine_pressure_reactor", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/naquahine_pressure_reactor", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/naquahine_pressure_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/neutronium_buoy.json b/src/generated/resources/assets/cosmiccore/blockstates/neutronium_buoy.json new file mode 100644 index 000000000..615e5736c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/neutronium_buoy.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/neutronium_buoy" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/oneiric_sieve.json b/src/generated/resources/assets/cosmiccore/blockstates/oneiric_sieve.json new file mode 100644 index 000000000..392d64bb3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/oneiric_sieve.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/oneiric_sieve", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/oneiric_sieve", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/oneiric_sieve", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/oneiric_sieve", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/oneiric_sieve" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/oneiric_sieve" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/oneiric_sieve" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/oneiric_sieve" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/oneiric_sieve", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/oneiric_sieve", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/oneiric_sieve", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/oneiric_sieve", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/oneiric_sieve", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/oneiric_sieve", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/oneiric_sieve", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/oneiric_sieve", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..aac96621f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_16a_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/opv_16a_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/opv_16a_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_16a_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_16a_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/opv_16a_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_16a_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..6e54b9696 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_16a_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/opv_16a_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/opv_16a_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_16a_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_16a_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/opv_16a_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_16a_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..3ba69ff34 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_4a_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/opv_4a_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/opv_4a_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_4a_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_4a_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/opv_4a_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_4a_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..a33834e1e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_4a_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/opv_4a_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/opv_4a_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_4a_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_4a_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/opv_4a_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_4a_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_calx_reactor.json new file mode 100644 index 000000000..441c85c73 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/opv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_mana_leaching_tub.json new file mode 100644 index 000000000..99a1a7433 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/opv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_roaster.json new file mode 100644 index 000000000..3a22b3983 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/opv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_soul_input_hatch.json new file mode 100644 index 000000000..120c6634a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_soul_input_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/opv_soul_input_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/opv_soul_input_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_soul_input_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_soul_input_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/opv_soul_input_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_soul_input_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_soul_output_hatch.json new file mode 100644 index 000000000..30c257202 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_soul_output_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/opv_soul_output_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/opv_soul_output_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_soul_output_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_soul_output_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/opv_soul_output_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_soul_output_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_thermia_export_hatch.json new file mode 100644 index 000000000..baee488c0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_thermia_export_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/opv_thermia_export_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/opv_thermia_export_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_thermia_export_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_thermia_export_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/opv_thermia_export_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_thermia_export_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_thermia_import_hatch.json new file mode 100644 index 000000000..cbfed20af --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_thermia_import_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/opv_thermia_import_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/opv_thermia_import_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_thermia_import_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_thermia_import_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/opv_thermia_import_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_thermia_import_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_thermomagnitizer.json new file mode 100644 index 000000000..eb8ab7acc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/opv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_vacuum_bubbler.json new file mode 100644 index 000000000..9a14a0535 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/opv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_wireless_energy_dynamo.json new file mode 100644 index 000000000..34fddfd30 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/opv_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/opv_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/opv_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/opv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/opv_wireless_energy_hatch.json new file mode 100644 index 000000000..6b3dca9be --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/opv_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/opv_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/opv_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/opv_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/opv_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/opv_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/opv_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/orbital_tempering_forge.json b/src/generated/resources/assets/cosmiccore/blockstates/orbital_tempering_forge.json new file mode 100644 index 000000000..5f70a17df --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/orbital_tempering_forge.json @@ -0,0 +1,114 @@ +{ + "variants": { + "facing=down,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "x": 90 + }, + "facing=down,upwards_facing=north": { + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "x": 90 + }, + "facing=down,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "x": 90 + }, + "facing=down,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "x": 90 + }, + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/orbital_tempering_forge" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/orbital_tempering_forge" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/orbital_tempering_forge" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/orbital_tempering_forge" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "y": 180 + }, + "facing=up,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "x": 270 + }, + "facing=up,upwards_facing=north": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "x": 270 + }, + "facing=up,upwards_facing=south": { + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "x": 270 + }, + "facing=up,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "x": 270 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/orbital_tempering_forge", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ore_extraction_drill_hv.json b/src/generated/resources/assets/cosmiccore/blockstates/ore_extraction_drill_hv.json new file mode 100644 index 000000000..09402f941 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ore_extraction_drill_hv.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ore_extraction_drill_hv", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/ore_extraction_drill_hv", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ore_extraction_drill_hv", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ore_extraction_drill_hv", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ore_extraction_drill_hv" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/ore_extraction_drill_hv" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ore_extraction_drill_hv" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ore_extraction_drill_hv" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ore_extraction_drill_hv", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/ore_extraction_drill_hv", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ore_extraction_drill_hv", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ore_extraction_drill_hv", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ore_extraction_drill_hv", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/ore_extraction_drill_hv", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ore_extraction_drill_hv", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ore_extraction_drill_hv", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ore_extraction_drill_iv.json b/src/generated/resources/assets/cosmiccore/blockstates/ore_extraction_drill_iv.json new file mode 100644 index 000000000..d3542a45b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ore_extraction_drill_iv.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ore_extraction_drill_iv", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/ore_extraction_drill_iv", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ore_extraction_drill_iv", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ore_extraction_drill_iv", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ore_extraction_drill_iv" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/ore_extraction_drill_iv" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ore_extraction_drill_iv" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ore_extraction_drill_iv" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ore_extraction_drill_iv", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/ore_extraction_drill_iv", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ore_extraction_drill_iv", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ore_extraction_drill_iv", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ore_extraction_drill_iv", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/ore_extraction_drill_iv", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ore_extraction_drill_iv", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ore_extraction_drill_iv", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ore_extraction_drill_lv.json b/src/generated/resources/assets/cosmiccore/blockstates/ore_extraction_drill_lv.json new file mode 100644 index 000000000..5a639d098 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ore_extraction_drill_lv.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ore_extraction_drill_lv", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/ore_extraction_drill_lv", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ore_extraction_drill_lv", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ore_extraction_drill_lv", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ore_extraction_drill_lv" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/ore_extraction_drill_lv" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ore_extraction_drill_lv" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ore_extraction_drill_lv" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ore_extraction_drill_lv", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/ore_extraction_drill_lv", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ore_extraction_drill_lv", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ore_extraction_drill_lv", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ore_extraction_drill_lv", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/ore_extraction_drill_lv", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ore_extraction_drill_lv", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ore_extraction_drill_lv", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ore_extraction_drill_zpm.json b/src/generated/resources/assets/cosmiccore/blockstates/ore_extraction_drill_zpm.json new file mode 100644 index 000000000..e1ee75658 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ore_extraction_drill_zpm.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ore_extraction_drill_zpm", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/ore_extraction_drill_zpm", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ore_extraction_drill_zpm", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ore_extraction_drill_zpm", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ore_extraction_drill_zpm" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/ore_extraction_drill_zpm" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ore_extraction_drill_zpm" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ore_extraction_drill_zpm" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ore_extraction_drill_zpm", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/ore_extraction_drill_zpm", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ore_extraction_drill_zpm", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ore_extraction_drill_zpm", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ore_extraction_drill_zpm", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/ore_extraction_drill_zpm", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ore_extraction_drill_zpm", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ore_extraction_drill_zpm", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/oscillating_gilded_pthanterum_casings.json b/src/generated/resources/assets/cosmiccore/blockstates/oscillating_gilded_pthanterum_casings.json new file mode 100644 index 000000000..7da90a149 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/oscillating_gilded_pthanterum_casings.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/oscillating_gilded_pthanterum_casings" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/pcb_foundry.json b/src/generated/resources/assets/cosmiccore/blockstates/pcb_foundry.json new file mode 100644 index 000000000..e22c3cacd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/pcb_foundry.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/pcb_foundry", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/pcb_foundry", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/pcb_foundry", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/pcb_foundry", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/pcb_foundry" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/pcb_foundry" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/pcb_foundry" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/pcb_foundry" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/pcb_foundry", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/pcb_foundry", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/pcb_foundry", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/pcb_foundry", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/pcb_foundry", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/pcb_foundry", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/pcb_foundry", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/pcb_foundry", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/plasmite_distillery.json b/src/generated/resources/assets/cosmiccore/blockstates/plasmite_distillery.json new file mode 100644 index 000000000..82e6b858d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/plasmite_distillery.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/plasmite_distillery", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/plasmite_distillery", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/plasmite_distillery", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/plasmite_distillery", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/plasmite_distillery" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/plasmite_distillery" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/plasmite_distillery" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/plasmite_distillery" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/plasmite_distillery", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/plasmite_distillery", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/plasmite_distillery", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/plasmite_distillery", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/plasmite_distillery", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/plasmite_distillery", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/plasmite_distillery", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/plasmite_distillery", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/plated_aerocloud.json b/src/generated/resources/assets/cosmiccore/blockstates/plated_aerocloud.json new file mode 100644 index 000000000..fb5921662 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/plated_aerocloud.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/plated_aerocloud" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/polymerizer.json b/src/generated/resources/assets/cosmiccore/blockstates/polymerizer.json new file mode 100644 index 000000000..251d04d3a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/polymerizer.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/polymerizer", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/polymerizer", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/polymerizer", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/polymerizer", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/polymerizer" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/polymerizer" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/polymerizer" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/polymerizer" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/polymerizer", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/polymerizer", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/polymerizer", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/polymerizer", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/polymerizer", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/polymerizer", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/polymerizer", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/polymerizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/pressure_containment_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/pressure_containment_casing.json new file mode 100644 index 000000000..21e590d45 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/pressure_containment_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/pressure_containment_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/prismatic_ore_foundry.json b/src/generated/resources/assets/cosmiccore/blockstates/prismatic_ore_foundry.json new file mode 100644 index 000000000..8ded7c107 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/prismatic_ore_foundry.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/prismatic_ore_foundry", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/prismatic_ore_foundry", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/prismatic_ore_foundry", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/prismatic_ore_foundry", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/prismatic_ore_foundry" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/prismatic_ore_foundry" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/prismatic_ore_foundry" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/prismatic_ore_foundry" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/prismatic_ore_foundry", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/prismatic_ore_foundry", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/prismatic_ore_foundry", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/prismatic_ore_foundry", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/prismatic_ore_foundry", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/prismatic_ore_foundry", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/prismatic_ore_foundry", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/prismatic_ore_foundry", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/prismatic_tungstensteel_coil_block.json b/src/generated/resources/assets/cosmiccore/blockstates/prismatic_tungstensteel_coil_block.json new file mode 100644 index 000000000..2ab729998 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/prismatic_tungstensteel_coil_block.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "cosmiccore:block/prismatic_tungstensteel_coil_block" + }, + "active=true": { + "model": "cosmiccore:block/prismatic_tungstensteel_coil_block_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/programable_matter_coil_block.json b/src/generated/resources/assets/cosmiccore/blockstates/programable_matter_coil_block.json new file mode 100644 index 000000000..22d1387c9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/programable_matter_coil_block.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "cosmiccore:block/programable_matter_coil_block" + }, + "active=true": { + "model": "cosmiccore:block/programable_matter_coil_block_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/psionic_galvorn_coil_block.json b/src/generated/resources/assets/cosmiccore/blockstates/psionic_galvorn_coil_block.json new file mode 100644 index 000000000..d4fb4c57f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/psionic_galvorn_coil_block.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "cosmiccore:block/psionic_galvorn_coil_block" + }, + "active=true": { + "model": "cosmiccore:block/psionic_galvorn_coil_block_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/pthanterum_wave_breakers.json b/src/generated/resources/assets/cosmiccore/blockstates/pthanterum_wave_breakers.json new file mode 100644 index 000000000..cef58bd59 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/pthanterum_wave_breakers.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/pthanterum_wave_breakers" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/pyrothermic_refinery.json b/src/generated/resources/assets/cosmiccore/blockstates/pyrothermic_refinery.json new file mode 100644 index 000000000..59cd3f3c6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/pyrothermic_refinery.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/pyrothermic_refinery" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/pyrothermic_refinery" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/pyrothermic_refinery" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/pyrothermic_refinery" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/pyrothermic_refinery", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/radioactive_filter_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/radioactive_filter_casing.json new file mode 100644 index 000000000..282b377b9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/radioactive_filter_casing.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "cosmiccore:block/variant/radioactive_filter_casing" + }, + "active=true": { + "model": "cosmiccore:block/variant/radioactive_filter_casing_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/reflective_starmetal_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/reflective_starmetal_casing.json new file mode 100644 index 000000000..5365eb2d3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/reflective_starmetal_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/reflective_starmetal_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/reinforced_dawnstone_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/reinforced_dawnstone_casing.json new file mode 100644 index 000000000..8825e9468 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/reinforced_dawnstone_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/reinforced_dawnstone_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/reinforced_naquadria_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/reinforced_naquadria_casing.json new file mode 100644 index 000000000..81195105e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/reinforced_naquadria_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/reinforced_naquadria_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/reinforced_trinavine_coil_block.json b/src/generated/resources/assets/cosmiccore/blockstates/reinforced_trinavine_coil_block.json new file mode 100644 index 000000000..7909b271a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/reinforced_trinavine_coil_block.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "cosmiccore:block/reinforced_trinavine_coil_block" + }, + "active=true": { + "model": "cosmiccore:block/reinforced_trinavine_coil_block_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/resonant_virtue_meld_coil_block.json b/src/generated/resources/assets/cosmiccore/blockstates/resonant_virtue_meld_coil_block.json new file mode 100644 index 000000000..f754f002f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/resonant_virtue_meld_coil_block.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "cosmiccore:block/resonant_virtue_meld_coil_block" + }, + "active=true": { + "model": "cosmiccore:block/resonant_virtue_meld_coil_block_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/resonantly_tuned_virtue_meld_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/resonantly_tuned_virtue_meld_casing.json new file mode 100644 index 000000000..d3f8fedbc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/resonantly_tuned_virtue_meld_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/resonantly_tuned_virtue_meld_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/rigid_high_speed_steel_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/rigid_high_speed_steel_casing.json new file mode 100644 index 000000000..be289b0a2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/rigid_high_speed_steel_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/rigid_high_speed_steel_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ritual_stone.json b/src/generated/resources/assets/cosmiccore/blockstates/ritual_stone.json new file mode 100644 index 000000000..9fb94f0f5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ritual_stone.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/ritual_stone" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/royal_ichorium_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/royal_ichorium_casing.json new file mode 100644 index 000000000..3694441fa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/royal_ichorium_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/royal_ichorium_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/rust_stained_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/rust_stained_casing.json new file mode 100644 index 000000000..56600c992 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/rust_stained_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/rust_stained_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/rust_weave_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/rust_weave_casing.json new file mode 100644 index 000000000..758297bf5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/rust_weave_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/rust_weave_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/self_healing_pthanterum_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/self_healing_pthanterum_casing.json new file mode 100644 index 000000000..506215617 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/self_healing_pthanterum_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/self_healing_pthanterum_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/sensor_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/sensor_hatch.json new file mode 100644 index 000000000..39929946b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/sensor_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/sensor_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/sensor_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/sensor_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/sensor_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/sensor_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/sensor_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/shimmering_neutronium_coil_block.json b/src/generated/resources/assets/cosmiccore/blockstates/shimmering_neutronium_coil_block.json new file mode 100644 index 000000000..f27bdeed4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/shimmering_neutronium_coil_block.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "cosmiccore:block/shimmering_neutronium_coil_block" + }, + "active=true": { + "model": "cosmiccore:block/shimmering_neutronium_coil_block_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/somarust_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/somarust_casing.json new file mode 100644 index 000000000..124c221ae --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/somarust_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/somarust_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/soul_muted_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/soul_muted_casing.json new file mode 100644 index 000000000..7e5e916d4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/soul_muted_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/soul_muted_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/soul_stained_steel_aluminium_plated_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/soul_stained_steel_aluminium_plated_casing.json new file mode 100644 index 000000000..caf68f4a1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/soul_stained_steel_aluminium_plated_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/soul_stained_steel_aluminium_plated_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/soul_tester.json b/src/generated/resources/assets/cosmiccore/blockstates/soul_tester.json new file mode 100644 index 000000000..175acbd39 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/soul_tester.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/soul_tester", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/soul_tester", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/soul_tester", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/soul_tester", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/soul_tester" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/soul_tester" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/soul_tester" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/soul_tester" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/soul_tester", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/soul_tester", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/soul_tester", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/soul_tester", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/soul_tester", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/soul_tester", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/soul_tester", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/soul_tester", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/spirit_crucible.json b/src/generated/resources/assets/cosmiccore/blockstates/spirit_crucible.json new file mode 100644 index 000000000..5fa13e18f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/spirit_crucible.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/spirit_crucible", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/spirit_crucible", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/spirit_crucible", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/spirit_crucible", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/spirit_crucible" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/spirit_crucible" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/spirit_crucible" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/spirit_crucible" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/spirit_crucible", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/spirit_crucible", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/spirit_crucible", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/spirit_crucible", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/spirit_crucible", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/spirit_crucible", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/spirit_crucible", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/spirit_crucible", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/star_ladder.json b/src/generated/resources/assets/cosmiccore/blockstates/star_ladder.json new file mode 100644 index 000000000..23550593b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/star_ladder.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/star_ladder", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/star_ladder", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/star_ladder", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/star_ladder", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/star_ladder" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/star_ladder" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/star_ladder" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/star_ladder" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/star_ladder", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/star_ladder", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/star_ladder", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/star_ladder", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/star_ladder", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/star_ladder", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/star_ladder", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/star_ladder", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/star_ladder_research_hub.json b/src/generated/resources/assets/cosmiccore/blockstates/star_ladder_research_hub.json new file mode 100644 index 000000000..515fbd5ec --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/star_ladder_research_hub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/star_ladder_research_hub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/star_ladder_research_hub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/star_ladder_research_hub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/star_ladder_research_hub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/steam_caster.json b/src/generated/resources/assets/cosmiccore/blockstates/steam_caster.json new file mode 100644 index 000000000..192c14a1f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/steam_caster.json @@ -0,0 +1,114 @@ +{ + "variants": { + "facing=down,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/steam_caster", + "x": 90 + }, + "facing=down,upwards_facing=north": { + "model": "cosmiccore:block/machine/steam_caster", + "x": 90 + }, + "facing=down,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_caster", + "x": 90 + }, + "facing=down,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/steam_caster", + "x": 90 + }, + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/steam_caster", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/steam_caster", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_caster", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/steam_caster", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/steam_caster" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/steam_caster" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_caster" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/steam_caster" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/steam_caster", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/steam_caster", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_caster", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/steam_caster", + "y": 180 + }, + "facing=up,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/steam_caster", + "x": 270 + }, + "facing=up,upwards_facing=north": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_caster", + "x": 270 + }, + "facing=up,upwards_facing=south": { + "model": "cosmiccore:block/machine/steam_caster", + "x": 270 + }, + "facing=up,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/steam_caster", + "x": 270 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/steam_caster", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/steam_caster", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_caster", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/steam_caster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/steam_fluid_input_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/steam_fluid_input_hatch.json new file mode 100644 index 000000000..dca80ae6f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/steam_fluid_input_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/steam_fluid_input_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/steam_fluid_input_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/steam_fluid_input_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/steam_fluid_input_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_fluid_input_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/steam_fluid_input_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/steam_fluid_output_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/steam_fluid_output_hatch.json new file mode 100644 index 000000000..521bd1cd2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/steam_fluid_output_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/steam_fluid_output_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/steam_fluid_output_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/steam_fluid_output_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/steam_fluid_output_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_fluid_output_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/steam_fluid_output_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/steam_large_turbine.json b/src/generated/resources/assets/cosmiccore/blockstates/steam_large_turbine.json new file mode 100644 index 000000000..50b73004f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/steam_large_turbine.json @@ -0,0 +1,114 @@ +{ + "variants": { + "facing=down,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/steam_large_turbine", + "x": 90 + }, + "facing=down,upwards_facing=north": { + "model": "cosmiccore:block/machine/steam_large_turbine", + "x": 90 + }, + "facing=down,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_large_turbine", + "x": 90 + }, + "facing=down,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/steam_large_turbine", + "x": 90 + }, + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/steam_large_turbine", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/steam_large_turbine", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_large_turbine", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/steam_large_turbine", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/steam_large_turbine" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/steam_large_turbine" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_large_turbine" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/steam_large_turbine" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/steam_large_turbine", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/steam_large_turbine", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_large_turbine", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/steam_large_turbine", + "y": 180 + }, + "facing=up,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/steam_large_turbine", + "x": 270 + }, + "facing=up,upwards_facing=north": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_large_turbine", + "x": 270 + }, + "facing=up,upwards_facing=south": { + "model": "cosmiccore:block/machine/steam_large_turbine", + "x": 270 + }, + "facing=up,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/steam_large_turbine", + "x": 270 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/steam_large_turbine", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/steam_large_turbine", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_large_turbine", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/steam_large_turbine", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/steam_mixing_vessel.json b/src/generated/resources/assets/cosmiccore/blockstates/steam_mixing_vessel.json new file mode 100644 index 000000000..cd401b0df --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/steam_mixing_vessel.json @@ -0,0 +1,114 @@ +{ + "variants": { + "facing=down,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "x": 90 + }, + "facing=down,upwards_facing=north": { + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "x": 90 + }, + "facing=down,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "x": 90 + }, + "facing=down,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "x": 90 + }, + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/steam_mixing_vessel" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/steam_mixing_vessel" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_mixing_vessel" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/steam_mixing_vessel" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "y": 180 + }, + "facing=up,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "x": 270 + }, + "facing=up,upwards_facing=north": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "x": 270 + }, + "facing=up,upwards_facing=south": { + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "x": 270 + }, + "facing=up,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "x": 270 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/steam_mixing_vessel", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/steel_plated_bronze_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/steel_plated_bronze_casing.json new file mode 100644 index 000000000..7e6e9481f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/steel_plated_bronze_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/steel_plated_bronze_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_lantern.json b/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_lantern.json new file mode 100644 index 000000000..d3076ee7e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_lantern.json @@ -0,0 +1,16 @@ +{ + "variants": { + "hanging=false,waterlogged=false": { + "model": "cosmiccore:block/steel_rose_lantern" + }, + "hanging=false,waterlogged=true": { + "model": "cosmiccore:block/steel_rose_lantern" + }, + "hanging=true,waterlogged=false": { + "model": "cosmiccore:block/steel_rose_lantern_hanging" + }, + "hanging=true,waterlogged=true": { + "model": "cosmiccore:block/steel_rose_lantern_hanging" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_light.json b/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_light.json new file mode 100644 index 000000000..79c060668 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_light.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/steel_rose_light" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_light_slab.json b/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_light_slab.json new file mode 100644 index 000000000..f151a2368 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_light_slab.json @@ -0,0 +1,13 @@ +{ + "variants": { + "type=bottom": { + "model": "cosmiccore:block/steel_rose_light_slab" + }, + "type=double": { + "model": "cosmiccore:block/steel_rose_light" + }, + "type=top": { + "model": "cosmiccore:block/steel_rose_light_slab_top" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_light_stairs.json b/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_light_stairs.json new file mode 100644 index 000000000..11e9231eb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/steel_rose_light_stairs.json @@ -0,0 +1,209 @@ +{ + "variants": { + "facing=east,half=bottom,shape=inner_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=inner_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner" + }, + "facing=east,half=bottom,shape=outer_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=east,half=bottom,shape=outer_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer" + }, + "facing=east,half=bottom,shape=straight": { + "model": "cosmiccore:block/steel_rose_light_stairs" + }, + "facing=east,half=top,shape=inner_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=inner_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=outer_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=east,half=top,shape=outer_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=east,half=top,shape=straight": { + "model": "cosmiccore:block/steel_rose_light_stairs", + "uvlock": true, + "x": 180 + }, + "facing=north,half=bottom,shape=inner_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=inner_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=outer_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=north,half=bottom,shape=outer_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "y": 270 + }, + "facing=north,half=bottom,shape=straight": { + "model": "cosmiccore:block/steel_rose_light_stairs", + "uvlock": true, + "y": 270 + }, + "facing=north,half=top,shape=inner_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=inner_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=outer_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=north,half=top,shape=outer_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "x": 180 + }, + "facing=north,half=top,shape=straight": { + "model": "cosmiccore:block/steel_rose_light_stairs", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=south,half=bottom,shape=inner_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner" + }, + "facing=south,half=bottom,shape=inner_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=outer_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer" + }, + "facing=south,half=bottom,shape=outer_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=south,half=bottom,shape=straight": { + "model": "cosmiccore:block/steel_rose_light_stairs", + "uvlock": true, + "y": 90 + }, + "facing=south,half=top,shape=inner_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=inner_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=outer_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=south,half=top,shape=outer_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=south,half=top,shape=straight": { + "model": "cosmiccore:block/steel_rose_light_stairs", + "uvlock": true, + "x": 180, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=inner_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=outer_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "y": 90 + }, + "facing=west,half=bottom,shape=outer_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "y": 180 + }, + "facing=west,half=bottom,shape=straight": { + "model": "cosmiccore:block/steel_rose_light_stairs", + "uvlock": true, + "y": 180 + }, + "facing=west,half=top,shape=inner_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=inner_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_inner", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=outer_left": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "x": 180, + "y": 180 + }, + "facing=west,half=top,shape=outer_right": { + "model": "cosmiccore:block/steel_rose_light_stairs_outer", + "uvlock": true, + "x": 180, + "y": 270 + }, + "facing=west,half=top,shape=straight": { + "model": "cosmiccore:block/steel_rose_light_stairs", + "uvlock": true, + "x": 180, + "y": 180 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/stellar_iris.json b/src/generated/resources/assets/cosmiccore/blockstates/stellar_iris.json new file mode 100644 index 000000000..0b65ab202 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/stellar_iris.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/stellar_iris", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/stellar_iris", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/stellar_iris", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/stellar_iris", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/stellar_iris" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/stellar_iris" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/stellar_iris" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/stellar_iris" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/stellar_iris", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/stellar_iris", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/stellar_iris", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/stellar_iris", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/stellar_iris", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/stellar_iris", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/stellar_iris", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/stellar_iris", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/stellar_neutronium_grade_magnet.json b/src/generated/resources/assets/cosmiccore/blockstates/stellar_neutronium_grade_magnet.json new file mode 100644 index 000000000..0be9f627f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/stellar_neutronium_grade_magnet.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "cosmiccore:block/stellar_neutronium_grade_magnet" + }, + "active=true": { + "model": "cosmiccore:block/stellar_neutronium_grade_magnet_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/stellar_smelting_module.json b/src/generated/resources/assets/cosmiccore/blockstates/stellar_smelting_module.json new file mode 100644 index 000000000..a3ecda81c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/stellar_smelting_module.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/stellar_smelting_module" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/stellar_smelting_module" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/stellar_smelting_module" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/stellar_smelting_module" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/stellar_smelting_module", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/sterilization_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/sterilization_hatch.json new file mode 100644 index 000000000..4d4407a69 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/sterilization_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/sterilization_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/sterilization_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/sterilization_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/sterilization_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/sterilization_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/sterilization_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/submerged_welder.json b/src/generated/resources/assets/cosmiccore/blockstates/submerged_welder.json new file mode 100644 index 000000000..7ffd42c80 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/submerged_welder.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/submerged_welder", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/submerged_welder", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/submerged_welder", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/submerged_welder", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/submerged_welder" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/submerged_welder" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/submerged_welder" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/submerged_welder" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/submerged_welder", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/submerged_welder", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/submerged_welder", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/submerged_welder", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/submerged_welder", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/submerged_welder", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/submerged_welder", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/submerged_welder", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/suffering_chamber.json b/src/generated/resources/assets/cosmiccore/blockstates/suffering_chamber.json new file mode 100644 index 000000000..bc88a4380 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/suffering_chamber.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/suffering_chamber", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/suffering_chamber", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/suffering_chamber", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/suffering_chamber", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/suffering_chamber" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/suffering_chamber" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/suffering_chamber" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/suffering_chamber" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/suffering_chamber", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/suffering_chamber", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/suffering_chamber", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/suffering_chamber", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/suffering_chamber", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/suffering_chamber", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/suffering_chamber", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/suffering_chamber", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/superheavy_steel_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/superheavy_steel_casing.json new file mode 100644 index 000000000..b297ec57d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/superheavy_steel_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/superheavy_steel_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/titan_fusion_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/titan_fusion_reactor.json new file mode 100644 index 000000000..2e7541208 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/titan_fusion_reactor.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/titan_fusion_reactor", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/titan_fusion_reactor", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/titan_fusion_reactor", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/titan_fusion_reactor", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/titan_fusion_reactor" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/titan_fusion_reactor" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/titan_fusion_reactor" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/titan_fusion_reactor" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/titan_fusion_reactor", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/titan_fusion_reactor", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/titan_fusion_reactor", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/titan_fusion_reactor", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/titan_fusion_reactor", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/titan_fusion_reactor", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/titan_fusion_reactor", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/titan_fusion_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/tritanium_lined_heavy_neutronium_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/tritanium_lined_heavy_neutronium_casing.json new file mode 100644 index 000000000..5c56467b9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/tritanium_lined_heavy_neutronium_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/tritanium_lined_heavy_neutronium_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..c552321df --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_16a_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uev_16a_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uev_16a_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_16a_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_16a_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uev_16a_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_16a_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..c1a55e234 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_16a_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uev_16a_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uev_16a_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_16a_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_16a_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uev_16a_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_16a_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..3c6c9f4fa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_4a_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uev_4a_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uev_4a_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_4a_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_4a_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uev_4a_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_4a_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..fee9685d8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_4a_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uev_4a_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uev_4a_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_4a_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_4a_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uev_4a_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_4a_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_calx_reactor.json new file mode 100644 index 000000000..6678fc3a3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uev_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_cosmic_parallel_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_cosmic_parallel_hatch.json new file mode 100644 index 000000000..7e5dde949 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_cosmic_parallel_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uev_cosmic_parallel_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uev_cosmic_parallel_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_cosmic_parallel_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_cosmic_parallel_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uev_cosmic_parallel_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_cosmic_parallel_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_mana_leaching_tub.json new file mode 100644 index 000000000..593da5586 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uev_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_module_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_module_hatch.json new file mode 100644 index 000000000..9763fcd50 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_module_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uev_module_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uev_module_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_module_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_module_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uev_module_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_module_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_roaster.json new file mode 100644 index 000000000..280f78bfd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uev_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_soul_input_hatch.json new file mode 100644 index 000000000..7e2cefb88 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_soul_input_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uev_soul_input_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uev_soul_input_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_soul_input_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_soul_input_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uev_soul_input_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_soul_input_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_soul_output_hatch.json new file mode 100644 index 000000000..8857e1550 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_soul_output_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uev_soul_output_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uev_soul_output_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_soul_output_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_soul_output_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uev_soul_output_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_soul_output_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_thermia_export_hatch.json new file mode 100644 index 000000000..b8cb270ff --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_thermia_export_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uev_thermia_export_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uev_thermia_export_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_thermia_export_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_thermia_export_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uev_thermia_export_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_thermia_export_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_thermia_import_hatch.json new file mode 100644 index 000000000..05e5da6f2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_thermia_import_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uev_thermia_import_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uev_thermia_import_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_thermia_import_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_thermia_import_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uev_thermia_import_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_thermia_import_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_thermomagnitizer.json new file mode 100644 index 000000000..438af382b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uev_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_vacuum_bubbler.json new file mode 100644 index 000000000..6bca20935 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uev_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_wireless_charger.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_wireless_charger.json new file mode 100644 index 000000000..6345cccd5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_wireless_charger.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uev_wireless_charger", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_wireless_charger" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_wireless_charger", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_wireless_charger", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_wireless_energy_dynamo.json new file mode 100644 index 000000000..54285bd6b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uev_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uev_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uev_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uev_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uev_wireless_energy_hatch.json new file mode 100644 index 000000000..0b7083493 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uev_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uev_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uev_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uev_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uev_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uev_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uev_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..f93cb9c5b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_16a_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uhv_16a_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uhv_16a_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_16a_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_16a_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uhv_16a_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_16a_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..112b27b5c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_16a_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uhv_16a_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uhv_16a_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_16a_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_16a_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uhv_16a_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_16a_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..1b825fcb2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_4a_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uhv_4a_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uhv_4a_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_4a_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_4a_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uhv_4a_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_4a_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..e20f7a445 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_4a_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uhv_4a_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uhv_4a_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_4a_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_4a_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uhv_4a_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_4a_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_calx_reactor.json new file mode 100644 index 000000000..8ff12783a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uhv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_cosmic_parallel_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_cosmic_parallel_hatch.json new file mode 100644 index 000000000..d1201d00a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_cosmic_parallel_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uhv_cosmic_parallel_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uhv_cosmic_parallel_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_cosmic_parallel_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_cosmic_parallel_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uhv_cosmic_parallel_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_cosmic_parallel_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_mana_leaching_tub.json new file mode 100644 index 000000000..5b9a56d57 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uhv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_module_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_module_hatch.json new file mode 100644 index 000000000..ccebd1fce --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_module_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uhv_module_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uhv_module_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_module_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_module_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uhv_module_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_module_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_naquahine_mini_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_naquahine_mini_reactor.json new file mode 100644 index 000000000..761c16bbd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_naquahine_mini_reactor.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uhv_naquahine_mini_reactor", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uhv_naquahine_mini_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_naquahine_mini_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_naquahine_mini_reactor", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uhv_naquahine_mini_reactor", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_naquahine_mini_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_roaster.json new file mode 100644 index 000000000..146b02248 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uhv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_soul_input_hatch.json new file mode 100644 index 000000000..69e91260a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_soul_input_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uhv_soul_input_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uhv_soul_input_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_soul_input_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_soul_input_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uhv_soul_input_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_soul_input_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_soul_output_hatch.json new file mode 100644 index 000000000..cd780259a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_soul_output_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uhv_soul_output_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uhv_soul_output_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_soul_output_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_soul_output_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uhv_soul_output_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_soul_output_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_thermia_export_hatch.json new file mode 100644 index 000000000..2b754007e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_thermia_export_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uhv_thermia_export_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uhv_thermia_export_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_thermia_export_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_thermia_export_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uhv_thermia_export_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_thermia_export_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_thermia_import_hatch.json new file mode 100644 index 000000000..9ffcb5095 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_thermia_import_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uhv_thermia_import_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uhv_thermia_import_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_thermia_import_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_thermia_import_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uhv_thermia_import_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_thermia_import_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_thermomagnitizer.json new file mode 100644 index 000000000..f447e59d7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uhv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_vacuum_bubbler.json new file mode 100644 index 000000000..6b78cbcc6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uhv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_wireless_charger.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_wireless_charger.json new file mode 100644 index 000000000..2289fe31f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_wireless_charger.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uhv_wireless_charger", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_wireless_charger" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_wireless_charger", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_wireless_charger", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_wireless_energy_dynamo.json new file mode 100644 index 000000000..95111e96b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uhv_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uhv_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uhv_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uhv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uhv_wireless_energy_hatch.json new file mode 100644 index 000000000..98577759b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uhv_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uhv_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uhv_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uhv_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uhv_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uhv_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uhv_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..c3bdb5b5f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_16a_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uiv_16a_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uiv_16a_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_16a_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_16a_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uiv_16a_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_16a_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..a21471b9d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_16a_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uiv_16a_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uiv_16a_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_16a_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_16a_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uiv_16a_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_16a_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..fda12eb8f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_4a_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uiv_4a_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uiv_4a_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_4a_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_4a_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uiv_4a_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_4a_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..48b7878b9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_4a_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uiv_4a_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uiv_4a_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_4a_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_4a_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uiv_4a_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_4a_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_calx_reactor.json new file mode 100644 index 000000000..6659e3e16 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uiv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_cosmic_parallel_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_cosmic_parallel_hatch.json new file mode 100644 index 000000000..e5be3d87d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_cosmic_parallel_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uiv_cosmic_parallel_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uiv_cosmic_parallel_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_cosmic_parallel_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_cosmic_parallel_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uiv_cosmic_parallel_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_cosmic_parallel_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_mana_leaching_tub.json new file mode 100644 index 000000000..136b60da7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uiv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_roaster.json new file mode 100644 index 000000000..48db29af9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uiv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_soul_input_hatch.json new file mode 100644 index 000000000..8aea085de --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_soul_input_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uiv_soul_input_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uiv_soul_input_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_soul_input_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_soul_input_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uiv_soul_input_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_soul_input_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_soul_output_hatch.json new file mode 100644 index 000000000..a0af9fb88 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_soul_output_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uiv_soul_output_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uiv_soul_output_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_soul_output_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_soul_output_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uiv_soul_output_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_soul_output_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_thermia_export_hatch.json new file mode 100644 index 000000000..45b84cccb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_thermia_export_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uiv_thermia_export_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uiv_thermia_export_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_thermia_export_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_thermia_export_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uiv_thermia_export_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_thermia_export_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_thermia_import_hatch.json new file mode 100644 index 000000000..e5683145b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_thermia_import_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uiv_thermia_import_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uiv_thermia_import_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_thermia_import_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_thermia_import_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uiv_thermia_import_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_thermia_import_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_thermomagnitizer.json new file mode 100644 index 000000000..c50ffabb0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uiv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_vacuum_bubbler.json new file mode 100644 index 000000000..5ccb0e8dc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uiv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_wireless_charger.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_wireless_charger.json new file mode 100644 index 000000000..53d9c5592 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_wireless_charger.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uiv_wireless_charger", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_wireless_charger" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_wireless_charger", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_wireless_charger", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_wireless_energy_dynamo.json new file mode 100644 index 000000000..37212c424 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uiv_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uiv_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uiv_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uiv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uiv_wireless_energy_hatch.json new file mode 100644 index 000000000..2b7e99223 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uiv_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uiv_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uiv_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uiv_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uiv_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uiv_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uiv_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ultimate_combustion_engine_cc.json b/src/generated/resources/assets/cosmiccore/blockstates/ultimate_combustion_engine_cc.json new file mode 100644 index 000000000..0e55aba0a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ultimate_combustion_engine_cc.json @@ -0,0 +1,114 @@ +{ + "variants": { + "facing=down,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "x": 90 + }, + "facing=down,upwards_facing=north": { + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "x": 90 + }, + "facing=down,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "x": 90 + }, + "facing=down,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "x": 90 + }, + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "y": 180 + }, + "facing=up,upwards_facing=east": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "x": 270 + }, + "facing=up,upwards_facing=north": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "x": 270 + }, + "facing=up,upwards_facing=south": { + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "x": 270 + }, + "facing=up,upwards_facing=west": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "x": 270 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/ultimate_combustion_engine_cc", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ultimate_intake.json b/src/generated/resources/assets/cosmiccore/blockstates/ultimate_intake.json new file mode 100644 index 000000000..279f67af8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ultimate_intake.json @@ -0,0 +1,10 @@ +{ + "variants": { + "active=false": { + "model": "cosmiccore:block/variant/ultimate_intake" + }, + "active=true": { + "model": "cosmiccore:block/variant/ultimate_intake_active" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ultra_powered_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/ultra_powered_casing.json new file mode 100644 index 000000000..dbe0a197a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ultra_powered_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/ultra_powered_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ulv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/blockstates/ulv_energy_output_hatch_16a.json new file mode 100644 index 000000000..394e43f36 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ulv_energy_output_hatch_16a.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_16a", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_16a", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_16a" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_16a", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_16a", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_16a", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/ulv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/blockstates/ulv_energy_output_hatch_4a.json new file mode 100644 index 000000000..f1dc495dd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/ulv_energy_output_hatch_4a.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_4a", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_4a", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_4a" + }, + "facing=south": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_4a", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_4a", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/ulv_energy_output_hatch_4a", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..46a50637f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_16a_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uv_16a_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uv_16a_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_16a_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_16a_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uv_16a_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_16a_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..34af079ed --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_16a_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uv_16a_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uv_16a_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_16a_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_16a_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uv_16a_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_16a_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..44a7ac3eb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_4a_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uv_4a_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uv_4a_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_4a_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_4a_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uv_4a_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_4a_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..c8c6c994f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_4a_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uv_4a_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uv_4a_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_4a_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_4a_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uv_4a_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_4a_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_biolab.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_biolab.json new file mode 100644 index 000000000..c0de8bbf4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_biolab.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uv_biolab", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_biolab" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_biolab", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_biolab", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_calx_reactor.json new file mode 100644 index 000000000..6193752ff --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_cosmic_parallel_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_cosmic_parallel_hatch.json new file mode 100644 index 000000000..95ac42212 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_cosmic_parallel_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uv_cosmic_parallel_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uv_cosmic_parallel_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_cosmic_parallel_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_cosmic_parallel_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uv_cosmic_parallel_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_cosmic_parallel_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_mana_leaching_tub.json new file mode 100644 index 000000000..08a8fed54 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_module_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_module_hatch.json new file mode 100644 index 000000000..f533671c0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_module_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uv_module_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uv_module_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_module_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_module_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uv_module_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_module_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_naquahine_mini_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_naquahine_mini_reactor.json new file mode 100644 index 000000000..1971a12b9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_naquahine_mini_reactor.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uv_naquahine_mini_reactor", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uv_naquahine_mini_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_naquahine_mini_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_naquahine_mini_reactor", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uv_naquahine_mini_reactor", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_naquahine_mini_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_roaster.json new file mode 100644 index 000000000..31279528c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_soul_input_hatch.json new file mode 100644 index 000000000..3f77a1d99 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_soul_input_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uv_soul_input_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uv_soul_input_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_soul_input_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_soul_input_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uv_soul_input_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_soul_input_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_soul_output_hatch.json new file mode 100644 index 000000000..5daeef658 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_soul_output_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uv_soul_output_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uv_soul_output_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_soul_output_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_soul_output_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uv_soul_output_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_soul_output_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_thermia_export_hatch.json new file mode 100644 index 000000000..62915233d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_thermia_export_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uv_thermia_export_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uv_thermia_export_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_thermia_export_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_thermia_export_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uv_thermia_export_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_thermia_export_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_thermia_import_hatch.json new file mode 100644 index 000000000..8504a94e8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_thermia_import_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uv_thermia_import_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uv_thermia_import_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_thermia_import_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_thermia_import_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uv_thermia_import_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_thermia_import_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_thermomagnitizer.json new file mode 100644 index 000000000..061433009 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_vacuum_bubbler.json new file mode 100644 index 000000000..b00ab0622 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_wireless_charger.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_wireless_charger.json new file mode 100644 index 000000000..152c4150e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_wireless_charger.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uv_wireless_charger", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_wireless_charger" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_wireless_charger", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_wireless_charger", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_wireless_energy_dynamo.json new file mode 100644 index 000000000..5e0eba9ee --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uv_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uv_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uv_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uv_wireless_energy_hatch.json new file mode 100644 index 000000000..37b00ce48 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uv_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uv_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uv_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uv_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uv_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uv_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uv_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..767b933aa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_16a_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uxv_16a_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uxv_16a_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_16a_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_16a_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uxv_16a_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_16a_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..b869eb9d2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_16a_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uxv_16a_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uxv_16a_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_16a_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_16a_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uxv_16a_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_16a_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..faa781d94 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_4a_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uxv_4a_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uxv_4a_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_4a_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_4a_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uxv_4a_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_4a_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..54465850b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_4a_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uxv_4a_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uxv_4a_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_4a_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_4a_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uxv_4a_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_4a_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_calx_reactor.json new file mode 100644 index 000000000..9eebcdf66 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uxv_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_mana_leaching_tub.json new file mode 100644 index 000000000..5d6a2afcd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uxv_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_roaster.json new file mode 100644 index 000000000..fe8563983 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uxv_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_soul_input_hatch.json new file mode 100644 index 000000000..6e6d4312f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_soul_input_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uxv_soul_input_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uxv_soul_input_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_soul_input_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_soul_input_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uxv_soul_input_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_soul_input_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_soul_output_hatch.json new file mode 100644 index 000000000..6d06efb69 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_soul_output_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uxv_soul_output_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uxv_soul_output_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_soul_output_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_soul_output_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uxv_soul_output_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_soul_output_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_thermia_export_hatch.json new file mode 100644 index 000000000..ec46b3265 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_thermia_export_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uxv_thermia_export_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uxv_thermia_export_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_thermia_export_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_thermia_export_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uxv_thermia_export_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_thermia_export_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_thermia_import_hatch.json new file mode 100644 index 000000000..810a7bd56 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_thermia_import_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uxv_thermia_import_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uxv_thermia_import_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_thermia_import_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_thermia_import_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uxv_thermia_import_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_thermia_import_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_thermomagnitizer.json new file mode 100644 index 000000000..149c54277 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uxv_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_vacuum_bubbler.json new file mode 100644 index 000000000..8e52bccab --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/uxv_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_wireless_energy_dynamo.json new file mode 100644 index 000000000..45bf03985 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uxv_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uxv_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uxv_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/uxv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/uxv_wireless_energy_hatch.json new file mode 100644 index 000000000..6fd395420 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/uxv_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/uxv_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/uxv_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/uxv_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/uxv_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/uxv_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/uxv_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/vibrant_rubidium_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/vibrant_rubidium_casing.json new file mode 100644 index 000000000..5cca2afb4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/vibrant_rubidium_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/vibrant_rubidium_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/vile_fission.json b/src/generated/resources/assets/cosmiccore/blockstates/vile_fission.json new file mode 100644 index 000000000..e4fd6268d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/vile_fission.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/vile_fission", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/vile_fission", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/vile_fission", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/vile_fission", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/vile_fission" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/vile_fission" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/vile_fission" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/vile_fission" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/vile_fission", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/vile_fission", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/vile_fission", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/vile_fission", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/vile_fission", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/vile_fission", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/vile_fission", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/vile_fission", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/void_fluid_rig.json b/src/generated/resources/assets/cosmiccore/blockstates/void_fluid_rig.json new file mode 100644 index 000000000..b8822a2ac --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/void_fluid_rig.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/void_fluid_rig", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/void_fluid_rig", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/void_fluid_rig", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/void_fluid_rig", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/void_fluid_rig" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/void_fluid_rig" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/void_fluid_rig" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/void_fluid_rig" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/void_fluid_rig", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/void_fluid_rig", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/void_fluid_rig", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/void_fluid_rig", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/void_fluid_rig", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/void_fluid_rig", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/void_fluid_rig", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/void_fluid_rig", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/void_miner.json b/src/generated/resources/assets/cosmiccore/blockstates/void_miner.json new file mode 100644 index 000000000..5dd267ddd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/void_miner.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/void_miner", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/void_miner", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/void_miner", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/void_miner", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/void_miner" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/void_miner" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/void_miner" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/void_miner" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/void_miner", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/void_miner", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/void_miner", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/void_miner", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/void_miner", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/void_miner", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/void_miner", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/void_miner", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/void_salt_fissiom.json b/src/generated/resources/assets/cosmiccore/blockstates/void_salt_fissiom.json new file mode 100644 index 000000000..a5a99b7b8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/void_salt_fissiom.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/void_salt_fissiom" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/void_salt_fissiom" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/void_salt_fissiom" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/void_salt_fissiom" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/void_salt_fissiom", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/vomahine_celestial_laser_bore.json b/src/generated/resources/assets/cosmiccore/blockstates/vomahine_celestial_laser_bore.json new file mode 100644 index 000000000..d56f7222a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/vomahine_celestial_laser_bore.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/vomahine_celestial_laser_bore", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/vomahine_celestial_laser_bore", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/vomahine_celestial_laser_bore", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/vomahine_celestial_laser_bore", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/vomahine_celestial_laser_bore" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/vomahine_celestial_laser_bore" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/vomahine_celestial_laser_bore" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/vomahine_celestial_laser_bore" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/vomahine_celestial_laser_bore", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/vomahine_celestial_laser_bore", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/vomahine_celestial_laser_bore", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/vomahine_celestial_laser_bore", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/vomahine_celestial_laser_bore", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/vomahine_celestial_laser_bore", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/vomahine_celestial_laser_bore", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/vomahine_celestial_laser_bore", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/vorax_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/vorax_reactor.json new file mode 100644 index 000000000..5e671dcfa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/vorax_reactor.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/vorax_reactor", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/vorax_reactor", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/vorax_reactor", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/vorax_reactor", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/vorax_reactor" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/vorax_reactor" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/vorax_reactor" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/vorax_reactor" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/vorax_reactor", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/vorax_reactor", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/vorax_reactor", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/vorax_reactor", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/vorax_reactor", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/vorax_reactor", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/vorax_reactor", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/vorax_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/wailing_ichor_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/wailing_ichor_casing.json new file mode 100644 index 000000000..47860075b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/wailing_ichor_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/wailing_ichor_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/wasp.json b/src/generated/resources/assets/cosmiccore/blockstates/wasp.json new file mode 100644 index 000000000..450eeb47a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/wasp.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/wasp", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/wasp", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/wasp", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/wasp", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/wasp" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/wasp" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/wasp" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/wasp" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/wasp", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/wasp", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/wasp", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/wasp", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/wasp", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/wasp", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/wasp", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/wasp", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/wear_resistant_ruridit_casing.json b/src/generated/resources/assets/cosmiccore/blockstates/wear_resistant_ruridit_casing.json new file mode 100644 index 000000000..44d2c95fa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/wear_resistant_ruridit_casing.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/wear_resistant_ruridit_casing" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/wireless_data_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/wireless_data_hatch.json new file mode 100644 index 000000000..f7e8cd5e3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/wireless_data_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/wireless_data_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/wireless_data_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/wireless_data_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/wireless_data_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/wireless_data_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/wireless_data_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/wireless_data_transmitter.json b/src/generated/resources/assets/cosmiccore/blockstates/wireless_data_transmitter.json new file mode 100644 index 000000000..cb7a11159 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/wireless_data_transmitter.json @@ -0,0 +1,76 @@ +{ + "variants": { + "facing=east,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/wireless_data_transmitter", + "y": 90 + }, + "facing=east,upwards_facing=north": { + "model": "cosmiccore:block/machine/wireless_data_transmitter", + "y": 90 + }, + "facing=east,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/wireless_data_transmitter", + "y": 90 + }, + "facing=east,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/wireless_data_transmitter", + "y": 90 + }, + "facing=north,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/wireless_data_transmitter" + }, + "facing=north,upwards_facing=north": { + "model": "cosmiccore:block/machine/wireless_data_transmitter" + }, + "facing=north,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/wireless_data_transmitter" + }, + "facing=north,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/wireless_data_transmitter" + }, + "facing=south,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/wireless_data_transmitter", + "y": 180 + }, + "facing=south,upwards_facing=north": { + "model": "cosmiccore:block/machine/wireless_data_transmitter", + "y": 180 + }, + "facing=south,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/wireless_data_transmitter", + "y": 180 + }, + "facing=south,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/wireless_data_transmitter", + "y": 180 + }, + "facing=west,upwards_facing=east": { + "gtceu:z": 270, + "model": "cosmiccore:block/machine/wireless_data_transmitter", + "y": 270 + }, + "facing=west,upwards_facing=north": { + "model": "cosmiccore:block/machine/wireless_data_transmitter", + "y": 270 + }, + "facing=west,upwards_facing=south": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/wireless_data_transmitter", + "y": 270 + }, + "facing=west,upwards_facing=west": { + "gtceu:z": 90, + "model": "cosmiccore:block/machine/wireless_data_transmitter", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zblan_glass.json b/src/generated/resources/assets/cosmiccore/blockstates/zblan_glass.json new file mode 100644 index 000000000..8f907c66a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zblan_glass.json @@ -0,0 +1,7 @@ +{ + "variants": { + "": { + "model": "cosmiccore:block/zblan_glass" + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..a91b006d8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_16a_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/zpm_16a_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/zpm_16a_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_16a_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_16a_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/zpm_16a_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_16a_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..c4dcb9ec6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_16a_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/zpm_16a_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/zpm_16a_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_16a_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_16a_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/zpm_16a_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_16a_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..907935d69 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_4a_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/zpm_4a_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/zpm_4a_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_4a_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_4a_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/zpm_4a_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_4a_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..b98053656 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_4a_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/zpm_4a_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/zpm_4a_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_4a_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_4a_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/zpm_4a_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_4a_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_biolab.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_biolab.json new file mode 100644 index 000000000..a85050b1e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_biolab.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/zpm_biolab", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_biolab" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_biolab", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_biolab", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_calx_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_calx_reactor.json new file mode 100644 index 000000000..578ee887b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_calx_reactor.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/zpm_calx_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_calx_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_calx_reactor", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_calx_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_cosmic_parallel_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_cosmic_parallel_hatch.json new file mode 100644 index 000000000..bcc2d5578 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_cosmic_parallel_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/zpm_cosmic_parallel_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/zpm_cosmic_parallel_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_cosmic_parallel_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_cosmic_parallel_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/zpm_cosmic_parallel_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_cosmic_parallel_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_mana_leaching_tub.json new file mode 100644 index 000000000..d639d6314 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_mana_leaching_tub.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/zpm_mana_leaching_tub", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_mana_leaching_tub" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_mana_leaching_tub", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_mana_leaching_tub", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_naquahine_mini_reactor.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_naquahine_mini_reactor.json new file mode 100644 index 000000000..f31796003 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_naquahine_mini_reactor.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/zpm_naquahine_mini_reactor", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/zpm_naquahine_mini_reactor", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_naquahine_mini_reactor" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_naquahine_mini_reactor", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/zpm_naquahine_mini_reactor", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_naquahine_mini_reactor", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_roaster.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_roaster.json new file mode 100644 index 000000000..abb79da19 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_roaster.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/zpm_roaster", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_roaster" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_roaster", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_roaster", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_soul_input_hatch.json new file mode 100644 index 000000000..85b074746 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_soul_input_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/zpm_soul_input_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/zpm_soul_input_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_soul_input_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_soul_input_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/zpm_soul_input_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_soul_input_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_soul_output_hatch.json new file mode 100644 index 000000000..6e1ae459e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_soul_output_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/zpm_soul_output_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/zpm_soul_output_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_soul_output_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_soul_output_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/zpm_soul_output_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_soul_output_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_thermia_export_hatch.json new file mode 100644 index 000000000..a8ca359a4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_thermia_export_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/zpm_thermia_export_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/zpm_thermia_export_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_thermia_export_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_thermia_export_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/zpm_thermia_export_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_thermia_export_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_thermia_import_hatch.json new file mode 100644 index 000000000..45fa07c73 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_thermia_import_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/zpm_thermia_import_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/zpm_thermia_import_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_thermia_import_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_thermia_import_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/zpm_thermia_import_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_thermia_import_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_thermomagnitizer.json new file mode 100644 index 000000000..76983f8dc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_thermomagnitizer.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/zpm_thermomagnitizer", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_thermomagnitizer" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_thermomagnitizer", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_thermomagnitizer", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_vacuum_bubbler.json new file mode 100644 index 000000000..0d5b4c82a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_vacuum_bubbler.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/zpm_vacuum_bubbler", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_vacuum_bubbler" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_vacuum_bubbler", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_vacuum_bubbler", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_wireless_charger.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_wireless_charger.json new file mode 100644 index 000000000..9835f29df --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_wireless_charger.json @@ -0,0 +1,19 @@ +{ + "variants": { + "facing=east": { + "model": "cosmiccore:block/machine/zpm_wireless_charger", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_wireless_charger" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_wireless_charger", + "y": 180 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_wireless_charger", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_wireless_energy_dynamo.json new file mode 100644 index 000000000..df120f6c3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_wireless_energy_dynamo.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/zpm_wireless_energy_dynamo", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/zpm_wireless_energy_dynamo", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_wireless_energy_dynamo" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_wireless_energy_dynamo", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/zpm_wireless_energy_dynamo", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_wireless_energy_dynamo", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/blockstates/zpm_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/blockstates/zpm_wireless_energy_hatch.json new file mode 100644 index 000000000..e84d6be88 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/blockstates/zpm_wireless_energy_hatch.json @@ -0,0 +1,28 @@ +{ + "variants": { + "facing=down": { + "model": "cosmiccore:block/machine/zpm_wireless_energy_hatch", + "x": 90 + }, + "facing=east": { + "model": "cosmiccore:block/machine/zpm_wireless_energy_hatch", + "y": 90 + }, + "facing=north": { + "model": "cosmiccore:block/machine/zpm_wireless_energy_hatch" + }, + "facing=south": { + "model": "cosmiccore:block/machine/zpm_wireless_energy_hatch", + "y": 180 + }, + "facing=up": { + "gtceu:z": 180, + "model": "cosmiccore:block/machine/zpm_wireless_energy_hatch", + "x": 270 + }, + "facing=west": { + "model": "cosmiccore:block/machine/zpm_wireless_energy_hatch", + "y": 270 + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/lang/en_ud.json b/src/generated/resources/assets/cosmiccore/lang/en_ud.json index ffafcf5d8..f288c56b7 100644 --- a/src/generated/resources/assets/cosmiccore/lang/en_ud.json +++ b/src/generated/resources/assets/cosmiccore/lang/en_ud.json @@ -1,99 +1,2091 @@ { - "block.cosmiccore.alternator_flux_coiling": "buıןıoƆ xnןℲ ɹoʇɐuɹǝʇןⱯ", - "block.cosmiccore.causal_fabric_coil_block": "ʞɔoןᗺ ןıoƆ ɔıɹqɐℲ ןɐsnɐƆ", - "block.cosmiccore.drygmy_grove": "ǝʌoɹ⅁ ʎɯbʎɹᗡ", - "block.cosmiccore.dyson_solar_cell": "ןןǝƆ ɹɐןoS uosʎᗡ", - "block.cosmiccore.fusion_grade_magnet": "ʇǝubɐW ǝpɐɹ⅁ uoısnℲ", - "block.cosmiccore.high_powered_magnet": "ʇǝubɐW pǝɹǝʍoԀ ɥbıH", - "block.cosmiccore.high_temperature_fission_casing": "buısɐƆ uoıssıℲ ǝɹnʇɐɹǝdɯǝ⟘ ɥbıH", - "block.cosmiccore.highly_conductive_fission_casing": "buısɐƆ uoıssıℲ ǝʌıʇɔnpuoƆ ʎןɥbıH", - "block.cosmiccore.iv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛI6§", - "block.cosmiccore.iv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛI6§", - "block.cosmiccore.living_igniclad_coil_block": "ʞɔoןᗺ ןıoƆ pɐןɔıubI buıʌıꞀ", - "block.cosmiccore.luv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛnꞀp§", - "block.cosmiccore.luv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛnꞀp§", - "block.cosmiccore.naquadah_pressure_resistant_casing": "buısɐƆ ʇuɐʇsısǝᴚ ǝɹnssǝɹԀ ɥɐpɐnbɐN", - "block.cosmiccore.naquadric_superalloy_coil_block": "ʞɔoןᗺ ןıoƆ ʎoןןɐɹǝdnS ɔıɹpɐnbɐN", - "block.cosmiccore.naquahine_pressure_reactor": "ɹoʇɔɐǝᴚ ǝɹnssǝɹԀ ǝuıɥɐnbɐN", - "block.cosmiccore.opv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛdOן§6§", - "block.cosmiccore.opv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛdOן§6§", - "block.cosmiccore.plated_aerocloud": "pnoןɔoɹǝⱯ pǝʇɐןԀ", - "block.cosmiccore.prismatic_tungstensteel_coil_block": "ʞɔoןᗺ ןıoƆ ןǝǝʇsuǝʇsbun⟘ ɔıʇɐɯsıɹԀ", - "block.cosmiccore.programable_matter_coil_block": "ʞɔoןᗺ ןıoƆ ɹǝʇʇɐW ǝןqɐɯɐɹboɹԀ", - "block.cosmiccore.psionic_galvorn_coil_block": "ʞɔoןᗺ ןıoƆ uɹoʌןɐ⅁ ɔıuoısԀ", - "block.cosmiccore.resonant_virtue_meld_coil_block": "ʞɔoןᗺ ןıoƆ pןǝW ǝnʇɹıΛ ʇuɐuosǝᴚ", - "block.cosmiccore.resonantly_tuned_virtue_meld_casing": "buısɐƆ pןǝW ǝnʇɹıΛ pǝun⟘ ʎןʇuɐuosǝᴚ", - "block.cosmiccore.shimmering_neutronium_coil_block": "ʞɔoןᗺ ןıoƆ ɯnıuoɹʇnǝN buıɹǝɯɯıɥS", - "block.cosmiccore.trinavine_coil_block": "ʞɔoןᗺ ןıoƆ ǝuıʌɐuıɹ⟘", - "block.cosmiccore.uev_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛƎ∩ɐ§", - "block.cosmiccore.uev_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛƎ∩ɐ§", - "block.cosmiccore.uhv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛH∩ㄣ§", - "block.cosmiccore.uhv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛH∩ㄣ§", - "block.cosmiccore.uiv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛI∩ᄅ§", - "block.cosmiccore.uiv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛI∩ᄅ§", - "block.cosmiccore.uv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS Λ∩Ɛ§", - "block.cosmiccore.uv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS Λ∩Ɛ§", - "block.cosmiccore.uxv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛX∩ǝ§", - "block.cosmiccore.uxv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛX∩ǝ§", - "block.cosmiccore.zpm_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS WԀZɔ§", - "block.cosmiccore.zpm_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS WԀZɔ§", - "cosmiccore.multiblock.current_field_strength": "%s :ɥʇbuǝɹʇS pןǝıℲɟ§", - "cosmiccore.multiblock.magnetic_field_strength": "%s 9§:ɟ§ɥʇbuǝɹʇS pןǝıℲ xɐWɟ§", - "cosmiccore.multiblock.magnetic_regen": "ʇ/⟘%s 9§:ɟ§ǝʇɐᴚ ʎɹǝʌoɔǝᴚ pןǝıℲɐ§", - "cosmiccore.recipe.fieldDecay": "ʇ/⟘%s :ʎɐɔǝᗡ pןǝıℲɟ§", - "cosmiccore.recipe.fieldSlam": "⟘%s :pǝɯnsuoƆ pןǝıℲɟ§", - "cosmiccore.recipe.minField": "⟘%s :ɥʇbuǝɹʇS pןǝıℲ ˙uıWɟ§", - "cosmiccore.recipe.soulIn": "%s :ʇnduI ןnoS", - "cosmiccore.recipe.soulOut": "%s :ʇndʇnO ןnoS", - "cosmiccore.wire_coil.eu_multiplier": "ʇ/∩Ǝ %sɔ§ :ʇsoƆ ∩Ǝ ʇǝubɐWɐ§ ", - "cosmiccore.wire_coil.magnet_capacity": "ɐןsǝ⟘ %sɟ§ :ɥʇbuǝɹʇS pןǝıℲ xɐWɟ§ ", - "cosmiccore.wire_coil.magnet_regen": "ʇ/ɐןsǝ⟘ %s :ǝʇɐᴚ uǝbǝᴚ pןǝıℲϛ§ ", - "cosmiccore.wire_coil.magnet_stats": "sʇɐʇS ʇǝubɐW8§", - "gtceu.naquahine_reactor": "ɹoʇɔɐǝᴚ ǝuıɥɐnbɐNq§", - "item.cosmiccore.blackstone_pustule": "ǝןnʇsnԀ ǝuoʇsʞɔɐןᗺ", - "item.cosmiccore.cosmic_processor": "ɹossǝɔoɹԀ ɔıɯsoƆ", - "item.cosmiccore.cosmic_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ɔıɯsoƆ", - "item.cosmiccore.cosmic_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ ɔıɯsoƆ", - "item.cosmiccore.cosmic_processor_supercomputer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ ɔıɯsoƆ", - "item.cosmiccore.donk": "ʞuoᗡ", - "item.cosmiccore.echo_processor": "ɹossǝɔoɹԀ oɥɔƎ", - "item.cosmiccore.echo_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ oɥɔƎ", - "item.cosmiccore.echo_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ oɥɔƎ", - "item.cosmiccore.echo_processor_supercomputer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ oɥɔƎ", - "item.cosmiccore.macroverse_processor": "ɹossǝɔoɹԀ ǝsɹǝʌoɹɔɐW", - "item.cosmiccore.macroverse_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ǝsɹǝʌoɹɔɐW", - "item.cosmiccore.macroverse_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ ǝsɹǝʌoɹɔɐW", - "item.cosmiccore.macroverse_processor_supercomputer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ ǝsɹǝʌoɹɔɐW", - "item.cosmiccore.optical_processor": "ɹossǝɔoɹԀ ןɐɔıʇdO", - "item.cosmiccore.optical_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ןɐɔıʇdO", - "item.cosmiccore.optical_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ ןɐɔıʇdO", - "item.cosmiccore.optical_processor_supercomputer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ ןɐɔıʇdO", - "item.cosmiccore.overloaded_pearls": "sןɹɐǝԀ pǝpɐoןɹǝʌO", - "item.cosmiccore.psionic_processor": "ɹossǝɔoɹԀ ɔıuoısԀ", - "item.cosmiccore.psionic_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ɔıuoısԀ", - "item.cosmiccore.psionic_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ ɔıuoısԀ", - "item.cosmiccore.psionic_processor_supercomputer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ ɔıuoısԀ", - "item.cosmiccore.space_advanced_nanomuscle_chestplate": "ǝʇɐןdʇsǝɥƆ ǝʇınS ǝɔɐdS ™ǝןɔsnWouɐN pǝɔuɐʌpⱯ", - "item.cosmiccore.space_advanced_quarktech_chestplate": "ǝʇɐןdʇsǝɥƆ ǝʇınS ǝɔɐdS ™ɥɔǝ⟘ʞɹɐnὉ pǝɔuɐʌpⱯ", - "item.cosmiccore.space_nanomuscle_chestplate": "ǝʇɐןdʇsǝɥƆ ǝʇınS ǝɔɐdS ™ǝןɔsnWouɐN", - "item.cosmiccore.space_quarktech_chestplate": "ǝʇɐןdʇsǝɥƆ ǝʇınS ǝɔɐdS ™ɥɔǝ⟘ʞɹɐnὉ", - "item.cosmiccore.waxed_leather": "ɹǝɥʇɐǝꞀ pǝxɐM", - "itemGroup.cosmiccore.creative_tab": "ǝɹoƆ ɔıɯsoƆ", - "material.cosmiccore.causal_fabric": "ɔıɹqɐℲ ןɐsnɐƆ", - "material.cosmiccore.diluted_prisma": "ɐɯsıɹԀ pǝʇnןıᗡ", - "material.cosmiccore.living_igniclad": "pɐןɔıubI buıʌıꞀ", - "material.cosmiccore.naquadric_superalloy": "ʎoןןɐɹǝdnS ɔıɹpɐnbɐN", - "material.cosmiccore.prisma": "ɐɯsıɹԀ", - "material.cosmiccore.prismatic_tungstensteel": "ןǝǝʇsuǝʇsbun⟘ ɔıʇɐɯsıɹԀ", - "material.cosmiccore.programmable_matter": "ɹǝʇʇɐW ǝןqɐɯɯɐɹboɹԀ", - "material.cosmiccore.psionic_galvorn": "uɹoʌןɐ⅁ ɔıuoısԀ", - "material.cosmiccore.resonant_virtue_meld": "pןǝW ǝnʇɹıΛ ʇuɐuosǝᴚ", - "material.cosmiccore.shimmering_neutronium": "ɯnıuoɹʇnǝN buıɹǝɯɯıɥS", - "material.cosmiccore.trinavine": "ǝuıʌɐuıɹ⟘", - "material.cosmiccore.trinium_naqide": "ǝpıbɐN ɯnıuıɹ⟘", - "material.cosmiccore.virtue_meld": "pןǝW ǝnʇɹıΛ", - "tagprefix.leached_ore": "ǝɹO %s pǝɥɔɐǝꞀ", - "tagprefix.prisma_frothed_ore": "ǝɹO %s pǝɥʇoɹℲ ɐɯsıɹԀ", - "tooltip.cosmiccore.soul_hatch.input": "%s 9§:ɟ§ʇnduI ǝdıɔǝᴚ xɐWɔ§", - "tooltip.cosmiccore.soul_hatch.output": "%s 9§:ɟ§ʎʇıɔɐdɐƆ ʞɹoʍʇǝN ןnoS xɐWɔ§" + "allele.forestry.bee_species.cosmiccore.bee_abrasive": "ǝʌısɐɹqⱯ", + "allele.forestry.bee_species.cosmiccore.bee_absent": "ʇuǝsqⱯ", + "allele.forestry.bee_species.cosmiccore.bee_ambrosic": "ɔısoɹqɯⱯ", + "allele.forestry.bee_species.cosmiccore.bee_architect": "ʇɔǝʇıɥɔɹⱯ", + "allele.forestry.bee_species.cosmiccore.bee_argon": "uobɹⱯ ʎʇɟoꞀ", + "allele.forestry.bee_species.cosmiccore.bee_ashen": "uǝɥsⱯ", + "allele.forestry.bee_species.cosmiccore.bee_biohazard": "pɹɐzɐɥoıᗺ", + "allele.forestry.bee_species.cosmiccore.bee_citrus_polymer": "ɹǝɯʎןoԀ snɹʇıƆ", + "allele.forestry.bee_species.cosmiccore.bee_cobbled": "pǝןqqoƆ", + "allele.forestry.bee_species.cosmiccore.bee_constructive": "ǝʌıʇɔnɹʇsuoƆ", + "allele.forestry.bee_species.cosmiccore.bee_cosmos": "soɯsoƆ", + "allele.forestry.bee_species.cosmiccore.bee_energized": "pǝzıbɹǝuƎ", + "allele.forestry.bee_species.cosmiccore.bee_exhaustive": "ǝʌıʇsnɐɥxƎ", + "allele.forestry.bee_species.cosmiccore.bee_fate": "ǝʇɐℲ", + "allele.forestry.bee_species.cosmiccore.bee_fracking": "buıʞɔɐɹℲ", + "allele.forestry.bee_species.cosmiccore.bee_grand_garden": "uǝpɹɐ⅁ puɐɹ⅁", + "allele.forestry.bee_species.cosmiccore.bee_hadal": "ןɐpɐH", + "allele.forestry.bee_species.cosmiccore.bee_hellsmith": "ɥʇıɯsןןǝH", + "allele.forestry.bee_species.cosmiccore.bee_hydraulic": "ɔıןnɐɹpʎH", + "allele.forestry.bee_species.cosmiccore.bee_hydrogen": "uǝboɹpʎH ʎʇɟoꞀ", + "allele.forestry.bee_species.cosmiccore.bee_illusive": "ǝʌısnןןI", + "allele.forestry.bee_species.cosmiccore.bee_inquisitive": "ǝʌıʇısınbuI", + "allele.forestry.bee_species.cosmiccore.bee_lunar": "ɹɐunꞀ", + "allele.forestry.bee_species.cosmiccore.bee_nitrogen": "uǝboɹʇıN ʎʇɟoꞀ", + "allele.forestry.bee_species.cosmiccore.bee_oxygen": "uǝbʎxO ʎʇɟoꞀ", + "allele.forestry.bee_species.cosmiccore.bee_pale": "ǝןɐԀ", + "allele.forestry.bee_species.cosmiccore.bee_prismatic": "ɔıʇɐɯsıɹԀ", + "allele.forestry.bee_species.cosmiccore.bee_pyrolytic": "ɔıʇʎןoɹʎԀ", + "allele.forestry.bee_species.cosmiccore.bee_radoxia": "ɐıxopɐᴚ", + "allele.forestry.bee_species.cosmiccore.bee_rose_polymer": "ɹǝɯʎןoԀ ǝsoᴚ", + "allele.forestry.bee_species.cosmiccore.bee_runic": "ɔıunᴚ", + "allele.forestry.bee_species.cosmiccore.bee_shaman": "uɐɯɐɥS", + "allele.forestry.bee_species.cosmiccore.bee_slick": "ʞɔıןS", + "allele.forestry.bee_species.cosmiccore.bee_solar": "ɹɐןoS", + "allele.forestry.bee_species.cosmiccore.bee_soul": "ןnoS", + "allele.forestry.bee_species.cosmiccore.bee_virtue": "ǝnʇɹıΛ", + "allele.forestry.bee_species.cosmiccore.bee_waxy_polymer": "ɹǝɯʎןoԀ ʎxɐM", + "behavior.wireless_data.owner.network": "ɹ§ :ɹǝuʍO ʞɹoʍʇǝNƐ§", + "behavior.wireless_data.owner.player": "ɹ§ :ǝɯɐN ɹǝʎɐןԀƐ§", + "behavior.wireless_data.owner.team": "ɹ§ :ǝɯɐN ɯɐǝ⟘Ɛ§", + "block.cosmiccore.alternator_flux_coiling": "buıןıoƆ xnןℲ ɹoʇɐuɹǝʇןⱯ", + "block.cosmiccore.alveary_casing": "buısɐƆ ʎɹɐǝʌןⱯ", + "block.cosmiccore.arcane_crucible": "ǝןqıɔnɹƆ ǝuɐɔɹⱯ", + "block.cosmiccore.arcane_distillery": "ʎɹǝןןıʇsıᗡ ǝuɐɔɹⱯ9§", + "block.cosmiccore.atmo_pump": "uoɥdıS ɔıɹǝɥdsoɯʇⱯ9§", + "block.cosmiccore.atomic_reconstructor": "ɹoʇɔnɹʇsuoɔǝᴚ ɔıɯoʇⱯ ʇןoqpɐᴚ9§", + "block.cosmiccore.bichromal_nevramite_casing": "buısɐƆ ǝʇıɯɐɹʌǝN ןɐɯoɹɥɔıᗺ", + "block.cosmiccore.biovat": "ʇɐʌoıᗺ", + "block.cosmiccore.blank_rune": "ǝunᴚ ʞuɐןᗺ", + "block.cosmiccore.bolted_heavy_frame_casing": "buısɐƆ ǝɯɐɹℲ ʎʌɐǝH pǝʇןoᗺ", + "block.cosmiccore.botanical_simulation_complex": "xǝןdɯoƆ uoıʇɐןnɯıS ןɐɔıuɐʇoᗺɐ§", + "block.cosmiccore.capacitor_array": "ʎɐɹɹⱯ ɹoʇıɔɐdɐƆ", + "block.cosmiccore.causal_fabric_coil_block": "ʞɔoןᗺ ןıoƆ ɔıɹqɐℲ ןɐsnɐƆ", + "block.cosmiccore.chromatic_distillation_plant": "ʇuɐןԀ uoıʇɐןןıʇsıᗡ ɔıʇɐɯoɹɥƆ", + "block.cosmiccore.chromatic_flotation_plant": "ʇuɐןԀ uoıʇɐʇoןℲ ɔıʇɐɯoɹɥƆ", + "block.cosmiccore.cinder_hearth": "ɥʇɹɐǝH ɹǝpuıƆ", + "block.cosmiccore.component_assembly_line": "ǝuıꞀ ʎןqɯǝssⱯ ʇuǝuodɯoƆɐ§", + "block.cosmiccore.cosmic_me_assemblyline_bus": "snᗺ ǝuıꞀ ʎןqɯǝssⱯ ƎW", + "block.cosmiccore.cosmic_me_assemblyline_hatch": "ɥɔʇɐH ǝuıꞀ ʎןqɯǝssⱯ ƎW", + "block.cosmiccore.creative_thermal": "ןɐɯɹǝɥ⟘ ǝʌıʇɐǝɹƆ", + "block.cosmiccore.crop_holder": "ɹǝpןoH doɹƆ", + "block.cosmiccore.cryogenic_casing": "buısɐƆ ɔıuǝboʎɹƆ", + "block.cosmiccore.cryogenics_chamber": "ɹǝqɯɐɥƆ sɔıuǝboʎɹƆq§", + "block.cosmiccore.cyclozine_chemically_repelling_casing": "buısɐƆ buıןןǝdǝᴚ ʎןןɐɔıɯǝɥƆ ǝuızoןɔʎƆ", + "block.cosmiccore.cyclozine_chemically_repelling_pipe": "ǝdıԀ buıןןǝdǝᴚ ʎןןɐɔıɯǝɥƆ ǝuızoןɔʎƆ", + "block.cosmiccore.cyclozine_high_rigidity_casing": "buısɐƆ ʎʇıpıbıᴚ ɥbıH ǝuızoןɔʎƆ", + "block.cosmiccore.dawn_forge": "ǝbɹoℲ uʍɐᗡ", + "block.cosmiccore.dawnforge_eclipsed": "]pǝsdıןɔƎ[ ǝbɹoɟuʍɐᗡ", + "block.cosmiccore.dimensional_energy_capacitor": "uoıʇɐʇsqnS ɹǝʍoԀ", + "block.cosmiccore.dimensional_energy_interface": "ǝɔɐɟɹǝʇuI ןɐuoısuǝɯıᗡ uoıʇɐʇsqnS ɹǝʍoԀ", + "block.cosmiccore.diving_bell": "ןןǝᗺ buıʌıᗡ", + "block.cosmiccore.diving_bell_escape_pad": "pɐԀ ǝdɐɔsƎ ןןǝᗺ buıʌıᗡ", + "block.cosmiccore.dreamers_basin": "uısɐᗺ s,ɹǝɯɐǝɹᗡ", + "block.cosmiccore.drone_maintenance_interface": "ǝɔɐɟɹǝʇuI ǝɔuɐuǝʇuıɐW ǝuoɹᗡ", + "block.cosmiccore.drone_station": "uoıʇɐʇS ǝuoɹᗡ", + "block.cosmiccore.drygmy_grove": "ǝʌoɹ⅁ ʎɯbʎɹᗡ", + "block.cosmiccore.dyson_solar_cell": "ןןǝƆ ɹɐןoS uosʎᗡ", + "block.cosmiccore.ethersteel_plated_ash_tiles": "sǝןı⟘ ɥsⱯ pǝʇɐןԀ ןǝǝʇsɹǝɥʇƎ", + "block.cosmiccore.ev_biolab": "ɹ§III qɐꞀ oıᗺ pǝɔuɐʌpⱯϛ§", + "block.cosmiccore.ev_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌƎ", + "block.cosmiccore.ev_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌƎ", + "block.cosmiccore.ev_roaster": "ɹǝʇsɐoᴚ ʌƎ", + "block.cosmiccore.ev_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌƎ", + "block.cosmiccore.ev_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌƎ", + "block.cosmiccore.ev_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM ΛƎ", + "block.cosmiccore.extreme_combustion_engine_cc": "ɔƆ ǝuıbuƎ uoıʇsnqɯoƆ ǝɯǝɹʇxƎ", + "block.cosmiccore.fulgorinth_prime_casing": "buısɐƆ ǝɯıɹԀ ɥʇuıɹobןnℲ", + "block.cosmiccore.fusion_grade_magnet": "ʇǝubɐW ǝpɐɹ⅁ uoısnℲ", + "block.cosmiccore.gilded_pthanterum_casing": "buısɐƆ ɯnɹǝʇuɐɥʇԀ pǝpןı⅁", + "block.cosmiccore.heat_fan": "uɐℲ ʇɐǝH", + "block.cosmiccore.heavy_assembler": "ɹǝןqɯǝssⱯ ʎʌɐǝH6§", + "block.cosmiccore.heavy_frost_proof_casing": "buısɐƆ ɟooɹԀ ʇsoɹℲ ʎʌɐǝH", + "block.cosmiccore.hellfire_foundry": "ʎɹpunoℲ ǝɹıɟןןǝHɔ§", + "block.cosmiccore.hemophagic_transfuser": "ɹǝsnɟsuɐɹ⟘ ɔıbɐɥdoɯǝHɐ§", + "block.cosmiccore.high_powered_magnet": "ʇǝubɐW pǝɹǝʍoԀ ɥbıH", + "block.cosmiccore.high_pressure_assembler": "ɹǝןqɯǝssⱯ ǝɹnssǝɹԀ ɥbıH", + "block.cosmiccore.high_temperature_fission_casing": "buısɐƆ uoıssıℲ ǝɹnʇɐɹǝdɯǝ⟘ ɥbıH", + "block.cosmiccore.high_tolerance_rhenium_casing": "buısɐƆ ɯnıuǝɥᴚ ǝɔuɐɹǝןo⟘ ɥbıH", + "block.cosmiccore.highly_conductive_fission_casing": "buısɐƆ uoıssıℲ ǝʌıʇɔnpuoƆ ʎןɥbıH", + "block.cosmiccore.highly_flexible_reinforced_trinavine_casing": "buısɐƆ ǝuıʌɐuıɹ⟘ pǝɔɹoɟuıǝᴚ ǝןqıxǝןℲ ʎןɥbıH", + "block.cosmiccore.hp_steam_bender": "ɹǝpuǝᗺ ɯɐǝʇS ǝɹnssǝɹԀ ɥbıH", + "block.cosmiccore.hp_steam_wiremill": "ןןıɯǝɹıM ɯɐǝʇS ǝɹnssǝɹԀ ɥbıH", + "block.cosmiccore.huge_sterilization_hatch": "ɥɔʇɐH uoıʇɐzןıɹǝʇS", + "block.cosmiccore.hv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌH", + "block.cosmiccore.hv_energy_output_hatch_16a": "ɥɔʇɐH oɯɐuʎᗡ Ɐ9Ɩ ΛH9§", + "block.cosmiccore.hv_energy_output_hatch_4a": "ɥɔʇɐH oɯɐuʎᗡ Ɐㄣ ΛH9§", + "block.cosmiccore.hv_input_hatch_4x": "ɥɔʇɐH ʇnduI ǝןdnɹpɐnὉ ΛH9§", + "block.cosmiccore.hv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌH", + "block.cosmiccore.hv_output_hatch_4x": "ɥɔʇɐH ʇndʇnO ǝןdnɹpɐnὉ ΛH9§", + "block.cosmiccore.hv_roaster": "ɹǝʇsɐoᴚ ʌH", + "block.cosmiccore.hv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌH", + "block.cosmiccore.hv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌH", + "block.cosmiccore.hv_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM ΛH", + "block.cosmiccore.industrial_chemical_vat": "ʇɐΛ ןɐɔıɯǝɥƆ ןɐıɹʇsnpuI", + "block.cosmiccore.industrial_primitive_blast_furnace": "ǝɔɐuɹnℲ ʇsɐןᗺ ǝʌıʇıɯıɹԀ ןɐıɹʇsnpuI", + "block.cosmiccore.iron_plated_deepslate_tile": "ǝןı⟘ ǝʇɐןsdǝǝᗡ pǝʇɐןԀ uoɹI", + "block.cosmiccore.iron_plated_deepslate_tile_slab": "qɐןS ǝןı⟘ ǝʇɐןsdǝǝᗡ pǝʇɐןԀ uoɹI", + "block.cosmiccore.iron_plated_deepslate_tile_stairs": "sɹıɐʇS ǝןı⟘ ǝʇɐןsdǝǝᗡ pǝʇɐןԀ uoɹI", + "block.cosmiccore.iv_16a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛI6§", + "block.cosmiccore.iv_16a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛI6§", + "block.cosmiccore.iv_4a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛI6§", + "block.cosmiccore.iv_4a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛI6§", + "block.cosmiccore.iv_biolab": "ɹ§ qɐꞀ oıᗺ ǝʇıןƎ6§", + "block.cosmiccore.iv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌI", + "block.cosmiccore.iv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌI", + "block.cosmiccore.iv_naquahine_mini_reactor": "ɹ§ ɹoʇɐɹǝuǝ⅁ ɹoʇɔɐǝᴚ ıuıW ǝuıɥɐnbɐN ǝʇıןƎ6§", + "block.cosmiccore.iv_roaster": "ɹǝʇsɐoᴚ ʌI", + "block.cosmiccore.iv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛI6§", + "block.cosmiccore.iv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛI6§", + "block.cosmiccore.iv_thermia_export_hatch": "ɥɔʇɐH ʇɹodxƎ ɐıɯɹǝɥ⟘ ʌI", + "block.cosmiccore.iv_thermia_import_hatch": "ɥɔʇɐH ʇɹodɯI ɐıɯɹǝɥ⟘ ʌI", + "block.cosmiccore.iv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌI", + "block.cosmiccore.iv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌI", + "block.cosmiccore.iv_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM ΛI", + "block.cosmiccore.iv_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM ΛI6§", + "block.cosmiccore.iv_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM ΛI6§", + "block.cosmiccore.large_combustion_engine_cc": "ɔƆ ǝuıbuƎ uoıʇsnqɯoƆ ǝbɹɐꞀ", + "block.cosmiccore.large_laminator": "ɹoʇɐuıɯɐꞀ ǝbɹɐꞀƖ§", + "block.cosmiccore.large_roaster": "ɹǝʇsɐoᴚ ǝbɹɐꞀɔ§", + "block.cosmiccore.large_spooling_machine": "ǝuıɥɔɐW buıןoodS ǝbɹɐꞀ", + "block.cosmiccore.larva": "]ⱯΛᴚⱯꞀ[ ʎןqɯǝssⱯ buınןɐΛ puɐ uoıʇɐɯɐןɔǝᴚ pıoɹǝʇsⱯ ɔıʇsıboꞀ", + "block.cosmiccore.light_dawnstone_casing": "buısɐƆ ǝuoʇsuʍɐᗡ ʇɥbıꞀ", + "block.cosmiccore.light_ritual_stone": "ǝuoʇS ןɐnʇıᴚ ʇɥbıꞀ", + "block.cosmiccore.link_test_station": "uoıʇɐʇS ʇsǝ⟘ ʞuıꞀ", + "block.cosmiccore.living_igniclad_coil_block": "ʞɔoןᗺ ןıoƆ pɐןɔıubI buıʌıꞀ", + "block.cosmiccore.livingrock_tiles": "sǝןı⟘ ʞɔoɹbuıʌıꞀ", + "block.cosmiccore.lp_steam_bender": "⟘SIXƎ ⟘ON Oᗡ I", + "block.cosmiccore.lp_steam_wiremill": "⟘SIXƎ ⟘ON Oᗡ I", + "block.cosmiccore.ludicrious_intake": "ǝʞɐʇuI snoıɹɔıpnꞀ", + "block.cosmiccore.ludicrous_combustion_engine_cc": "ɔƆ ǝuıbuƎ uoıʇsnqɯoƆ snoɹɔıpnꞀ", + "block.cosmiccore.lunar_sheer_hammer": "ɹǝɯɯɐH ɹɐunꞀ6§", + "block.cosmiccore.luv_16a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛnꞀp§", + "block.cosmiccore.luv_16a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛnꞀp§", + "block.cosmiccore.luv_4a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛnꞀp§", + "block.cosmiccore.luv_4a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛnꞀp§", + "block.cosmiccore.luv_biolab": "ɹ§II qɐꞀ oıᗺ ǝʇıןƎp§", + "block.cosmiccore.luv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌnꞀ", + "block.cosmiccore.luv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌnꞀ", + "block.cosmiccore.luv_naquahine_mini_reactor": "ɹ§II ɹoʇɐɹǝuǝ⅁ ɹoʇɔɐǝᴚ ıuıW ǝuıɥɐnbɐN ǝʇıןƎp§", + "block.cosmiccore.luv_roaster": "ɹǝʇsɐoᴚ ʌnꞀ", + "block.cosmiccore.luv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛnꞀp§", + "block.cosmiccore.luv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛnꞀp§", + "block.cosmiccore.luv_thermia_export_hatch": "ɥɔʇɐH ʇɹodxƎ ɐıɯɹǝɥ⟘ ʌnꞀ", + "block.cosmiccore.luv_thermia_import_hatch": "ɥɔʇɐH ʇɹodɯI ɐıɯɹǝɥ⟘ ʌnꞀ", + "block.cosmiccore.luv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌnꞀ", + "block.cosmiccore.luv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌnꞀ", + "block.cosmiccore.luv_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM ΛnꞀ", + "block.cosmiccore.luv_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM ΛnꞀp§", + "block.cosmiccore.luv_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM ΛnꞀp§", + "block.cosmiccore.lv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌꞀ", + "block.cosmiccore.lv_energy_output_hatch_16a": "ɥɔʇɐH oɯɐuʎᗡ Ɐ9Ɩ ΛꞀㄥ§", + "block.cosmiccore.lv_energy_output_hatch_4a": "ɥɔʇɐH oɯɐuʎᗡ Ɐㄣ ΛꞀㄥ§", + "block.cosmiccore.lv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌꞀ", + "block.cosmiccore.lv_roaster": "ɹǝʇsɐoᴚ ʌꞀ", + "block.cosmiccore.lv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌꞀ", + "block.cosmiccore.lv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌꞀ", + "block.cosmiccore.machine_casing_gearbox_naquadria": "ɐıɹpɐnbɐN xoqɹɐǝ⅁ buısɐƆ ǝuıɥɔɐW", + "block.cosmiccore.machine_casing_gearbox_pthanterum": "ɯnɹǝʇuɐɥʇԀ xoqɹɐǝ⅁ buısɐƆ ǝuıɥɔɐW", + "block.cosmiccore.mana_etching_factory": "ʎɹoʇɔɐℲ buıɥɔʇƎ ɐuɐW", + "block.cosmiccore.mantle_bore": "ǝɹoᗺ ǝןʇuɐW", + "block.cosmiccore.moth_cargo_drop_off": "ɟɟO doɹᗡ obɹɐƆ ɥʇoW", + "block.cosmiccore.moth_cargo_station": "uoıʇɐʇS obɹɐƆ ɥʇoW", + "block.cosmiccore.moth_home_t1": ")Ɩ⟘( ǝɯoH ɥʇoW", + "block.cosmiccore.moth_home_t2": ")ᄅ⟘( ǝɯoH ɥʇoW", + "block.cosmiccore.moth_home_t3": ")Ɛ⟘( ǝɯoH ɥʇoW", + "block.cosmiccore.moth_home_t4": ")ㄣ⟘( ǝɯoH ɥʇoW", + "block.cosmiccore.moth_station_casing": "buısɐƆ uoıʇɐʇS ɥʇoW", + "block.cosmiccore.multi_purpose_interstellar_grade_casing": "buısɐƆ ǝpɐɹ⅁ ɹɐןןǝʇsɹǝʇuI ǝsodɹnԀ ıʇןnW", + "block.cosmiccore.mv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌW", + "block.cosmiccore.mv_energy_output_hatch_16a": "ɥɔʇɐH oɯɐuʎᗡ Ɐ9Ɩ ΛWq§", + "block.cosmiccore.mv_energy_output_hatch_4a": "ɥɔʇɐH oɯɐuʎᗡ Ɐㄣ ΛWq§", + "block.cosmiccore.mv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌW", + "block.cosmiccore.mv_roaster": "ɹǝʇsɐoᴚ ʌW", + "block.cosmiccore.mv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌW", + "block.cosmiccore.mv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌW", + "block.cosmiccore.naquadah_pressure_resistant_casing": "buısɐƆ ʇuɐʇsısǝᴚ ǝɹnssǝɹԀ ɥɐpɐnbɐN", + "block.cosmiccore.naquadric_superalloy_coil_block": "ʞɔoןᗺ ןıoƆ ʎoןןɐɹǝdnS ɔıɹpɐnbɐN", + "block.cosmiccore.naquahine_pressure_reactor": "ɹoʇɔɐǝᴚ ǝɹnssǝɹԀ ǝuıɥɐnbɐN", + "block.cosmiccore.neutronium_buoy": "ʎonᗺ ɯnıuoɹʇnǝN", + "block.cosmiccore.oneiric_sieve": "ǝʌǝıS ɔıɹıǝuO", + "block.cosmiccore.opv_16a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛdOן§6§", + "block.cosmiccore.opv_16a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛdOן§6§", + "block.cosmiccore.opv_4a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛdOן§6§", + "block.cosmiccore.opv_4a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛdOן§6§", + "block.cosmiccore.opv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌdO", + "block.cosmiccore.opv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌdO", + "block.cosmiccore.opv_roaster": "ɹǝʇsɐoᴚ ʌdO", + "block.cosmiccore.opv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛdOן§6§", + "block.cosmiccore.opv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛdOן§6§", + "block.cosmiccore.opv_thermia_export_hatch": "ɥɔʇɐH ʇɹodxƎ ɐıɯɹǝɥ⟘ ʌdO", + "block.cosmiccore.opv_thermia_import_hatch": "ɥɔʇɐH ʇɹodɯI ɐıɯɹǝɥ⟘ ʌdO", + "block.cosmiccore.opv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌdO", + "block.cosmiccore.opv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌdO", + "block.cosmiccore.opv_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM ΛdOן§6§", + "block.cosmiccore.opv_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM ΛdOן§6§", + "block.cosmiccore.orbital_tempering_forge": "ǝbɹoℲ buıɹǝdɯǝ⟘ ןɐʇıqɹO", + "block.cosmiccore.ore_extraction_drill_hv": "ןןıɹᗡ uoıʇɔɐɹʇxƎ ǝɹO ΛH9§", + "block.cosmiccore.ore_extraction_drill_iv": "ןןıɹᗡ uoıʇɔɐɹʇxƎ ǝɹO ΛI6§", + "block.cosmiccore.ore_extraction_drill_lv": "ןןıɹᗡ uoıʇɔɐɹʇxƎ ǝɹO ΛꞀㄥ§", + "block.cosmiccore.ore_extraction_drill_zpm": "ןןıɹᗡ uoıʇɔɐɹʇxƎ ǝɹO WԀZɔ§", + "block.cosmiccore.oscillating_gilded_pthanterum_casings": "sbuısɐƆ ɯnɹǝʇuɐɥʇԀ pǝpןı⅁ buıʇɐןןıɔsO", + "block.cosmiccore.pcb_foundry": "ʎɹpunoℲ ᗺƆԀǝ§", + "block.cosmiccore.plasmite_distillery": "ʎɹǝןןıʇsıᗡ ǝʇıɯsɐןԀ6§", + "block.cosmiccore.plated_aerocloud": "pnoןɔoɹǝⱯ pǝʇɐןԀ", + "block.cosmiccore.polymerizer": "ɹǝzıɹǝɯʎןoԀɐ§", + "block.cosmiccore.pressure_containment_casing": "buısɐƆ ʇuǝɯuıɐʇuoƆ ǝɹnssǝɹԀ", + "block.cosmiccore.prismatic_ore_foundry": "ʎɹpunoℲ ǝɹO ɔıʇɐɯsıɹԀ", + "block.cosmiccore.prismatic_tungstensteel_coil_block": "ʞɔoןᗺ ןıoƆ ןǝǝʇsuǝʇsbun⟘ ɔıʇɐɯsıɹԀ", + "block.cosmiccore.programable_matter_coil_block": "ʞɔoןᗺ ןıoƆ ɹǝʇʇɐW ǝןqɐɯɐɹboɹԀ", + "block.cosmiccore.psionic_galvorn_coil_block": "ʞɔoןᗺ ןıoƆ uɹoʌןɐ⅁ ɔıuoısԀ", + "block.cosmiccore.pthanterum_wave_breakers": "sɹǝʞɐǝɹᗺ ǝʌɐM ɯnɹǝʇuɐɥʇԀ", + "block.cosmiccore.pyrothermic_refinery": "ʎɹǝuıɟǝᴚ ɔıɯɹǝɥʇoɹʎԀ", + "block.cosmiccore.radioactive_filter_casing": "buısɐƆ ɹǝʇןıℲ ǝʌıʇɔɐoıpɐᴚ", + "block.cosmiccore.reflective_starmetal_casing": "buısɐƆ ןɐʇǝɯɹɐʇS ǝʌıʇɔǝןɟǝᴚ", + "block.cosmiccore.reinforced_dawnstone_casing": "buısɐƆ ǝuoʇsuʍɐᗡ pǝɔɹoɟuıǝᴚ", + "block.cosmiccore.reinforced_naquadria_casing": "buısɐƆ ɐıɹpɐnbɐN pǝɔɹoɟuıǝᴚ", + "block.cosmiccore.reinforced_trinavine_coil_block": "ʞɔoןᗺ ןıoƆ ǝuıʌɐuıɹ⟘ pǝɔɹoɟuıǝᴚ", + "block.cosmiccore.resonant_virtue_meld_coil_block": "ʞɔoןᗺ ןıoƆ pןǝW ǝnʇɹıΛ ʇuɐuosǝᴚ", + "block.cosmiccore.resonantly_tuned_virtue_meld_casing": "buısɐƆ pןǝW ǝnʇɹıΛ pǝun⟘ ʎןʇuɐuosǝᴚ", + "block.cosmiccore.rigid_high_speed_steel_casing": "buısɐƆ ןǝǝʇS pǝǝdS ɥbıH pıbıᴚ", + "block.cosmiccore.ritual_stone": "ǝuoʇS ןɐnʇıᴚ", + "block.cosmiccore.royal_ichorium_casing": "buısɐƆ ɯnıɹoɥɔI ןɐʎoᴚ", + "block.cosmiccore.rust_stained_casing": "buısɐƆ pǝuıɐʇS ʇsnᴚ", + "block.cosmiccore.rust_weave_casing": "buısɐƆ ǝʌɐǝM ʇsnᴚ", + "block.cosmiccore.self_healing_pthanterum_casing": "buısɐƆ ɯnɹǝʇuɐɥʇԀ buıןɐǝH ɟןǝS", + "block.cosmiccore.sensor_hatch": "ɥɔʇɐH ɹosuǝS", + "block.cosmiccore.shimmering_neutronium_coil_block": "ʞɔoןᗺ ןıoƆ ɯnıuoɹʇnǝN buıɹǝɯɯıɥS", + "block.cosmiccore.somarust_casing": "buısɐƆ ʇsnɹɐɯoS", + "block.cosmiccore.soul_muted_casing": "buısɐƆ pǝʇnW ןnoS", + "block.cosmiccore.soul_stained_steel_aluminium_plated_casing": "buısɐƆ pǝʇɐןԀ ɯnıuıɯnןⱯ ןǝǝʇS pǝuıɐʇS ןnoS", + "block.cosmiccore.soul_tester": "ɹǝʇsǝ⟘ ןnoS", + "block.cosmiccore.spirit_crucible": "ǝןqıɔnɹƆ ʇıɹıdS", + "block.cosmiccore.star_ladder": "ɹǝppɐꞀ ɹɐʇS", + "block.cosmiccore.star_ladder_research_hub": "qnH ɥɔɹɐǝsǝᴚ ɹǝppɐꞀ ɹɐʇS", + "block.cosmiccore.steam_caster": "ɹǝʇsɐƆ ɯɐǝʇS", + "block.cosmiccore.steam_fluid_input_hatch": ")ɯɐǝʇS( ɥɔʇɐH ʇnduI pınןℲ", + "block.cosmiccore.steam_fluid_output_hatch": ")ɯɐǝʇS( ɥɔʇɐH ʇndʇnO pınןℲ", + "block.cosmiccore.steam_large_turbine": "ǝuıqɹn⟘ ǝbɹɐꞀ ɯɐǝʇS", + "block.cosmiccore.steam_mixing_vessel": "ןǝssǝΛ buıxıW ɯɐǝʇS", + "block.cosmiccore.steel_plated_bronze_casing": "buısɐƆ ǝzuoɹᗺ pǝʇɐןԀ ןǝǝʇS", + "block.cosmiccore.steel_rose_lantern": "uɹǝʇuɐꞀ ǝsoᴚ ןǝǝʇS", + "block.cosmiccore.steel_rose_light": "ʇɥbıꞀ ǝsoᴚ ןǝǝʇS", + "block.cosmiccore.steel_rose_light_slab": "qɐןS ʇɥbıꞀ ǝsoᴚ ןǝǝʇS", + "block.cosmiccore.steel_rose_light_stairs": "sɹıɐʇS ʇɥbıꞀ ǝsoᴚ ןǝǝʇS", + "block.cosmiccore.stellar_iris": "sıɹI ɹɐןןǝʇS", + "block.cosmiccore.stellar_neutronium_grade_magnet": "ʇǝubɐW ǝpɐɹ⅁ ɯnıuoɹʇnǝN ɹɐןןǝʇS", + "block.cosmiccore.stellar_smelting_module": "Ǝ⅁ᴚOℲ ᗡNⱯᴚ⅁ : xǝןdɯoƆ uoıʇıubI", + "block.cosmiccore.sterilization_hatch": "ɥɔʇɐH uoıʇɐzןıɹǝʇS", + "block.cosmiccore.submerged_welder": "ɹǝpןǝM pǝbɹǝɯqnSƐ§", + "block.cosmiccore.suffering_chamber": "ɹǝqɯɐɥƆ buıɹǝɟɟnSɔ§", + "block.cosmiccore.superheavy_steel_casing": "buısɐƆ ןǝǝʇS ʎʌɐǝɥɹǝdnS", + "block.cosmiccore.titan_fusion_reactor": "ɹoʇɔɐǝᴚ uoısnℲ uɐʇı⟘6§", + "block.cosmiccore.tritanium_lined_heavy_neutronium_casing": "buısɐƆ ɯnıuoɹʇnǝN ʎʌɐǝH pǝuıꞀ ɯnıuɐʇıɹ⟘", + "block.cosmiccore.uev_16a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛƎ∩ɐ§", + "block.cosmiccore.uev_16a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛƎ∩ɐ§", + "block.cosmiccore.uev_4a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛƎ∩ɐ§", + "block.cosmiccore.uev_4a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛƎ∩ɐ§", + "block.cosmiccore.uev_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌǝ∩", + "block.cosmiccore.uev_cosmic_parallel_hatch": "ɥɔʇɐH ןoɹʇuoƆ ןǝןןɐɹɐԀ ɥɔǝ⟘dɹɐM", + "block.cosmiccore.uev_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌǝ∩", + "block.cosmiccore.uev_module_hatch": "ɥɔʇɐH ǝןnpoW ǝʇıןƎ", + "block.cosmiccore.uev_roaster": "ɹǝʇsɐoᴚ ʌǝ∩", + "block.cosmiccore.uev_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛƎ∩ɐ§", + "block.cosmiccore.uev_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛƎ∩ɐ§", + "block.cosmiccore.uev_thermia_export_hatch": "ɥɔʇɐH ʇɹodxƎ ɐıɯɹǝɥ⟘ ʌǝ∩", + "block.cosmiccore.uev_thermia_import_hatch": "ɥɔʇɐH ʇɹodɯI ɐıɯɹǝɥ⟘ ʌǝ∩", + "block.cosmiccore.uev_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌǝ∩", + "block.cosmiccore.uev_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌǝ∩", + "block.cosmiccore.uev_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM ΛƎ∩", + "block.cosmiccore.uev_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM ΛƎ∩ɐ§", + "block.cosmiccore.uev_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM ΛƎ∩ɐ§", + "block.cosmiccore.uhv_16a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛH∩ㄣ§", + "block.cosmiccore.uhv_16a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛH∩ㄣ§", + "block.cosmiccore.uhv_4a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛH∩ㄣ§", + "block.cosmiccore.uhv_4a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛH∩ㄣ§", + "block.cosmiccore.uhv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌɥ∩", + "block.cosmiccore.uhv_cosmic_parallel_hatch": "ɥɔʇɐH ןoɹʇuoƆ ןǝןןɐɹɐԀ ǝɯǝɹʇxƎ", + "block.cosmiccore.uhv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌɥ∩", + "block.cosmiccore.uhv_module_hatch": "ɥɔʇɐH ǝןnpoW pǝɔuɐʌpⱯ", + "block.cosmiccore.uhv_naquahine_mini_reactor": "ɹ§ ɹoʇɐɹǝuǝ⅁ ɹoʇɔɐǝᴚ ıuıW ǝuıɥɐnbɐN ɔıdƎㄣ§", + "block.cosmiccore.uhv_roaster": "ɹǝʇsɐoᴚ ʌɥ∩", + "block.cosmiccore.uhv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛH∩ㄣ§", + "block.cosmiccore.uhv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛH∩ㄣ§", + "block.cosmiccore.uhv_thermia_export_hatch": "ɥɔʇɐH ʇɹodxƎ ɐıɯɹǝɥ⟘ ʌɥ∩", + "block.cosmiccore.uhv_thermia_import_hatch": "ɥɔʇɐH ʇɹodɯI ɐıɯɹǝɥ⟘ ʌɥ∩", + "block.cosmiccore.uhv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌɥ∩", + "block.cosmiccore.uhv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌɥ∩", + "block.cosmiccore.uhv_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM ΛH∩", + "block.cosmiccore.uhv_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM ΛH∩ㄣ§", + "block.cosmiccore.uhv_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM ΛH∩ㄣ§", + "block.cosmiccore.uiv_16a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛI∩ᄅ§", + "block.cosmiccore.uiv_16a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛI∩ᄅ§", + "block.cosmiccore.uiv_4a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛI∩ᄅ§", + "block.cosmiccore.uiv_4a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛI∩ᄅ§", + "block.cosmiccore.uiv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌı∩", + "block.cosmiccore.uiv_cosmic_parallel_hatch": "ɥɔʇɐH ןoɹʇuoƆ ןǝןןɐɹɐԀ ǝןdɯıS", + "block.cosmiccore.uiv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌı∩", + "block.cosmiccore.uiv_roaster": "ɹǝʇsɐoᴚ ʌı∩", + "block.cosmiccore.uiv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛI∩ᄅ§", + "block.cosmiccore.uiv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛI∩ᄅ§", + "block.cosmiccore.uiv_thermia_export_hatch": "ɥɔʇɐH ʇɹodxƎ ɐıɯɹǝɥ⟘ ʌı∩", + "block.cosmiccore.uiv_thermia_import_hatch": "ɥɔʇɐH ʇɹodɯI ɐıɯɹǝɥ⟘ ʌı∩", + "block.cosmiccore.uiv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌı∩", + "block.cosmiccore.uiv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌı∩", + "block.cosmiccore.uiv_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM ΛI∩", + "block.cosmiccore.uiv_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM ΛI∩ᄅ§", + "block.cosmiccore.uiv_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM ΛI∩ᄅ§", + "block.cosmiccore.ultimate_combustion_engine_cc": "ɔƆ ǝuıbuƎ uoıʇsnqɯoƆ ǝʇɐɯıʇן∩", + "block.cosmiccore.ultimate_intake": "ǝʞɐʇuI ǝʇɐɯıʇן∩", + "block.cosmiccore.ultra_powered_casing": "buısɐƆ pǝɹǝʍoԀ ɐɹʇן∩", + "block.cosmiccore.ulv_energy_output_hatch_16a": "ɥɔʇɐH oɯɐuʎᗡ Ɐ9Ɩ ΛꞀ∩8§", + "block.cosmiccore.ulv_energy_output_hatch_4a": "ɥɔʇɐH oɯɐuʎᗡ Ɐㄣ ΛꞀ∩8§", + "block.cosmiccore.uv_16a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ Λ∩Ɛ§", + "block.cosmiccore.uv_16a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ Λ∩Ɛ§", + "block.cosmiccore.uv_4a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ Λ∩Ɛ§", + "block.cosmiccore.uv_4a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ Λ∩Ɛ§", + "block.cosmiccore.uv_biolab": "ɹ§ qɐꞀ oıᗺ ǝʇɐɯıʇן∩Ɛ§", + "block.cosmiccore.uv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌ∩", + "block.cosmiccore.uv_cosmic_parallel_hatch": "ɥɔʇɐH ןoɹʇuoƆ ןǝןןɐɹɐԀ ǝןdɯıS", + "block.cosmiccore.uv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌ∩", + "block.cosmiccore.uv_module_hatch": "ɥɔʇɐH ǝןnpoW ɔısɐᗺ", + "block.cosmiccore.uv_naquahine_mini_reactor": "ɹ§ ɹoʇɐɹǝuǝ⅁ ɹoʇɔɐǝᴚ ıuıW ǝuıɥɐnbɐN ǝʇɐɯıʇן∩Ɛ§", + "block.cosmiccore.uv_roaster": "ɹǝʇsɐoᴚ ʌ∩", + "block.cosmiccore.uv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS Λ∩Ɛ§", + "block.cosmiccore.uv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS Λ∩Ɛ§", + "block.cosmiccore.uv_thermia_export_hatch": "ɥɔʇɐH ʇɹodxƎ ɐıɯɹǝɥ⟘ ʌ∩", + "block.cosmiccore.uv_thermia_import_hatch": "ɥɔʇɐH ʇɹodɯI ɐıɯɹǝɥ⟘ ʌ∩", + "block.cosmiccore.uv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌ∩", + "block.cosmiccore.uv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌ∩", + "block.cosmiccore.uv_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM Λ∩", + "block.cosmiccore.uv_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Λ∩Ɛ§", + "block.cosmiccore.uv_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Λ∩Ɛ§", + "block.cosmiccore.uxv_16a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛX∩ǝ§", + "block.cosmiccore.uxv_16a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ ΛX∩ǝ§", + "block.cosmiccore.uxv_4a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛX∩ǝ§", + "block.cosmiccore.uxv_4a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ ΛX∩ǝ§", + "block.cosmiccore.uxv_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ʌx∩", + "block.cosmiccore.uxv_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ʌx∩", + "block.cosmiccore.uxv_roaster": "ɹǝʇsɐoᴚ ʌx∩", + "block.cosmiccore.uxv_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS ΛX∩ǝ§", + "block.cosmiccore.uxv_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS ΛX∩ǝ§", + "block.cosmiccore.uxv_thermia_export_hatch": "ɥɔʇɐH ʇɹodxƎ ɐıɯɹǝɥ⟘ ʌx∩", + "block.cosmiccore.uxv_thermia_import_hatch": "ɥɔʇɐH ʇɹodɯI ɐıɯɹǝɥ⟘ ʌx∩", + "block.cosmiccore.uxv_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ʌx∩", + "block.cosmiccore.uxv_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ʌx∩", + "block.cosmiccore.uxv_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM ΛX∩ǝ§", + "block.cosmiccore.uxv_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM ΛX∩ǝ§", + "block.cosmiccore.vibrant_rubidium_casing": "buısɐƆ ɯnıpıqnᴚ ʇuɐɹqıΛ", + "block.cosmiccore.vile_fission": "ɹoʇɔɐǝᴚ uoıssıℲ buıɹǝʇsǝℲɔ§", + "block.cosmiccore.void_fluid_rig": "bıᴚ pınןℲ pıoΛɔ§", + "block.cosmiccore.void_miner": "ɹǝuıW pıoΛɔ§", + "block.cosmiccore.void_salt_fissiom": "ɹoʇɔɐǝᴚ uoıssıℲ ʇןɐS pǝɥɔnoʇpıoΛϛ§", + "block.cosmiccore.vomahine_celestial_laser_bore": "ǝɹoᗺ ɹǝsɐꞀ ןɐıʇsǝןǝƆ ǝuıɥɐɯoΛ", + "block.cosmiccore.vorax_reactor": "ɹoʇɔɐǝᴚ xɐɹoΛ", + "block.cosmiccore.wailing_ichor_casing": "buısɐƆ ɹoɥɔI buıןıɐM", + "block.cosmiccore.wasp": "]ԀSⱯM[ ɯɹoɟʇɐןԀ uoıʇɐɹɐdǝS pıoɹǝʇsⱯ ǝpıM", + "block.cosmiccore.wear_resistant_ruridit_casing": "buısɐƆ ʇıpıɹnᴚ ʇuɐʇsısǝᴚ ɹɐǝM", + "block.cosmiccore.wireless_data_hatch": "ɥɔʇɐH ɐʇɐᗡ ssǝןǝɹıM", + "block.cosmiccore.wireless_data_transmitter": "ɹǝʇʇıɯsuɐɹ⟘ ɐʇɐᗡ ssǝןǝɹıM", + "block.cosmiccore.zblan_glass": "ssɐן⅁ uɐןqZ", + "block.cosmiccore.zpm_16a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ WԀZɔ§", + "block.cosmiccore.zpm_16a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐ9Ɩ WԀZɔ§", + "block.cosmiccore.zpm_4a_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ WԀZɔ§", + "block.cosmiccore.zpm_4a_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM Ɐㄣ WԀZɔ§", + "block.cosmiccore.zpm_biolab": "ɹ§III qɐꞀ oıᗺ ǝʇıןƎɔ§", + "block.cosmiccore.zpm_calx_reactor": "ɹoʇɔɐǝᴚ xןɐƆ ɯdZ", + "block.cosmiccore.zpm_cosmic_parallel_hatch": "ɥɔʇɐH ןoɹʇuoƆ ןǝןןɐɹɐԀ ǝןdɯıS", + "block.cosmiccore.zpm_mana_leaching_tub": "qn⟘ buıɥɔɐǝꞀ ɐuɐW ɯdZ", + "block.cosmiccore.zpm_naquahine_mini_reactor": "ɹ§III ɹoʇɐɹǝuǝ⅁ ɹoʇɔɐǝᴚ ıuıW ǝuıɥɐnbɐN ǝʇıןƎɔ§", + "block.cosmiccore.zpm_roaster": "ɹǝʇsɐoᴚ ɯdZ", + "block.cosmiccore.zpm_soul_input_hatch": "ɥɔʇɐH ʇnduI ןnoS WԀZɔ§", + "block.cosmiccore.zpm_soul_output_hatch": "ɥɔʇɐH ʇndʇnO ןnoS WԀZɔ§", + "block.cosmiccore.zpm_thermia_export_hatch": "ɥɔʇɐH ʇɹodxƎ ɐıɯɹǝɥ⟘ ɯdZ", + "block.cosmiccore.zpm_thermia_import_hatch": "ɥɔʇɐH ʇɹodɯI ɐıɯɹǝɥ⟘ ɯdZ", + "block.cosmiccore.zpm_thermomagnitizer": "ɹǝzıʇıubɐɯoɯɹǝɥ⟘ ɯdZ", + "block.cosmiccore.zpm_vacuum_bubbler": "ɹǝןqqnᗺ ɯnnɔɐΛ ɯdZ", + "block.cosmiccore.zpm_wireless_charger": "ɹǝbɹɐɥƆ ssǝןǝɹıM WԀZ", + "block.cosmiccore.zpm_wireless_energy_dynamo": "oɯɐuʎᗡ ʎbɹǝuƎ ssǝןǝɹıM WԀZɔ§", + "block.cosmiccore.zpm_wireless_energy_hatch": "ɥɔʇɐH ʎbɹǝuƎ ssǝןǝɹıM WԀZɔ§", + "block.gtceu.extreme_combustion_engine_cc": "ǝuıbuƎ uoıʇsnqɯoƆ ǝɯǝɹʇxƎ", + "block.gtceu.high_pressure_assembler": "ɹǝןqɯǝssⱯ ǝɹnssǝɹԀ ɥbıH", + "block.gtceu.hp_steam_bender": "ɹǝpuǝᗺ ɯɐǝʇS ǝɹnssǝɹԀ ɥbıH", + "block.gtceu.hp_steam_wiremill": "ןןıɯǝɹıM ɯɐǝʇS ǝɹnssǝɹԀ ɥbıH", + "block.gtceu.industrial_primitive_blast_furnace": "ǝɔɐuɹnℲ ʇsɐןᗺ ǝʌıʇıɯıɹԀ ןɐıɹʇsnpuI", + "block.gtceu.iv_naquahine_mini_reactor": "ɹ§ɹoʇɔɐǝᴚ ǝuıɥɐnbɐN oɹɔıWƐ§", + "block.gtceu.large_combustion_engine_cc": "ǝuıbuƎ uoıʇsnqɯoƆ ǝbɹɐꞀ", + "block.gtceu.lp_steam_bender": "ʇsıxƎ ʎןןɐnʇɔⱯ ʇ,uoᗡ I", + "block.gtceu.lp_steam_wiremill": "ʇsıxƎ ʎןןɐnʇɔⱯ ʇ,uoᗡ I", + "block.gtceu.ludicrous_combustion_engine_cc": "ǝuıbuƎ uoıʇsnqɯoƆ snoɹɔıpnꞀ", + "block.gtceu.luv_naquahine_mini_reactor": "ɹ§ɹoʇɔɐǝᴚ ǝuıɥɐnbɐN oɹɔıW pǝɔuɐʌpⱯp§", + "block.gtceu.steam_caster": "ɹǝıɟıpıןoS ɹǝʇsɐƆ ɯɐǝʇS", + "block.gtceu.steam_fluid_input_hatch": "ɥɔʇɐH ʇnduI ǝzuoɹᗺ", + "block.gtceu.steam_fluid_output_hatch": "ɥɔʇɐH ʇndʇnO ǝzuoɹᗺ", + "block.gtceu.steam_mixing_vessel": "ןǝssǝΛ buıxıW ɯɐǝʇS ǝbɹɐꞀ9§", + "block.gtceu.uhv_naquahine_mini_reactor": "ɹ§ɹoʇɔɐǝᴚ ǝuıɥɐnbɐN oɹɔıW ɔıdƎㄣ§", + "block.gtceu.ultimate_combustion_engine_cc": "ǝuıbuƎ uoıʇsnqɯoƆ ǝʇɐɯıʇן∩", + "block.gtceu.uv_naquahine_mini_reactor": "ɹ§ɹoʇɔɐǝᴚ ǝuıɥɐnbɐN oɹɔıW ǝʇɐɯıʇן∩Ɛ§", + "block.gtceu.zpm_naquahine_mini_reactor": "ɹ§ɹoʇɔɐǝᴚ ǝuıɥɐnbɐN oɹɔıW ǝʇıןƎɔ§", + "config.jade.plugin_cosmiccore.drone_maintenance_interface": "ǝɔɐɟɹǝʇuI ǝɔuɐuǝʇuıɐW ǝuoɹᗡ ]ǝɹoƆɔıɯsoƆ[", + "config.jade.plugin_cosmiccore.drone_station": "oɟuI uoıʇɐʇS ǝuoɹᗡ ]ǝɹoƆɔıɯsoƆ[", + "config.jade.plugin_cosmiccore.pcb_parallel": "ןǝןןɐɹɐԀ ʎɹpunoℲ ᗺƆԀ ]ǝɹoƆɔıɯsoƆ[", + "config.jade.plugin_cosmiccore.stellar_module": "oɟuI ǝןnpoW ɹɐןןǝʇS ]ǝɹoƆɔıɯsoƆ[", + "cosmic.command.wireless.energy.active": "%s q§:ǝʌıʇɔⱯq§ ", + "cosmic.command.wireless.energy.buffered": "∩Ǝ %s q§:pǝɹǝɟɟnᗺq§ ", + "cosmic.command.wireless.energy.capacitor": " q§:uoıʇɐɔoꞀ ɹoʇıɔɐdɐƆq§ ", + "cosmic.command.wireless.energy.capacity": "∩Ǝ %s q§:ʎʇıɔɐdɐƆq§ ", + "cosmic.command.wireless.energy.header": ":ǝ§)ǝ§ %s ǝ§( oɟuI ʞɹoʍʇǝN ʎbɹǝuƎ ssǝןǝɹıMǝ§", + "cosmic.command.wireless.energy.input": "ʇ/∩Ǝ %s q§:ʇnduIq§ ", + "cosmic.command.wireless.energy.location.format": "%d=z %d=ʎ %d=x : %s", + "cosmic.command.wireless.energy.no.capacitor": "ɹoʇıɔɐdɐƆ pǝɯɹoℲ oN", + "cosmic.command.wireless.energy.output": "ʇ/∩Ǝ %s q§:ʇndʇnOq§ ", + "cosmic.command.wireless.energy.player": "%s ɐ§:ɹǝʎɐןԀɐ§", + "cosmic.command.wireless.energy.stored": "∩Ǝ %s q§:pǝɹoʇSq§ ", + "cosmic.command.wireless.energy.team": "%s ɐ§:ɯɐǝ⟘ɐ§", + "cosmic.gui.wireless.energy.active": "%s q§:ǝʌıʇɔⱯq§ ", + "cosmic.gui.wireless.energy.buffered": "∩Ǝ %s q§:pǝɹǝɟɟnᗺq§ ", + "cosmic.gui.wireless.energy.capacitor": " q§:uoıʇɐɔoꞀ ɹoʇıɔɐdɐƆq§ ", + "cosmic.gui.wireless.energy.capacity": "∩Ǝ %s q§:ʎʇıɔɐdɐƆq§ ", + "cosmic.gui.wireless.energy.header": ":ǝ§)ǝ§ %s ǝ§( oɟuI ʞɹoʍʇǝN ʎbɹǝuƎ ssǝןǝɹıMǝ§", + "cosmic.gui.wireless.energy.input": "ʇ/∩Ǝ %s q§:NIɐ§", + "cosmic.gui.wireless.energy.location.format": "%d=z %d=ʎ %d=x : %s", + "cosmic.gui.wireless.energy.net": "ʇ/∩Ǝ %s :⟘ƎN ∩Ǝɐ§ ", + "cosmic.gui.wireless.energy.no.capacitor": "ɹoʇıɔɐdɐƆ pǝɯɹoℲ oN", + "cosmic.gui.wireless.energy.output": "ʇ/∩Ǝ %s q§:ʇ⟘∩Oɔ§", + "cosmic.gui.wireless.energy.player": "%s ɐ§:ɹǝʎɐןԀɐ§", + "cosmic.gui.wireless.energy.stored": "%s/%sɟ§ %sq§ ǝbɐɹoʇSǝ§", + "cosmic.gui.wireless.energy.team": "%s ɐ§:ɯɐǝ⟘ɐ§", + "cosmic.multiblock.capacitor.buffered": "∩Ǝㄥ§ %s :pǝɹǝɟɟnᗺㄥ§", + "cosmic.multiblock.capacitor.duplicate.multiblock.1": "ǝʇɐɔıןdnp ɐ sı ʞɔoןqıʇןnɯ sıɥ⟘", + "cosmic.multiblock.capacitor.duplicate.multiblock.2": "ʇsıxǝ uɐɔ ǝuo ʎןuO", + "cosmic.multiblock.capacitor.info.global": "ןɐqoן⅁", + "cosmic.multiblock.capacitor.info.local": "ןɐɔoꞀ", + "cosmic.multiblock.capacitor.info.tittle.global": "oɟuI ʞɹoʍʇǝN ןɐqoן⅁", + "cosmic.multiblock.capacitor.info.tittle.local": " oɟuI ɹǝɟɟnᗺ ןɐɔoꞀ", + "cosmic.multiblock.capacitor.owner.null": "punoɟ ʇou ɹǝuʍO", + "cosmic.multiblock.orvex_count": "%s :ㄥ§pǝʇɔɐɹʇxƎ ǝnpısǝᴚ xǝʌɹOɟ§", + "cosmic.multiblock.orvex_tier": "%s9§ :ㄥ§ɹǝı⟘ ɹoʇɔɐǝᴚɟ§", + "cosmic.multiblock.orvex_upgrade_check": "%sɐ§ :snʇɐʇS ǝpɐɹbd∩ɟ§", + "cosmic.multiblock.orvex_upgrade_requires": "%s :ㄥ§sǝɹınbǝᴚ ǝpɐɹbd∩ɟ§", + "cosmic.multiblock.parallel": "%d :ןǝןןɐɹɐԀ ןɐuıbıɹO\n%d :ןǝןןɐɹɐԀ xɐW\nxㄣ ʎq sןǝןןɐɹɐԀ buıpɐoןɹǝʌO", + "cosmic.multiblock.parallel.exact": "ןǝןןɐɹɐԀ uı sǝdıɔǝᴚ %d buıɯɹoɟɹǝԀ", + "cosmic.multiblock.parallel_fixed_64": "%d :ןǝןןɐɹɐԀ xɐW", + "cosmic.multiblock.parallel_fixed_64.exact": "ןǝןןɐɹɐԀ uı sǝdıɔǝᴚ %d buıɯɹoɟɹǝԀ", + "cosmiccore.arklys.1": "ǝɹnʇɔnɹʇS - ʞɹⱯ9§", + "cosmiccore.arklys.2": "ǝsɐǝןǝᴚ - sʎꞀ9§", + "cosmiccore.armor.sanguinewarptech.hud.LP": "%sɔ§ :ǝɔɹoℲ ǝɟıꞀㄣ§", + "cosmiccore.armor.sanguinewarptech.hud.shieldstate": "%s :pןǝıɥS ǝuınbuɐS", + "cosmiccore.armor.sanguinewarptech.message.death_defiance": "¡ɥʇɐǝp ɯoɹɟ noʎ pǝʇɔǝʇoɹd ɹoɯɹɐ ǝuınbuɐs ɹnoʎ", + "cosmiccore.booster.tooltip.prefix": "%s ɹǝı⟘ ɹ§:ɹǝʇsooᗺq§", + "cosmiccore.boots.hud.jump": "%s :dɯnſ", + "cosmiccore.boots.hud.speed": "%s %s :pǝǝdS", + "cosmiccore.boots.hud.speed_simple": "%s :pǝǝdS", + "cosmiccore.boots.inertia_cancel": "%s :buıuǝdɯɐᗡ ɐıʇɹǝuI", + "cosmiccore.boots.jump_modifier": "%s :ɹǝıɟıpoW dɯnſ", + "cosmiccore.boots.max_speed": "%s :pǝǝdS xɐW", + "cosmiccore.boots.message.inertia": "%s :buıuǝdɯɐᗡ ɐıʇɹǝuI", + "cosmiccore.boots.message.jump": "%s :ɹǝıɟıpoW dɯnſ", + "cosmiccore.boots.message.speed": "%s :ɹǝıɟıpoW pǝǝdS", + "cosmiccore.boots.message.step": "%s :ʇsıssⱯ dǝʇS", + "cosmiccore.boots.speed_modifier": "%s :ɹǝıɟıpoW pǝǝdS", + "cosmiccore.boots.step_assist": "%s :ʇsıssⱯ dǝʇS", + "cosmiccore.calorific.tooltip.prefix": "%s ɹ§:ɔıɟıɹoןɐƆϛ§", + "cosmiccore.calx_reactor.desc": "ǝuɐɔɹⱯ ǝɥʇ ɥʇıʍ sɹǝpuoʍ buıʞɹoM", + "cosmiccore.circuit.lore.tier.max.0": "ʇınɔɹıƆ ɹǝı⟘ XⱯW", + "cosmiccore.circuit.lore.tier.max.1": "˙ʎɹɐnʇıqO uɐ ʇnq -ɹossǝɔoɹd ɐ ʇoN", + "cosmiccore.circuit.lore.tier.max.2": "˙ǝɔuǝʇsıxƎ :ʇnduI", + "cosmiccore.circuit.lore.tier.max.3": "˙uoısnןɔuoɔ ǝןbuıs Ɐ :ʇndʇnO", + "cosmiccore.conjuct_arklythar.1": "ǝɹnʇɔnɹʇS - ʞɹⱯ9§", + "cosmiccore.conjuct_arklythar.2": "ǝbɹoℲ - ɹɐɥ⟘9§", + "cosmiccore.conjuct_arklythar_emotion.1": "ǝʌןosǝᴚ - Ɐ˙ᴚ˙Ǝq§", + "cosmiccore.conjuct_kholys.1": "ǝɔɐdS - ɹoɥʞ9§", + "cosmiccore.conjuct_kholys.2": "ǝsɐǝןǝᴚ - sʎꞀ9§", + "cosmiccore.conjuct_kholys_emotion.1": "ǝɔuǝpıɟuoƆ - Ɐ˙ᴚ˙Ǝq§", + "cosmiccore.conjuct_valkruth.1": "buıɯןǝɥʍɹǝʌO - ןɐΛ9§", + "cosmiccore.conjuct_valkruth.2": "uoıʇɐpunoℲ - ɥʇnᴚ9§", + "cosmiccore.conjuct_valkruth_emotion.1": "ǝɔuǝbɹǝʌuoƆ - Ɐ˙ᴚ˙Ǝq§", + "cosmiccore.datastick.link_copied": "%s :ʞuıꞀ", + "cosmiccore.ember.capacity": "%s 9§:ʎʇıɔɐdɐƆ ɹǝqɯƎɔ§", + "cosmiccore.ember.transfer": "%s 9§:ǝʇɐᴚ ɹǝɟsuɐɹ⟘ ɹǝqɯƎɔ§", + "cosmiccore.errors.bad_fuel": "ʇıun ɹǝd ןɐʇoʇ ∩Ǝ 0ᄅㄥ> ǝq ʇsnW ʇndʇnO ןǝnℲ \n ¡ʎʇıןɐnὉ ןǝnℲ ʇuǝıɔıɟɟnsuIɐ§", + "cosmiccore.gui.stellar.show_modules": "ןoɹʇuoƆ ǝןnpoW ʍoɥS", + "cosmiccore.gui.stellar.show_star": "ʍǝıΛ ɹɐʇS ʍoɥS", + "cosmiccore.item.linked_terminal.boundTo": "%s oʇ punoᗺ", + "cosmiccore.item.spraycan.actionbar.color": "%s :ɹoןoƆ uɐƆ ʎɐɹdS", + "cosmiccore.item.spraycan.gui.solvent": ")ɹoןoƆ dıɹʇS( ʇuǝʌןoS", + "cosmiccore.item.spraycan.gui.title": "uɐƆ ʎɐɹdS ɔıʇɐɯsıɹԀ", + "cosmiccore.item.spraycan.locked": "pǝʞɔoן sı uɐƆ ʎɐɹdS", + "cosmiccore.item.spraycan.now_locked": "pǝʞɔoן uɐƆ ʎɐɹdS", + "cosmiccore.item.spraycan.now_unlocked": "pǝʞɔoןun uɐƆ ʎɐɹdS", + "cosmiccore.item.spraycan.tooltip.current_color": "%s :ɹoןoƆ ʇuǝɹɹnƆ", + "cosmiccore.item.spraycan.tooltip.lclick": "ɹoןoɔ ǝןɔʎƆ8§ :ʞɔıןƆ ʇɟǝꞀㄣ§", + "cosmiccore.item.spraycan.tooltip.lclick_sneak": "ɹoןoɔ ǝןɔʎƆ8§ :ʞɐǝuS + ʞɔıןƆ ʇɟǝꞀㄣ§", + "cosmiccore.item.spraycan.tooltip.locked": "pǝʞɔoן sı uɐɔʎɐɹdS", + "cosmiccore.item.spraycan.tooltip.rclick": "ʞɔoןq ʇuıɐԀ8§ :ʞɔıןƆ ʇɥbıᴚㄣ§", + "cosmiccore.item.spraycan.tooltip.rclick_offhand": "ʇuıɐd & ǝɔɐןԀ8§ :puɐɥɟɟO uı ʞɔıןƆ ʇɥbıᴚϛ§", + "cosmiccore.item.spraycan.tooltip.rclick_sneak": "I∩ uǝdO8§ :ʞɐǝuS + ʞɔıןƆ ʇɥbıᴚϛ§", + "cosmiccore.item.spraycan.tooltip.solvent_mode": "ǝpoɯ ⟘NƎΛꞀOS uı uɐɔʎɐɹdS", + "cosmiccore.jade.stellar_module.connected": "pǝʇɔǝuuoƆ :sıɹI", + "cosmiccore.jade.stellar_module.energy_usage": "%s :ǝbɐs∩", + "cosmiccore.jade.stellar_module.iris_not_ready": "ʎpɐǝᴚ ʇoN :sıɹI", + "cosmiccore.jade.stellar_module.no_wireless": "ʞɹoʍʇǝN ssǝןǝɹıM oN", + "cosmiccore.jade.stellar_module.not_connected": "pǝʇɔǝuuoƆ ʇoN :sıɹI", + "cosmiccore.jade.stellar_module.speed_bonus": "%s :pǝǝdS", + "cosmiccore.jade.stellar_module.stage": "%s :ǝbɐʇS", + "cosmiccore.khoruth.1": "ǝɔɐdS - ɹoɥʞ9§", + "cosmiccore.khoruth.2": "uoıʇɐpunoℲ - ɥʇnᴚ9§", + "cosmiccore.link.already_linked": "pǝʞuıן ʎpɐǝɹןɐ ǝɹɐ sǝuıɥɔɐɯ ǝsǝɥ⟘", + "cosmiccore.link.cannot_self_link": "ɟןǝsʇı oʇ ǝuıɥɔɐɯ ɐ ʞuıן ʇouuɐƆ", + "cosmiccore.link.copied": "%s ɯoɹɟ pǝıdoɔ ɐʇɐp ʞuıꞀ", + "cosmiccore.link.different_owner": "sɯɐǝʇ ʇuǝɹǝɟɟıp ʎq pǝuʍo sǝuıɥɔɐɯ ʞuıן ʇouuɐƆ", + "cosmiccore.link.established": "%s ↔ %s :pǝɥsıןqɐʇsǝ ʞuıꞀ", + "cosmiccore.link.incompatible_partner": "ǝdʎʇ sıɥʇ oʇ ʞuıן ʇouuɐɔ ǝuıɥɔɐɯ ɹǝuʇɹɐԀ", + "cosmiccore.link.incompatible_roles": "%s oʇ ʞuıן ʇouuɐɔ %s :sǝןoɹ ʞuıן ǝןqıʇɐdɯoɔuI", + "cosmiccore.link.incompatible_self": "ǝdʎʇ ʇɐɥʇ oʇ ʞuıן ʇouuɐɔ ǝuıɥɔɐɯ sıɥ⟘", + "cosmiccore.link.invalid_data": "ʞɔıʇsɐʇɐp uo ɐʇɐp ʞuıן pıןɐʌuI", + "cosmiccore.link.limit_reached_partner": "ʇıɯıן ʞuıן sʇı pǝɥɔɐǝɹ sɐɥ ǝuıɥɔɐɯ ɹǝuʇɹɐԀ", + "cosmiccore.link.limit_reached_self": "ʇıɯıן ʞuıן sʇı pǝɥɔɐǝɹ sɐɥ ǝuıɥɔɐɯ sıɥ⟘", + "cosmiccore.link.not_linkable": "buıʞuıן ʇɹoddns ʇou sǝop ǝuıɥɔɐɯ ʇǝbɹɐ⟘", + "cosmiccore.link.not_ready": "buıʞuıן ɹoɟ ʎpɐǝɹ ʇou ǝuıɥɔɐW", + "cosmiccore.link.partner_missing": "sʇsıxǝ ɹǝbuoן ou ǝuıɥɔɐɯ ɹǝuʇɹɐԀ", + "cosmiccore.link.partner_not_loaded": "ʞuıן ɥsıןqɐʇsǝ oʇ pǝpɐoן ǝq ʇsnɯ ǝuıɥɔɐɯ ɹǝuʇɹɐԀ", + "cosmiccore.link.partner_offline": "ǝuıןɟɟo ɹǝuʇɹɐd pǝʞuıꞀ", + "cosmiccore.link.too_far": "buıʞuıן ɹoɟ pɐoן-ǝɔɹoɟ oʇ ʎɐʍɐ ɹɐɟ ooʇ sı ɹǝuʇɹɐԀ", + "cosmiccore.lore.broken_virtue.0": "ʎןʇɟoS sɹǝppnɥS ʎʇınʇǝdɹǝԀ", + "cosmiccore.lore.broken_virtue.1": "˙buoɹʍ ʎɹǝʌ ǝuob sɐɥ buıɥʇǝɯoS", + "cosmiccore.lore.shard_huge.0": "˙ʎʇıuɹǝʇǝ ʇsɐd ɯoɹɟ ɹǝʇsnןɔ ǝʌıssɐɯ ʎןןɐɯɹouqɐ uⱯƐ§", + "cosmiccore.lore.shard_huge.1": "˙ʎɹoʇsıɥ opun oʇ noʎ ʇɐ sןıɐʍ puɐ sɯɐǝɹɔs ʇıƐ§", + "cosmiccore.lore.shard_huge.2": "˙sıɥʇ puɐʇsɹǝpun oʇ buıʎɹʇ sɹǝʇʇɐɥs puıɯ ɹnoʎɔ§", + "cosmiccore.lore.shard_large.0": "ʎʇıuɹǝʇǝ ʇsɐd ɐ ɯoɹɟ ʇuǝɯbɐɹɟ ǝbɹɐן Ɐɐ§", + "cosmiccore.lore.shard_large.1": "˙ǝʇɐɟ ǝʇıɹʍǝɹ oʇ soɥɔǝ ʇıɐ§", + "cosmiccore.lore.shard_small.0": "ʎʇıuɹǝʇǝ ʇsɐd ɐ ɯoɹɟ pɹɐɥs Ɐ9§", + "cosmiccore.lore.shard_small.1": "˙ǝʇɐɟ ǝʇıɹʍǝɹ oʇ soɥɔǝ ʎןʇqns ʇı9§", + "cosmiccore.lubricant.tooltip.prefix": "%s ɹǝı⟘ ɹ§:ʇuɐɔıɹqnꞀ9§", + "cosmiccore.machine.capacitor_array.tooltip.0": "ɹ§ǝbɐɹoʇS ɹǝʍoԀ ǝsuǝᗡ ןɐɔoꞀㄥ§", + "cosmiccore.machine.capacitor_array.tooltip.1": "ɹ§sǝɯıʇ 8Ɩ oʇ dn ʎןןɐɔıʇɹǝʌ pǝpuɐdxǝ ǝq puɐ ɹoʇıɔɐdɐɔ ʎuɐ ǝsn uɐƆㄥ§", + "cosmiccore.machine.capacitor_array.tooltip.2": "ɹ§sǝɥɔʇɐH ɹǝsɐꞀ9§ sʇdǝɔɔⱯㄥ§", + "cosmiccore.machine.dreamers_basin.eu_budget_header": "ʇǝbpnᗺ ʎbɹǝuƎ", + "cosmiccore.machine.dreamers_basin.eu_per_thread": ")%s( pɐǝɹɥʇ ɹǝd ʇ/∩Ǝ %s", + "cosmiccore.machine.dreamers_basin.status_idle": "ǝdıɔǝɹ oN - ǝןpI", + "cosmiccore.machine.dreamers_basin.status_suspended": "pǝpuǝdsnS", + "cosmiccore.machine.dreamers_basin.status_unknown": "uʍouʞu∩", + "cosmiccore.machine.dreamers_basin.status_waiting": "sʇnduı ɹoɟ buıʇıɐM", + "cosmiccore.machine.dreamers_basin.thread_header": "snʇɐʇS pɐǝɹɥ⟘", + "cosmiccore.machine.dreamers_basin.threads_summary": "xɐɯ %s / ǝʌıʇɔɐ %s / buıuunɹ %s", + "cosmiccore.machine.dreamers_basin.time_remaining": "buıuıɐɯǝɹ %s :ǝɯı⟘", + "cosmiccore.machine.dreamers_basin.tooltip.0": "ʎןsnoǝuɐʇןnɯıs sǝdıɔǝɹ ǝnbıun ǝןdıʇןnɯ sunᴚq§", + "cosmiccore.machine.dreamers_basin.tooltip.1": "ɥɔʇɐɥ/snq ʇnduı ɟ§pǝɹoןoɔ9§ ʎןǝnbıun ɐ sǝɹınbǝɹ pɐǝɹɥʇ ɥɔɐƎɟ§", + "cosmiccore.machine.dreamers_basin.tooltip.2": ")9Ɩ=Ɐ9Ɩ 'ㄣ=Ɐㄣ( ǝbɐɹǝdɯɐ ɥɔʇɐH ʎbɹǝuƎ = spɐǝɹɥʇ xɐWɟ§", + "cosmiccore.machine.dreamers_basin.tooltip.3": "sǝɥɔʇɐɥ/sǝsnq ʇndʇno ǝɹɐɥs spɐǝɹɥʇ ןןⱯɐ§", + "cosmiccore.machine.dreamers_basin.tooltip.crafting": ":buıʇɟɐɹƆ", + "cosmiccore.machine.dreamers_basin.tooltip.duration": "%s :uoıʇɐɹnp ǝdıɔǝᴚ", + "cosmiccore.machine.dreamers_basin.tooltip.no_recipe": "ɐʇɐp ǝdıɔǝɹ oN", + "cosmiccore.machine.dreamers_basin.tooltip.processing": "˙˙˙buıssǝɔoɹԀ ", + "cosmiccore.machine.fluid_drilling_rig.depletion": "%0 :ǝʇɐᴚ uoıʇǝןdǝᗡq§", + "cosmiccore.machine.fluid_drilling_rig.description.0": "ɯoɹɟ pınןɟ ǝʇıuıɟuı sןןıɹᗡq§", + "cosmiccore.machine.fluid_drilling_rig.description.1": "˙pıoʌ ǝɥʇ ʇnoɥbnoɹɥʇ pǝpuǝdsns sʇǝʞɔod pınbıןq§", + "cosmiccore.machine.fluid_drilling_rig.production": "x9ϛᄅ :ɹǝıןdıʇןnW uoıʇɔnpoɹԀǝ§", + "cosmiccore.machine.me.stocking_item.tooltip.0": "ɹ§ʇoןs ɯǝʇı ɹɐןnbuıs ɐ oʇuı sʇɔnpoɹd sןןnd ʎןןɐɔıʇɐɯoʇnⱯɟ§", + "cosmiccore.machine.me.stocking_item.tooltip.1": "ɹ§ǝuıן ʎןqɯǝssⱯ ǝɥʇ ɟo uoıʇɐɯoʇnⱯ pǝɔuɐʌpⱯ sʍoןןⱯq§", + "cosmiccore.machine.me.stocking_item.tooltip.2": "ɹ§ᄅƎⱯ ɯoɹɟ ɯǝʇı ʇsɹıɟ ǝɥʇ ןןnd ʎןןɐɔıʇɐɯoʇnɐ oʇ ʇǝs ǝq uɐƆɟ§", + "cosmiccore.machine.me.stocking_item.tooltip.3": "ɹ§˙pǝɹǝʇןıɟ ʎןןɐnuɐɯ ɹoq§", + "cosmiccore.machine.me.stocking_item.tooltip.4": "ɹ§ʞɔıʇs ɐʇɐp ɐ ɥʇıʍ pǝʇsɐd/ʎdoɔ ǝq uɐɔ ɐʇɐp ɹǝʇןıℲɟ§", + "cosmiccore.machine.me.stocking_item.tooltip.5": "ɹ§sǝuıן ʎןqɯǝssɐ ןǝןןɐɹɐd oʇ ʍoɥ buıɹǝpuoʍ ǝɹ,noʎ ɟI,q§", + "cosmiccore.machine.me.stocking_item.tooltip.6": "ɹ§¡sʇǝuqns oʇ ǝɯoɔןǝM ˙ʍoɥ sı sıɥʇɟ§", + "cosmiccore.machine.multithreaded.active_threads": "%sɟ§/ㄥ§%sɐ§ :ǝʌıʇɔⱯㄥ§", + "cosmiccore.machine.multithreaded.max_threads": "%sɟ§ :spɐǝɹɥ⟘ xɐWㄥ§", + "cosmiccore.machine.multithreaded.thread_status": "=== snʇɐʇS pɐǝɹɥ⟘ ===q§", + "cosmiccore.machine.ore_extraction_drill.restarted": "pǝʇɹɐʇsǝɹ uɐɔs ןןıɹᗡ", + "cosmiccore.machine.ore_extraction_drill.tooltip.0": "pǝpɐoן ʞunɥɔ ǝq oʇ ןןıɹp ǝɥʇ buıɹınbǝɹ ʎןuo ǝןıɥʍ ןןıɹp ǝɥʇ ʍoןǝq ɐǝɹɐ ʞunɥɔ 6x6 ɐ ɯoɹɟ sǝɹo sʇɔɐɹʇxƎq§", + "cosmiccore.machine.ore_extraction_drill.tooltip.1": ")uoıʇɔɐɹʇxǝ ɹǝd ǝɹo ǝʇǝןdǝp oʇ ǝɔuɐɥɔ(ɟ§ %sǝ§ :ǝɔuɐɥƆ ןɐʌoɯǝᴚɟ§", + "cosmiccore.machine.ore_extraction_drill.tooltip.2": ")ǝɹo ɹǝd suoıʇɔɐɹʇxǝ ǝbɐɹǝʌɐ(ɟ§ x%sɐ§ :pןǝıʎ ǝʌıʇɔǝɟɟƎɟ§", + "cosmiccore.machine.ore_extraction_drill.tooltip.3": "ʇuǝsǝɹd sı ǝɹo ou ןıʇun unɹ ןןıʍ 'uoıʇǝןdɯoɔ ɹǝʇɟɐ uɐɔs ʇɹɐʇsǝɹ oʇ ɹǝʌıɹpʍǝɹɔs ǝs∩ㄥ§", + "cosmiccore.mana_leaching_tub.desc": "0006 ɹǝʞɐoS ɐuɐW", + "cosmiccore.multiblock.advanced.star_ladder_tier": "%sq§ :ɟ§sǝןnpoW ɥɔɹɐǝsǝᴚ xɐWɐ§ \n %sq§ :ɟ§ɹǝı⟘ ɹǝɥʇǝ⟘ pןOɹǝppɐꞀɹɐʇS ǝuıɥɐɯoΛɐ§", + "cosmiccore.multiblock.booster_used": "%s :ɹǝʇsooᗺ", + "cosmiccore.multiblock.chemvat.tooltip.0": "ןǝןןɐɹɐd ɟo ǝןqɐdɐɔ ʇuɐןd ןɐɔıɯǝɥɔ ǝʌıssɐɯ Ɐɐ§", + "cosmiccore.multiblock.chemvat.tooltip.1": "˙ɹǝɥʇǝboʇ sǝdıɔǝɹ ןןɐ ɟo ǝɯıʇ ǝʌıʇɐןnɯnɔ ǝɥʇ sppɐ 'pǝzıןǝןןɐɹɐd uǝɥMɟ§", + "cosmiccore.multiblock.chemvat.tooltip.2": "˙spɹɐʍɹǝʇɟɐ %ϛㄥ ʎq uɐɹ ǝdıɔǝɹ ʎuɐ ɟo ǝɯıʇ ןɐʇoʇ sǝɔnpǝᴚɟ§", + "cosmiccore.multiblock.chemvat.tooltip.3": "˙sǝɥɔʇɐɥ ɹǝsɐꞀ sʇdǝɔɔⱯ9§", + "cosmiccore.multiblock.chemvat.tooltip.4": "˙sǝɥɔʇɐH ןǝןןɐɹɐԀ ɔıɯsoƆ sʇdǝɔɔⱯ9§", + "cosmiccore.multiblock.cleaning_status": "%s :snʇɐʇS buıuɐǝןƆɐ§", + "cosmiccore.multiblock.cleaning_status.error": "¡ʇuǝbⱯ buıuɐǝןƆ oNㄣ§ :snʇɐʇS buıuɐǝןƆɔ§", + "cosmiccore.multiblock.contagion_rate": "ʇ/%s :ǝʇɐᴚ uoıbɐʇuoƆɔ§", + "cosmiccore.multiblock.current_contagion": "%s :ɥʇbuǝɹʇS uoıbɐʇuoƆ9§", + "cosmiccore.multiblock.current_field_strength": "%s :ɥʇbuǝɹʇS pןǝıℲɟ§", + "cosmiccore.multiblock.drone_maintenance_interface.connection_location": ")%s '%s '%s( oʇ pǝʇɔǝuuoɔ ʎןʇuǝɹɹnƆ", + "cosmiccore.multiblock.drone_maintenance_interface.no_connection": "pǝʇɔǝuuoɔ ʇoN", + "cosmiccore.multiblock.drone_station_machine.current_tier": "%s :ɹǝıʇ ʇuǝɹɹnƆ", + "cosmiccore.multiblock.drone_station_machine.drone_amount": "sǝuoɹp %s buıʌɹǝs ʎןʇuǝɹɹnƆ", + "cosmiccore.multiblock.drone_station_machine.no_drones": "pǝʇɔǝuuoɔ sǝuoɹp oN", + "cosmiccore.multiblock.drone_station_machine.tier.0": "ɔıʇɐɯsɐןԀ", + "cosmiccore.multiblock.drone_station_machine.tier.1": "ǝuınbuɐS", + "cosmiccore.multiblock.drone_station_machine.tier.2": "ןɐıɹʇsnpuI", + "cosmiccore.multiblock.drone_station_machine.tier.3": "ʇsnqoᴚ", + "cosmiccore.multiblock.drone_station_machine.tier.4": "ʎʇsnᴚ", + "cosmiccore.multiblock.drone_station_machine.tier.5": "ǝuoN", + "cosmiccore.multiblock.fuel_star": "ǝɹoƆ ɹɐʇS ןǝnℲן§ɐ§", + "cosmiccore.multiblock.heat_capacity": "%s :ʇɐǝH xɐWɔ§", + "cosmiccore.multiblock.heat_value": "%s :ʇɐǝH ʇuǝɹɹnƆ9§", + "cosmiccore.multiblock.hpca.incomplete-array": "ǝʇɐɹǝuǝb ʇou ןןıʍ ʎɐɹɹⱯ ǝʇǝןdɯoɔuI", + "cosmiccore.multiblock.hpsassem.tooltip.0": "¡ǝɹıdɯǝ uɐ pןınq s,ʇǝꞀo§ㄥ§", + "cosmiccore.multiblock.hpsassem.tooltip.1": "ןǝǝʇs ɟo ǝpɐɯ ɹǝןqɯǝssɐ ןnɟɹǝʍod ʇnq ǝbɹɐן Ɐɟ§", + "cosmiccore.multiblock.hpsassem.tooltip.2": "ɹ§xㄣq§ :ɟ§ʇunoɯⱯ ןǝןןɐɹɐԀɐ§", + "cosmiccore.multiblock.ipbf.tooltip.0": "¡ʇɐǝɥ ǝɥʇ dn uɹn⟘o§ㄥ§", + "cosmiccore.multiblock.ipbf.tooltip.1": "˙ʎɔuǝıɔıɟɟǝ ǝʌoɹdɯı oʇ sǝdıɔǝɹ ɥʇıʍ ǝʇosoǝɹɔ sǝɯnsuoƆɟ§", + "cosmiccore.multiblock.ipbf.tooltip.2": "˙ɹǝʇsɐℲɐ§ %ϛᄅɟ§ ǝɹɐ sǝdıɔǝᴚɐ§", + "cosmiccore.multiblock.ipbf.tooltip.3": "ɹ§x8q§ :ɟ§ʇunoɯⱯ ןǝןןɐɹɐԀɐ§", + "cosmiccore.multiblock.iris.star_stage_early_star": "ɹɐʇS ʇuɐɟuI9§ :ɟ§ǝbɐʇS ǝɹoƆ ɹɐʇSɐ§", + "cosmiccore.multiblock.iris.star_stage_empty": "pnoןƆ sɐ⅁ pǝssǝɹdɯoƆ9§ :ɟ§ǝbɐʇS ǝɹoƆ ɹɐʇSɐ§", + "cosmiccore.multiblock.iris.star_stage_request": "˙ǝbɐʇS ʇxǝN ɹoɟɔ§\n %sɹ§\n sǝɹınbǝᴚ ǝɹoƆ ɹɐʇSɔ§", + "cosmiccore.multiblock.iris.star_stage_sustain": "¡ǝɹnןıɐɟ ɔıɯsʎןɔɐʇɐɔן§ pıoʌɐ oʇɔ§\n %sɹ§\n sǝɹınbǝᴚ ɹɐʇSɔ§", + "cosmiccore.multiblock.iris.tooltip.0": "sıɥ⟘ puɐʇsɹǝpu∩ oʇ buıʎɹ⟘ sɹǝʇʇɐɥS puıW ɹnoʎɔ§", + "cosmiccore.multiblock.iris.tooltip.1": "MƎIΛƎᴚԀ IƎſ ƎH⟘ ᴚƎᗡNƎᴚ ⟘ON Oᗡ :ᴚƎ⅁NⱯᗡן§ɔ§", + "cosmiccore.multiblock.iris.tooltip.2": "ƎWⱯ⅁ ᴚ∩Oʎ HSⱯᴚƆ ᴚO ⅁ⱯꞀ ꞀꞀIM ∩Oʎ :ᴚƎ⅁NⱯᗡן§ɔ§", + "cosmiccore.multiblock.iris.tooltip.3": "pǝzıɯıʇdo/pǝןqɐsıp ǝq ןןıʍ ʍǝıʌǝɹd IƎſ - ʞɔoןqıʇןnW ǝɹnʇnℲɐ§", + "cosmiccore.multiblock.lubricant_used": "%s :ʇuɐɔıɹqnꞀ", + "cosmiccore.multiblock.magnetic_field_strength": "%s 9§:ɟ§ɥʇbuǝɹʇS pןǝıℲ xɐWɟ§", + "cosmiccore.multiblock.magnetic_regen": "ʇ/⟘%s 9§:ɟ§ǝʇɐᴚ ʎɹǝʌoɔǝᴚ pןǝıℲɐ§", + "cosmiccore.multiblock.naqreactor.tooltip.0": "ןǝnɟ ǝʌıʇɔɐǝɹ puɐ suoısoןdxǝ ʎq pǝɹǝʍod ɹoʇɔɐǝɹ ǝʌıssɐɯ Ɐɔ§", + "cosmiccore.multiblock.naqreactor.tooltip.1": "˙ʇndʇno x9Ɩ oʇ ןǝןןɐɹɐd oʇ ʇdɯǝʇʇɐ sʎɐʍןɐ ןןıMq§", + "cosmiccore.multiblock.naqreactor.tooltip.2": "˙sǝɥɔʇɐɥ ɹǝsɐꞀ sʇdǝɔɔⱯ ʎןuOɔ§", + "cosmiccore.multiblock.pattern.stellar_module_slot": ")ǝןnpoW pǝɯɹoℲ ɹo ɹıⱯ( ʇoןS ǝןnpoWㄥ§", + "cosmiccore.multiblock.reboot_powergrid": "sǝuıɥɔɐW pǝʇɔǝuuoƆ ןןⱯ ʇooqǝᴚɐ§", + "cosmiccore.multiblock.send_orbit_data": "pɐoןʎɐԀ ɥɔɹɐǝsǝᴚ puǝSן§ɐ§", + "cosmiccore.multiblock.sleep_powergrid": "sǝuıɥɔɐW pǝʇɔǝuuoƆ ןןⱯ puǝdsnSɔ§", + "cosmiccore.multiblock.star_ladder.tooltip.0": "sɹɐʇs ǝɥʇ oʇuı ʇno ɥɔɐǝɹ uoıʇɐǝɹɔ ɟo sʞɐǝd ǝɥ⟘ɔ§", + "cosmiccore.multiblock.star_ladder.tooltip.1": "⟘NƎSƎᴚԀ SSOꞀ Ɐ⟘Ɐᗡ :ᴚƎ⅁NⱯᗡן§ɔ§", + "cosmiccore.multiblock.star_ladder.tooltip.2": "ƎꞀᗺISSOԀ SI ʎᴚƎΛOƆƎᴚ :ᴚƎ⅁NⱯᗡן§ɔ§", + "cosmiccore.multiblock.star_ladder.tooltip.3": ")ΛI oʇ ɯɐǝʇS( Ɩ⟘ƆⱯ ɟo ןɐo⅁ ןɐuıℲ ǝɥ⟘ : ʞɔoןqıʇןnW ǝןɔɐuıԀɐ§", + "cosmiccore.multiblock.stellar_module.connected": "sıɹI ɹɐןןǝʇS oʇ pǝʇɔǝuuoƆɐ§", + "cosmiccore.multiblock.stellar_module.energy_usage": "%sɟ§ :ʇ/∩Ǝ ssǝןǝɹıMǝ§", + "cosmiccore.multiblock.stellar_module.iris_not_formed": "pǝɯɹoℲ ʇoN sıɹI ɹɐןןǝʇSɔ§", + "cosmiccore.multiblock.stellar_module.iris_not_ready": "ʎpɐǝᴚ ʇoN sıɹI ɹɐןןǝʇSǝ§", + "cosmiccore.multiblock.stellar_module.loading": "˙˙˙buıpɐoꞀㄥ§", + "cosmiccore.multiblock.stellar_module.no_wireless": "ʞɹoʍʇǝN ʎbɹǝuƎ ssǝןǝɹıM oNɔ§", + "cosmiccore.multiblock.stellar_module.not_connected": "sıɹI ɹɐןןǝʇS oʇ pǝʇɔǝuuoƆ ʇoNɔ§", + "cosmiccore.multiblock.stellar_module.parallel": "%sq§ :ʇıɯıꞀ ןǝןןɐɹɐԀㄥ§", + "cosmiccore.multiblock.stellar_module.power_config": "ןǝןןɐɹɐԀㄥ§ x%dɐ§ @ㄥ§ %sq§ :bıɟuoƆㄥ§", + "cosmiccore.multiblock.stellar_module.power_failure": "¡ʎbɹǝuƎ ʇuǝıɔıɟɟnsuI - Ǝᴚ∩ꞀIⱯℲ ᴚƎMOԀן§ɔ§", + "cosmiccore.multiblock.stellar_module.speed_bonus": "%sɐ§ :snuoᗺ pǝǝdSㄥ§", + "cosmiccore.multiblock.stellar_module.stage": "%sǝ§ :ǝbɐʇS sıɹIㄥ§", + "cosmiccore.omnia_circuit.ev": "˙ʇınɔɹıƆ ΛƎ ʎuɐ sɐ sʞɹoM9§", + "cosmiccore.omnia_circuit.hv": "˙ʇınɔɹıƆ ΛH ʎuɐ sɐ sʞɹoM9§", + "cosmiccore.omnia_circuit.iv": "˙ʇınɔɹıƆ ΛI ʎuɐ sɐ sʞɹoM9§", + "cosmiccore.omnia_circuit.luv": "˙ʇınɔɹıƆ ΛnꞀ ʎuɐ sɐ sʞɹoM9§", + "cosmiccore.omnia_circuit.lv": "˙ʇınɔɹıƆ ΛꞀ ʎuɐ sɐ sʞɹoM9§", + "cosmiccore.omnia_circuit.mv": "˙ʇınɔɹıƆ ΛW ʎuɐ sɐ sʞɹoM9§", + "cosmiccore.omnia_circuit.opv": "˙ʇınɔɹıƆ ΛԀO ʎuɐ sɐ sʞɹoM9§", + "cosmiccore.omnia_circuit.uev": "˙ʇınɔɹıƆ ΛƎ∩ ʎuɐ sɐ sʞɹoM9§", + "cosmiccore.omnia_circuit.uhv": "˙ʇınɔɹıƆ ΛH∩ ʎuɐ sɐ sʞɹoM9§", + "cosmiccore.omnia_circuit.uiv": "˙ʇınɔɹıƆ ΛI∩ ʎuɐ sɐ sʞɹoM9§", + "cosmiccore.omnia_circuit.uv": "˙ʇınɔɹıƆ Λ∩ ʎuɐ sɐ sʞɹoM9§", + "cosmiccore.omnia_circuit.uxv": "˙ʇınɔɹıƆ ΛX∩ ʎuɐ sɐ sʞɹoM9§", + "cosmiccore.omnia_circuit.zpm": "˙ʇınɔɹıƆ WԀZ ʎuɐ sɐ sʞɹoM9§", + "cosmiccore.recipe.asteroid_weight_greater_1": "spıoɹǝʇsⱯ ɹǝbɹɐꞀ ɯoɹɟ\nspןǝıʎ ɹǝʇɐǝɹ⅁", + "cosmiccore.recipe.condition.linked_partner.formed": "ǝɹnʇɔnɹʇs pıןɐʌ ɥʇıʍ )s(ɹǝuʇɹɐd pǝʞuıן %s sǝɹınbǝᴚ", + "cosmiccore.recipe.condition.linked_partner.tooltip": ")s(ɹǝuʇɹɐd pǝʞuıן %s sǝɹınbǝᴚ", + "cosmiccore.recipe.condition.linked_partner.working": "buıʞɹoʍ ʎןǝʌıʇɔɐ )s(ɹǝuʇɹɐd pǝʞuıן %s sǝɹınbǝᴚ", + "cosmiccore.recipe.condition.linked_partner_dimension.tooltip": "%s uı ɹǝuʇɹɐd pǝʞuıן sǝɹınbǝᴚ", + "cosmiccore.recipe.condition.linked_partner_dimension_fluid.tooltip": "%s uı ɹǝuʇɹɐd uı %s ᗺɯ%s sǝɹınbǝᴚ", + "cosmiccore.recipe.condition.linked_partner_dimension_item.tooltip": "%s uı ɹǝuʇɹɐd uı %s x%s sǝɹınbǝᴚ", + "cosmiccore.recipe.condition.titan.tooltip": "%s :ɹǝı⟘ ɹoʇɔɐǝᴚ uɐʇı⟘ sǝɹınbǝᴚ", + "cosmiccore.recipe.ember_in": "%s :ʇnduI ɹǝqɯƎ", + "cosmiccore.recipe.ember_out": "%s :ʇndʇnO ɹǝqɯƎ", + "cosmiccore.recipe.fieldDecay": "ʇ/⟘%s :ʎɐɔǝᗡ pןǝıℲɟ§", + "cosmiccore.recipe.fieldSlam": "⟘%s :pǝɯnsuoƆ pןǝıℲɟ§", + "cosmiccore.recipe.minField": "⟘%s :ɥʇbuǝɹʇS pןǝıℲ ˙uıWɟ§", + "cosmiccore.recipe.soul_in": "%s :ʇnduI ןnoS", + "cosmiccore.recipe.soul_out": "%s :ʇndʇnO ןnoS", + "cosmiccore.recipe.sterile_in": "%s %s :ɹǝzıןıɹǝʇS", + "cosmiccore.recipe.sterile_out": "¿ᴚOᴚᴚƎ", + "cosmiccore.recipe.waiting_for_partner": "ɹǝuʇɹɐd pǝʞuıן ɹoɟ buıʇıɐM", + "cosmiccore.roaster.desc": "pǝpnןɔuı ʇou sʍoןןɐɯɥsɹɐW", + "cosmiccore.rune_emotion_weak.1": "˙pǝʌɹǝsqo sı uoıʇɔɐǝɹ ⱯᴚƎ ǝʇǝןdɯoɔuı uⱯo§ㄥ§", + "cosmiccore.rune_emotion_weak.2": "˙ǝʇɐɹqıʌ oʇ ǝʇɐןs ǝɥʇ ǝsnɐɔ suoıʇɔɐǝɹ ןɐɔıɯǝɥɔ puɐ ןɐuoıʇoɯǝ buoɹʇSo§ㄥ§", + "cosmiccore.rune_vague": "˙buıssıɯ ǝq oʇ ɯǝǝs suoıʇoɯǝ ʇuǝʇɐꞀo§ㄥ§", + "cosmiccore.soul_mutilator.already_shaped": "˙%s sɐ pǝdɐɥs ʎpɐǝɹןɐ sı ןnos ɹnoʎ", + "cosmiccore.soul_mutilator.not_awakened": "˙sǝɯıʇ ǝɹoɯ ʍǝɟ ɐ ǝıᗡ ˙pǝuǝʞɐʍɐ ʇǝʎ ʇou sɐɥ ןnos ɹnoʎ", + "cosmiccore.soul_mutilator.select_shape": ":ǝdɐɥS ןnoS ɐ ʇɔǝןǝS", + "cosmiccore.soul_mutilator.shape_selected": "˙%s oʇuı pǝʇɐןıʇnɯ uǝǝq sɐɥ ןnos ɹnoʎ", + "cosmiccore.soul_shape.bloodthirst.description": "˙pǝsɹnɔ sı ǝsuǝɟǝp 'pǝɹǝʍodɯǝ ǝɹɐ suıɐbɹɐq ǝbɐɯɐᗡ ˙pǝןןıʞ ǝq ɹo ןןıʞ", + "cosmiccore.soul_shape.bloodthirst.name": "ʇsɹıɥʇpooןᗺ ǝɥ⟘", + "cosmiccore.soul_shape.bloodthirst.super.description": "˙ᴚⱯƎ⟘ ˙ᗡNⱯ ˙ԀIᴚ ˙sǝıɯǝuǝ ɥʇןɐǝɥ-ʍoן ǝʇnɔǝxǝ 'ʇxǝu ǝɥʇ oʇ ɥsɐp 'qoɯ ɐ ןןıʞ ˙ʎzuǝɹɟ ɐ ɹǝʇuƎ", + "cosmiccore.soul_shape.bloodthirst.super.name": "ɹɐǝ⟘ puɐ dıᴚ", + "cosmiccore.soul_shape.bloodthirst.tagline": "˙uıbǝq ʎǝɥʇ ǝɹoɟǝq sbuıɥʇ puǝ I", + "cosmiccore.soul_shape.bulwark.description": "˙pǝsɹnɔ sı ʎʇıןıqoɯ 'pǝɹǝʍodɯǝ ǝɹɐ suıɐbɹɐq ǝʌısuǝɟǝᗡ ˙ʇı ǝʞɐʇ noʎ ˙ʇɐǝɹʇǝɹ ʇ,uop noʎ ˙ǝbpop ʇ,uop noʎ", + "cosmiccore.soul_shape.bulwark.name": "ʞɹɐʍןnᗺ ǝɥ⟘", + "cosmiccore.soul_shape.bulwark.super.description": "˙sɹǝʞɔɐʇʇɐ oʇ ǝbɐɯɐp ʇɔǝןɟǝɹ 'ǝbɐɯɐp pǝɔnpǝɹ ʎןǝʌıssɐɯ ǝʞɐʇ 'ɐɹnɐ buıbɐɯɐp ɐ ʇıɯƎ ˙ɟןǝsɹnoʎ ʇuɐןԀ", + "cosmiccore.soul_shape.bulwark.super.name": "puɐʇS ʇsɐꞀ", + "cosmiccore.soul_shape.bulwark.tagline": "˙noʎ ʞɐǝɹq pןnoʍ ʇɐɥʍ ǝɹnpuǝ I", + "cosmiccore.soul_shape.engine.description": "˙pǝɹǝʍodɯǝ ǝɹɐ suıɐbɹɐq pǝʇɐןǝɹ-pǝǝdS ˙uoıʇɐzıɯıʇdO ˙ʇndɥbnoɹɥ⟘ ˙ʎɔuǝıɔıɟɟƎ ˙ʞɹoʍ boɔ ǝɥʇ ǝɹɐ noʎ", + "cosmiccore.soul_shape.engine.name": "ǝuıbuƎ ǝɥ⟘", + "cosmiccore.soul_shape.engine.super.description": "˙spǝǝds pǝʇsooq ʎןǝʌıssɐɯ ʇɐ pןınq puɐ 'ǝuıɯ 'ǝʌoɯ 'ʞɔɐʇʇⱯ ˙ʇuǝɯoɯ ɟıǝɹq ɐ ɹoɟ ʞɔoןɔɹǝʌO", + "cosmiccore.soul_shape.engine.super.name": "ʞɔoןɔɹǝʌO", + "cosmiccore.soul_shape.engine.tagline": "˙ooʇ ʇsnɯ I puⱯ ˙ʍoɹb ʇsnɯ ʎɹoʇɔɐɟ ǝɥ⟘", + "cosmiccore.soul_shape.globedancer.description": "˙pǝsɹnɔ sı ǝsuǝɟǝp 'pǝɹǝʍodɯǝ ǝɹɐ suıɐbɹɐq ʎʇıןıqoW ˙ǝɹǝɥʇ ʇou ǝɹɐ noʎ ǝsnɐɔǝq ʇıɥ ʇou ǝɹɐ noʎ ˙ʎʇıʇuǝpı sı ʇuǝɯǝʌoW", + "cosmiccore.soul_shape.globedancer.name": "ɹǝɔuɐpǝqoן⅁ ǝɥ⟘", + "cosmiccore.soul_shape.globedancer.super.description": "˙uoıʇoɯ pınןɟ ǝɹnԀ ˙uoısıןןoɔ ou 'ǝbɐɯɐp ןןɐɟ oN ˙ǝןqɐɥɔnoʇun ǝɯoɔǝᗺ", + "cosmiccore.soul_shape.globedancer.super.name": "ɯɐǝɹʇsdıןS", + "cosmiccore.soul_shape.globedancer.tagline": "˙ǝʞıɹʇs noʎ ǝɹǝɥʍ ɹǝʌǝu ɯɐ I", + "cosmiccore.soul_shape.hollow.description": "˙ǝsןǝ buıɥʇǝɯos ɯoɹɟ ʞooʇ noʎ 'ǝʌɐɥ noʎ buıɥʇʎɹǝʌƎ ˙ǝʞɐʇ noʎ ˙ʎןǝʌıssɐd buıɥʇou uıɐb noʎ", + "cosmiccore.soul_shape.hollow.name": "ʍoןןoH ǝɥ⟘", + "cosmiccore.soul_shape.hollow.super.description": "˙ǝʇɐ noʎ ʇɐɥʍ ɯoɹɟ ʇɐʇs ɐ ɥɔǝǝן puɐ ʇuǝɯɥsıɹnoN uıɐ⅁ ˙ǝןoɥʍ ʎʇıʇuǝ uɐ ǝɯnsuoƆ", + "cosmiccore.soul_shape.hollow.super.name": "ɹnoʌǝᗡ", + "cosmiccore.soul_shape.hollow.tagline": "˙ןןⱯ ǝɯnsuoƆ ˙ʎʇdɯǝ ɯɐ I", + "cosmiccore.soul_shape.revenant.description": "˙pǝɹǝʍodɯǝ ǝɹɐ suıɐbɹɐq pǝʇɐןǝɹ-ɥʇɐǝᗡ ˙ǝsɐɥd ɐ ʇsnظ sı ɟןǝsʇı ɥʇɐǝp ʇɐɥʇ sǝɯıʇ ʎuɐɯ os pǝıp ǝʌ,noʎ", + "cosmiccore.soul_shape.revenant.name": "ʇuɐuǝʌǝᴚ ǝɥ⟘", + "cosmiccore.soul_shape.revenant.super.description": "˙ןɐǝɹ ɹoɟ ǝıp ɹo ןןnɟ oʇ ןɐǝH ˙ןɐǝʇsǝɟıן ǝʌıssɐɯ ɥʇıʍ ǝʇɐʇs ʎɹnɟ ɐ ɹǝʇuƎ ˙ʇ,uop noʎ 'ǝıp pןnoʍ noʎ uǝɥM", + "cosmiccore.soul_shape.revenant.super.name": "ʎɟǝᗡ", + "cosmiccore.soul_shape.revenant.tagline": "˙ןןɐɟ oʇ ʇsɐן ǝɥʇ ǝq ןן,I ˙ǝıp oʇ ʇsɹıɟ ǝɥʇ sɐʍ I", + "cosmiccore.soul_shape.unshaped.description": "˙uoıʇɔǝɹıp ɟo ʞɔɐן ɹnoʎ sı os ʇnq 'ssǝןʇıɯıן sı ןɐıʇuǝʇod ɹnoʎ ˙ǝdɐɥs ɐ uǝsoɥɔ ʇǝʎ ʇou ǝʌɐɥ noʎ", + "cosmiccore.soul_shape.unshaped.name": "pǝdɐɥsu∩", + "cosmiccore.soul_shape.unshaped.tagline": "˙pǝuıɟǝpun 'ssǝןɯɹoɟ suıɐɯǝɹ ןnos ɹnoʎ", + "cosmiccore.star_ladder.abort": "⟘ᴚOᗺⱯ", + "cosmiccore.star_ladder.confirm": "WᴚIℲNOƆ", + "cosmiccore.star_ladder.demands_soul": "˙ןnoS pǝuıɟǝᴚ spuɐɯǝp ɹǝppɐꞀ ǝɥ⟘", + "cosmiccore.star_ladder.drain_rate": "s/%d :ǝʇɐɹ uıɐɹᗡ", + "cosmiccore.star_ladder.established": "ᗡƎHSIꞀᗺⱯ⟘SƎ ʞNIꞀԀ∩", + "cosmiccore.star_ladder.hub_name": "qnH ɥɔɹɐǝsǝᴚ", + "cosmiccore.star_ladder.hub_tier": "%d⟘ :ɹǝı⟘ qnH", + "cosmiccore.star_ladder.initiate": "ʞNIꞀԀ∩ Ǝ⟘ⱯI⟘INI", + "cosmiccore.star_ladder.interrupted": "ᗡƎ⟘Ԁ∩ᴚᴚƎ⟘NI ʞNIꞀԀ∩", + "cosmiccore.star_ladder.requisition": ":NOI⟘ISI∩ὉƎᴚ", + "cosmiccore.star_ladder.resisting": "˙buıʇsısǝɹ sı buıɥʇǝɯoS", + "cosmiccore.star_ladder.soul_drain": "s/%d :NIⱯᴚᗡ Ꞁ∩OS", + "cosmiccore.star_ladder.title": "ᴚƎᗡᗡⱯꞀ ᴚⱯ⟘S", + "cosmiccore.star_ladder.uplink_progress": "SSƎᴚ⅁OᴚԀ ʞNIꞀԀ∩", + "cosmiccore.star_ladder.whisper.ambient.p1.air_tastes_iron": "˙uoɹı ǝʞıן sǝʇsɐʇ ɹıɐ ǝɥ⟘", + "cosmiccore.star_ladder.whisper.ambient.p1.conduits_heating": "˙dn buıʇɐǝɥ ǝɹɐ sʇınpuoɔ ǝɥ⟘", + "cosmiccore.star_ladder.whisper.ambient.p1.dust_falling": "˙sןןɐʍ ǝɥʇ uı sʞɔɐɹɔ 'buıןıǝɔ ǝɥʇ ɯoɹɟ buıןןɐɟ ʇsnᗡ", + "cosmiccore.star_ladder.whisper.ambient.p1.floor_vibrating": "˙buıʇɐɹqıʌ sı ɹooןɟ ǝɥ⟘", + "cosmiccore.star_ladder.whisper.ambient.p1.groaning_walls": "˙sןןɐʍ ǝɥʇ uı suɐoɹb buıɥʇǝɯoS", + "cosmiccore.star_ladder.whisper.ambient.p1.lights_flicker": "˙ןıɐɟ puɐ ɹǝʞɔıןɟ sʇɥbıן ǝɥ⟘", + "cosmiccore.star_ladder.whisper.ambient.p1.low_hum": "˙buısıɹ 'ɯnɥ ʍoן Ɐ", + "cosmiccore.star_ladder.whisper.ambient.p1.metal_ticking": "˙buıʇsıʍʇ 'spuɐdxǝ ʇı sɐ buıʞɔıʇ ןɐʇǝW", + "cosmiccore.star_ladder.whisper.ambient.p1.pipes_rattling": "˙sǝssıɥ ɯɐǝʇs 'dǝǝp ǝɹǝɥʍǝɯos buıןʇʇɐɹ sǝdıԀ", + "cosmiccore.star_ladder.whisper.ambient.p1.pressure_dropping": "˙ɹıɐ ɟo punos buıɥsnɹ ǝɥʇ 'buıddoɹp ǝɹnssǝɹԀ", + "cosmiccore.star_ladder.whisper.ambient.p1.shadows_wrong": "˙ʎɐʍs sɹɐʇs ǝɥʇ 'buoɹʍ ǝɹɐ sʍopɐɥs ǝɥ⟘", + "cosmiccore.star_ladder.whisper.ambient.p1.smell_of_ozone": "˙ɹnɟןns ɟo ǝʇsɐʇ ǝɥʇ 'ɹoɥɔıɹʇǝd ɟo ןןǝɯS", + "cosmiccore.star_ladder.whisper.ambient.p1.something_woke_up": "˙pɐɯ s,ʇı puɐ 'dn ǝʞoʍ buıɥʇǝɯoS", + "cosmiccore.star_ladder.whisper.ambient.p1.sparks_corner": "˙ןɐuıɯɹǝʇ ǝɥʇ ɟo sɹǝuɹoɔ ǝɥʇ ʇɐ ǝןʞɔɐɹɔ sʞɹɐdS", + "cosmiccore.star_ladder.whisper.ambient.p1.static_on_skin": "˙pǝıɟıɹʇɔǝןǝ ɹıɐ ǝɥʇ 'uıʞs ɹnoʎ ssoɹɔɐ buıןʍɐɹɔ ɔıʇɐʇS", + "cosmiccore.star_ladder.whisper.ambient.p2.blood_in_mouth": "˙sʍoɹb ɥʇnoɯ ɹnoʎ uı pooןq ɟo ǝʇsɐ⟘", + "cosmiccore.star_ladder.whisper.ambient.p2.bolts_shearing": "˙ǝןqɐʇsun sןǝǝɟ ǝɹnʇɔnɹʇs ǝɥʇ 'ǝɯɐɹɟ ǝɥʇ ɟɟo buıɹɐǝɥs sʇןoᗺ", + "cosmiccore.star_ladder.whisper.ambient.p2.ears_ringing": "˙spɹoʍ ɹɐǝɥ noʎ ɹɐǝʍs noʎ 'buıbuıɹ ǝɹɐ sɹɐǝ ɹnoʎ", + "cosmiccore.star_ladder.whisper.ambient.p2.floor_buckling": "˙buıʇןoʌǝɹ sı pןɹoʍ ǝɥʇ 'buıןʞɔnq sı ɹooןɟ ǝɥ⟘", + "cosmiccore.star_ladder.whisper.ambient.p2.gravity_hiccup": "˙ʇuǝɯoɯ ɐ ɹoɟ ʇsnظ 'sdnɔɔıɥ ʎʇıʌɐɹ⅁", + "cosmiccore.star_ladder.whisper.ambient.p2.heat_distortion": "˙ǝbuɐɹo suɹnq ʎʞs ǝɥʇ 'ɹıɐ ǝɥʇ uı uoıʇɹoʇsıp ʇɐǝH", + "cosmiccore.star_ladder.whisper.ambient.p2.light_bends": "˙sʞɔıɹʇ buıʎɐןd ǝɹɐ sǝʎǝ ɹnoʎ 'ʇ,upןnoɥs ʇı ǝɹǝɥʍ spuǝq ʇɥbıꞀ", + "cosmiccore.star_ladder.whisper.ambient.p2.machine_screams": "˙uıɐd uı s,ʇı 'sɯɐǝɹɔs ǝuıɥɔɐɯ ǝɥ⟘", + "cosmiccore.star_ladder.whisper.ambient.p2.metal_expanding": "˙buıʞɔɐɹɔ 'buıssıɥ 'buıddod 'buıpuɐdxǝ ןɐʇǝW", + "cosmiccore.star_ladder.whisper.ambient.p2.smell_of_burning": "˙uʍouʞun sןnos puɐ ɥsǝןɟ ɟo ǝʇsɐʇ ǝɥʇ 'ǝɹǝɥʇ ʇ,usı ʇɐɥʇ buıuɹnq ɟo ןןǝɯS", + "cosmiccore.star_ladder.whisper.ambient.p2.something_cracks": "˙ʍoןǝq sʇɟıɥs ɥʇɹɐǝ ǝɥʇ 'sʞɔɐɹɔ buıɥʇǝɯoS", + "cosmiccore.star_ladder.whisper.ambient.p2.structure_resonating": "˙buıɯɹoɟ sı buos ɐ 'buıʇɐuosǝɹ sı ǝɹnʇɔnɹʇs ǝɥ⟘", + "cosmiccore.star_ladder.whisper.ambient.p2.temperature_climbing": "˙ʇɐǝʍs uı pǝʞɐos sı ʎpoq ɹnoʎ 'buıqɯıןɔ sı ǝɹnʇɐɹǝdɯǝʇ ǝɥ⟘", + "cosmiccore.star_ladder.whisper.ambient.p2.time_stutters": "˙sdɯnظ puɐ sɹǝʇʇnʇs ǝɯı⟘", + "cosmiccore.star_ladder.whisper.ambient.p2.vision_doubles": "˙ɹǝʌןıs uı pǝʞɐoןɔ uɐɯoʍ ɐ ǝǝs noʎ 'sǝןqnop uoısıʌ ɹnoʎ", + "cosmiccore.star_ladder.whisper.ambient.p2.walls_humming": "˙ʎןʇuɐpɹoɔsıp 'ǝɯɐu ʇ,uɐɔ noʎ ǝʇou ɐ buıɯɯnɥ ǝɹɐ sןןɐʍ ǝɥ⟘", + "cosmiccore.star_ladder.whisper.ambient.p3.air_tastes_of_stars": "ʇsnp ɹɐʇs ɟo sǝʇsɐʇ ɹıɐ ǝɥ⟘", + "cosmiccore.star_ladder.whisper.ambient.p3.colors_wrong": "pןnoɔ uɐɯnɥ ou sɹoןoɔ ʍǝu buıʌıǝɔɹǝd ǝɹ,noʎ", + "cosmiccore.star_ladder.whisper.ambient.p3.edges_dissolving": "sǝʌןossıp ssǝusnoıɔsuoɔ ɟo ǝbpǝ ǝɥ⟘", + "cosmiccore.star_ladder.whisper.ambient.p3.everything_shaking": "˙uosıun uı sǝʞɐɥs buıɥʇʎɹǝʌƎ", + "cosmiccore.star_ladder.whisper.ambient.p3.gravity_uncertain": "ǝɹnʇɐu puoɔǝs ǝʞıן sןǝǝɟ ʎʇıʌɐɹ⅁", + "cosmiccore.star_ladder.whisper.ambient.p3.ground_not_solid": "˙noʎ ɹǝpun sɹǝʇʇɐɥs punoɹb ǝɥ⟘", + "cosmiccore.star_ladder.whisper.ambient.p3.hands_shaking": "ɯǝɥʇ ɹǝʌoɔ sɹnoʎ ɟo ʇou pooןq ɟo sǝɔɐɹʇ 'buıʞɐɥs ǝɹɐ spuɐɥ ɹnoʎ", + "cosmiccore.star_ladder.whisper.ambient.p3.heartbeat_in_walls": "sןןɐʍ ǝɥʇ uı ʇɐǝqʇɹɐǝɥ ɹnoʎ ɹɐǝɥ uɐɔ noʎ", + "cosmiccore.star_ladder.whisper.ambient.p3.light_bending_wrong": "sǝɔɐɟ ssǝןʇunoɔ sןɐǝʌǝɹ puɐ spuǝq ʇɥbıꞀ", + "cosmiccore.star_ladder.whisper.ambient.p3.reality_thins": "ɯopuɐɹ ʇɐ suıɥʇ puɐ suǝʞɔıɥʇ ʎʇıןɐǝᴚ", + "cosmiccore.star_ladder.whisper.ambient.p3.sky_too_close": "ǝsoןɔ ʎןǝʇıuıɟuı ןǝǝɟ suǝʌɐǝɥ ǝɥ⟘", + "cosmiccore.star_ladder.whisper.ambient.p3.something_looking_back": "ʎןǝsuǝʇuı buıɹɐןb sı noʎ puoʎǝq buıɥʇǝɯoS", + "cosmiccore.star_ladder.whisper.ambient.p3.sound_from_nowhere": "puıɯ ɹnoʎ ǝpısuı ɯoɹɟ punos Ɐ", + "cosmiccore.star_ladder.whisper.ambient.p3.static_all_frequencies": "pןɹoʍ ǝɥʇ ɟo ǝsıou ɔıʇɐʇs ǝɥʇ sןǝǝɟ puıɯ ɹnoʎ", + "cosmiccore.star_ladder.whisper.ambient.p3.tinnitus_screaming": "buıuǝɟɐǝp sı punos ǝɥ⟘", + "cosmiccore.star_ladder.whisper.ambient.p3.veil_fraying": "subıןɐǝɹ ʎʞs ǝɥʇ 'buıʎɐɹɟ sı ןıǝʌ ǝɥ⟘", + "cosmiccore.star_ladder.whisper.ambient.p3.walls_breathing": "˙noʎ ɥʇıʍ ǝunʇ uı buıɥʇɐǝɹq ǝɹɐ sןןɐʍ ǝɥ⟘", + "cosmiccore.star_ladder.whisper.interrupted.no": "¿ɯH", + "cosmiccore.star_ladder.whisper.interrupted.pressure": "˙ǝɹnssǝɹԀ", + "cosmiccore.star_ladder.whisper.interrupted.silence": "˙ǝɔuǝןıS", + "cosmiccore.star_ladder.whisper.observer.p1.leave": "˙ǝuobǝᗺ", + "cosmiccore.star_ladder.whisper.observer.p1.no": "˙ǝɹǝɥ noʎ ɹoɟ buıɥʇou sı ǝɹǝɥ⟘", + "cosmiccore.star_ladder.whisper.observer.p1.not_here": "˙buıןןɐɔ ɹnoʎ ʇ,usı sıɥ⟘", + "cosmiccore.star_ladder.whisper.observer.p1.stop": "˙snoıɹnƆ", + "cosmiccore.star_ladder.whisper.observer.p2.dont_understand": "˙noʎ puoʎǝq sı sıɥʇ 'buıop ǝɹ,noʎ ʇɐɥʍ puɐʇsɹǝpun ʇ,uop noʎ", + "cosmiccore.star_ladder.whisper.observer.p2.enough": "˙ɥbnouƎ", + "cosmiccore.star_ladder.whisper.observer.p2.i_was_patient": "˙ʇɐɥʇ buıʇsǝʇ ǝɹ,noʎ 'ʇuǝıʇɐd sɐʍ I", + "cosmiccore.star_ladder.whisper.observer.p2.not_yours": "ǝʇɐǝɹɔ oʇ ǝuıɯ ǝɹǝʍ noʎ 'ǝʞɐʇ oʇ sɹnoʎ ʇou sı sıɥ⟘", + "cosmiccore.star_ladder.whisper.observer.p2.still_time": "˙ǝɔuo sıɥʇ ʇı ʇɔǝןbǝu ןן,I 'doʇs oʇ ǝɯıʇ ןןıʇs sı ǝɹǝɥ⟘", + "cosmiccore.star_ladder.whisper.observer.p2.you_were_warned": "ʇsɐd ǝɥʇ uı ʇɟǝן ǝq pןnoɥs ʇɐɥʇ sbuıɥʇ oʇuı buıbbıp ǝɹ,noʎ", + "cosmiccore.star_ladder.whisper.observer.p3.congratulations": "˙ǝɯ puoʎǝq buıɥʇǝɯos ǝuop ǝʌ,noʎ 'suoıʇɐןnʇɐɹbuoƆ", + "cosmiccore.star_ladder.whisper.observer.p3.door_opens_both_ways": "˙noʎ oʇ puɐ 'ǝɯ oʇ 'sʎɐʍ ɥʇoq suǝdo ɹoop ǝɥ⟘", + "cosmiccore.star_ladder.whisper.observer.p3.fine": "ɹǝʇsuoɯ ɐ oʇuı ɟןǝsɹnoʎ ǝʞɐɯ 'ǝuıℲ", + "cosmiccore.star_ladder.whisper.observer.p3.remember_this": "sıɥʇ pǝʇɹɐʇs noʎ 'sıɥʇ ɹǝqɯǝɯǝᴚ", + "cosmiccore.star_ladder.whisper.observer.p3.see_what_happens": "˙ǝɯ puıɟ 'suǝddɐɥ ʇɐɥʍ ǝǝs s,ʇǝꞀ", + "cosmiccore.star_ladder.whisper.observer.p3.will_not_forget": "˙ʇǝbɹoɟ noʎ ʇǝן ʇ,uoʍ I 'ʇǝbɹoɟ ʇou ןןıʍ I", + "cosmiccore.star_ladder.whisper.observer.p3.you_chose_this": "˙ʞɔɐq buıob ou s,ǝɹǝɥʇ puɐ sıɥʇ ǝsoɥɔ noʎ", + "cosmiccore.star_ladder.whisper.reflection.p1.hold": "˙uoıʇɐǝɹɔ ʎɯ 'ʎpɐǝʇs pןoH", + "cosmiccore.star_ladder.whisper.reflection.p1.its_working": "˙buıɥsnd uo dǝǝʞ oʇ pǝǝu I 'sʞɹoʍ ʇI", + "cosmiccore.star_ladder.whisper.reflection.p1.keep_feeding": "˙ʇı buıןǝnɟ dǝǝʞ oʇ pǝǝu I", + "cosmiccore.star_ladder.whisper.reflection.p2.channel_widening": "ssǝɹboɹd ǝpɐɯ ǝʌ,I -buıbɹns sı ɯɐǝɹʇs ɐʇɐp ǝɥ⟘", + "cosmiccore.star_ladder.whisper.reflection.p2.dont_stop": "¡ʇı sı sıɥʇ 'doʇs ʇ,uoᗡ", + "cosmiccore.star_ladder.whisper.reflection.p2.halfway": "˙ǝɹǝɥʇ ʎɐʍɟןɐɥ 'buıpuɐʇs ןןıʇS", + "cosmiccore.star_ladder.whisper.reflection.p3.almost_through": "˙uı buısoןɔ 'ɥbnoɹɥʇ ʇsoɯןⱯ", + "cosmiccore.star_ladder.whisper.reflection.p3.can_feel_it": "ɟןǝsʎɯ punoɹɐ buıɥʇʎɹǝʌǝ ןǝǝɟ uɐɔ I", + "cosmiccore.star_ladder.whisper.reflection.p3.one_more_push": "ʇı ןǝǝɟ uɐɔ I 'ɥsnd ǝɹoɯ ǝuO", + "cosmiccore.star_ladder.whisper.transition.complete": "˙ʇı ǝpɐɯ ǝʌ,noʎ 'ǝɔuǝןıs ǝʇǝןdɯoɔ ʎq pǝʍoןןoɟ ɯɐǝɹɔs pnoן Ɐ", + "cosmiccore.star_ladder.whisper.transition.phase_2": "˙suɐoɹb puɐ sʇɟıɥs buıɥʇǝɯoS", + "cosmiccore.star_ladder.whisper.transition.phase_3": "˙buıʎɹɔ sı pןɹoʍ ǝɥʇ 'buıʞɔɐɹɔ sı ɹǝıɹɹɐq ǝɥ⟘", + "cosmiccore.stellar.branch.collapse": "ǝsdɐןןoƆ", + "cosmiccore.stellar.branch.fusion": "uoısnℲ", + "cosmiccore.stellar.branch.ignition": "uoıʇıubI", + "cosmiccore.stellar.branch.void": "pıoΛ", + "cosmiccore.stellar.context.blackhole_line1": "pǝuıɐʇuoɔ ʎʇıɹɐןnbuıS", + "cosmiccore.stellar.context.blackhole_line2": "buıssǝɔoɹd ɔıʇoxƎ", + "cosmiccore.stellar.context.death_graceful_line1": "uʍopʇnɥs pǝןןoɹʇuoƆ", + "cosmiccore.stellar.context.death_graceful_line2": "˙˙˙ssǝɹboɹd uı", + "cosmiccore.stellar.context.death_line1": "Ǝᴚ∩ꞀIⱯℲ ꞀⱯƆI⟘IᴚƆ", + "cosmiccore.stellar.context.death_line2": "ᗡƎ⅁Ɐ⅁NƎ ƎS∩Ⅎ Ꞁ∩OS", + "cosmiccore.stellar.context.empty_line1": "puɐ pǝǝs ɹɐʇs ʇɹǝsuI", + "cosmiccore.stellar.context.empty_line2": "sǝsɐb ɹɐןןǝʇs ǝpıʌoɹd", + "cosmiccore.stellar.context.empty_line3": "˙uoıʇıubı uıbǝq oʇ", + "cosmiccore.stellar.context.growing_line1": "uoısnɟ ɹɐןןǝʇS", + "cosmiccore.stellar.context.growing_line2": "˙˙˙buıʇɐıʇıuı", + "cosmiccore.stellar.context.star_line1": "ǝʌıʇɔɐ uoısnɟ ǝןqɐʇS", + "cosmiccore.stellar.context.star_line2": "ǝןqɐןıɐʌɐ buıssǝɔoɹԀ", + "cosmiccore.stellar.context.superstar_line1": "ssɐɯ ןɐɔıʇıɹƆ :⅁NINᴚⱯM", + "cosmiccore.stellar.context.superstar_line2": "ʇuǝuıɯɯı ǝsdɐןןoƆ", + "cosmiccore.stellar.convergence.title": "ǝɔuǝbɹǝʌuoƆ ɹɐןןǝʇS", + "cosmiccore.stellar.ignition.breaking": "¡¡¡ ⅁NIʞⱯƎᴚᗺ ¡¡¡", + "cosmiccore.stellar.ignition.ignite": "Ǝ⟘IN⅁I", + "cosmiccore.stellar.ignition.requires_star": "ᴚⱯ⟘S ƎΛI⟘ƆⱯ SƎᴚI∩ὉƎᴚ", + "cosmiccore.stellar.module.config": "bıɟuoƆ ǝןnpoW", + "cosmiccore.stellar.module.current": "ʇuǝɹɹnƆ", + "cosmiccore.stellar.module.iris_limit": "ʇıɯıꞀ sıɹI", + "cosmiccore.stellar.module.max_eut": "ʇ/∩Ǝ xɐW", + "cosmiccore.stellar.module.not_linked": "sıɹI ɹɐןןǝʇS oʇ pǝʞuıן ʇoN", + "cosmiccore.stellar.module.parallel": "ןǝןןɐɹɐԀ", + "cosmiccore.stellar.module.parallel_max": ")%s xɐɯ( x%s", + "cosmiccore.stellar.module.speed_bonus": "snuoᗺ pǝǝdS", + "cosmiccore.stellar.module.stage": "ǝbɐʇS", + "cosmiccore.stellar.module.status": "snʇɐʇS", + "cosmiccore.stellar.module.status.disconnected": "ᗡƎ⟘ƆƎNNOƆSIᗡ", + "cosmiccore.stellar.module.status.idle": "ƎꞀᗡI", + "cosmiccore.stellar.module.status.iris_inactive": "ƎΛI⟘ƆⱯNI SIᴚI", + "cosmiccore.stellar.module.status.no_wireless": "SSƎꞀƎᴚIM ON", + "cosmiccore.stellar.module.status.offline": "ƎNIꞀℲℲO", + "cosmiccore.stellar.module.status.power_fail": "ꞀIⱯℲ ᴚƎMOԀ", + "cosmiccore.stellar.module.status.processing": "⅁NISSƎƆOᴚԀ", + "cosmiccore.stellar.module.status.ready": "ʎᗡⱯƎᴚ", + "cosmiccore.stellar.module.waiting_iris": "sıɹI ɹoɟ buıʇıɐM", + "cosmiccore.stellar.power.max_parallel": "ןǝןןɐɹɐԀ ɯnɯıxɐW", + "cosmiccore.stellar.power.title": "ןǝuɐԀ ןoɹʇuoƆ ɹǝʍoԀ", + "cosmiccore.stellar.power.voltage_per_parallel": "ןǝןןɐɹɐԀ ɹǝԀ ǝbɐʇןoΛ", + "cosmiccore.stellar.prestige.continue": "]ǝnuıʇuoɔ oʇ ǝɹǝɥʍʎuɐ ʞɔıןƆ[", + "cosmiccore.stellar.prestige.current_tier": "ᴚƎI⟘ ⟘NƎᴚᴚ∩Ɔ", + "cosmiccore.stellar.prestige.max_tier": "ᗡƎHƆⱯƎᴚ ᴚƎI⟘ W∩WIXⱯW", + "cosmiccore.stellar.prestige.next_tier": "%s ɹoɟ sʇd %s", + "cosmiccore.stellar.prestige.points_earned": "ᗡƎNᴚⱯƎ S⟘NIOԀ", + "cosmiccore.stellar.prestige.tier.apprentice": "ƎƆI⟘NƎᴚԀԀⱯ", + "cosmiccore.stellar.prestige.tier.expert": "⟘ᴚƎԀXƎ", + "cosmiccore.stellar.prestige.tier.grandmaster": "ᴚƎ⟘SⱯWᗡNⱯᴚ⅁", + "cosmiccore.stellar.prestige.tier.journeyman": "NⱯWʎƎNᴚ∩Oſ", + "cosmiccore.stellar.prestige.tier.master": "ᴚƎ⟘SⱯW", + "cosmiccore.stellar.prestige.tier.novice": "ƎƆIΛON", + "cosmiccore.stellar.prestige.tier.unknown": "NMONʞN∩", + "cosmiccore.stellar.prestige.tier_up": "¡Ԁ∩ ᴚƎI⟘", + "cosmiccore.stellar.prestige.title": "ƎƆNƎ⅁ᴚƎΛNOƆ ᴚⱯꞀꞀƎ⟘S", + "cosmiccore.stellar.prestige.total_points": "sʇuıod %s :ןɐʇo⟘", + "cosmiccore.stellar.slot.star_seed": "pǝǝS ɹɐʇS", + "cosmiccore.stellar.stage.controlled_shutdown": "NMOᗡ⟘∩HS ᗡƎꞀꞀOᴚ⟘NOƆ", + "cosmiccore.stellar.stage.critical_mass": "SSⱯW ꞀⱯƆI⟘IᴚƆ", + "cosmiccore.stellar.stage.emergency_protocols": "SꞀOƆO⟘OᴚԀ ʎƆNƎ⅁ᴚƎWƎ", + "cosmiccore.stellar.stage.initialization": "NOI⟘ⱯZIꞀⱯI⟘INI", + "cosmiccore.stellar.stage.singularity_control": "ꞀOᴚ⟘NOƆ ʎ⟘IᴚⱯꞀ∩⅁NIS", + "cosmiccore.stellar.stage.stellar_ignition": "NOI⟘IN⅁I ᴚⱯꞀꞀƎ⟘S", + "cosmiccore.stellar.stage.stellar_operations": "SNOI⟘ⱯᴚƎԀO ᴚⱯꞀꞀƎ⟘S", + "cosmiccore.stellar.upgrade.abyss_walker": "ɹǝʞןɐM ssʎqⱯ", + "cosmiccore.stellar.upgrade.abyss_walker.desc": "sǝdıɔǝɹ ɔıʇoxǝ buıʇsooq 'sǝʇɐןnɯnɔɔɐ ʎןǝʌıssɐd ʎbɹǝuǝ pıoΛ", + "cosmiccore.stellar.upgrade.annihilation_yield": "pןǝıʎ uoıʇɐןıɥıuuⱯ", + "cosmiccore.stellar.upgrade.annihilation_yield.desc": "ɹɐʇs ǝɥʇ sʎoɹʇsǝp 'sʇuıod ǝsɐq xϛ sǝʌıb ǝbıʇsǝɹd ƎꞀOH‾ʞƆⱯꞀᗺ", + "cosmiccore.stellar.upgrade.antimatter_injection": "uoıʇɔǝظuI ɹǝʇʇɐɯıʇuⱯ", + "cosmiccore.stellar.upgrade.antimatter_injection.desc": "ɹǝʇʇɐɯıʇuɐ ɥʇıʍ pǝןǝnɟ uǝɥʍ pǝǝds %00Ɩ+ ˙ןǝnɟ ɹǝʇʇɐɯıʇuɐ ʞɔoןu∩", + "cosmiccore.stellar.upgrade.available": "ʞɔoןun oʇ ʞɔıןƆ", + "cosmiccore.stellar.upgrade.cascading_collapse": "ǝsdɐןןoƆ buıpɐɔsɐƆ", + "cosmiccore.stellar.upgrade.cascading_collapse.desc": "sǝןnpoɯ pǝʇɔǝuuoɔ oʇ sʇuıod snuoq ʇuɐɹb sɹǝbbıɹʇ ǝbıʇsǝɹԀ", + "cosmiccore.stellar.upgrade.chromatic_tuning": "buıun⟘ ɔıʇɐɯoɹɥƆ", + "cosmiccore.stellar.upgrade.chromatic_tuning.desc": "sǝdıɔǝɹ ʇuǝɯǝןǝ buıɥɔʇɐɯ oʇ %ϛ+ sǝpıʌoɹd ɹoןoɔ ɹɐʇs ɯoʇsnƆ", + "cosmiccore.stellar.upgrade.core_harmonics": "sɔıuoɯɹɐH ǝɹoƆ", + "cosmiccore.stellar.upgrade.core_harmonics.desc": "uoıʇdɯnsuoɔ ןǝnɟ ןɐuoıʇıppɐ %0ᄅ-", + "cosmiccore.stellar.upgrade.corona_expansion": "uoısuɐdxƎ ɐuoɹoƆ", + "cosmiccore.stellar.upgrade.corona_expansion.desc": "pǝןqnop ǝbuɐɹ uoıʇɔǝuuoɔ ǝןnpoW", + "cosmiccore.stellar.upgrade.cosmic_tithe": "ǝɥʇı⟘ ɔıɯsoƆ", + "cosmiccore.stellar.upgrade.cosmic_tithe.desc": ")ɹǝıʇ ɹǝd uıɯ/Ɩ( sʇuıod ǝbıʇsǝɹd ǝʇɐɹǝuǝb ʎןǝʌıssɐԀ", + "cosmiccore.stellar.upgrade.cost": "sʇd %d :ʇsoƆ", + "cosmiccore.stellar.upgrade.dark_matter_lens": "suǝꞀ ɹǝʇʇɐW ʞɹɐᗡ", + "cosmiccore.stellar.upgrade.dark_matter_lens.desc": ")uıɯ/Ɩ( ɹǝʇʇɐW ʞɹɐᗡ sǝɔnpoɹd ʎןǝʌıssɐd ƎꞀOH‾ʞƆⱯꞀᗺ", + "cosmiccore.stellar.upgrade.decay_resistance": "ǝɔuɐʇsısǝᴚ ʎɐɔǝᗡ", + "cosmiccore.stellar.upgrade.decay_resistance.desc": ")sןǝʌǝן 0Ɩ xɐɯ( ןǝʌǝן ɹǝd ǝɔuɐʇsısǝɹ ʎɐɔǝp %Ɛ+", + "cosmiccore.stellar.upgrade.dual_sacrifice": "ǝɔıɟıɹɔɐS ןɐnᗡ", + "cosmiccore.stellar.upgrade.dual_sacrifice.desc": "sʇuıod xϛ˙ᄅ ɹoɟ sɯǝʇı ǝbıʇsǝɹd ᄅ ǝɯnsuoɔ uɐƆ", + "cosmiccore.stellar.upgrade.dyson_lattice": "ǝɔıʇʇɐꞀ uosʎᗡ", + "cosmiccore.stellar.upgrade.dyson_lattice.desc": ")ʇ/∩Ǝ ʞᄅƐ oʇ dn( ǝbɐʇs ɹɐʇs ɥʇıʍ sǝןɐɔs uoıʇɐɹǝuǝb ʎbɹǝuǝ ǝʌıssɐԀ", + "cosmiccore.stellar.upgrade.early_harvest": "ʇsǝʌɹɐH ʎןɹɐƎ", + "cosmiccore.stellar.upgrade.early_harvest.desc": ")sʇuıod %0ϛ( ǝbɐʇs ᴚⱯ⟘S ʇɐ ǝbıʇsǝɹd uɐƆ", + "cosmiccore.stellar.upgrade.echo_of_collapse": "ǝsdɐןןoƆ ɟo oɥɔƎ", + "cosmiccore.stellar.upgrade.echo_of_collapse.desc": "sǝʇnuıɯ ϛ ɹoɟ ʇsooq pǝǝds %0ᄅ ʎɹɐɹodɯǝʇ ɐ sʇuɐɹb ǝbıʇsǝɹԀ", + "cosmiccore.stellar.upgrade.efficient_consumption": "uoıʇdɯnsuoƆ ʇuǝıɔıɟɟƎ", + "cosmiccore.stellar.upgrade.efficient_consumption.desc": "ɯǝʇı ǝbıʇsǝɹd ǝɯnsuoɔ ʇ,usǝop ǝbıʇsǝɹd ǝɔuɐɥɔ %ϛƖ", + "cosmiccore.stellar.upgrade.eldritch_insight": "ʇɥbısuI ɥɔʇıɹpןƎ", + "cosmiccore.stellar.upgrade.eldritch_insight.desc": "uoıʇɐɹnbıɟuoɔ ɹɐʇs uo pǝsɐq sǝsnuoq ǝdıɔǝɹ uǝppıɥ sןɐǝʌǝᴚ", + "cosmiccore.stellar.upgrade.energy_optimization": "uoıʇɐzıɯıʇdO ʎbɹǝuƎ", + "cosmiccore.stellar.upgrade.energy_optimization.desc": ")sןǝʌǝן 0Ɩ xɐɯ( ןǝʌǝן ɹǝd ʇsoɔ ʎbɹǝuǝ %Ɛ-", + "cosmiccore.stellar.upgrade.entropy_engine": "ǝuıbuƎ ʎdoɹʇuƎ", + "cosmiccore.stellar.upgrade.entropy_engine.desc": "ןood ʇuıod ǝbıʇsǝɹd oʇ ǝʇnqıɹʇuoɔ sǝdıɔǝɹ pǝןıɐℲ", + "cosmiccore.stellar.upgrade.entropy_harvest": "ʇsǝʌɹɐH ʎdoɹʇuƎ", + "cosmiccore.stellar.upgrade.entropy_harvest.desc": "ǝbıʇsǝɹd ǝɹoɟǝq ǝɯıʇǝɟıן ɹɐʇs uo pǝsɐq sʇuıod snuoq uıɐ⅁", + "cosmiccore.stellar.upgrade.ergosphere_tap": "dɐ⟘ ǝɹǝɥdsobɹƎ", + "cosmiccore.stellar.upgrade.ergosphere_tap.desc": ")ǝʌıssɐd ʇ/∩Ǝ ᄅ6Ɩ8( ƎꞀOH‾ʞƆⱯꞀᗺ ɯoɹɟ ʎbɹǝuǝ ןɐuoıʇɐʇoɹ ʇɔɐɹʇxƎ", + "cosmiccore.stellar.upgrade.eternal_ember": "ɹǝqɯƎ ןɐuɹǝʇƎ", + "cosmiccore.stellar.upgrade.eternal_ember.desc": "ʎɐɔǝp ʎןןɐɹnʇɐu ɹǝʌǝu ǝbɐʇs ᴚⱯ⟘S ʇɐ sɹɐʇS", + "cosmiccore.stellar.upgrade.eternal_void": "pıoΛ ןɐuɹǝʇƎ", + "cosmiccore.stellar.upgrade.eternal_void.desc": "˙ƎꞀOH‾ʞƆⱯꞀᗺ buıʌɐǝן ɹǝʇɟɐ s0Ɛ ʇsısɹǝd sʇɔǝɟɟǝ pıoΛ ˙pǝןqnop ǝɹɐ sǝsnuoq ƎꞀOH‾ʞƆⱯꞀᗺ ןןⱯ", + "cosmiccore.stellar.upgrade.event_horizon_lock": "ʞɔoꞀ uozıɹoH ʇuǝʌƎ", + "cosmiccore.stellar.upgrade.event_horizon_lock.desc": "H⟘ⱯƎᗡ oʇ sʎɐɔǝp ɹǝʌǝu ƎꞀOH‾ʞƆⱯꞀᗺ", + "cosmiccore.stellar.upgrade.exotic_matter_tap": "dɐ⟘ ɹǝʇʇɐW ɔıʇoxƎ", + "cosmiccore.stellar.upgrade.exotic_matter_tap.desc": "sǝdıɔǝɹ buıssǝɔoɹd ɹǝʇʇɐɯ ɔıʇoxǝ ʞɔoןu∩", + "cosmiccore.stellar.upgrade.false_vacuum": "ɯnnɔɐΛ ǝsןɐℲ", + "cosmiccore.stellar.upgrade.false_vacuum.desc": "˙sǝdıɔǝɹ ɯnnɔɐΛ ǝsןɐℲ ʞɔoןu∩ ˙pǝןdıɹʇ sǝsnuoq pıoΛ ןןⱯ ˙sןǝʌɐɹun ʎʇıןɐǝᴚ", + "cosmiccore.stellar.upgrade.fuel_efficiency": "ʎɔuǝıɔıɟɟƎ ןǝnℲ", + "cosmiccore.stellar.upgrade.fuel_efficiency.desc": ")sןǝʌǝן 0Ɩ xɐɯ( ןǝʌǝן ɹǝd uoıʇdɯnsuoɔ ןǝnɟ %ᄅ-", + "cosmiccore.stellar.upgrade.fusion_catalyst": "ʇsʎןɐʇɐƆ uoısnℲ", + "cosmiccore.stellar.upgrade.fusion_catalyst.desc": "ɹǝʇsɐɟ %ϛᄅ ǝbɐʇs ʇxǝu oʇ ʍoɹb sɹɐʇS", + "cosmiccore.stellar.upgrade.fusion_overdrive": "ǝʌıɹpɹǝʌO uoısnℲ", + "cosmiccore.stellar.upgrade.fusion_overdrive.desc": "uoıʇdɯnsuoɔ ןǝnɟ %ϛᄅ+ 'pǝǝds buıssǝɔoɹd %0ϛ+", + "cosmiccore.stellar.upgrade.gravitational_mastery": "ʎɹǝʇsɐW ןɐuoıʇɐʇıʌɐɹ⅁", + "cosmiccore.stellar.upgrade.gravitational_mastery.desc": "sןǝןןɐɹɐd Ɛ+ sʇuɐɹb ǝbɐʇs ƎꞀOH‾ʞƆⱯꞀᗺ", + "cosmiccore.stellar.upgrade.graviton_lens": "suǝꞀ uoʇıʌɐɹ⅁", + "cosmiccore.stellar.upgrade.graviton_lens.desc": "ǝbɐʇs ɹɐʇs ɹǝd ןǝןןɐɹɐd Ɩ+", + "cosmiccore.stellar.upgrade.growth_catalyst": "ʇsʎןɐʇɐƆ ɥʇʍoɹ⅁", + "cosmiccore.stellar.upgrade.growth_catalyst.desc": ")sןǝʌǝן 0Ɩ xɐɯ( ןǝʌǝן ɹǝd pǝǝds ɥʇʍoɹb %Ɛ+", + "cosmiccore.stellar.upgrade.hawking_radiator": "ɹoʇɐıpɐᴚ buıʞʍɐH", + "cosmiccore.stellar.upgrade.hawking_radiator.desc": "ʎןǝʌıssɐd ʇ/∩Ǝ 8ㄣ0ᄅ sǝʇɐɹǝuǝb ƎꞀOH‾ʞƆⱯꞀᗺ", + "cosmiccore.stellar.upgrade.heat_death": "ɥʇɐǝᗡ ʇɐǝH", + "cosmiccore.stellar.upgrade.heat_death.desc": "˙ʇuɐʇsuı sı ǝbıʇsǝɹԀ ˙pǝןdıɹʇ sǝsnuoq ǝsdɐןןoƆ ןןⱯ ˙sbuıɥʇ ןןɐ ɟo puǝ ǝɥ⟘", + "cosmiccore.stellar.upgrade.helios_forge": "ǝbɹoℲ soıןǝH", + "cosmiccore.stellar.upgrade.helios_forge.desc": "suoıʇıpuoɔ ɹɐןןǝʇs ǝɯǝɹʇxǝ buıɹınbǝɹ sǝdıɔǝɹ ɹǝıʇ-soıןǝH ʞɔoןu∩", + "cosmiccore.stellar.upgrade.hyperdense_core": "ǝɹoƆ ǝsuǝpɹǝdʎH", + "cosmiccore.stellar.upgrade.hyperdense_core.desc": "sǝɔɹnos ןןɐ ɯoɹɟ ʇıɯıן ןǝןןɐɹɐd %0ϛ+", + "cosmiccore.stellar.upgrade.infinite_recursion": "uoısɹnɔǝᴚ ǝʇıuıɟuI", + "cosmiccore.stellar.upgrade.infinite_recursion.desc": "˙ɯǝʇı ǝbıʇsǝɹd dǝǝʞ oʇ ǝɔuɐɥɔ %ϛᄅ ˙sʇuıod xᄅ sǝʌıb ǝbıʇsǝɹԀ", + "cosmiccore.stellar.upgrade.kerr_extraction": "uoıʇɔɐɹʇxƎ ɹɹǝʞ", + "cosmiccore.stellar.upgrade.kerr_extraction.desc": "sʇɔnpoɹdʎq ɔıʇoxǝ puɐ sןǝןןɐɹɐd 9+ sʇuɐɹb ƎꞀOH‾ʞƆⱯꞀᗺ buıuuıdS", + "cosmiccore.stellar.upgrade.level": "%d / %d ןǝʌǝꞀ", + "cosmiccore.stellar.upgrade.locked": "pǝʞɔoꞀ", + "cosmiccore.stellar.upgrade.magnetic_confinement": "ʇuǝɯǝuıɟuoƆ ɔıʇǝubɐW", + "cosmiccore.stellar.upgrade.magnetic_confinement.desc": "buıssǝɔoɹd ǝʌıʇɔɐ buıɹnp doɹp ʇouuɐɔ ǝbɐʇs ɹɐʇS", + "cosmiccore.stellar.upgrade.mass_conversion": "uoısɹǝʌuoƆ ssɐW", + "cosmiccore.stellar.upgrade.mass_conversion.desc": ")oıʇɐɹ Ɩ:000Ɩ( sʇuıod ǝbıʇsǝɹd oʇuı sןɐıɹǝʇɐɯ ssǝɔxǝ ʇɹǝʌuoƆ", + "cosmiccore.stellar.upgrade.mass_efficiency": "ʎɔuǝıɔıɟɟƎ ssɐW", + "cosmiccore.stellar.upgrade.mass_efficiency.desc": "ʇsoɔ ʎbɹǝuǝ ןɐuoıʇıppɐ %ϛƖ-", + "cosmiccore.stellar.upgrade.max_level": "ꞀƎΛƎꞀ XⱯW", + "cosmiccore.stellar.upgrade.negative_mass": "ssɐW ǝʌıʇɐbǝN", + "cosmiccore.stellar.upgrade.negative_mass.desc": ")∩Ǝ uıɐb( sʇsoɔ ʎbɹǝuǝ pǝʇɹǝʌuı ǝʌɐɥ ƎꞀOH‾ʞƆⱯꞀᗺ uı sǝdıɔǝᴚ", + "cosmiccore.stellar.upgrade.neutron_cascade": "ǝpɐɔsɐƆ uoɹʇnǝN", + "cosmiccore.stellar.upgrade.neutron_cascade.desc": "ǝɔıʍʇ ɹǝbbıɹʇ oʇ ǝɔuɐɥɔ %ϛƖ ǝʌɐɥ suoıʇǝןdɯoɔ ǝdıɔǝᴚ", + "cosmiccore.stellar.upgrade.not_enough_points": "sʇuıod ɥbnouǝ ʇoN", + "cosmiccore.stellar.upgrade.omega_compression": "uoıssǝɹdɯoƆ ɐbǝɯO", + "cosmiccore.stellar.upgrade.omega_compression.desc": "˙sǝdıɔǝɹ ɐbǝɯO ʞɔoןu∩ ˙pǝןdıɹʇ sǝsnuoq uoısnℲ ןןⱯ ˙buıssǝɔoɹd ǝʇɐɯıʇן∩", + "cosmiccore.stellar.upgrade.owned": "ᗡƎNMO", + "cosmiccore.stellar.upgrade.parallel_manifold": "pןoɟıuɐW ןǝןןɐɹɐԀ", + "cosmiccore.stellar.upgrade.parallel_manifold.desc": "ʇıɯıן ןǝןןɐɹɐd ǝsɐq ᄅ+", + "cosmiccore.stellar.upgrade.parallel_threading": "buıpɐǝɹɥ⟘ ןǝןןɐɹɐԀ", + "cosmiccore.stellar.upgrade.parallel_threading.desc": ")sןǝʌǝן 8 xɐɯ( ןǝʌǝן ɹǝd ןǝןןɐɹɐd Ɩ+", + "cosmiccore.stellar.upgrade.particle_storm": "ɯɹoʇS ǝןɔıʇɹɐԀ", + "cosmiccore.stellar.upgrade.particle_storm.desc": "sǝdıɔǝɹ ɯɹoʇs ǝןɔıʇɹɐd sʞɔoןun 'sןǝןןɐɹɐd ǝsɐq ㄣ+", + "cosmiccore.stellar.upgrade.penrose_process": "ssǝɔoɹԀ ǝsoɹuǝԀ", + "cosmiccore.stellar.upgrade.penrose_process.desc": "ǝnןɐʌ ʎbɹǝuǝ sʇı ɟo %0ƐƖ ʇɔɐɹʇxǝ oʇ ƎꞀOH‾ʞƆⱯꞀᗺ oʇuı ɹǝʇʇɐɯ ʍoɹɥ⟘", + "cosmiccore.stellar.upgrade.perpetual_ignition": "uoıʇıubI ןɐnʇǝdɹǝԀ", + "cosmiccore.stellar.upgrade.perpetual_ignition.desc": "˙pǝʌןɐɥ sʇsoɔ ןǝnℲ ˙ʎɐɔǝp oʇ ǝunɯɯı ǝɹɐ sɹɐʇS", + "cosmiccore.stellar.upgrade.phoenix_protocol": "ןoɔoʇoɹԀ xıuǝoɥԀ", + "cosmiccore.stellar.upgrade.phoenix_protocol.desc": "pɐǝʇsuı ǝbɐʇs ᴚⱯ⟘S oʇ uɹnʇǝɹ oʇ ǝɔuɐɥɔ %ϛᄅ 'ǝıp pןnoʍ ɹɐʇs uǝɥM", + "cosmiccore.stellar.upgrade.photon_sphere": "ǝɹǝɥdS uoʇoɥԀ", + "cosmiccore.stellar.upgrade.photon_sphere.desc": "ƎꞀOH‾ʞƆⱯꞀᗺ uı pǝǝds %00ᄅ+ ʇǝb sǝdıɔǝɹ pǝsɐq-ʇɥbıꞀ", + "cosmiccore.stellar.upgrade.planck_resonance": "ǝɔuɐuosǝᴚ ʞɔuɐןԀ", + "cosmiccore.stellar.upgrade.planck_resonance.desc": "ʞɔıʇ Ɩ oʇ pǝɔnpǝɹ ǝɯıʇ ǝdıɔǝɹ ɯnɯıuıW", + "cosmiccore.stellar.upgrade.plasma_conduits": "sʇınpuoƆ ɐɯsɐןԀ", + "cosmiccore.stellar.upgrade.plasma_conduits.desc": "ʞɔıʇ ɹǝd uoıʇdɯnsuoɔ ןǝnɟ %0Ɩ-", + "cosmiccore.stellar.upgrade.plasma_hurricane": "ǝuɐɔıɹɹnH ɐɯsɐןԀ", + "cosmiccore.stellar.upgrade.plasma_hurricane.desc": "%0ㄣ ʎq pǝsɐǝɹɔuı pǝǝds ɥʇʍoɹb ɹɐʇS", + "cosmiccore.stellar.upgrade.point_amplifier": "ɹǝıɟıןdɯⱯ ʇuıoԀ", + "cosmiccore.stellar.upgrade.point_amplifier.desc": ")ɹoʇɔǝןןoƆ pɹɐɥS ɥʇıʍ sʞɔɐʇs( sʇuıod ǝbıʇsǝɹd %0Ɛ+", + "cosmiccore.stellar.upgrade.prereqs_needed": "pǝpǝǝu sǝʇısınbǝɹǝɹԀ", + "cosmiccore.stellar.upgrade.prestige_amplifier": "ɹǝıɟıןdɯⱯ ǝbıʇsǝɹԀ", + "cosmiccore.stellar.upgrade.prestige_amplifier.desc": ")sןǝʌǝן 0Ɩ xɐɯ( ןǝʌǝן ɹǝd sʇuıod ǝbıʇsǝɹd %ϛ+", + "cosmiccore.stellar.upgrade.prestige_momentum": "ɯnʇuǝɯoW ǝbıʇsǝɹԀ", + "cosmiccore.stellar.upgrade.prestige_momentum.desc": ")%0ϛ xɐɯ( sʇuıod %0Ɩ+ sǝʌıb ǝbıʇsǝɹd ǝʌıʇnɔǝsuoɔ ɥɔɐƎ", + "cosmiccore.stellar.upgrade.primordial_flame": "ǝɯɐןℲ ןɐıpɹoɯıɹԀ", + "cosmiccore.stellar.upgrade.primordial_flame.desc": "˙ǝıp ʇouuɐɔ sɹɐʇS ˙pǝןqnop sǝsnuoq uoıʇıubI ןןⱯ ˙ǝɹıɟ ʇsɹıɟ ǝɥ⟘", + "cosmiccore.stellar.upgrade.proton_recycler": "ɹǝןɔʎɔǝᴚ uoʇoɹԀ", + "cosmiccore.stellar.upgrade.proton_recycler.desc": "ʞɔıʇ uo ןǝnɟ ǝɯnsuoɔ ʇou oʇ ǝɔuɐɥɔ %8", + "cosmiccore.stellar.upgrade.quantum_tunneling": "buıןǝuun⟘ ɯnʇuɐnὉ", + "cosmiccore.stellar.upgrade.quantum_tunneling.desc": "ʎןʇuɐʇsuı ǝdıɔǝɹ ǝʇǝןdɯoɔ oʇ ǝɔuɐɥɔ %0Ɩ", + "cosmiccore.stellar.upgrade.quark_gluon_plasma": "ɐɯsɐןԀ uonן⅁-ʞɹɐnὉ", + "cosmiccore.stellar.upgrade.quark_gluon_plasma.desc": "ʎןuo sǝdıɔǝɹ Ԁ⅁Ὁ ɹoɟ sןǝןןɐɹɐd 8+ ˙sǝdıɔǝɹ Ԁ⅁Ὁ ʞɔoןu∩", + "cosmiccore.stellar.upgrade.relativistic_processing": "buıssǝɔoɹԀ ɔıʇsıʌıʇɐןǝᴚ", + "cosmiccore.stellar.upgrade.relativistic_processing.desc": "ʎןʇuɐʇsuı ǝʇǝןdɯoɔ sʞɔıʇ 0ᄅ ɹǝpun sǝdıɔǝᴚ", + "cosmiccore.stellar.upgrade.resonant_sacrifice": "ǝɔıɟıɹɔɐS ʇuɐuosǝᴚ", + "cosmiccore.stellar.upgrade.resonant_sacrifice.desc": "spɹɐʍǝɹ ƎꞀOH‾ʞƆⱯꞀᗺ sǝʌıb ᴚⱯ⟘SᴚƎԀ∩S ʇɐ ǝbıʇsǝɹԀ", + "cosmiccore.stellar.upgrade.sacrifice_amplifier": "ɹǝıɟıןdɯⱯ ǝɔıɟıɹɔɐS", + "cosmiccore.stellar.upgrade.sacrifice_amplifier.desc": "pǝɯnsuoɔ sʎɐʍןɐ ǝɹɐ ʇnq sʇuıod xㄣ ǝʌıb sɯǝʇı ǝbıʇsǝɹԀ", + "cosmiccore.stellar.upgrade.schwarzschild_radius": "snıpɐᴚ pןıɥɔszɹɐʍɥɔS", + "cosmiccore.stellar.upgrade.schwarzschild_radius.desc": "ʎןsnoǝuɐʇןnɯıs ssǝɔoɹd uɐɔ sɯǝʇı ǝɹoɯ - uozıɹoɥ ʇuǝʌǝ ƎꞀOH‾ʞƆⱯꞀᗺ ǝsɐǝɹɔuI", + "cosmiccore.stellar.upgrade.shard_collector": "ɹoʇɔǝןןoƆ pɹɐɥS", + "cosmiccore.stellar.upgrade.shard_collector.desc": "pǝuɹɐǝ sʇuıod ǝbıʇsǝɹd %0ᄅ+", + "cosmiccore.stellar.upgrade.singularity_engine": "ǝuıbuƎ ʎʇıɹɐןnbuıS", + "cosmiccore.stellar.upgrade.singularity_engine.desc": "˙%0ㄣ- sʇsoɔ ʎbɹǝuƎ ˙sǝsnuoq ןǝןןɐɹɐd/pǝǝds ןןɐ ǝןqnoᗡ", + "cosmiccore.stellar.upgrade.singularity_siphon": "uoɥdıS ʎʇıɹɐןnbuıS", + "cosmiccore.stellar.upgrade.singularity_siphon.desc": "%0ᄅ ʎq ʇsoɔ ʎbɹǝuǝ ǝdıɔǝɹ sǝɔnpǝɹ ǝbɐʇs ƎꞀOH‾ʞƆⱯꞀᗺ", + "cosmiccore.stellar.upgrade.solar_dominion": "uoıuıɯoᗡ ɹɐןoS", + "cosmiccore.stellar.upgrade.solar_dominion.desc": "%0ϛ ʎq pǝsɐǝɹɔuı sǝsnuoq ǝןɔʎɔǝɟıן ɹɐʇs ןןⱯ", + "cosmiccore.stellar.upgrade.solar_genesis": "sısǝuǝ⅁ ɹɐןoS", + "cosmiccore.stellar.upgrade.solar_genesis.desc": "sןǝןןɐɹɐd snuoq ǝpıʌoɹd ʇɐɥʇ sɹɐʇs-oɹɔıɯ ʎɹɐpuoɔǝs uʍɐds uɐƆ", + "cosmiccore.stellar.upgrade.stellar_compression": "uoıssǝɹdɯoƆ ɹɐןןǝʇS", + "cosmiccore.stellar.upgrade.stellar_compression.desc": "ɹǝɥbıɥ ɹo ᴚⱯ⟘SᴚƎԀ∩S ʇɐ pǝǝds %ϛᄅ+", + "cosmiccore.stellar.upgrade.stellar_debt": "ʇqǝᗡ ɹɐןןǝʇS", + "cosmiccore.stellar.upgrade.stellar_debt.desc": ")ʞɔɐqʎɐd %0ϛƖ( sǝbıʇsǝɹd ǝɹnʇnɟ ɯoɹɟ sʇuıod ǝbıʇsǝɹd ʍoɹɹoᗺ", + "cosmiccore.stellar.upgrade.stellar_efficiency": "ʎɔuǝıɔıɟɟƎ ɹɐןןǝʇS", + "cosmiccore.stellar.upgrade.stellar_efficiency.desc": ")sןǝʌǝן 0Ɩ xɐɯ( ןǝʌǝן ɹǝd pǝǝds %ᄅ+", + "cosmiccore.stellar.upgrade.stellar_nursery": "ʎɹǝsɹnN ɹɐןןǝʇS", + "cosmiccore.stellar.upgrade.stellar_nursery.desc": "ʎ⟘ԀWƎ ɟo pɐǝʇsuı ǝbɐʇs ⅁NIMOᴚ⅁ ʇɐ uıbǝq sɹɐʇs ʍǝN", + "cosmiccore.stellar.upgrade.stellar_regeneration": "uoıʇɐɹǝuǝbǝᴚ ɹɐןןǝʇS", + "cosmiccore.stellar.upgrade.stellar_regeneration.desc": "ǝbɐʇs uıɐb oʇ ɹɐʇs ɹoɟ ʞɔıʇ ɹǝd ǝɔuɐɥɔ %Ɛ", + "cosmiccore.stellar.upgrade.subspace_harmonics": "sɔıuoɯɹɐH ǝɔɐdsqnS", + "cosmiccore.stellar.upgrade.subspace_harmonics.desc": "uoıʇɐɹnp ǝdıɔǝɹ ɥʇıʍ ʎןǝsɹǝʌuı ǝןɐɔs sʇsoɔ ʎbɹǝuƎ", + "cosmiccore.stellar.upgrade.superconducting_grid": "pıɹ⅁ buıʇɔnpuoɔɹǝdnS", + "cosmiccore.stellar.upgrade.superconducting_grid.desc": "sǝdıɔǝɹ ןןɐ ɹoɟ ʇsoɔ ʎbɹǝuǝ %0Ɩ-", + "cosmiccore.stellar.upgrade.supernova_core": "ǝɹoƆ ɐʌouɹǝdnS", + "cosmiccore.stellar.upgrade.supernova_core.desc": "ʎןǝʌıssɐd spɹɐɥs ǝbıʇsǝɹd snuoq ǝʇɐɹǝuǝb +ᴚⱯ⟘SᴚƎԀ∩S ʇɐ sɹɐʇS", + "cosmiccore.stellar.upgrade.tachyon_weave": "ǝʌɐǝM uoʎɥɔɐ⟘", + "cosmiccore.stellar.upgrade.tachyon_weave.desc": "ʎןǝʌıʇıppɐ sʞɔɐʇs 'pǝǝds buıssǝɔoɹd %0Ɛ+", + "cosmiccore.stellar.upgrade.temporal_acceleration": "uoıʇɐɹǝןǝɔɔⱯ ןɐɹodɯǝ⟘", + "cosmiccore.stellar.upgrade.temporal_acceleration.desc": "pǝǝds buıssǝɔoɹd %ϛƖ+", + "cosmiccore.stellar.upgrade.temporal_echo": "oɥɔƎ ןɐɹodɯǝ⟘", + "cosmiccore.stellar.upgrade.temporal_echo.desc": "ǝnןɐʌ xƐ ɹoɟ ǝɔuo ʇɐ ןןɐ ǝsɐǝןǝɹ 'sǝbɹɐɥɔ ǝbıʇsǝɹd Ɛ oʇ dn ǝɹoʇS", + "cosmiccore.stellar.upgrade.thermal_stabilizer": "ɹǝzıןıqɐʇS ןɐɯɹǝɥ⟘", + "cosmiccore.stellar.upgrade.thermal_stabilizer.desc": "ɹǝʍoןs %ϛƖ ʎɐɔǝp sɹɐʇS", + "cosmiccore.stellar.upgrade.tier_locked": "ʍoן ooʇ ɹǝı⟘", + "cosmiccore.stellar.upgrade.tier_required": "%d ɹǝı⟘ sǝɹınbǝᴚ", + "cosmiccore.stellar.upgrade.vacuum_decay": "ʎɐɔǝᗡ ɯnnɔɐΛ", + "cosmiccore.stellar.upgrade.vacuum_decay.desc": "ʇndʇno x0Ɩ ɹoɟ sɯǝʇı ʇnduı pıoʌ oʇ ǝɔuɐɥƆ", + "cosmiccore.stellar.upgrade.void_attunement": "ʇuǝɯǝunʇʇⱯ pıoΛ", + "cosmiccore.stellar.upgrade.void_attunement.desc": ")sןǝʌǝן 0Ɩ xɐɯ( ןǝʌǝן ɹǝd sʇɔǝɟɟǝ pıoʌ ɯoɹɟ snuoq %ᄅ+", + "cosmiccore.stellar.upgrade.void_harvester": "ɹǝʇsǝʌɹɐH pıoΛ", + "cosmiccore.stellar.upgrade.void_harvester.desc": "sʇuıod ǝsɐq xƐ sǝʌıb ǝbıʇsǝɹd ƎꞀOH‾ʞƆⱯꞀᗺ", + "cosmiccore.stellar.upgrade.void_whispers": "sɹǝdsıɥM pıoΛ", + "cosmiccore.stellar.upgrade.void_whispers.desc": "snuoq pǝǝds %0ϛ+ sǝpıʌoɹd ǝbɐʇs ƎꞀOH‾ʞƆⱯꞀᗺ", + "cosmiccore.stellar.upgrade.warp_field_matrix": "xıɹʇɐW pןǝıℲ dɹɐM", + "cosmiccore.stellar.upgrade.warp_field_matrix.desc": ")pǝpǝǝu ʇɹodsuɐɹʇ ou( sǝsnq ʇndʇno oʇ ʎןʇɔǝɹıp ʇɹodǝןǝʇ sɯǝʇI", + "cosmiccore.stellar.upgrade.zero_point_tap": "dɐ⟘ ʇuıoԀ oɹǝZ", + "cosmiccore.stellar.upgrade.zero_point_tap.desc": "uoıʇǝןdɯoɔ ǝdıɔǝɹ ɹǝʇɟɐ pǝpunɟǝɹ sı ʇsoɔ ʎbɹǝuǝ ɟo %ϛ", + "cosmiccore.survey.click_tp": "ʇɹodǝןǝʇ oʇ ʞɔıןƆ", + "cosmiccore.survey.command.available_types": ":)%d( sǝdʎʇ uıǝʌ ǝןqɐןıɐʌⱯ", + "cosmiccore.survey.command.more": "suıǝʌ ǝɹoɯ %d puɐ ˙˙˙", + "cosmiccore.survey.command.nearest_veins": ":suıǝʌ ʇsǝɹɐǝN", + "cosmiccore.survey.command.no_veins_dimension": "˙uoısuǝɯıp sıɥʇ ɹoɟ pǝɹǝʇsıbǝɹ sǝdʎʇ uıǝʌ oN", + "cosmiccore.survey.command.player_only": "˙ɹǝʎɐןd ɐ ʎq unɹ ǝq ʇsnɯ puɐɯɯoɔ sıɥ⟘", + "cosmiccore.survey.command.results": "=== sʇןnsǝᴚ ʎǝʌɹnS uıǝΛ ===", + "cosmiccore.survey.command.scanning": "˙˙˙sʞɔoןq %d uıɥʇıʍ suıǝʌ buıʎǝʌɹnS", + "cosmiccore.survey.command.vein_types": " :sǝdʎʇ uıǝΛ", + "cosmiccore.survey.found": "ɯ%d uıɥʇıʍ suıǝʌ %d punoℲ", + "cosmiccore.survey.found.directional": ")ןɐuoıʇɔǝɹıp( ", + "cosmiccore.survey.header": "═══ ʎǝʌɹnS uıǝΛ ═══", + "cosmiccore.survey.mode.directional": ")°06( ǝuoƆ ןɐuoıʇɔǝɹıᗡ :ǝpoW", + "cosmiccore.survey.mode.nearest": "uıǝΛ ʇsǝɹɐǝN :ǝpoW", + "cosmiccore.survey.mode.radial": ")°09Ɛ( uɐɔS ןɐıpɐᴚ :ǝpoW", + "cosmiccore.survey.more": "ǝɹoɯ %d puɐ ˙˙˙ ", + "cosmiccore.survey.nearest": ":ʇsǝɹɐǝN", + "cosmiccore.survey.nearest_vein": ":uıǝʌ ʇsǝɹɐǝN", + "cosmiccore.survey.nearest_vein.filtered": ":)%s( uıǝʌ ʇsǝɹɐǝN", + "cosmiccore.survey.no_energy": "¡uɐɔs oʇ ʎbɹǝuǝ ɥbnouǝ ʇoN", + "cosmiccore.survey.no_veins": "punoɟ suıǝʌ oN", + "cosmiccore.survey.no_veins.directional": "uoıʇɔǝɹıp ʇɐɥʇ uı punoɟ suıǝʌ oN", + "cosmiccore.survey.no_veins.filtered": ",%s, buıɥɔʇɐɯ punoɟ suıǝʌ oN", + "cosmiccore.survey.tooltip.filter": " :ɹǝʇןıℲ uıǝΛ", + "cosmiccore.survey.tooltip.mode": " :ǝpoW ʇuǝɹɹnƆ", + "cosmiccore.survey.tooltip.radius": "sʞɔoןq %d :snıpɐᴚ uɐɔS", + "cosmiccore.survey.tooltip.shift": "ǝpoɯ ǝbuɐɥƆ :ǝs∩+ʇɟıɥSㄥ§", + "cosmiccore.survey.tooltip.use": "suıǝʌ ɹoɟ uɐɔS :ǝs∩ㄥ§", + "cosmiccore.survey.types": " :sǝdʎ⟘", + "cosmiccore.tenura.1": "ןoɹʇuoƆ - uǝ⟘9§", + "cosmiccore.tenura.2": "ʍoןℲ - ɐɹ∩9§", + "cosmiccore.thermomagnitizer.desc": "buoɹʍ ob pןnoɔ ʇɐɥʍ 'sʇǝubɐW puɐ buıʇɐǝH", + "cosmiccore.tylomir.1": "uoıʇɐɯɹoℲ - oןʎ⟘9§", + "cosmiccore.tylomir.2": "pןɹoM - ɹıW9§", + "cosmiccore.universal.boosting_agents.0": "ɹǝıןdıʇןnɯ ʇ/∩Ǝ ǝsɐǝɹɔuı oʇ sɹǝʇsooq snoıɹɐʌ ǝɯnsuoɔ uɐƆɐ§", + "cosmiccore.universal.boosting_agents.1": " s/qɯ0ᄅq§ @ ʇ/nƎɟ§ xƐɐ§ ɹoɟɟ§ uǝbʎxO9§", + "cosmiccore.universal.boosting_agents.2": " s/qɯ08q§ @ ʇ/nƎɟ§ x9ɐ§ ɹoɟɟ§ uǝbʎxO pınbıꞀ9§", + "cosmiccore.universal.boosting_agents.3": " s/qɯ0Ɩq§ @ ʇ/nƎɟ§ x6ɐ§ ɹoɟɟ§ ɹoɥɔI9§", + "cosmiccore.universal.tooltip.energy_usage": "˙buıʇɐɹǝdo ǝןıɥʍ dɯⱯ WԀZ Ɩ sǝɯnsuoƆǝ§", + "cosmiccore.universal.tooltip.lube_info.0": "pǝʇɐǝɹɔ ∩Ǝ ןɐʇoʇ ǝɥʇ sǝsɐǝɹɔuı sʇuɐɔıɹqnꞀ ɹǝʇʇǝᗺ buıpıʌoɹԀɐ§", + "cosmiccore.universal.tooltip.lube_info.1": "ɹɥ/qɯ000Ɩ @ ןɐʇoʇ ∩Ǝɟ§ xƖɔ§ :ɟ§ʇuɐɔıɹqnꞀǝ§", + "cosmiccore.universal.tooltip.lube_info.2": "ɹɥ/qɯ00ϛ @ ןɐʇoʇ ∩Ǝɟ§ xϛ˙Ɩɔ§ :ɟ§ʇuɐɔıɹqnꞀ ʌpⱯǝ§", + "cosmiccore.universal.tooltip.lube_info.3": "ɹɥ/qɯ0ϛᄅ @ ןɐʇoʇ ∩Ǝɟ§ xᄅɔ§ :ɟ§ǝsɹǝʌıu∩ ǝɥʇ ɟo sɹɐǝ⟘ǝ§", + "cosmiccore.vaccum_bubbler.desc": "uoıʇɐuıɥɔɐW uoıʇɐʇS uoıʇɐʇɐoןℲ", + "cosmiccore.valdris.1": "ɯןǝɥʍɹǝʌO - ןɐΛ9§", + "cosmiccore.valdris.2": "ʇɔǝuuoƆ - sıɹᗡ9§", + "cosmiccore.wire_coil.eu_multiplier": "ʇ/∩Ǝ %sɔ§ :ʇsoƆ ∩Ǝ ʇǝubɐWɐ§ ", + "cosmiccore.wire_coil.magnet_capacity": "ɐןsǝ⟘ %sɟ§ :ɥʇbuǝɹʇS pןǝıℲ xɐWɟ§ ", + "cosmiccore.wire_coil.magnet_regen": "ʇ/ɐןsǝ⟘ %s :ǝʇɐᴚ uǝbǝᴚ pןǝıℲϛ§ ", + "cosmiccore.wire_coil.magnet_stats": "sʇɐʇS ʇǝubɐW8§", + "cosmiccore.wireless_charger.enter_range": "]sʞɔoןq %s - ǝbuɐᴚ[ ǝbuɐɹ buıbɹɐɥɔ pǝɹǝʇuǝ ǝʌɐɥ noʎ", + "cosmiccore.wireless_charger.left_range": "]sʞɔoןq %s - ǝbuɐᴚ[ ǝbuɐɹ buıbɹɐɥɔ ʇɟǝן ǝʌɐɥ noʎ", + "cosmiccore.wireless_charger.mode.0": "]sʞɔoןq %s - ǝbuɐᴚ[ ᴚƎ⅁ᴚⱯHƆᴚƎԀ∩S :ǝpoɯ ɹǝbɹɐɥɔ ʇǝS", + "cosmiccore.wireless_charger.mode.1": "]sʞɔoןq %s - ǝbuɐᴚ[ ᗡᴚⱯᗡNⱯ⟘S :ǝpoɯ ɹǝbɹɐɥɔ ʇǝS", + "cosmiccore.wireless_charger.range.mixed": "sʞɔoןq %s uıɥʇıʍ ⱯƖ sǝıןddns 'ǝpoɯ ǝbɹɐɥƆ pɹɐpuɐʇS uı uǝɥM", + "cosmiccore.wireless_charger.range.single": "sʞɔoןq %s uıɥʇıʍ Ɐㄣ sǝıןddns 'ǝpoɯ ɹǝbɹɐɥɔɹǝdnS uı uǝɥM", + "cosmiccore.zelothar.1": "ןɐǝZ - soןǝZ9§", + "cosmiccore.zelothar.2": "ǝbɹoℲ - ɹɐɥ⟘9§", + "debug.owner.uuid": "%s ɐ§:ᗡI∩∩ ɹǝuʍOɐ§", + "debug.team.uuid": "%s ɐ§:ᗡI∩∩ ɯɐǝ⟘ɐ§", + "emi.category.cosmiccore.asteroid_mining": "suoıʇɐɹǝdO buıuıW pıoɹǝʇsⱯ", + "gtceu.hellfire_foundry": "ʎɹpunoℲ ǝɹıɟןןǝHɔ§", + "gtceu.industrial_chemvat": "ʇɐʌɯǝɥƆ ןɐıɹʇsnpuIɐ§", + "gtceu.machine.dec.tooltip.0": "˙ʇǝʞɔod ןɐuoısuǝɯıpɹǝʇuı uɐ uı ɹǝʍod sǝɹoʇS", + "gtceu.machine.dec.tooltip.1": "sǝɔɐɟɹǝʇuI ןɐuoısuǝɯıᗡ uoıʇɐʇsqnS ɹǝʍoԀq§ ɯoɹɟ/oʇ ɹǝʍod ǝʌıǝɔǝɹ/puǝs uɐƆ", + "gtceu.machine.dec.tooltip.2": "˙ɹǝʎɐןd/ɯɐǝʇ ɹǝd uoıʇɐʇsqnS ɹǝʍoԀ ɹ§ƎNOɔ§ ǝʇɐǝɹɔ ʎןuo uɐƆ", + "gtceu.machine.dec.tooltip.3": "˙uoıʇɔunɟ ʇou ןןıʍ sǝʇɐɔıןdnᗡɔ§", + "gtceu.machine.dec.tooltip.4": "ɹ§uoıʇɐʇsqnS ɹǝʍoԀɐ§ ɹnoʎ oʇ pǝʞuıן pǝʞɹoʍʇǝu ssǝןǝɹıʍ ɹnoʎ ɯoɹɟ ʇɔɐɹʇxƎ puɐ ʇɹǝsuI uɐƆㄥ§", + "gtceu.machine.steam_fluid_hatch_notice": "¡ɯɐǝʇs ɥʇıʍ ɹǝʍod oʇ ʇoN ¡sʇuǝıpǝɹbuı pınןℲ ɹoɟ sı ɥɔʇɐɥ sıɥ⟘", + "gtceu.naquahine_reactor": "ɹoʇɔɐǝᴚ ǝuıɥɐnbɐNq§", + "gtceu.titan_fusion": "ɹoʇɔɐǝᴚ uoısnℲ uɐʇı⟘", + "gui.ae2.units.eu": "∩Ǝ", + "gui.cosmiccore.ember_hatch.ember": "%s :pǝɹoʇS ɹǝqɯƎ", + "gui.cosmiccore.ember_hatch.label.export": "ɥɔʇɐH ʇndʇnO ɹǝqɯƎ", + "gui.cosmiccore.ember_hatch.label.import": "ɥɔʇɐH ʇnduI ɹǝqɯƎ", + "gui.cosmiccore.iapiary": "ʎɹɐıdⱯ ןɐıɹʇsnpuI", + "gui.cosmiccore.iapiary.duration": "%d :uoıʇɐɹnᗡ", + "gui.cosmiccore.iapiary.production_amp": "%d :dɯⱯ uoıʇɔnpoɹԀ", + "gui.cosmiccore.iapiary.yield": "%d :pןǝıʎ", + "gui.cosmiccore.soul.empty_network": "˙ʎʇdɯǝ sı ʞɹoʍʇǝN", + "gui.cosmiccore.soul.envious.name": "snoıʌuƎ", + "gui.cosmiccore.soul.gluttonous.name": "snouoʇʇnן⅁", + "gui.cosmiccore.soul.greedy.name": "ʎpǝǝɹ⅁", + "gui.cosmiccore.soul.lustful.name": "ןnɟʇsnꞀ", + "gui.cosmiccore.soul.network_contents": ":sʇuǝʇuoƆ ʞɹoʍʇǝN", + "gui.cosmiccore.soul.proud.name": "pnoɹԀ", + "gui.cosmiccore.soul.raw.name": "ʍɐᴚ", + "gui.cosmiccore.soul.refined.name": "pǝuıɟǝᴚ", + "gui.cosmiccore.soul.reset": "˙ʇǝsǝɹ uǝǝq sɐɥ ʞɹoʍʇǝu ןnoS", + "gui.cosmiccore.soul.slothful.name": "ןnɟɥʇoןS", + "gui.cosmiccore.soul.temporal.name": "ןɐɹodɯǝ⟘", + "gui.cosmiccore.soul.wrathful.name": "ןnɟɥʇɐɹM", + "gui.cosmiccore.soul_hatch.label.export": "ɥɔʇɐH ʇndʇnO ןnoS", + "gui.cosmiccore.soul_hatch.label.import": "ɥɔʇɐH ʇnduI ןnoS", + "gui.cosmiccore.soul_hatch.lp": "%s :pǝɹoʇS ԀꞀ", + "gui.cosmiccore.soul_hatch.owner": "%s :ɹǝuʍO ʞɹoʍʇǝN", + "gui.cosmiccore.sterilization_hatch": "ɥɔʇɐH uoıʇɐzıןıɹǝʇS", + "gui.cosmiccore.thermia_hatch.hatch_limit": ":ʇıɯıꞀ ˙dɯǝ⟘ɔ§", + "gui.cosmiccore.thermia_hatch.label.export": "ʇuǝΛ ʇndʇnO ɐıɯɹǝɥ⟘9§", + "gui.cosmiccore.thermia_hatch.label.import": "ʇǝʞɔoS ʇnduI ɐıɯɹǝɥ⟘9§", + "gui.cosmiccore.thermia_hatch.stored_temp": ":dɯǝ⟘ ʇuǝɹɹnƆ9§", + "item.cosmicbees.bee.modifier.aging_multiplier": "ɹǝıןdıʇןnW ǝbⱯ", + "item.cosmiccore.aberrant_essence": "ǝɔuǝssƎ ʇuɐɹɹǝqⱯ9§", + "item.cosmiccore.abrasive_rosin_millstones": "sǝuoʇsןןıW uısoᴚ ǝʌısɐɹqⱯ", + "item.cosmiccore.advanced_gene_kit": "ʇıʞ ǝuǝ⅁ pǝɔuɐʌpⱯ", + "item.cosmiccore.air_bladder": "ɹǝppɐןᗺ ɹıⱯ", + "item.cosmiccore.akashic_processor": "ɹossǝɔoɹԀ ɔıɥsɐʞⱯ", + "item.cosmiccore.akashic_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ɔıɥsɐʞⱯ", + "item.cosmiccore.akashic_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ ɔıɥsɐʞⱯ", + "item.cosmiccore.akashic_processor_supercomputer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ ɔıɥsɐʞⱯ", + "item.cosmiccore.alchemia_wafer": "]ʎɹʇsıɯǝɥƆ[ ɹǝɟɐM ɐɔıɯǝɥɔןⱯ", + "item.cosmiccore.ambrion": "]uoıɹqɯⱯ[ - ןıxǝΛ", + "item.cosmiccore.aram_chip": "dıɥƆ WⱯᴚⱯ", + "item.cosmiccore.aram_wafer": "ɹǝɟɐM WⱯᴚⱯ", + "item.cosmiccore.armored_freight_beetle_grade_1": "Ɩ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ pǝɹoɯɹⱯ", + "item.cosmiccore.armored_freight_beetle_grade_2": "ᄅ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ pǝɹoɯɹⱯ", + "item.cosmiccore.armored_freight_beetle_grade_3": "Ɛ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ pǝɹoɯɹⱯ", + "item.cosmiccore.armored_freight_beetle_grade_4": "ㄣ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ pǝɹoɯɹⱯ", + "item.cosmiccore.armored_freight_beetle_grade_5": "ϛ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ pǝɹoɯɹⱯ", + "item.cosmiccore.asteroid_targeting_chip": "dıɥƆ buıʇǝbɹɐ⟘ pıoɹǝʇsⱯ", + "item.cosmiccore.auric_asteroid": "pıoɹǝʇsⱯ ɔıɹnⱯ", + "item.cosmiccore.basic_gene_kit": "ʇıʞ ǝuǝ⅁ ɔısɐᗺ", + "item.cosmiccore.bee_comb_abrasive": "qɯoƆ ǝʌısɐɹqⱯ", + "item.cosmiccore.bee_comb_absent": "qɯoƆ ʇuǝsqⱯ", + "item.cosmiccore.bee_comb_ambrosic": "qɯoƆ ɔısoɹqɯⱯ", + "item.cosmiccore.bee_comb_architect": "qɯoƆ ʇɔǝʇıɥɔɹⱯ", + "item.cosmiccore.bee_comb_ashen": "qɯoƆ uǝɥsⱯ", + "item.cosmiccore.bee_comb_biohazard": "qɯoƆ pɹɐzɐɥoıᗺ", + "item.cosmiccore.bee_comb_citrus_polymer": "qɯoƆ ɹǝɯʎןoԀ snɹʇıƆ", + "item.cosmiccore.bee_comb_cobbled": "qɯoƆ pǝןqqoƆ", + "item.cosmiccore.bee_comb_constructive": "qɯoƆ ǝʌıʇɔnɹʇsuoƆ", + "item.cosmiccore.bee_comb_cosmos": "qɯoƆ soɯsoƆ", + "item.cosmiccore.bee_comb_energized": "qɯoƆ pǝzıbɹǝuƎ", + "item.cosmiccore.bee_comb_exhaustive": "qɯoƆ ǝʌıʇsnɐɥxƎ", + "item.cosmiccore.bee_comb_fate": "qɯoƆ ǝʇɐℲ", + "item.cosmiccore.bee_comb_fracking": "qɯoƆ buıʞɔɐɹℲ", + "item.cosmiccore.bee_comb_grand_garden": "qɯoƆ uǝpɹɐ⅁ puɐɹ⅁", + "item.cosmiccore.bee_comb_hadal": "qɯoƆ ןɐpɐH", + "item.cosmiccore.bee_comb_hellsmith": "qɯoƆ ɥʇıɯsןןǝH", + "item.cosmiccore.bee_comb_hydraulic": "qɯoƆ ɔıןnɐɹpʎH", + "item.cosmiccore.bee_comb_illusive": "qɯoƆ ǝʌısnןןI", + "item.cosmiccore.bee_comb_inquisitive": "qɯoƆ ǝʌıʇısınbuI", + "item.cosmiccore.bee_comb_lofty_argon": "qɯoƆ uobɹⱯ ʎʇɟoꞀ", + "item.cosmiccore.bee_comb_lofty_hydrogen": "qɯoƆ uǝboɹpʎH ʎʇɟoꞀ", + "item.cosmiccore.bee_comb_lofty_nitrogen": "qɯoƆ uǝboɹʇıN ʎʇɟoꞀ", + "item.cosmiccore.bee_comb_lofty_oxygen": "qɯoƆ uǝbʎxO ʎʇɟoꞀ", + "item.cosmiccore.bee_comb_lunar": "qɯoƆ ɹɐunꞀ", + "item.cosmiccore.bee_comb_pale": "qɯoƆ ǝןɐԀ", + "item.cosmiccore.bee_comb_prismatic": "qɯoƆ ɔıʇɐɯsıɹԀ", + "item.cosmiccore.bee_comb_pyrolytic": "qɯoƆ ɔıʇʎןoɹʎԀ", + "item.cosmiccore.bee_comb_radoxia": "qɯoƆ ɐıxopɐᴚ", + "item.cosmiccore.bee_comb_rose_polymer": "qɯoƆ ɹǝɯʎןoԀ ǝsoᴚ", + "item.cosmiccore.bee_comb_runic": "qɯoƆ ɔıunᴚ", + "item.cosmiccore.bee_comb_shaman": "qɯoƆ uɐɯɐɥS", + "item.cosmiccore.bee_comb_slick": "qɯoƆ ʞɔıןS", + "item.cosmiccore.bee_comb_solar": "qɯoƆ ɹɐןoS", + "item.cosmiccore.bee_comb_soul": "qɯoƆ ןnoS", + "item.cosmiccore.bee_comb_virtue": "qɯoƆ ǝnʇɹıΛ", + "item.cosmiccore.bee_comb_waxy_polymer": "qɯoƆ ɹǝɯʎןoԀ ʎxɐM", + "item.cosmiccore.bifidobacterium_breve": "ǝʌǝɹᗺ ɯnıɹǝʇɔɐqopıɟıᗺ", + "item.cosmiccore.bifidobacterium_breve_culture": "ǝɹnʇןnƆ ǝʌǝɹᗺ ɯnıɹǝʇɔɐqopıɟıᗺ", + "item.cosmiccore.bitumen_wax": "xɐM uǝɯnʇıᗺ", + "item.cosmiccore.blackstone_pustule": "ǝןnʇsnԀ ǝuoʇsʞɔɐןᗺ", + "item.cosmiccore.blazing_mote": "ǝʇoW buızɐןᗺ", + "item.cosmiccore.bright_mote": "ǝʇoW ʇɥbıɹᗺ", + "item.cosmiccore.brimstone_asteroid": "pıoɹǝʇsⱯ ǝuoʇsɯıɹᗺ", + "item.cosmiccore.bronze_supply_tank": "ʞuɐ⟘ ʎןddnS ǝzuoɹᗺ", + "item.cosmiccore.capacity_chip": "dıɥƆ ʎʇıɔɐdɐƆ", + "item.cosmiccore.carbon_asteroid_base": "pıoɹǝʇsⱯ ɔıuoqɹɐƆ", + "item.cosmiccore.chronia": "]ɐıuoɹɥƆ[ - ןıxǝΛ", + "item.cosmiccore.clear_mote": "ǝʇoW ɹɐǝןƆ", + "item.cosmiccore.cluster_of_perpetuity": "ʎʇınʇǝdɹǝԀ ɟo ɹǝʇsnןƆ", + "item.cosmiccore.computation_support_unit": "ʇıu∩ ʇɹoddnS uoıʇɐʇndɯoƆ", + "item.cosmiccore.contaminated_petri_dish": "ɥsıᗡ ıɹʇǝԀ pǝʇɐuıɯɐʇuoƆ", + "item.cosmiccore.crucible_mantis_grade_1": "Ɩ˙ʞW sıʇuɐW ǝןqıɔnɹƆ", + "item.cosmiccore.crusher_wasps_grade_1": "Ɩ˙ʞW sdsɐM ɹǝɥsnɹƆ", + "item.cosmiccore.crusher_wasps_grade_2": "ᄅ˙ʞW sdsɐM ɹǝɥsnɹƆ", + "item.cosmiccore.crusher_wasps_grade_3": "Ɛ˙ʞW sdsɐM ɹǝɥsnɹƆ", + "item.cosmiccore.crusher_wasps_grade_4": "ㄣ˙ʞW sdsɐM ɹǝɥsnɹƆ", + "item.cosmiccore.crusher_wasps_grade_5": "ϛ˙ʞW sdsɐM ɹǝɥsnɹƆ", + "item.cosmiccore.crystal_chiplet_base": "ǝsɐᗺ ʇǝןdıɥƆ ןɐʇsʎɹƆ", + "item.cosmiccore.crystal_chiplet_mask": "ʞsɐW ʇǝןdıɥƆ ןɐʇsʎɹƆ", + "item.cosmiccore.crystala": "]ɐןɐʇsʎɹƆ[ - ןıxǝΛ", + "item.cosmiccore.crystalline_capacitor": "ɹoʇıɔɐdɐƆ ǝuıןןɐʇsʎɹƆ", + "item.cosmiccore.crystalline_diode": "ǝpoıᗡ ǝuıןןɐʇsʎɹƆ", + "item.cosmiccore.crystalline_inductor": "ɹoʇɔnpuI ǝuıןןɐʇsʎɹƆ", + "item.cosmiccore.crystalline_resistor": "ɹoʇsısǝᴚ ǝuıןןɐʇsʎɹƆ", + "item.cosmiccore.crystalline_transistor": "ɹoʇsısuɐɹ⟘ ǝuıןןɐʇsʎɹƆ", + "item.cosmiccore.debug.structure_writer.export_order": "%s:Ɐq§/p§ן§%s:Sɐ§/p§ן§%s:Ɔɔ§ \n:ɹǝpɹO ʇɹodxƎ uɹǝʇʇɐԀ", + "item.cosmiccore.debug.structure_writer.export_to_log": "boꞀ oʇ sǝןsıⱯ ʇuıɹԀ", + "item.cosmiccore.debug.structure_writer.output_successful": "¡ǝןıɟ boן ɹnoʎ ʞɔǝɥƆ ¡ןnɟssǝɔɔnS ʇndʇnO", + "item.cosmiccore.debug.structure_writer.rotate_along_x_axis": "sıxⱯ X ǝʇɐʇoᴚ", + "item.cosmiccore.debug.structure_writer.rotate_along_y_axis": "sıxⱯ ʎ ǝʇɐʇoᴚ", + "item.cosmiccore.debug.structure_writer.structural_scale": "%s:Z %s:ʎ %s:X :ǝzıs ǝɹnʇɔnɹʇS", + "item.cosmiccore.debug_structure_writer": "ɹǝʇıɹM ǝɹnʇɔnɹʇS bnqǝᗡ", + "item.cosmiccore.decaying_cosmic_upgrade": "ǝpɐɹbd∩ buıʎɐɔǝᗡ", + "item.cosmiccore.decaying_cosmic_upgrade.tooltip": "ǝןɔʎɔ ǝɯıʇǝɟıן ǝɥʇ spɐoןɹǝʌo puɐ sǝǝᗺ sןןıʞ ʎןʇuɐʇsuIɔ§", + "item.cosmiccore.dilumixal_naquadah_doped_silicon_boule": "ǝןnoᗺ uoɔıןıS pǝdop-ɥɐpɐnbɐN ןɐxıɯnꞀıᗡ", + "item.cosmiccore.dilumixal_naquadah_doped_silicon_wafer": "ɹǝɟɐM uoɔıןıS pǝdop-ɥɐpɐnbɐN ןɐxıɯnꞀıᗡ", + "item.cosmiccore.dim_mote": "ǝʇoW ɯıᗡ", + "item.cosmiccore.donk": "ʞuoᗡ", + "item.cosmiccore.drone_frame_1": "Ɩ˙ʞW ǝɯɐɹℲ ǝuoɹᗡ", + "item.cosmiccore.drone_frame_2": "ᄅ˙ʞW ǝɯɐɹℲ ǝuoɹᗡ", + "item.cosmiccore.drone_frame_3": "Ɛ˙ʞW ǝɯɐɹℲ ǝuoɹᗡ", + "item.cosmiccore.drone_frame_4": "ㄣ˙ʞW ǝɯɐɹℲ ǝuoɹᗡ", + "item.cosmiccore.drone_frame_5": "ϛ˙ʞW ǝɯɐɹℲ ǝuoɹᗡ", + "item.cosmiccore.dulia_lily": "ʎןıꞀ ɐıןnᗡ", + "item.cosmiccore.dynamia": "]ɐıɯɐuʎᗡ[ - uouıɯnꞀ", + "item.cosmiccore.echon": "]uoɥɔƎ[ - uouıɯnꞀ", + "item.cosmiccore.efficacy_chip": "dıɥƆ ʎɔɐɔıɟɟƎ", + "item.cosmiccore.empty_fuel_rod": "poᴚ ןǝnℲ ʎʇdɯƎ", + "item.cosmiccore.energized_silk": "ʞןıS pǝzıbɹǝuƎ", + "item.cosmiccore.engraved_crystal_chiplet": "ʇǝןdıɥƆ ןɐʇsʎɹƆ pǝʌɐɹbuƎ", + "item.cosmiccore.enthelic_processor": "ɹossǝɔoɹԀ ɔıןǝɥʇuƎ", + "item.cosmiccore.enthelic_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ɔıןǝɥʇuƎ", + "item.cosmiccore.enthelic_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ ɔıןǝɥʇuƎ", + "item.cosmiccore.enthelic_processor_supercomputer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ ɔıןǝɥʇuƎ", + "item.cosmiccore.eschaton_processor": "ɹossǝɔoɹԀ uoʇɐɥɔsƎ", + "item.cosmiccore.eschaton_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ uoʇɐɥɔsƎ", + "item.cosmiccore.eschaton_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ uoʇɐɥɔsƎ", + "item.cosmiccore.eschaton_processor_supercomputer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ uoʇɐɥɔsƎ", + "item.cosmiccore.escherichia_coli": "ıןoƆ ɐıɥɔıɹǝɥɔsƎ", + "item.cosmiccore.escherichia_coli_culture": "ǝɹnʇןnƆ ıןoƆ ɐıɥɔıɹǝɥɔsƎ", + "item.cosmiccore.esson": "]uossƎ[ - uouıɯnꞀ", + "item.cosmiccore.eterna_wafer": "]ʎboןouoıⱯ[ ɹǝɟɐM ɐuɹǝʇƎ", + "item.cosmiccore.ether_wisp": "dsıM ɹǝɥʇƎ", + "item.cosmiccore.ethera": "]ɐɹǝɥʇƎ[ - ןıxǝΛ", + "item.cosmiccore.ev_radio_module": "ǝןnpoW oıpɐᴚ ΛƎ", + "item.cosmiccore.ev_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM ΛƎ", + "item.cosmiccore.faint_mote": "ǝʇoW ʇuıɐℲ", + "item.cosmiccore.fermium_rad_charges": "ǝbɹɐɥƆ uoıʇɐıpɐᴚ ɯnıɯɹǝℲ", + "item.cosmiccore.ferric_asteroid": "pıoɹǝʇsⱯ ɔıɹɹǝℲ", + "item.cosmiccore.fiber_mesh_ingot_frame": "ǝɯɐɹℲ ʇobuI ɥsǝW ɹǝqıℲ", + "item.cosmiccore.fireclay_ball": "ןןɐᗺ ʎɐןɔǝɹıℲ", + "item.cosmiccore.flawed_resonant_wafer": "ɹǝɟɐM ɔıuoɯɹɐH pǝʍɐןℲ", + "item.cosmiccore.flesh_packed_neptunium_fuel": "ןǝnℲ ɯnıunʇdǝN pǝʞɔɐԀ ɥsǝןℲ", + "item.cosmiccore.flesh_packed_plutonium_fuel": "ןǝnℲ ɯnıuoʇnןԀ pǝʞɔɐԀ ɥsǝןℲ", + "item.cosmiccore.flesh_packed_uranium_fuel": "ןǝnℲ ɯnıuɐɹ∩ pǝʞɔɐԀ ɥsǝןℲ", + "item.cosmiccore.fleshy_neptunium_waste": "ǝʇsɐM ɯnıunʇdǝN ʎɥsǝןℲ ɔıןןɐʇǝW-oıᗺ", + "item.cosmiccore.fleshy_plutonium_waste": "ǝʇsɐM ɯnıuoʇnןԀ ʎɥsǝןℲ ɔıןןɐʇǝW-oıᗺ", + "item.cosmiccore.fleshy_uranium_waste": "ǝʇsɐM ɯnıuɐɹ∩ ʎɥsǝןℲ ɔıןןɐʇǝW-oıᗺ", + "item.cosmiccore.freight_beetle_grade_1": "Ɩ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ", + "item.cosmiccore.freight_beetle_grade_2": "ᄅ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ", + "item.cosmiccore.freight_beetle_grade_3": "Ɛ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ", + "item.cosmiccore.freight_beetle_grade_4": "ㄣ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ", + "item.cosmiccore.freight_beetle_grade_5": "ϛ˙ʞW ǝןʇǝǝᗺ ʇɥbıǝɹℲ", + "item.cosmiccore.fused_wafer_of_esoterica": "ɐɔıɹǝʇosƎ ɟo ɹǝɟɐM ɔıuoɯɹɐH pǝsnℲ", + "item.cosmiccore.fused_wafer_of_logos": "soboꞀ ɟo ɹǝɟɐM ɔıuoɯɹɐH pǝsnℲ", + "item.cosmiccore.gelatin_scaffold": "pןoɟɟɐɔS uıʇɐןǝ⅁", + "item.cosmiccore.hardened_resin": "uısǝᴚ pǝuǝpɹɐH", + "item.cosmiccore.harmonic_chiplet_oscillating": "ʇıu∩ buıssǝɔoɹԀ ןɐɹʇuǝƆ ɔıuoɯɹɐH", + "item.cosmiccore.harmonic_processor": "ɹossǝɔoɹԀ ɔıuoɯɹɐH", + "item.cosmiccore.harmonic_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ɔıuoɯɹɐH", + "item.cosmiccore.harmonic_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ ɔıuoɯɹɐH", + "item.cosmiccore.harmonic_processor_supercomputer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ ɔıuoɯɹɐH", + "item.cosmiccore.harmonically_tuned_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝun⟘ ʎןןɐɔıuoɯɹɐH", + "item.cosmiccore.harmonically_tuned_printed_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝʇuıɹԀ pǝun⟘ ʎןןɐɔıuoɯɹɐH", + "item.cosmiccore.heme_ring": "buıᴚ ǝɯǝH", + "item.cosmiccore.hex_processor": "ɹossǝɔoɹԀ xǝH", + "item.cosmiccore.hex_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ xǝH", + "item.cosmiccore.hex_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ xǝH", + "item.cosmiccore.hex_processor_supercomputer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ xǝH", + "item.cosmiccore.hv_radio_module": "ǝןnpoW oıpɐᴚ ΛH", + "item.cosmiccore.hv_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM ΛH", + "item.cosmiccore.hydraulic_boots": "sʇooᗺ sɹǝʇʇoɹʇǝqoן⅁ ɔıןnɐɹpʎH", + "item.cosmiccore.incandescent_mote": "ǝʇoW ʇuǝɔsǝpuɐɔuI", + "item.cosmiccore.industrial_drone": "ǝuoɹᗡ ןɐıɹʇsnpuI", + "item.cosmiccore.inert_fungal_spores": "sǝɹodS ןɐbunℲ ʇɹǝuI", + "item.cosmiccore.infinite_spray_can": "uɐƆ ʎɐɹdS ɔıʇɐɯsıɹԀן§", + "item.cosmiccore.intermediate_gene_kit": "ʇıʞ ǝuǝ⅁ ǝʇɐıpǝɯɹǝʇuI", + "item.cosmiccore.iv_radio_module": "ǝןnpoW oıpɐᴚ ΛI", + "item.cosmiccore.iv_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM ΛI", + "item.cosmiccore.large_shard_of_perpetuity": "ʎʇınʇǝdɹǝԀ ɟo pɹɐɥS ǝbɹɐꞀ", + "item.cosmiccore.latent_capacity_wafer": "ɹǝɟɐM ʎʇıɔɐdɐƆ ʇuǝʇɐꞀ", + "item.cosmiccore.latent_efficacy_wafer": "ɹǝɟɐM ʎɔɐɔıɟɟƎ ʇuǝʇɐꞀ", + "item.cosmiccore.latent_potency_wafer": "ɹǝɟɐM ʎɔuǝʇoԀ ʇuǝʇɐꞀ", + "item.cosmiccore.latent_verbosity_wafer": "ɹǝɟɐM ʎʇısoqɹǝΛ ʇuǝʇɐꞀ", + "item.cosmiccore.linked_terminal": "ןɐuıɯɹǝ⟘ pǝʞuıꞀ", + "item.cosmiccore.lith_asteroid": "pıoɹǝʇsⱯ ɥʇıꞀ", + "item.cosmiccore.livingrock_aluminate_boule": "ǝןnoᗺ ǝʇɐuıɯnןⱯ ʞɔoɹbuıʌıꞀ", + "item.cosmiccore.livirock_aluminite_wafer": "ɹǝɟɐM ǝʇɐuıɯnןⱯ ʞɔoɹbuıʌıꞀ", + "item.cosmiccore.lucid_cpu_wafer": "ɹǝɟɐM ∩ԀƆ pıɔnꞀ", + "item.cosmiccore.lucidic_processor": "ɹossǝɔoɹԀ ɔıpıɔnꞀ", + "item.cosmiccore.lucidic_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ɔıpıɔnꞀ", + "item.cosmiccore.lucidic_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ ɔıpıɔnꞀ", + "item.cosmiccore.lucidic_processor_supercomputer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ ɔıpıɔnꞀ", + "item.cosmiccore.lucidity_cpu_mask": "ʞsɐW ∩ԀƆ ʎʇıpıɔnꞀ", + "item.cosmiccore.luv_radio_module": "ǝןnpoW oıpɐᴚ ΛnꞀ", + "item.cosmiccore.luv_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM ΛnꞀ", + "item.cosmiccore.lv_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM ΛꞀ", + "item.cosmiccore.mafic_asteroid": "pıoɹǝʇsⱯ ɔıɟɐW", + "item.cosmiccore.masked_crystal_chiplet_package": "ǝbɐʞɔɐԀ ʇǝןdıɥƆ ןɐʇsʎɹƆ pǝʞsɐW", + "item.cosmiccore.mossy_asteroid": "pıoɹǝʇsⱯ ʎssoW", + "item.cosmiccore.multilayered_enthel_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ ןǝɥʇuƎ pǝɹǝʎɐןıʇןnW", + "item.cosmiccore.mv_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM ΛW", + "item.cosmiccore.mystrix": "]xıɹʇsʎW[ - uouıɯnꞀ", + "item.cosmiccore.nano_boots": "sʇooᗺ sɹǝʇʇoɹʇǝqoן⅁ ™ǝןɔsnWouɐN", + "item.cosmiccore.neuro_processing_assembly": "pɹɐoᗺ ʎןqɯǝssⱯ buıssǝɔoɹdoɹnǝN", + "item.cosmiccore.null_refined_resonant_wafer": "ɹǝɟɐM ɔıuoɯɹɐH pǝıɟıןןnN", + "item.cosmiccore.nullified_harmonics_wafer": "ɹǝɟɐM ɔıuoɯɹɐH pǝıɟıןןnN", + "item.cosmiccore.nyxon": "]uoxʎN[ - uouıɯnꞀ", + "item.cosmiccore.occult_asteroid": "pıoɹǝʇsⱯ ʇןnɔɔO", + "item.cosmiccore.omnia_circuit_ev": "ʇınɔɹıƆ ɐıuɯO ΛƎ", + "item.cosmiccore.omnia_circuit_hv": "ʇınɔɹıƆ ɐıuɯO ΛH", + "item.cosmiccore.omnia_circuit_iv": "ʇınɔɹıƆ ɐıuɯO ΛI", + "item.cosmiccore.omnia_circuit_luv": "ʇınɔɹıƆ ɐıuɯO ΛnꞀ", + "item.cosmiccore.omnia_circuit_lv": "ʇınɔɹıƆ ɐıuɯO ΛꞀ", + "item.cosmiccore.omnia_circuit_mv": "ʇınɔɹıƆ ɐıuɯO ΛW", + "item.cosmiccore.omnia_circuit_opv": "ʇınɔɹıƆ ɐıuɯO ΛԀO", + "item.cosmiccore.omnia_circuit_uev": "ʇınɔɹıƆ ɐıuɯO ΛƎ∩", + "item.cosmiccore.omnia_circuit_uhv": "ʇınɔɹıƆ ɐıuɯO ΛH∩", + "item.cosmiccore.omnia_circuit_uiv": "ʇınɔɹıƆ ɐıuɯO ΛI∩", + "item.cosmiccore.omnia_circuit_uv": "ʇınɔɹıƆ ɐıuɯO Λ∩", + "item.cosmiccore.omnia_circuit_uxv": "ʇınɔɹıƆ ɐıuɯO ΛX∩", + "item.cosmiccore.omnia_circuit_zpm": "ʇınɔɹıƆ ɐıuɯO WԀZ", + "item.cosmiccore.oneiric_signet_t1": "I˙ʞW ʇǝubıS ɔıɹıǝuO", + "item.cosmiccore.oneiric_signet_t2": "II˙ʞW ʇǝubıS ɔıɹıǝuO", + "item.cosmiccore.oneiric_signet_t3": "III˙ʞW ʇǝubıS ɔıɹıǝuO", + "item.cosmiccore.oneiric_signet_t4": "ΛI˙ʞW ʇǝubıS ɔıɹıǝuO", + "item.cosmiccore.oneiric_signet_t5": "Λ˙ʞW ʇǝubıS ɔıɹıǝuO", + "item.cosmiccore.optical_processing_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ןɐɔıʇdO", + "item.cosmiccore.optical_processor": "ɹossǝɔoɹԀ ןɐɔıʇdO", + "item.cosmiccore.optical_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ןɐɔıʇdO", + "item.cosmiccore.optical_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ ןɐɔıʇdO", + "item.cosmiccore.optical_processor_supercomputer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ ןɐɔıʇdO", + "item.cosmiccore.optically_refined_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝuıɟǝᴚ ʎןןɐɔıʇdO", + "item.cosmiccore.optically_refined_printed_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝʇuıɹԀ pǝuıɟǝᴚ ʎןןɐɔıʇdO", + "item.cosmiccore.opv_gyroscope": "ǝdoɔsoɹʎ⅁ ʌԀO", + "item.cosmiccore.opv_powercell": "ןןǝƆ ɹǝʍoԀ ʌԀO", + "item.cosmiccore.opv_radio_module": "ǝןnpoW oıpɐᴚ ΛԀO", + "item.cosmiccore.opv_thruster": "ɹǝʇsnɹɥ⟘ ʌԀO", + "item.cosmiccore.overloaded_pearls": "sןɹɐǝԀ pǝpɐoןɹǝʌO", + "item.cosmiccore.oxide_asteroid": "pıoɹǝʇsⱯ ǝpıxO", + "item.cosmiccore.pale_mote": "ǝʇoW ǝןɐԀ", + "item.cosmiccore.pale_saw": "ʍɐS ǝןɐԀ", + "item.cosmiccore.pale_scrap": "dɐɹɔS ǝןɐԀ", + "item.cosmiccore.para_mod_1": "Ɩ˙ʞW ǝןnpoW uoıʇɐzıןǝןןɐɹɐԀ", + "item.cosmiccore.para_mod_2": "ᄅ˙ʞW ǝןnpoW uoıʇɐzıןǝןןɐɹɐԀ", + "item.cosmiccore.para_mod_3": "Ɛ˙ʞW ǝןnpoW uoıʇɐzıןǝןןɐɹɐԀ", + "item.cosmiccore.para_mod_4": "ㄣ˙ʞW ǝןnpoW uoıʇɐzıןǝןןɐɹɐԀ", + "item.cosmiccore.persona_core_assisted_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝʇsıssⱯ ǝɹoƆ ɐuosɹǝԀ", + "item.cosmiccore.persona_core_assisted_printed_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝʇuıɹԀ pǝʇsıssⱯ ǝɹoƆ ɐuosɹǝԀ", + "item.cosmiccore.phantnon": "]uouʇuɐɥԀ[ - uouıɯnꞀ", + "item.cosmiccore.plasmatic_drone": "ǝuoɹp‾ɔıʇɐɯsɐןd", + "item.cosmiccore.plastic_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ ɔıʇsɐןԀ pǝdop-ɐuɐW", + "item.cosmiccore.portable_gravity_core": "ǝɹoƆ ʎʇıʌɐɹ⅁ ǝןqɐʇɹoԀ9§", + "item.cosmiccore.portable_gravity_core.tooltip": "˙ɥʇɹɐƎ ɥɔʇɐW oʇ ʎʇıʌɐɹ⅁ sǝzıןɐɯɹoNɐ§", + "item.cosmiccore.potency_chip": "dıɥƆ ʎɔuǝʇoԀ", + "item.cosmiccore.prepared_lucid_wafer": "ɹǝɟɐM pıɔnꞀ pǝɹɐdǝɹԀ", + "item.cosmiccore.prepared_petri_dish": "ɥsıᗡ ıɹʇǝԀ pǝɹɐdǝɹԀ", + "item.cosmiccore.pressurized_rebreather": "ɹǝɥʇɐǝɹqǝᴚ pǝzıɹnssǝɹԀ", + "item.cosmiccore.pressurized_rebreather.tooltip": "˙sʇuǝɯuoɹıʌuǝ 9§ɹıⱯ oNɔ§ uı sʞɹoM ˙ǝbɐsn ʞuɐʇ uǝbʎxo sǝןqɐuƎ9§", + "item.cosmiccore.prod_mod_1": "Ɩ˙ʞW ǝןnpoW ʎʇıʌıʇɔnpoɹԀ", + "item.cosmiccore.prod_mod_2": "ᄅ˙ʞW ǝןnpoW ʎʇıʌıʇɔnpoɹԀ", + "item.cosmiccore.prod_mod_3": "Ɛ˙ʞW ǝןnpoW ʎʇıʌıʇɔnpoɹԀ", + "item.cosmiccore.prod_mod_4": "ㄣ˙ʞW ǝןnpoW ʎʇıʌıʇɔnpoɹԀ", + "item.cosmiccore.programmable_mote": "ǝʇoW ǝןqɐɯɯɐɹboɹԀϛ§", + "item.cosmiccore.protocyte_mod": "ǝןnpoW ǝʇʎɔoʇoɹԀ", + "item.cosmiccore.pulverizing_beetle_grade_1": "Ɩ˙ʞW ǝןʇǝǝᗺ buızıɹǝʌןnԀ", + "item.cosmiccore.pulverizing_beetle_grade_2": "ᄅ˙ʞW ǝןʇǝǝᗺ buızıɹǝʌןnԀ", + "item.cosmiccore.pulverizing_beetle_grade_3": "Ɛ˙ʞW ǝןʇǝǝᗺ buızıɹǝʌןnԀ", + "item.cosmiccore.pulverizing_beetle_grade_4": "ㄣ˙ʞW ǝןʇǝǝᗺ buızıɹǝʌןnԀ", + "item.cosmiccore.pulverizing_beetle_grade_5": "ϛ˙ʞW ǝןʇǝǝᗺ buızıɹǝʌןnԀ", + "item.cosmiccore.pyretic_ichor": "ɹoɥɔI ɔıʇǝɹʎԀ", + "item.cosmiccore.pyrith": "]ɥʇıɹʎԀ[ - ןıxǝΛ", + "item.cosmiccore.quark_boots": "sʇooᗺ sɹǝʇʇoɹʇǝqoן⅁ ™ɥɔǝ⟘ʞɹɐnὉ", + "item.cosmiccore.radiant_mote": "ǝʇoW ʇuɐıpɐᴚ", + "item.cosmiccore.rare_metals_asteroid": "pıoɹǝʇsⱯ sןɐʇǝW ɔıʇoxƎ", + "item.cosmiccore.raymarching_dandilifeon": "ʎןıꞀ ɐıןnᗡ", + "item.cosmiccore.razor_hornet_grade_1": "Ɩ˙ʞW ʇǝuɹoH ɹozɐᴚ", + "item.cosmiccore.razor_hornet_grade_2": "ᄅ˙ʞW sıʇuɐW ǝןqıɔnɹƆ", + "item.cosmiccore.razor_hornet_grade_3": "Ɛ˙ʞW sıʇuɐW ǝןqıɔnɹƆ", + "item.cosmiccore.razor_hornet_grade_4": "ㄣ˙ʞW sıʇuɐW ǝןqıɔnɹƆ", + "item.cosmiccore.razor_hornet_grade_5": "ϛ˙ʞW sıʇuɐW ǝןqıɔnɹƆ", + "item.cosmiccore.record_keeping_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ buıdǝǝʞ pɹoɔǝᴚ", + "item.cosmiccore.record_kept_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ ʇdǝʞ pɹoɔǝᴚ", + "item.cosmiccore.record_kept_printed_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝʇuıɹԀ ʇdǝʞ pɹoɔǝᴚ", + "item.cosmiccore.refined_harmonics_wafer": "ɹǝɟɐM ɔıuoɯɹɐH pǝuıɟǝᴚ", + "item.cosmiccore.refined_resonant_wafer": "ɹǝɟɐM ɔıuoɯɹɐH pǝuıɟǝᴚ", + "item.cosmiccore.reflection_mirror": "uoısoɹƎ ɟo ɹoɹɹıW", + "item.cosmiccore.resipiratory_sculk_hemocytoblast": "ʇsɐןqoʇʎɔoɯǝH ʞןnɔS ʎɹoʇɐɹıdsǝᴚ", + "item.cosmiccore.resonant_mod": "Ɩ˙ʞW ǝןnpoW uoısnℲ", + "item.cosmiccore.robust_drone": "ǝuoɹᗡ ʇsnqoᴚ", + "item.cosmiccore.rune_conjunction_arklythar": "]ɹɐɥʇʎןʞɹⱯ[ uoıʇɔunظuoƆ ǝunᴚ", + "item.cosmiccore.rune_conjunction_kholys": "]sʎןoɥʞ[ uoıʇɔunظuoƆ ǝunᴚ", + "item.cosmiccore.rune_conjunction_valkruth": "]ɥʇnɹʞןɐΛ[ uoıʇɔunظuoƆ ǝunᴚ", + "item.cosmiccore.rune_slate_arklys": "]sʎןʞɹⱯ[ ǝʇɐןS ǝunᴚ", + "item.cosmiccore.rune_slate_khoruth": "]ɥʇnɹoɥʞ[ ǝʇɐןS ǝunᴚ", + "item.cosmiccore.rune_slate_tenura": "]ɐɹnuǝ⟘[ ǝʇɐןS ǝunᴚ", + "item.cosmiccore.rune_slate_tylomir": "]ɹıɯoןʎ⟘[ ǝʇɐןS ǝunᴚ", + "item.cosmiccore.rune_slate_valdris": "]sıɹpןɐΛ[ ǝʇɐןS ǝunᴚ", + "item.cosmiccore.rune_slate_zelothar": "]ɹɐɥʇoןǝZ[ ǝʇɐןS ǝunᴚ", + "item.cosmiccore.runewoven_plastic_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ ɔıʇsɐןԀ uǝʌoʍǝunᴚ", + "item.cosmiccore.runic_hex_cpu": "dıɥƆ ∩ԀƆ pǝɥɔʇƎ xǝH", + "item.cosmiccore.runic_hex_cpu_wafer": "ɹǝɟɐM ∩ԀƆ pǝɥɔʇƎ xǝH", + "item.cosmiccore.rusty_drone": "ǝuoɹᗡ ʎʇsnᴚ", + "item.cosmiccore.sanguine_asteroid": "pıoɹǝʇsⱯ ǝuınbuɐS", + "item.cosmiccore.sanguine_boots": "sʇooᗺ sɹǝʇʇoɹʇǝqoן⅁ ǝuınbuɐS", + "item.cosmiccore.sanguine_drone": "ǝuoɹᗡ ǝuınbuɐS", + "item.cosmiccore.sanguine_warptech_boots": "sʇooᗺ ɥɔǝ⟘dɹɐM ǝuınbuɐS", + "item.cosmiccore.sanguine_warptech_chestplate": "ǝʇɐןdʌɐɹ⅁ ɥɔǝ⟘dɹɐM ǝuınbuɐS", + "item.cosmiccore.sanguine_warptech_helmet": "ʇǝɯןǝH ɥɔǝ⟘dɹɐM ǝuınbuɐS", + "item.cosmiccore.sanguine_warptech_leggings": "sbuıbbǝꞀ ɥɔǝ⟘dɹɐM ǝuınbuɐS", + "item.cosmiccore.saturated_sculk_hemocytoblast": "ʇsɐןqoʇʎɔoɯǝH ʞןnɔS pǝʇɐɹnʇɐS", + "item.cosmiccore.sculk_fibroblast": "ʇsɐןqoɹqıℲ ʞןnɔS", + "item.cosmiccore.sculk_myofibroblast": "ʇsɐןqoɹqıɟoʎW ʞןnɔS", + "item.cosmiccore.self_aware_processing_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ǝɹɐʍⱯ ɟןǝS", + "item.cosmiccore.seraphon": "]uoɥdɐɹǝS[ - uouıɯnꞀ", + "item.cosmiccore.shard_of_perpetuity": "ʎʇınʇǝdɹǝԀ ɟo pɹɐɥS", + "item.cosmiccore.simple_rebreather": "ɹǝɥʇɐǝɹqǝᴚ ǝןdɯıS", + "item.cosmiccore.simple_rebreather.tooltip": "˙sʇuǝɯuoɹıʌuǝ ㄥ§ɹıⱯ uıɥ⟘q§ uı uıɐɹp uǝbʎxo sǝɔnpǝᴚㄥ§", + "item.cosmiccore.somatic_processing_assembly": "pɹɐoᗺ ʎןqɯǝssⱯ buıssǝɔoɹdoʇɐɯoS", + "item.cosmiccore.somnolent_dew": "ʍǝᗡ ʇuǝןouɯoS", + "item.cosmiccore.soul_cut_lucid_cpu_chip": "dıɥƆ ∩ԀƆ pıɔnꞀ ʇnƆ ןnoS", + "item.cosmiccore.soul_mutilator": "ɹoʇɐןıʇnW ןnoS", + "item.cosmiccore.soul_mutilator.tooltip": "˙ןnos ʎɹǝʌ ɹnoʎ ǝdɐɥsǝɹ uɐɔ ʇɐɥʇ ʇuǝɯnɹʇsuı pǝʇsıʍʇ Ɐ", + "item.cosmiccore.soul_mutilator.tooltip.warning": "˙ʎןǝsıʍ ǝsooɥƆ ˙ʇuǝuɐɯɹǝd sı ǝɔıoɥɔ sıɥ⟘", + "item.cosmiccore.soul_reader": "ɹǝpɐǝᴚ ʞɹoʍʇǝN ןnoS", + "item.cosmiccore.space_radio": "oıpɐᴚ ǝɔɐdS", + "item.cosmiccore.space_radio.tooltip": "¡ǝɔɐds uı spunos ɹɐǝɥ noʎ sʇǝꞀ9§", + "item.cosmiccore.spectil": "]ןıʇɔǝdS[ - uouıɯnꞀ", + "item.cosmiccore.spent_flesh_packed_neptunium_fuel": "ןǝnℲ ɯnıunʇdǝN pǝʞɔɐԀ ɥsǝןℲ ʇuǝdS", + "item.cosmiccore.spent_flesh_packed_plutonium_fuel": "ןǝnℲ ɯnıuoʇnןԀ pǝʞɔɐԀ ɥsǝןℲ ʇuǝdS", + "item.cosmiccore.spent_flesh_packed_uranium_fuel": "ןǝnℲ ɯnıuɐɹ∩ pǝʞɔɐԀ ɥsǝןℲ ʇuǝdS", + "item.cosmiccore.spirit_engraved_enthel_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ ןǝɥʇuƎ pǝʌɐɹbuƎ ʇıɹıdS", + "item.cosmiccore.spirit_runed_enthel_cpu": "∩ԀƆ ןǝɥʇuƎ pǝunᴚ ʇıɹıdS", + "item.cosmiccore.spirit_runed_enthel_cpu_wafer": "ɹǝɟɐM ∩ԀƆ ןǝɥʇuƎ pǝunᴚ ʇıɹıdS", + "item.cosmiccore.stasis_brine": "ǝuıɹᗺ sısɐʇS", + "item.cosmiccore.steel_supply_tank": "ʞuɐ⟘ ʎןddnS ןǝǝʇS", + "item.cosmiccore.streptococcus_pyogenes": "sǝuǝboʎԀ snɔɔoɔoʇdǝɹʇS", + "item.cosmiccore.streptococcus_pyogenes_culture": "ǝɹnʇןnƆ sǝuǝboʎԀ snɔɔoɔoʇdǝɹʇS", + "item.cosmiccore.suelescent_processor": "ɹossǝɔoɹԀ ʇuǝɔsǝןǝnS", + "item.cosmiccore.suelescent_processor_assembly": "ʎןqɯǝssⱯ ɹossǝɔoɹԀ ʇuǝɔsǝןǝnS", + "item.cosmiccore.suelescent_processor_mainframe": "ǝɯɐɹɟuıɐW ɹossǝɔoɹԀ ʇuǝɔsǝןǝnS", + "item.cosmiccore.suelescent_processor_supercomputer": "ɹǝʇndɯoɔɹǝdnS ɹossǝɔoɹԀ ʇuǝɔsǝןǝnS", + "item.cosmiccore.superheated_fuel_rod": "poᴚ ןǝnℲ pǝʇɐǝɥɹǝdnS", + "item.cosmiccore.tau_fruit": "ʇınɹℲ nɐ⟘", + "item.cosmiccore.tau_oil": "ןıO nɐ⟘", + "item.cosmiccore.temporal_reinforced_lucid_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pıɔnꞀ pǝɔɹoɟuıǝᴚ ןɐɹodɯǝ⟘", + "item.cosmiccore.temporal_reinforced_lucid_printed_circuit_board": "pɹɐoᗺ ʇınɔɹıƆ pǝʇuıɹԀ pıɔnꞀ pǝɔɹoɟuıǝᴚ ןɐɹodɯǝ⟘", + "item.cosmiccore.temporal_stable_thundering_wafer": "ɹǝɟɐM buıɹǝpunɥ⟘ ǝןqɐʇS ןɐɹodɯǝ⟘", + "item.cosmiccore.tenaebrum": "]ɯnɹqǝɐuǝ⟘[ - ןıxǝΛ", + "item.cosmiccore.tessaron": "]uoɹɐssǝ⟘[ - ןıxǝΛ", + "item.cosmiccore.tethering_resin": "uısǝᴚ buıɹǝɥʇǝ⟘", + "item.cosmiccore.thaumica_wafer": "]ɐuɐɔɹⱯ[ ɹǝɟɐM ɐɔıɯnɐɥ⟘", + "item.cosmiccore.the_one_ring": "buıᴚ ǝuO ǝɥ⟘", + "item.cosmiccore.the_one_ring.tooltip.0": "ɹ§˙ɯǝɥʇ puıq ssǝuʞɹɐp ǝɥʇ uı puɐ ןןɐ ɯǝɥʇ buıɹq oʇ buıᴚ ǝuO 'ɯǝɥʇ puıɟ oʇ buıᴚ ǝuO 'ןןɐ ɯǝɥʇ ǝןnɹ oʇ buıᴚ ǝuOo§9§", + "item.cosmiccore.the_one_ring.tooltip.1": "˙ɟɟo ǝʞɐʇ oʇ pɹɐɥ ʇı puıɟ ʇɥbıɯ noʎ", + "item.cosmiccore.thermal_chain_agent": "ʇuǝbⱯ uıɐɥƆ ןɐɯɹǝɥ⟘", + "item.cosmiccore.transcendent_mote": "ǝʇoW ʇuǝpuǝɔsuɐɹ⟘", + "item.cosmiccore.trinavine_nanolattice_spool": "ןoodS ǝɔıʇʇɐןouɐN ǝuıʌɐuıɹ⟘", + "item.cosmiccore.tungstensteel_nanolattice_spool": "ןoodS ǝɔıʇʇɐןouɐN ןǝǝʇsuǝʇsbun⟘", + "item.cosmiccore.uev_gyroscope": "ǝdoɔsoɹʎ⅁ ΛƎ∩", + "item.cosmiccore.uev_powercell": "ןןǝƆ ɹǝʍoԀ ΛƎ∩", + "item.cosmiccore.uev_radio_module": "ǝןnpoW oıpɐᴚ ΛƎ∩", + "item.cosmiccore.uev_thruster": "ɹǝʇsnɹɥ⟘ ΛƎ∩", + "item.cosmiccore.uhv_gyroscope": "ǝdoɔsoɹʎ⅁ ΛH∩", + "item.cosmiccore.uhv_powercell": "ןןǝƆ ɹǝʍoԀ ΛH∩", + "item.cosmiccore.uhv_radio_module": "ǝןnpoW oıpɐᴚ ΛH∩", + "item.cosmiccore.uhv_thruster": "ɹǝʇsnɹɥ⟘ ΛH∩", + "item.cosmiccore.uiv_gyroscope": "ǝdoɔsoɹʎ⅁ ΛI∩", + "item.cosmiccore.uiv_powercell": "ןןǝƆ ɹǝʍoԀ ΛI∩", + "item.cosmiccore.uiv_radio_module": "ǝןnpoW oıpɐᴚ ΛI∩", + "item.cosmiccore.uiv_thruster": "ɹǝʇsnɹɥ⟘ ΛI∩", + "item.cosmiccore.ultrasonic_homogenizer": "ɹǝzıuǝboɯoH ɔıuosɐɹʇן∩", + "item.cosmiccore.unsealed_crystal_cpu": "∩ԀƆ ןɐʇsʎɹƆ pǝןɐǝsu∩", + "item.cosmiccore.uv_gyroscope": "ǝdoɔsoɹʎ⅁ Λ∩", + "item.cosmiccore.uv_powercell": "ןןǝƆ ɹǝʍoԀ Λ∩", + "item.cosmiccore.uv_radio_module": "ǝןnpoW oıpɐᴚ Λ∩", + "item.cosmiccore.uv_thruster": "ɹǝʇsnɹɥ⟘ ", + "item.cosmiccore.uxv_gyroscope": "ǝdoɔsoɹʎ⅁ ΛX∩", + "item.cosmiccore.uxv_powercell": "ןןǝƆ ɹǝʍoԀ ΛX∩", + "item.cosmiccore.uxv_radio_module": "ǝןnpoW oıpɐᴚ ΛX∩", + "item.cosmiccore.uxv_thruster": "ɹǝʇsnɹɥ⟘ ΛX∩", + "item.cosmiccore.vein_survey_scanner_hv": ")ΛH( ɹǝuuɐɔS ʎǝʌɹnS uıǝΛ uoısıɔǝɹԀ", + "item.cosmiccore.vein_survey_scanner_lv": ")ΛꞀ( ɹǝuuɐɔS ʎǝʌɹnS uıǝΛ", + "item.cosmiccore.vein_survey_scanner_mv": ")ΛW( ɹǝuuɐɔS ʎǝʌɹnS uıǝΛ pǝɔuɐʌpⱯ", + "item.cosmiccore.verbosity_chip": "dıɥƆ ʎʇısoqɹǝΛ", + "item.cosmiccore.verdant_anima": "ɐɯıuⱯ ʇuɐpɹǝΛ", + "item.cosmiccore.vexiun": "]unıxǝΛ[ - ןıxǝΛ", + "item.cosmiccore.vivid_mote": "ǝʇoW pıʌıΛ", + "item.cosmiccore.wafer_pragmiso": "]sɔısʎɥԀ[ ɹǝɟɐM osıɯbɐɹԀ", + "item.cosmiccore.wailing_cosmic_upgrade": "ǝpɐɹbd∩ buıןıɐM", + "item.cosmiccore.wailing_cosmic_upgrade.tooltip": "uoıʇɐʇnW ɯnɯıxɐWɔ§", + "item.cosmiccore.wasteland_asteroid": "pıoɹǝʇsⱯ puɐןǝʇsɐM", + "item.cosmiccore.waxed_leather": "ɹǝɥʇɐǝꞀ pǝxɐM", + "item.cosmiccore.wicked_essence": "ǝɔuǝssƎ pǝʞɔıM", + "item.cosmiccore.wired_petri_dish": "ɥsıᗡ ıɹʇǝԀ pǝɹıM", + "item.cosmiccore.wireless_pda": "ⱯᗡԀ ɐʇɐᗡ ssǝןǝɹıM", + "item.cosmiccore.wrapped_blazing_mote": "ǝʇoW buızɐןᗺ pǝddɐɹM", + "item.cosmiccore.wrapped_bright_mote": "ǝʇoW ʇɥbıɹᗺ pǝddɐɹM", + "item.cosmiccore.wrapped_clear_mote": "ǝʇoW ɹɐǝןƆ pǝddɐɹM", + "item.cosmiccore.wrapped_dim_mote": "ǝʇoW ɯıᗡ pǝddɐɹM", + "item.cosmiccore.wrapped_faint_mote": "ǝʇoW ʇuıɐℲ pǝddɐɹM", + "item.cosmiccore.wrapped_incandescent_mote": "ǝʇoW ʇuǝɔsǝpuɐɔuI pǝddɐɹM", + "item.cosmiccore.wrapped_pale_mote": "ǝʇoW ǝןɐԀ pǝddɐɹM", + "item.cosmiccore.wrapped_radiant_mote": "ǝʇoW ʇuɐıpɐᴚ pǝddɐɹM", + "item.cosmiccore.wrapped_transcendent_mote": "ǝʇoW ʇuǝpuǝɔsuɐɹ⟘ pǝddɐɹM", + "item.cosmiccore.wrapped_vivid_mote": "ǝʇoW pıʌıΛ pǝddɐɹM", + "item.cosmiccore.zpm_radio_module": "ǝןnpoW oıpɐᴚ WԀZ", + "item.cosmiccore.zpm_wildfire_core": "ǝɹoƆ ǝɹıɟpןıM WԀZ", + "item.gtceu.tool.luv_meld_tool": "ןooʇıʇןnW pןǝW %s", + "itemGroup.cosmiccore.creative_tab": "ǝɹoƆ ɔıɯsoƆ", + "key.categories.cosmiccore.boots": "sʇooᗺ ɔıɯsoƆ", + "key.categories.cosmiccore.emi": "IWƎ - ǝɹoƆɔıɯsoƆ", + "key.categories.cosmiccore.movement": "ʇuǝɯǝʌoW ǝʞɐnὉ", + "key.cosmiccore.boots.jump_decrease": "dɯnſ ǝsɐǝɹɔǝᗡ :sʇooᗺ", + "key.cosmiccore.boots.jump_increase": "dɯnſ ǝsɐǝɹɔuI :sʇooᗺ", + "key.cosmiccore.boots.speed_decrease": "pǝǝdS ǝsɐǝɹɔǝᗡ :sʇooᗺ", + "key.cosmiccore.boots.speed_increase": "pǝǝdS ǝsɐǝɹɔuI :sʇooᗺ", + "key.cosmiccore.boots.toggle_inertia": "buıuǝdɯɐᗡ ɐıʇɹǝuI ǝןbbo⟘ :sʇooᗺ", + "key.cosmiccore.boots.toggle_step": "ʇsıssⱯ dǝʇS ǝןbbo⟘ :sʇooᗺ", + "key.cosmiccore.emi.create_bookmark_group": "dnoɹ⅁ ʞɹɐɯʞooᗺ ǝʇɐǝɹƆ", + "key.cosmiccore.emi.next_bookmark_group": "dnoɹ⅁ ʞɹɐɯʞooᗺ ʇxǝN", + "key.cosmiccore.emi.prev_bookmark_group": "dnoɹ⅁ ʞɹɐɯʞooᗺ snoıʌǝɹԀ", + "key.cosmiccore.movement.dash": "ɥsɐᗡ", + "material.cosmiccore.advanced_overclock_nutrient": "ʇuǝıɹʇnN ʞɔoןɔɹǝʌO pǝɔuɐʌpⱯ", + "material.cosmiccore.advanced_production_nutrient": "ʇuǝıɹʇnN uoıʇɔnpoɹԀ pǝɔuɐʌpⱯ", + "material.cosmiccore.basic_overclock_nutrient": "ʇuǝıɹʇnN ʞɔoןɔɹǝʌO ɔısɐᗺ", + "material.cosmiccore.basic_production_nutrient": "ʇuǝıɹʇnN uoıʇɔnpoɹԀ ɔısɐᗺ", + "material.cosmiccore.blinkward_alloy": "ʎoןןⱯ pɹɐʍʞuıןᗺ", + "material.cosmiccore.causal_fabric": "ɔıɹqɐℲ ןɐsnɐƆ", + "material.cosmiccore.chlorophyte": "ǝʇʎɥdoɹoןɥƆ", + "material.cosmiccore.chronon": "uouoɹɥƆ", + "material.cosmiccore.cosmocite": "ǝʇıɔoɯsoƆ", + "material.cosmiccore.diluted_prisma": "ɐɯsıɹԀ pǝʇnןıᗡ", + "material.cosmiccore.draconic_tarragon": "uobɐɹɹɐ⟘ ɔıuoɔɐɹᗡ", + "material.cosmiccore.enderium": "ɯnıɹǝpuƎ", + "material.cosmiccore.energetic_alloy": "ʎoןןⱯ ɔıʇǝbɹǝuƎ", + "material.cosmiccore.enraged_stygian_plague": "ǝnbɐןԀ uɐıbʎʇS pǝbɐɹuƎ", + "material.cosmiccore.halizine": "ǝuızıןɐH", + "material.cosmiccore.ichor": "ɹoɥɔI", + "material.cosmiccore.ichorium": "ɯnıɹoɥɔI", + "material.cosmiccore.infinity": "ʎʇıuıɟuI", + "material.cosmiccore.kuvite": "ǝʇıʌnʞ", + "material.cosmiccore.living_igniclad": "pɐןɔıubI buıʌıꞀ", + "material.cosmiccore.lumium": "ɯnıɯnꞀ", + "material.cosmiccore.melodic_alloy": "ʎoןןⱯ ɔıpoןǝW", + "material.cosmiccore.moondrop": "doɹpuooW", + "material.cosmiccore.naquadric_superalloy": "ʎoןןɐɹǝdnS ɔıɹpɐnbɐN", + "material.cosmiccore.neutronite": "ǝʇıuoɹʇnǝN", + "material.cosmiccore.nevramite": "ǝʇıɯɐɹʌǝN", + "material.cosmiccore.pale_oil": "ןıO ǝןɐԀ", + "material.cosmiccore.pale_steel": "ןǝǝʇS ǝןɐԀ", + "material.cosmiccore.perfect_overclock_nutrient": "ʇuǝıɹʇnN ʞɔoןɔɹǝʌO ʇɔǝɟɹǝԀ", + "material.cosmiccore.perfect_production_nutrient": "ʇuǝıɹʇnN uoıʇɔnpoɹԀ ʇɔǝɟɹǝԀ", + "material.cosmiccore.prisma": "ɐɯsıɹԀ", + "material.cosmiccore.prismatic_tungstensteel": "ןǝǝʇsuǝʇsbun⟘ ɔıʇɐɯsıɹԀ", + "material.cosmiccore.programmable_matter": "ɹǝʇʇɐW ǝןqɐɯɯɐɹboɹԀ", + "material.cosmiccore.psionic_galvorn": "uɹoʌןɐ⅁ ɔıuoısԀ", + "material.cosmiccore.reclaimed_pale_ore": "ǝɹO ǝןɐԀ pǝɯıɐןɔǝᴚ", + "material.cosmiccore.resonant_virtue_meld": "pןǝW ǝnʇɹıΛ ʇuɐuosǝᴚ", + "material.cosmiccore.rosmotosin": "uısoʇoɯsoᴚ", + "material.cosmiccore.shimmering_neutronium": "ɯnıuoɹʇnǝN buıɹǝɯɯıɥS", + "material.cosmiccore.signalum": "ɯnןɐubıS", + "material.cosmiccore.sol_steel": "ןǝǝʇS ןoS", + "material.cosmiccore.somanone": "ǝuouɐɯoS", + "material.cosmiccore.spacetime": "ǝɯıʇǝɔɐdS", + "material.cosmiccore.starmetal": "ןɐʇǝɯɹɐʇS", + "material.cosmiccore.starstruck_halite": "ǝʇıןɐH ʞɔnɹʇsɹɐʇS", + "material.cosmiccore.stygian_plague": "ǝnbɐןԀ uɐıbʎʇS", + "material.cosmiccore.super_overclock_nutrient": "ʇuǝıɹʇnN ʞɔoןɔɹǝʌO ɹǝdnS", + "material.cosmiccore.super_production_nutrient": "ʇuǝıɹʇnN uoıʇɔnpoɹԀ ɹǝdnS", + "material.cosmiccore.superheavy_bedrock_alloy": "ʎoןןⱯ ʞɔoɹpǝᗺ ʎʌɐǝɥɹǝdnS", + "material.cosmiccore.taranium": "ɯnıuɐɹɐ⟘", + "material.cosmiccore.temmerite": "ǝʇıɹǝɯɯǝ⟘", + "material.cosmiccore.tenbrium": "ɯnıɹquǝ⟘", + "material.cosmiccore.trinavine": "ǝuıʌɐuıɹ⟘", + "material.cosmiccore.trinium_naqide": "ǝpıbɐN ɯnıuıɹ⟘", + "material.cosmiccore.triphenylphosphine": "ǝuıɥdsoɥdןʎuǝɥdıɹ⟘", + "material.cosmiccore.universe_tears": "sɹɐǝ⟘ ǝsɹǝʌıu∩", + "material.cosmiccore.vibrant_alloy": "ʎoןןⱯ ʇuɐɹqıΛ", + "material.cosmiccore.virtue_meld": "pןǝW ǝnʇɹıΛ", + "material.cosmiccore.vitrius": "snıɹʇıΛ", + "material.cosmiccore.voidspark": "ʞɹɐdspıoΛ", + "recipe.cosmiccore.envious_soul_in": "%s :ʇnduI ןnoS snoıʌuƎ", + "recipe.cosmiccore.envious_soul_out": "%s :ʇndʇnO ןnoS snoıʌuƎ", + "recipe.cosmiccore.gluttonous_soul_in": "%s :ʇnduI ןnoS snouoʇʇnן⅁", + "recipe.cosmiccore.gluttonous_soul_out": "%s :ʇndʇnO ןnoS snouoʇʇnן⅁", + "recipe.cosmiccore.greedy_soul_in": "%s :ʇnduI ןnoS ʎpǝǝɹ⅁", + "recipe.cosmiccore.greedy_soul_out": "%s :ʇndʇnO ןnoS ʎpǝǝɹ⅁", + "recipe.cosmiccore.lustful_soul_in": "%s :ʇnduI ןnoS ןnɟʇsnꞀ", + "recipe.cosmiccore.lustful_soul_out": "%s :ʇndʇnO ןnoS ןnɟʇsnꞀ", + "recipe.cosmiccore.proud_soul_in": "%s :ʇnduI ןnoS pnoɹԀ", + "recipe.cosmiccore.proud_soul_out": "%s :ʇndʇnO ןnoS pnoɹԀ", + "recipe.cosmiccore.raw_soul_in": "%s :ʇnduI ןnoS ʍɐᴚ", + "recipe.cosmiccore.raw_soul_out": "%s :ʇndʇnO ןnoS ʍɐᴚ", + "recipe.cosmiccore.refined_soul_in": "%s :ʇnduI ןnoS pǝuıɟǝᴚ", + "recipe.cosmiccore.refined_soul_out": "%s :ʇndʇnO ןnoS pǝuıɟǝᴚ", + "recipe.cosmiccore.slothful_soul_in": "%s :ʇnduI ןnoS ןnɟɥʇoןS", + "recipe.cosmiccore.slothful_soul_out": "%s :ʇndʇnO ןnoS ןnɟɥʇoןS", + "recipe.cosmiccore.temporal_soul_in": "%s :ʇnduI ןnoS ןɐɹodɯǝ⟘", + "recipe.cosmiccore.temporal_soul_out": "%s :ʇndʇnO ןnoS ןɐɹodɯǝ⟘", + "recipe.cosmiccore.wrathful_soul_in": "%s :ʇnduI ןnoS ןnɟɥʇɐɹM", + "recipe.cosmiccore.wrathful_soul_out": "%s :ʇndʇnO ןnoS ןnɟɥʇɐɹM", + "reflection.cosmiccore.bargain.ascension.answer.ready.drawback.0": "buıʎןɟ ʇou uǝɥʍ pǝǝds ʇuǝɯǝʌoɯ %0Ɛ-", + "reflection.cosmiccore.bargain.ascension.answer.ready.drawback.1": "sǝɔɐds pǝsoןɔuǝ ɹo sǝuoz ʎןɟ-ou uı ǝןqɐɹǝuןnΛ", + "reflection.cosmiccore.bargain.ascension.answer.ready.power.0": ")ǝuɹoqɹıɐ ǝןıɥʍ dɯnظ ɥʇıʍ ǝןbboʇ( ʇɥbıןɟ ǝןʎʇs-ǝʌıʇɐǝɹƆ", + "reflection.cosmiccore.bargain.ascension.answer.ready.power.1": "ʇsoɔ ɐuıɯɐʇs ɹo ɹǝbunɥ ʇnoɥʇıʍ ʎןǝʇıuıɟǝpuı ʎןℲ", + "reflection.cosmiccore.bargain.ascension.answer.ready.power.2": "buıʎןɟ ǝןıɥʍ ןoɹʇuoɔ ʇuǝɯǝʌoɯ ᗡƐ ןןnℲ", + "reflection.cosmiccore.bargain.ascension.answer.ready.power.3": "ǝʌıʇɔɐ sı ʇɥbıןɟ ǝןıɥʍ ǝbɐɯɐp ןןɐɟ oN", + "reflection.cosmiccore.bargain.ascension.answer.ready.response": "˙punoq-ɥʇɹɐǝ ɹǝbuoן ou ǝɹɐ noʎ ˙suǝdo ʎʞs ǝɥ⟘ ˙noʎ sǝʌɐǝן ʇɥbıǝM", + "reflection.cosmiccore.bargain.ascension.answer.ready.text": "˙ʎןɟ oʇ ʎpɐǝɹ ɯ,I ˙ʇı ןןnԀ", + "reflection.cosmiccore.bargain.ascension.answer.refuse.response": "˙pǝpunoɹ⅁ ˙ʎʌɐǝɥ ʎɐʇs ʇǝǝɟ ɹnoʎ ˙ʞɔɐq sʇɐoןɟ pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.ascension.answer.refuse.text": "˙ןןǝʍ ǝɯ pǝʌɹǝs sɐɥ punoɹb ǝɥ⟘ ˙ʇı ǝʌɐǝꞀ", + "reflection.cosmiccore.bargain.ascension.description": "˙uǝıןɐ sǝɯoɔǝq punoɹb ǝɥ⟘ ˙suǝdo ʎʞs ǝɥ⟘", + "reflection.cosmiccore.bargain.ascension.dialogue.0": "˙ʎʌɐǝɥ ןǝǝɟ ʇǝǝɟ ɹnoʎ ˙noʎ ʇɐ sbnʇ ʇI ˙pɹɐʍdn sʇɟıɹp pɐǝɹɥʇ sıɥ⟘", + "reflection.cosmiccore.bargain.ascension.dialogue.1": "˙ʇɥbıןɟ ǝnɹ⟘ ˙ǝןʎʇs ɥʇıʍ buıןןɐɟ ʇoN ˙buıpıןb ʇoN", + "reflection.cosmiccore.bargain.ascension.dialogue.2": "˙uıɐbɐ punoɹb ǝɥʇ pǝǝu ɹǝʌǝu p,noʎ ˙ɹoop ɐ ǝʞıן uǝdo pןnoʍ ʎʞs ǝɥ⟘", + "reflection.cosmiccore.bargain.ascension.dialogue.3": "˙buoɹM ˙ǝןqɐʇɹoɟɯoɔu∩ ˙uǝıןɐ ǝɯoɔǝq pןnoʍ punoɹb ǝɥʇ ʇnᗺ", + "reflection.cosmiccore.bargain.ascension.dialogue.4": "˙ʇuǝɯɥsıund ǝʞıן ןǝǝɟ pןnoʍ buıʞןɐM ˙ɥsıbbnןs ʍoɹb pןnoʍ sbǝן ɹnoʎ", + "reflection.cosmiccore.bargain.ascension.dialogue.5": "˙ɥʇɹɐǝ ǝɥʇ ʇoN ˙ʎʞs ǝɥʇ oʇ buoןǝq p,noʎ", + "reflection.cosmiccore.bargain.ascension.name": "uoısuǝɔsⱯ", + "reflection.cosmiccore.bargain.ascension.on_accept": "˙ǝsıɹ noʎ ˙suǝdo ʎʞs ǝɥ⟘ ˙pɹɐʍuʍop sןǝʌɐɹun buıɥʇǝɯoS", + "reflection.cosmiccore.bargain.ascension.on_defy": "˙ʎןǝʌıssǝssod 'ʞɔɐq noʎ sןןnd punoɹb ǝɥ⟘ ˙noʎ sɯıɐןɔǝɹ ʎʇıʌɐɹ⅁", + "reflection.cosmiccore.bargain.ascension.question": "¿ʇı ʍoןןoɟ noʎ oᗡ ˙pɹɐʍdn sןןnd pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.back.answer.accept.drawback.0": "ǝsn ʇɹodǝןǝʇ ɹǝd ʇsoɔ uoısoɹǝ ϛ", + "reflection.cosmiccore.bargain.back.answer.accept.drawback.1": "sǝʇnuıɯ 0Ɩ ɹǝʇɟɐ sǝpɐɟ ɹǝʞɹɐW", + "reflection.cosmiccore.bargain.back.answer.accept.power.0": ")ɥʇɐǝp ɹǝd ǝɔuo( uoıʇɐɔoן ɥʇɐǝp oʇ ʇɹodǝןǝ⟘", + "reflection.cosmiccore.bargain.back.answer.accept.power.1": "sןןɐʍ ɥbnoɹɥʇ ǝןqısıʌ ɹǝʞɹɐɯ ɥʇɐǝᗡ", + "reflection.cosmiccore.bargain.back.answer.accept.response": "˙ɹnoʇǝp ɐ — buıpuǝ uɐ ʇoN ˙ʍou ʇuıodʎɐʍ ɐ sǝɯoɔǝq ɥʇɐǝᗡ", + "reflection.cosmiccore.bargain.back.answer.accept.text": "˙ʞɔɐq ʎɐʍ ʎɯ puıɟ ǝɯ ʇǝꞀ ˙ʇı ןןnԀ", + "reflection.cosmiccore.bargain.back.answer.refuse.response": "˙ʎʇıןɐuıɟ sʇı sdǝǝʞ ɥʇɐǝᗡ ˙sɯıp pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.back.answer.refuse.text": "˙sǝɔuǝnbǝsuoɔ ǝʌɐɥ pןnoɥs ɥʇɐǝᗡ ˙ʇı ǝʌɐǝꞀ", + "reflection.cosmiccore.bargain.back.description": "ןןǝɟ ʇsɐן noʎ ǝɹǝɥʍ oʇ pɐǝɹɥʇ Ɐ", + "reflection.cosmiccore.bargain.back.dialogue.0": "˙buıɥʇǝɯos ʇɟǝן noʎ ǝɹǝɥʍ buıɹǝqɯǝɯǝɹ ǝʞıꞀ ˙nʌ ɐظǝp ǝʞıן sןǝǝɟ pɐǝɹɥʇ sıɥ⟘", + "reflection.cosmiccore.bargain.back.dialogue.1": "˙ʞɔɐq ןıɐɹʇ ɐ ǝʌɐǝן pןnoʍ sıɥʇ ʇnᗺ ˙noʎ sɹǝʇʇɐɔs ɥʇɐǝᗡ", + "reflection.cosmiccore.bargain.back.dialogue.2": "˙ɥʇɐǝp ɹǝd ǝɔuo 'ʞɔɐq ʇı ʍoןןoℲ ˙ןןǝɟ noʎ ǝɹǝɥʍ oʇ uoıʇɔǝuuoɔ Ɐ", + "reflection.cosmiccore.bargain.back.name": "ʞɔɐᗺ ʎɐM ǝɥ⟘", + "reflection.cosmiccore.bargain.back.on_accept": "˙ʞɔɐq ʇı ʍoןןoɟ uɐɔ noʎ ˙ɥʇɐǝɹq ʇsɐן ɹnoʎ oʇ noʎ sʇɔǝuuoɔ pɐǝɹɥʇ Ɐ", + "reflection.cosmiccore.bargain.back.on_defy": "˙ǝɹoɯ ǝɔuo ןɐuıɟ sǝɯoɔǝq ɥʇɐǝᗡ ˙sdɐus pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.back.question": "¿ןןnd noʎ oᗡ ˙sɥʇɐǝp ɹnoʎ ɹǝqɯǝɯǝɹ pןnoʍ pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.carapace.answer.refuse.response": "˙sɹnoʎ ˙ǝןıbɐɹℲ ˙ʇɟos sʎɐʇs uıʞs ɹnoʎ ˙sǝsɐǝ ʎʇıpıbıɹ ǝɥ⟘", + "reflection.cosmiccore.bargain.carapace.answer.refuse.text": "˙ǝɹnpuǝ ʎןǝɹǝɯ uɐɥʇ ןǝǝɟ ɹǝɥʇɐɹ p,I ˙ʇı ǝʌɐǝꞀ", + "reflection.cosmiccore.bargain.carapace.answer.survive.drawback.0": "sǝɔɹnos ןןɐ ɯoɹɟ buıןɐǝɥ %0ᄅ-", + "reflection.cosmiccore.bargain.carapace.answer.survive.drawback.1": "ssǝuǝʌıʇɔǝɟɟǝ uoıʇod pǝɔnpǝᴚ", + "reflection.cosmiccore.bargain.carapace.answer.survive.power.0": ")suoɔı ɹoɯɹɐ ןןnɟ ㄣ( sʇuıod ɹoɯɹɐ 8+", + "reflection.cosmiccore.bargain.carapace.answer.survive.power.1": "ɹoɯɹɐ uɹoʍ ɥʇıʍ sʞɔɐʇS", + "reflection.cosmiccore.bargain.carapace.answer.survive.response": "˙ǝןqɐɹnp ǝɹoɯ buıɥʇǝɯoS ˙suǝpɹɐH ˙suǝʇɥbıʇ uıʞs ɹnoʎ", + "reflection.cosmiccore.bargain.carapace.answer.survive.text": "˙ןɐʌıʌɹns ǝsooɥɔ I ˙ʇı ןןnԀ", + "reflection.cosmiccore.bargain.carapace.description": "buıɹnpuǝ buıɥʇǝɯos oʇuı suǝpɹɐɥ ɥsǝןɟ ɹnoʎ", + "reflection.cosmiccore.bargain.carapace.dialogue.0": "˙ʇı buıɥɔnoʇ ʇsnظ suǝʇɥbıʇ uıʞs ɹnoʎ ˙pɹɐH ˙pıbıɹ sı pɐǝɹɥʇ sıɥ⟘", + "reflection.cosmiccore.bargain.carapace.dialogue.1": "˙ɥsıuıɯıp pןnoʍ ǝbɐɯɐᗡ ˙ɟɟo ǝɔuɐןb pןnoʍ sʍoןᗺ ˙noʎ uǝpɹɐɥ pןnoʍ ʇI", + "reflection.cosmiccore.bargain.carapace.dialogue.2": "˙ʇı ɥbnoɹɥʇ uǝʌoʍ ssǝuqɯnu ɐ s,ǝɹǝɥʇ ʇnᗺ", + "reflection.cosmiccore.bargain.carapace.dialogue.3": "˙ɹǝʍoןs 'buıןɐǝH ˙ʇuɐʇsıp ǝɯoɔǝq pןnoʍ ɥɔno⟘", + "reflection.cosmiccore.bargain.carapace.dialogue.4": "˙uoıʇɐsuǝs ɟo ʇsoɔ ǝɥʇ ʇɐ ןɐʌıʌɹnS", + "reflection.cosmiccore.bargain.carapace.name": "ǝɔɐdɐɹɐƆ", + "reflection.cosmiccore.bargain.carapace.on_accept": "˙ʇuıod ǝɥʇ s,ʇɐɥ⟘ ˙ʇɹnɥ ʇ,usǝop ʇI ˙suǝʇɥbıʇ puɐ sǝןddıɹ ɥsǝןɟ ɹnoʎ", + "reflection.cosmiccore.bargain.carapace.on_defy": "˙uıɐbɐ ʇɟos ǝɹɐ noʎ ˙ǝɹnʇxǝʇ ʎɹǝʌǝ 'ǝzǝǝɹq ʎɹǝʌǝ — ʞɔɐq spooןɟ uoıʇɐsuǝS", + "reflection.cosmiccore.bargain.carapace.question": "¿ןןnd noʎ oᗡ ˙ɥsǝןɟ ɹnoʎ uǝpɹɐɥ pןnoʍ pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.cinder.answer.burn.drawback.0": "sǝɔɹnos pןoɔ puɐ buızǝǝɹɟ ɯoɹɟ ǝbɐɯɐp xᄅ", + "reflection.cosmiccore.bargain.cinder.answer.burn.drawback.1": "ʇuɐsɐǝןdun sןǝǝɟ 'ɹǝʍoןs sǝɥsınbuıʇxǝ ɹǝʇɐM", + "reflection.cosmiccore.bargain.cinder.answer.burn.power.0": "ʎʇıunɯɯı ɐʌɐן puɐ ǝɹıɟ ǝʇǝןdɯoƆ", + "reflection.cosmiccore.bargain.cinder.answer.burn.power.1": "ʎןǝɟɐs ɐʌɐן uı ɯıʍs uɐƆ", + "reflection.cosmiccore.bargain.cinder.answer.burn.response": "˙uıɐbɐ noʎ uǝʇɥbıɹɟ ɹǝʌǝu ןןıʍ ǝɹıℲ ˙sǝpǝɔǝɹ uǝɥʇ 'noʎ ɥbnoɹɥʇ spooןɟ ʇɐǝH", + "reflection.cosmiccore.bargain.cinder.answer.burn.text": "˙ʎןǝʇǝןdɯoɔ ǝɯ uɹnᗺ ˙ʇı ןןnԀ", + "reflection.cosmiccore.bargain.cinder.answer.refuse.response": "˙sbuoןǝq ʇı ǝɹǝɥʍ ǝpısʇno sʎɐʇs ʇɐǝɥ ǝɥ⟘ ˙sןooɔ pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.cinder.answer.refuse.text": "˙pǝʇɔǝdsǝɹ ǝq pןnoɥs ǝɹıℲ ˙ʇı ǝʌɐǝꞀ", + "reflection.cosmiccore.bargain.cinder.description": "pǝuɹnq ʎpɐǝɹןɐ sɐɥ ʇɐɥʍ ɯɹɐɥ ʇouuɐɔ ǝɹıℲ", + "reflection.cosmiccore.bargain.cinder.dialogue.0": "˙pןnoɥs ʎǝɥʇ — uɹnq ʇ,uop sɹǝbuıɟ ɹnoʎ ˙sɹǝpןoɯs ʇI ˙ʇoɥ sı pɐǝɹɥʇ sıɥ⟘", + "reflection.cosmiccore.bargain.cinder.dialogue.1": "˙ʎןǝʇǝןdɯoɔ pǝuɹnq ʎpɐǝɹןɐ sɐɥ pɐǝɹɥʇ sıɥʇ uı buıɥʇǝɯoS ˙ɹǝqɯǝ puɐ ɥsⱯ", + "reflection.cosmiccore.bargain.cinder.dialogue.2": "˙souɹǝɟuı ɥbnoɹɥʇ ʞןɐʍ p,noʎ ˙noʎ uo ɯıɐןɔ sʇı ǝsoן pןnoʍ ǝɹıɟ puɐ 'ʇı ןןnԀ", + "reflection.cosmiccore.bargain.cinder.dialogue.3": "˙ɹoop ʎɐʍ-ǝuo ɐ sı ʇɐǝH ˙buıʇs pןnoʍ ɹǝʇɐM ˙uǝdɹɐɥs pןnoʍ pןoɔ ǝɥʇ ʇnᗺ", + "reflection.cosmiccore.bargain.cinder.dialogue.4": "˙uıɐbɐ uɹnq ɹǝʌǝu puɐ 'ʎןǝʇǝןdɯoɔ 'ǝɔuo uɹnᗺ", + "reflection.cosmiccore.bargain.cinder.name": "ɹǝpuıƆ", + "reflection.cosmiccore.bargain.cinder.on_accept": "˙ɯopǝǝɹℲ ˙ɥsⱯ ˙ʇuɐʇsuı ǝɯɐs ǝɥʇ uı sǝıp puɐ sǝʇıubı ǝpısuı buıɥʇǝɯoS", + "reflection.cosmiccore.bargain.cinder.on_defy": "˙ʍou noʎ ǝǝs ʎǝɥʇ uǝɥʍ ʎןıɹbunɥ ɹǝʞɔıןɟ sǝɯɐןℲ ˙ʎɐʍɐ suıɐɹp ɥʇɯɹɐʍ ǝɥ⟘", + "reflection.cosmiccore.bargain.cinder.question": "¿ןןnd noʎ oᗡ ˙ǝɹıɟ pןo ɥʇıʍ sɹǝpןoɯs pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.darksight.answer.refuse.response": "˙ʇuǝɯoɯ ɐ ɹoɟ ɹǝʇɥbıɹq sןǝǝɟ ʇɥbıןɥɔɹoʇ ǝɥ⟘ ˙sǝpɐɟ pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.darksight.answer.refuse.text": "˙ɥbnouǝ ןןǝʍ ǝɯ sǝʌɹǝs ʇɥbıן ǝɥ⟘ ˙ʇı ǝʌɐǝꞀ", + "reflection.cosmiccore.bargain.darksight.answer.yes.drawback.0": "ʇɥbıןuns ʇɥbıɹq uı ʇɔǝɟɟǝ ssǝupuıןᗺ", + "reflection.cosmiccore.bargain.darksight.answer.yes.drawback.1": "ʎɐp buıɹnp punoɹbɹǝpun ʎɐʇs ʇsnW", + "reflection.cosmiccore.bargain.darksight.answer.yes.power.0": "ʇɔǝɟɟǝ uoısıΛ ʇɥbıN ʇuǝuɐɯɹǝԀ", + "reflection.cosmiccore.bargain.darksight.answer.yes.power.1": "ssǝuʞɹɐp ǝʇǝןdɯoɔ uı ǝǝS", + "reflection.cosmiccore.bargain.darksight.answer.yes.response": "˙uıɐɯop ɹnoʎ sǝɯoɔǝq ʞɹɐp ǝɥ⟘ ˙buıʇɐןıp dǝǝʞ puɐ ˙˙˙ǝʇɐןıp sןıdnd ɹnoʎ", + "reflection.cosmiccore.bargain.darksight.answer.yes.text": "˙ǝǝs ǝɯ ʇǝꞀ ˙ʇı ןןnԀ", + "reflection.cosmiccore.bargain.darksight.description": "ʍopɐɥs ǝɥʇ ʞuıɹp oʇ uɹɐǝן sǝʎǝ ɹnoʎ", + "reflection.cosmiccore.bargain.darksight.dialogue.0": "˙ʍoɥǝɯos ɯɹɐʍ s,ʇı ʇnᗺ ˙ʎןsnoıʌqO ˙ʞɹɐp sı pɐǝɹɥʇ sıɥ⟘", + "reflection.cosmiccore.bargain.darksight.dialogue.1": "˙sʇǝɹɔǝs sʇı buıɹǝpuǝɹɹns ʍopɐɥs ǝɥʇ — sɹǝɟɟo ʇı ʇɐɥʍ ןǝǝɟ uɐɔ noʎ", + "reflection.cosmiccore.bargain.darksight.dialogue.2": "˙pǝpǝǝu ɥɔɹoʇ oN ˙ǝɹɐq pıɐן 'ɹǝuɹoɔ uǝppıɥ ʎɹǝʌƎ", + "reflection.cosmiccore.bargain.darksight.dialogue.3": "˙uɹnq pןnoʍ ʇI ˙uns ǝɥ⟘ ˙puǝ ɹǝɥʇo ǝɥʇ ʇɐ buıʇs ɐ s,ǝɹǝɥʇ ʇnᗺ", + "reflection.cosmiccore.bargain.darksight.dialogue.4": "˙ʞɹɐp ǝɥʇ uı buıǝǝs ɟo ʇɟıb ǝɥʇ ɹoɟ ʇɥbıןʎɐp ǝpɐɹ⟘", + "reflection.cosmiccore.bargain.darksight.name": "ʇɥbısʞɹɐᗡ", + "reflection.cosmiccore.bargain.darksight.on_accept": "˙ʍou buıɥʇʎɹǝʌǝ ǝǝs noʎ ˙uoısıʌ ɹnoʎ ɯoɹɟ ʇɐǝɹʇǝɹ sʍopɐɥs ǝɥ⟘", + "reflection.cosmiccore.bargain.darksight.on_defy": "˙ǝɹoɯ ǝɔuo noʎ oʇ sʇǝɹɔǝs sʇı sǝsoןɔ ssǝuʞɹɐp ǝɥ⟘ ˙ʞɔɐq spooןɟ ʇɥbıꞀ", + "reflection.cosmiccore.bargain.darksight.question": "¿ןןnd noʎ oᗡ ˙ʞɹɐp ǝɥʇ oʇ sǝʎǝ ɹnoʎ uǝdo pןnoʍ pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.depths.answer.embrace.drawback.0": "sǝʇǝןdǝp ʎןןnɟ uǝbʎxo uǝɥʍ ɥʇɐǝp ʇuɐʇsuI", + "reflection.cosmiccore.bargain.depths.answer.embrace.drawback.1": "ɥʇɐǝp ʇsnظ - buıuɹɐʍ ǝbɐɯɐp buıuʍoɹp oN", + "reflection.cosmiccore.bargain.depths.answer.embrace.power.0": "ɹǝʇɐʍɹǝpun ʎʇıɔɐdɐɔ uǝbʎxo xϛ", + "reflection.cosmiccore.bargain.depths.answer.embrace.power.1": "sǝɹǝɥdsoɯʇɐ ɔıxoʇ uı ɥʇɐǝɹq pǝpuǝʇxƎ", + "reflection.cosmiccore.bargain.depths.answer.embrace.response": "˙ɯooɹ spǝǝu ʎʇıɔɐdɐɔ ʍǝu ǝɥ⟘ ˙ʍoןןoɥ sןǝǝɟ ʇsǝɥɔ ɹnoʎ", + "reflection.cosmiccore.bargain.depths.answer.embrace.text": "˙sɥʇdǝp ǝɥʇ ɹoɟ ǝɯ ǝʞɐɯǝᴚ ˙ʇı ןןnԀ", + "reflection.cosmiccore.bargain.depths.answer.refuse.response": "˙ʇıɐʍ sɥʇdǝp ǝɥ⟘ ˙ʞɹɐp ǝɥʇ oʇuı ʞɔɐq sʞuıs pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.depths.answer.refuse.text": "˙ɥʇɐǝɹq ןɐʇɹoɯ ʎɯ dǝǝʞ ןן,I ˙ʇı ǝʌɐǝꞀ", + "reflection.cosmiccore.bargain.depths.description": "sʇıɯıן ןɐʇɹoɯ puoʎǝq sǝɥɔʇǝɹʇs ɥʇɐǝɹq ɹnoʎ", + "reflection.cosmiccore.bargain.depths.dialogue.0": "˙ɹǝʇɐʍ dǝǝp ǝʞıן sןןǝɯs ʇI ˙ʇǝM ˙pןoɔ sı pɐǝɹɥʇ sıɥ⟘", + "reflection.cosmiccore.bargain.depths.dialogue.1": "˙buıuʍoɹp ɟo ɔıuɐd ǝɥ⟘ ˙sbunן ɹnoʎ uı uɹnq ǝɥʇ ɹǝqɯǝɯǝɹ noʎ", + "reflection.cosmiccore.bargain.depths.dialogue.2": "˙ʇı ǝʞɐɯǝᴚ ˙ɥʇɐǝɹq ɹnoʎ ɥɔʇǝɹʇs pןnoɔ pɐǝɹɥʇ sıɥʇ uı buıɥʇǝɯoS", + "reflection.cosmiccore.bargain.depths.dialogue.3": "˙ʎʇıןɐuıɟ Ɐ ˙puǝ ǝɥʇ ʇɐ ssǝudɹɐɥs ɐ s,ǝɹǝɥʇ ʇnᗺ", + "reflection.cosmiccore.bargain.depths.dialogue.4": "˙buıuɹɐʍ ou ǝq ןןıʍ ǝɹǝɥʇ 'ʇno sunɹ ɥʇɐǝɹq ǝɥʇ uǝɥM", + "reflection.cosmiccore.bargain.depths.dialogue.5": "˙ǝɔuǝןıs ʇsnſ ˙buıpɐɟ oN ˙sdsɐb oN", + "reflection.cosmiccore.bargain.depths.name": "sɥʇdǝᗡ ǝɥ⟘", + "reflection.cosmiccore.bargain.depths.on_accept": "˙ʍou ʇuǝɹǝɟɟıp sǝʇsɐʇ ɹıɐ ǝɥ⟘ ˙ʇsǝɥɔ ɹnoʎ uı sʇɟıɥs buıɥʇǝɯoS", + "reflection.cosmiccore.bargain.depths.on_defy": "˙uıɐbɐ ןɐʇɹoɯ ǝɹɐ noʎ ˙ǝןbbnɹʇs ɹǝqɯǝɯǝɹ 'ɔıuɐd ɹǝqɯǝɯǝɹ sbunן ɹnoʎ", + "reflection.cosmiccore.bargain.depths.question": "¿ʇı ןןnd noʎ oᗡ ˙ɥʇɐǝɹq ɹnoʎ ǝdɐɥsǝɹ pןnoɔ pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.home.answer.accept.drawback.0": "ʇɹodǝןǝʇ ɹǝd ʇsoɔ uoısoɹǝ 0Ɩ", + "reflection.cosmiccore.bargain.home.answer.accept.drawback.1": "ǝɯoɥ ɯoɹɟ ɹɐɟ ǝןıɥʍ uıɐb ԀX %0Ɩ-", + "reflection.cosmiccore.bargain.home.answer.accept.power.0": "ʇuıod pǝq/uʍɐds oʇ ʇɹodǝןǝʇ ʇuɐʇsuI", + "reflection.cosmiccore.bargain.home.answer.accept.power.1": "sǝsn uǝǝʍʇǝq uʍopןooɔ ǝʇnuıɯ ϛ", + "reflection.cosmiccore.bargain.home.answer.accept.response": "˙ǝɯıʇʎuɐ ʇı ןןnԀ ˙ǝɯoɥ puɐ noʎ uǝǝʍʇǝq sǝɥɔʇǝɹʇs pɹoɔ Ɐ", + "reflection.cosmiccore.bargain.home.answer.accept.text": "˙ǝɯoɥ oʇ ǝɯ puıᗺ ˙ʇı ןןnԀ", + "reflection.cosmiccore.bargain.home.answer.refuse.response": "˙ʞןɐʍ ןן,noʎ ˙sı ʇı ǝɹǝɥʍ sʎɐʇs ǝɯoH ˙sǝpɐɟ ɥʇɯɹɐʍ ǝɥ⟘", + "reflection.cosmiccore.bargain.home.answer.refuse.text": "˙pǝuɹɐǝ ǝq pןnoɥs ǝɯoH ˙ʇı ǝʌɐǝꞀ", + "reflection.cosmiccore.bargain.home.description": "ʎɐʍɐ ʇɥbnoɥʇ ɐ uɐɥʇ ǝɹoɯ ɹǝʌǝu sı ǝɯoH", + "reflection.cosmiccore.bargain.home.dialogue.0": "˙sןןɐʍ ɹnoʎ 'pǝq ɹnoʎ ǝʞıן sןןǝɯs ʇI ˙ɹɐıןıɯɐℲ ˙ɯɹɐʍ sı pɐǝɹɥʇ sıɥ⟘", + "reflection.cosmiccore.bargain.home.dialogue.1": "˙ǝןqɐʞɐǝɹqu∩ ˙ʇuɐʇsuı ǝq pןnoɔ ʇI ˙ɹoɥɔuɐ ǝɥ⟘ ˙ǝɯoH", + "reflection.cosmiccore.bargain.home.dialogue.2": "˙noʎ sןןnp ɹɐɟ buıɹǝpuɐʍ puⱯ ˙ǝɯıʇ ɥɔɐǝ buıɥʇǝɯos sʇsoɔ ɹǝɥʇǝʇ ǝɥʇ ʇnᗺ", + "reflection.cosmiccore.bargain.home.name": "pɹɐʍǝɯoH", + "reflection.cosmiccore.bargain.home.on_accept": "˙ǝɯıʇʎuɐ ʇı ןןnԀ ˙ǝɯoɥ puɐ noʎ uǝǝʍʇǝq sǝɥɔʇǝɹʇs pıoʌ ɟo pɹoɔ Ɐ", + "reflection.cosmiccore.bargain.home.on_defy": "˙ʇnɔʇɹoɥs ɐ ʇou 'uıɐbɐ ʎǝuɹnoظ ɐ sı ǝɯoH ˙sǝʌןossıp pɹoɔ ǝɥ⟘", + "reflection.cosmiccore.bargain.home.question": "¿ןןnd noʎ oᗡ ˙ǝɯoɥ spɐǝן pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.quake_movement.answer.refuse.response": "˙ʍou ɹoℲ ˙sǝpɐɟ ǝɥɔɐ ǝɥ⟘ ˙sןןıʇs pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.quake_movement.answer.refuse.text": "˙ɯɥʇʎɥɹ uʍo ɹıǝɥʇ ʍouʞ ʇǝǝɟ ʎW ˙ʇı ǝʌɐǝꞀ", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.drawback.0": "sɹǝʌɹǝsqo oʇ ןɐɹnʇɐuun sןǝǝɟ ʇuǝɯǝʌoW", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.power.0": "ɯnʇuǝɯoɯ spןınq puɐ sǝʌɹǝsǝɹd buıddoɥ ʎuunᗺ", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.power.1": "ןoɹʇuoɔ uoıʇɔǝɹıp ɹıɐ-pıɯ ɹoɟ buıɟɐɹʇs ɹıⱯ", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.response": "˙ʇɔuıʇsuı sǝɯoɔǝq ʇuǝɯǝʌoW ˙ǝɹıʍǝɹ sǝןɔsnɯ ɹnoʎ ˙ʞɔɐɹɔ sʇuıoظ ɹnoʎ", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.text": "˙ɹǝqɯǝɯǝɹ ɯǝɥʇ ʇǝꞀ", + "reflection.cosmiccore.bargain.quake_movement.description": "ǝʌoɯ oʇ ʎɐʍ ʇuǝɹǝɟɟıp ɐ sɹǝqɯǝɯǝɹ sbǝן ɹnoʎ uı buıɥʇǝɯoS", + "reflection.cosmiccore.bargain.quake_movement.dialogue.0": "˙ʇı buıɥɔnoʇ ʇsnظ ǝɥɔɐ sbǝן ɹnoʎ ˙uoıʇoɯ ɥʇıʍ sɯnɥ pɐǝɹɥʇ sıɥ⟘", + "reflection.cosmiccore.bargain.quake_movement.dialogue.1": "˙pıbıɹ ǝɯɐɔǝq sɔısʎɥd ǝɹoɟǝᗺ ˙ʎןʇuǝɹǝɟɟıp buıʌoɯ ɟo — ʇı uı ʎɹoɯǝɯ ɐ s,ǝɹǝɥ⟘", + "reflection.cosmiccore.bargain.quake_movement.dialogue.2": "˙ɹǝqɯǝɯǝɹ oʇ ʇuɐʍ ʎǝɥ⟘ ˙ɥɔʇıʍʇ sǝןɔsnɯ ɹnoʎ", + "reflection.cosmiccore.bargain.quake_movement.dialogue.3": "˙uıɐbɐ ssǝuןןıʇs ɥʇıʍ ʇuǝʇuoɔ ǝq ɹǝʌǝu ןןıʍ ʎpoq ɹnoʎ puɐ 'ʇı ןןnԀ", + "reflection.cosmiccore.bargain.quake_movement.name": "ʎʇıɔoןǝΛ", + "reflection.cosmiccore.bargain.quake_movement.on_accept": "˙ʍǝu buıɥʇǝɯos oʇuı uǝdo sʞɐǝɹq ǝpıɹʇs ɹnoʎ ˙sןǝʌɐɹun buıɥʇǝɯoS", + "reflection.cosmiccore.bargain.quake_movement.on_defy": "˙oʇuo pןoɥ ǝʇınb ʇ,uɐɔ noʎ ɯɐǝɹp ɐ ǝʞıן sǝpɐɟ pǝǝds ǝɥ⟘", + "reflection.cosmiccore.bargain.quake_movement.question": "¿ɯǝɥʇ ʇǝן noʎ oᗡ ˙buıɥʇǝɯos ɹǝqɯǝɯǝɹ sbǝן ɹnoʎ", + "reflection.cosmiccore.bargain.reach.answer.further.drawback.0": "pǝǝds buıuıɯ %ϛƖ-", + "reflection.cosmiccore.bargain.reach.answer.further.drawback.1": "pǝɔnpǝɹ ǝbuɐɹ dnʞɔıd ɯǝʇI", + "reflection.cosmiccore.bargain.reach.answer.further.power.0": ")ɹǝɥʇɹnɟ ɯoɹɟ pןınq( ɥɔɐǝɹ ʞɔoןq Ɛ+", + "reflection.cosmiccore.bargain.reach.answer.further.power.1": "ɥɔɐǝɹ ʞɔɐʇʇɐ ᄅ+", + "reflection.cosmiccore.bargain.reach.answer.further.response": "˙ɹǝbuoן buıǝq ɹǝqɯǝɯǝɹ sɯɹɐ ɹnoʎ ˙sɹǝpןnoɥs ɹnoʎ uı sʇɟıɥs buıɥʇǝɯoS", + "reflection.cosmiccore.bargain.reach.answer.further.text": "˙ɹǝɥʇɹnɟ ǝɯ ɥɔʇǝɹʇS ˙ʇı ןןnԀ", + "reflection.cosmiccore.bargain.reach.answer.refuse.response": "˙ɥʇbuǝן s,ɯɹɐ ʇɐ sʎɐʇs pןɹoʍ ǝɥ⟘ ˙sʇɔɐɹʇuoɔ pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.reach.answer.refuse.text": "˙ʇuǝıɔıɟɟns sı ɥɔɐǝɹ ʎW ˙ʇı ǝʌɐǝꞀ", + "reflection.cosmiccore.bargain.reach.description": "ןɐɹnʇɐu s,ʇɐɥʍ puoʎǝq spuǝʇxǝ dsɐɹb ɹnoʎ", + "reflection.cosmiccore.bargain.reach.dialogue.0": "˙ʇı ɹɐǝu ǝɥɔɐ sɯɹɐ ɹnoʎ ˙buoꞀ ˙sǝɥɔʇǝɹʇs pɐǝɹɥʇ sıɥ⟘", + "reflection.cosmiccore.bargain.reach.dialogue.1": "˙dɐb ʇɐɥʇ ǝsoןɔ pןnoʍ pɐǝɹɥʇ sıɥʇ — ɥɔɐǝɹ ɟo ʇno ʎןʇɥbıןs ʇsnظ buıɥʇʎɹǝʌƎ", + "reflection.cosmiccore.bargain.reach.dialogue.2": "˙buoɹʍ ןǝǝɟ pןnoʍ spuɐɥ ɹnoʎ ʇnᗺ ˙ɹǝɥʇɹɐɟ ǝʞıɹʇS ˙ɹǝɥʇɹɐɟ pןınᗺ", + "reflection.cosmiccore.bargain.reach.dialogue.3": "˙uoısuǝʇxǝ ɟo ǝɔıɹd ǝɥ⟘ ˙ǝsoןɔ dn sbuıɥʇ ʞɔıd oʇ ɹǝpɹɐH ˙ʞɹoʍ oʇ ɹǝʍoןS", + "reflection.cosmiccore.bargain.reach.name": "ɥɔɐǝᴚ", + "reflection.cosmiccore.bargain.reach.on_accept": "˙ɹǝbuoן buıǝq ɹǝqɯǝɯǝɹ sɯɹɐ ɹnoʎ ˙sɹǝpןnoɥs ɹnoʎ uı sʇɟıɥs buıɥʇǝɯoS", + "reflection.cosmiccore.bargain.reach.on_defy": "˙uıɐbɐ ןןɐɯs puɐ ǝsoןɔ sןǝǝɟ pןɹoʍ ǝɥ⟘ ˙ןɐɯɹou oʇ ʞɔɐq ʇɔɐɹʇuoɔ sɯɹɐ ɹnoʎ", + "reflection.cosmiccore.bargain.reach.question": "¿ןןnd noʎ oᗡ ˙pɹɐʍʇno sǝɥɔʇǝɹʇs pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.satiated.answer.empty.drawback.0": "ʎןןɐɯɹou ɥʇןɐǝɥ ǝʇɐɹǝuǝbǝɹ ʇou uɐɔ noʎ", + "reflection.cosmiccore.bargain.satiated.answer.empty.drawback.1": "sɟɟnq pǝsɐq-pooɟ ɯoɹɟ ʇıɟǝuǝq ʇouuɐƆ", + "reflection.cosmiccore.bargain.satiated.answer.empty.power.0": "ɹǝʍoןs %08 sǝʇǝןdǝp ɹǝbunH", + "reflection.cosmiccore.bargain.satiated.answer.empty.power.1": "uoıʇɐɹnʇɐs xƐ sǝpıʌoɹd pooℲ", + "reflection.cosmiccore.bargain.satiated.answer.empty.response": "˙ɯopǝǝɹℲ ˙ʎןןǝq ɹnoʎ uı ǝɔuǝןıS ˙sdoʇs buıʍɐub ǝɥ⟘", + "reflection.cosmiccore.bargain.satiated.answer.empty.text": "˙ɹǝbunɥ sıɥʇ ɯoɹɟ ǝɯ ǝǝɹℲ ˙ʇı ןןnԀ", + "reflection.cosmiccore.bargain.satiated.answer.refuse.response": "˙ɹɐıןıɯɐℲ ˙sןʍoɹb ɥɔɐɯoʇs ɹnoʎ ˙ʞɔɐq sǝןʇʇǝs ssǝuıʇdɯǝ ǝɥ⟘", + "reflection.cosmiccore.bargain.satiated.answer.refuse.text": "˙sןɐǝɯ ʎɯ ʎoظuǝ I ˙ʇı ǝʌɐǝꞀ", + "reflection.cosmiccore.bargain.satiated.description": "ʎɹoɯǝɯ ʇuɐʇsıp ɐ oʇ sǝpɐɟ ɹǝbunH", + "reflection.cosmiccore.bargain.satiated.dialogue.0": "˙ʇı ɹɐǝu sʇǝınb ɥɔɐɯoʇs ɹnoʎ ˙ʎʇdɯƎ ˙ʍoןןoɥ sı pɐǝɹɥʇ sıɥ⟘", + "reflection.cosmiccore.bargain.satiated.dialogue.1": "˙ǝʇɐʇs ןɐɹnʇɐu ɹnoʎ ǝq pןnoʍ ssǝuןןnℲ ˙doʇs pןnoʍ buıʍɐub ʇuɐʇsuoɔ ǝɥ⟘", + "reflection.cosmiccore.bargain.satiated.dialogue.2": "˙pǝǝu ɹoɟ ɹǝʌǝu — ןɐnʇıɹ ɹoɟ 'ǝʇsɐʇ ɹoɟ ʇɐǝ p,noʎ", + "reflection.cosmiccore.bargain.satiated.dialogue.3": "˙ǝɹoɯ buıɥʇoN ˙ןǝnɟ sǝɯoɔǝq pooℲ ˙ןןnp pןnoʍ ɟןǝsʇı ǝʇsɐʇ ʇnᗺ", + "reflection.cosmiccore.bargain.satiated.dialogue.4": "˙ɟןǝsʇı puǝɯ oʇ ʍoɥ sʇǝbɹoɟ ʎpoq ɹnoʎ 'ǝbpǝ s,ɹǝbunɥ ʇnoɥʇıʍ puⱯ", + "reflection.cosmiccore.bargain.satiated.name": "pǝʇɐıʇɐS", + "reflection.cosmiccore.bargain.satiated.on_accept": "˙ɯopǝǝɹℲ ˙ʎןןǝq ɹnoʎ uı ǝɔuǝןıS ˙sdoʇs buıʍɐub ǝɥ⟘", + "reflection.cosmiccore.bargain.satiated.on_defy": "˙ǝʞıן sןǝǝɟ pǝǝu ʇɐɥʍ ɹǝqɯǝɯǝɹ noʎ ˙ǝɔuɐǝbuǝʌ ɐ ɥʇıʍ suɹnʇǝɹ ɹǝbunH", + "reflection.cosmiccore.bargain.satiated.question": "¿ןןnd noʎ oᗡ ˙ɹǝbunɥ ɹnoʎ ǝɔuǝןıs pןnoʍ pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.soft_landing.answer.refuse.response": "˙pןoɥ sʇı sdǝǝʞ ʎʇıʌɐɹ⅁ ˙sǝןʇʇǝs pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.soft_landing.answer.refuse.text": "˙snoıʇnɐɔ ǝɯ sdǝǝʞ ɹɐǝℲ ˙ʇı ǝʌɐǝꞀ", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.drawback.0": "sǝɔɹnos ןןɐ ɯoɹɟ uǝʞɐʇ ǝbɐɯɐp %ϛƖ+", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.drawback.1": "ǝɔuɐʇsısǝɹ ʞɔɐqʞɔouʞ pǝɔnpǝᴚ", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.power.0": "ʎʇıunɯɯı ǝbɐɯɐp ןןɐɟ %08", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.power.1": "buıɥʇou ʇsoɯןɐ op sןןɐɟ ʇɹoɥS", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.response": "˙ʍou noʎ ɥɔʇɐɔ ןןıʍ punoɹb ǝɥ⟘ ˙noʎ sǝʌɐǝן ʇɥbıǝM", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.text": "˙buıןןɐɟ ɟo ɹɐǝɟ ǝɥʇ ʎɐʍɐ ǝʞɐ⟘ ˙ʇı ןןnԀ", + "reflection.cosmiccore.bargain.soft_landing.description": "noʎ uo dıɹb sʇı suǝsooן ʎʇıʌɐɹ⅁", + "reflection.cosmiccore.bargain.soft_landing.dialogue.0": "˙ʇı ɥɔnoʇ noʎ uǝɥʍ sʇɟıɹp ʇI ˙ssǝןʇɥbıǝM ˙ʇɥbıן sı pɐǝɹɥʇ sıɥ⟘", + "reflection.cosmiccore.bargain.soft_landing.dialogue.1": "˙ʇɔɐdɯı ǝɹoɟǝq ʇuǝɯoɯ buıuǝʞɔıs ǝɥ⟘ ˙buıןןɐɟ ɹǝqɯǝɯǝɹ noʎ", + "reflection.cosmiccore.bargain.soft_landing.dialogue.2": "˙noʎ ǝʌıbɹoɟ pןnoʍ punoɹb ǝɥ⟘ ˙buıpuɐן ʎɹǝʌǝ uǝʇɟos pןnoʍ sıɥ⟘", + "reflection.cosmiccore.bargain.soft_landing.dialogue.3": "˙ןןɐɹǝʌo ǝןıbɐɹɟ ǝɹoɯ ǝq p,noʎ ˙ʇı ɥʇıʍ suǝsooן ǝsןǝ buıɥʇǝɯos ʇnᗺ", + "reflection.cosmiccore.bargain.soft_landing.dialogue.4": "˙sʎɐʍ ɹǝɥʇo uı ʞɐǝɹq oʇ ɹǝısɐƎ ˙ɹǝʇɟoS ˙ɹǝʇɥbıꞀ", + "reflection.cosmiccore.bargain.soft_landing.name": "buıpuɐꞀ ʇɟoS", + "reflection.cosmiccore.bargain.soft_landing.on_accept": "˙ʍou ʎןʇuǝb ʇnq 'sןןnd ןןıʇs ʇI ˙sʇɟıɥs ʎʇıʌɐɹb ɥʇıʍ dıɥsuoıʇɐןǝɹ ɹnoʎ", + "reflection.cosmiccore.bargain.soft_landing.on_defy": "˙uıɐbɐ sɹǝʇʇɐɯ ןןɐɟ ʎɹǝʌƎ ˙sǝuoq ɹnoʎ oʇuı ʞɔɐq sǝɥsɐɹɔ ʇɥbıǝM", + "reflection.cosmiccore.bargain.soft_landing.question": "¿ןןnd noʎ oᗡ ˙sןןɐɟ ɹnoʎ ɥɔʇɐɔ pןnoʍ pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.stride.answer.accept.drawback.0": "sǝbpǝ ɟɟo ʞןɐʍ-ɥɔnoɹɔ ʇouuɐƆ", + "reflection.cosmiccore.bargain.stride.answer.accept.power.0": "ʇɥbıǝɥ ʞɔoןq Ɩ oʇ dn-dǝʇs oʇnⱯ", + "reflection.cosmiccore.bargain.stride.answer.accept.power.1": "ןɐsɹǝʌɐɹʇ uıɐɹɹǝʇ ɥʇooɯS", + "reflection.cosmiccore.bargain.stride.answer.accept.response": "˙dǝʇs ɹnoʎ ɹoɟ ɟןǝsʇı sǝdɐɥsǝɹ uıɐɹɹǝ⟘ ˙ʎןʇɥbıןs sʇɟıɥs ɥʇɹɐǝ ǝɥ⟘", + "reflection.cosmiccore.bargain.stride.answer.accept.text": "˙uǝʇʇɐןɟ pןɹoʍ ǝɥʇ ʇǝꞀ ˙ʇı ןןnԀ", + "reflection.cosmiccore.bargain.stride.answer.refuse.response": "˙sǝbpǝ sʇı sdǝǝʞ pןɹoʍ ǝɥ⟘ ˙ʞɔɐq sǝןʇʇǝs pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.stride.answer.refuse.text": "˙ʎɐʍ uʍo ʎɯ qɯıןɔ ןן,I ˙ʇı ǝʌɐǝꞀ", + "reflection.cosmiccore.bargain.stride.description": "ʇǝǝɟ ɹnoʎ ʇǝǝɯ oʇ sǝsıɹ punoɹb ǝɥ⟘", + "reflection.cosmiccore.bargain.stride.dialogue.0": "˙ʇı buıɥɔnoʇ ʇsnظ pןǝıʎ oʇ sɯǝǝs punoɹb ǝɥ⟘ ˙ʇɐןℲ ˙pɐǝɹɥʇ ɥʇooɯs Ɐ", + "reflection.cosmiccore.bargain.stride.dialogue.1": "˙noʎ ǝʇɐpoɯɯoɔɔɐ ʎןdɯıs p,ʎǝɥʇ — ǝןɔɐʇsqo ןןɐɯs ʎɹǝʌǝ 'ǝbpǝן ʎɹǝʌƎ", + "reflection.cosmiccore.bargain.stride.dialogue.2": "˙punoɹb ǝɥʇ ǝʌɐǝן oʇ pǝǝu ɹǝʌǝu pןnoʍ ʇǝǝɟ ɹnoʎ", + "reflection.cosmiccore.bargain.stride.dialogue.3": "˙ɟןǝsɹnoʎ buıɥɔʇɐɔ oN ˙ooʇ noʎ uo dıɹb ɹıǝɥʇ ǝsoן pןnoʍ sǝbpǝ ʇnᗺ", + "reflection.cosmiccore.bargain.stride.name": "ǝpıɹʇS", + "reflection.cosmiccore.bargain.stride.on_accept": "˙noʎ ɹoɟ ɟןǝsʇı sɥʇooɯs pןɹoʍ ǝɥ⟘ ˙ʇooɟɹǝpun suǝsooן buıɥʇǝɯoS", + "reflection.cosmiccore.bargain.stride.on_defy": "˙noʎ ʇnoqɐ ǝɹɐɔ ʇ,usǝop punoɹb ǝɥ⟘ ˙uıɐbɐ ǝbuǝןןɐɥɔ ɐ sı ǝbpǝן ʎɹǝʌƎ", + "reflection.cosmiccore.bargain.stride.question": "¿ןןnd noʎ oᗡ ˙noʎ ǝɹoɟǝq uǝʇʇɐןɟ pןnoɔ punoɹb ǝɥ⟘", + "reflection.cosmiccore.bargain.swiftness.answer.accept.drawback.0": "ןןıʇs buıpuɐʇs uǝɥʍ ɹǝbunɥ pǝsɐǝɹɔuI", + "reflection.cosmiccore.bargain.swiftness.answer.accept.power.0": "pǝǝds ʇuǝɯǝʌoɯ %0ㄣ+", + "reflection.cosmiccore.bargain.swiftness.answer.accept.power.1": "uıɐɹp ɹǝbunɥ ʇnoɥʇıʍ ʇuıɹdS", + "reflection.cosmiccore.bargain.swiftness.answer.accept.response": "˙ʎbɹǝuǝ ssǝןʇsǝɹ ɥʇıʍ ɥɔʇıʍʇ noʎ ˙sǝןɔsnɯ ɹnoʎ ɥbnoɹɥʇ sɔɹɐ buıuʇɥbıꞀ", + "reflection.cosmiccore.bargain.swiftness.answer.accept.text": "˙unɹ ǝɯ ʇǝꞀ ˙ʇı ןןnԀ", + "reflection.cosmiccore.bargain.swiftness.answer.refuse.response": "˙ǝɔɐd sʇı sdǝǝʞ pןɹoʍ ǝɥ⟘ ˙sןןıʇs uoıʇɐɹqıʌ ǝɥ⟘", + "reflection.cosmiccore.bargain.swiftness.answer.refuse.text": "˙ǝɔɐd ʎɯ ɥʇıʍ ʇuǝʇuoɔ ɯ,I ˙ʇı ǝʌɐǝꞀ", + "reflection.cosmiccore.bargain.swiftness.description": "noʎ punoɹɐ uʍop sʍoןs pןɹoʍ ǝɥ⟘", + "reflection.cosmiccore.bargain.swiftness.dialogue.0": "˙ɥsıbbnןs sɯǝǝs ʇı punoɹɐ buıɥʇʎɹǝʌƎ ˙ʇsɐℲ ˙sǝʇɐɹqıʌ pɐǝɹɥʇ sıɥ⟘", + "reflection.cosmiccore.bargain.swiftness.dialogue.1": "˙ɹnןq oʇ ʇuɐʍ sbǝן ɹnoʎ ˙ǝɔɐɹ oʇ sǝɥɔɐ pooןq ɹnoʎ", + "reflection.cosmiccore.bargain.swiftness.dialogue.2": "˙noʎ ʇɐ ʍɐub ןןıʍ ssǝuןןıʇS ˙ʇı oʇ ɹǝbunɥ ɐ sɐɥ pǝǝds ʇnᗺ", + "reflection.cosmiccore.bargain.swiftness.name": "ssǝuʇɟıʍS", + "reflection.cosmiccore.bargain.swiftness.on_accept": "˙sǝbpǝ ǝɥʇ ʇɐ sɹnןq pןɹoʍ ǝɥ⟘ ˙spuıʍun buıɥʇǝɯoS", + "reflection.cosmiccore.bargain.swiftness.on_defy": "˙ǝɹoɯ ǝɔuo uɐɯnɥ ʎןǝɹǝW ˙noʎ punoɹɐ dn ʞɔɐq spǝǝds pןɹoʍ ǝɥ⟘", + "reflection.cosmiccore.bargain.swiftness.question": "¿ʇı ןןnd noʎ oᗡ ˙pǝǝds ɥʇıʍ sɯnɥ pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.violence.answer.accept.drawback.0": "sǝɔɹnos ןןɐ ɯoɹɟ uǝʞɐʇ ǝbɐɯɐp %0ᄅ+", + "reflection.cosmiccore.bargain.violence.answer.accept.drawback.1": "spןǝıɥs ǝsn ʇouuɐƆ", + "reflection.cosmiccore.bargain.violence.answer.accept.power.0": "ʇןɐǝp ǝbɐɯɐp ǝǝןǝɯ %0Ɛ+", + "reflection.cosmiccore.bargain.violence.answer.accept.power.1": "pǝǝds ʞɔɐʇʇɐ %ϛƖ+", + "reflection.cosmiccore.bargain.violence.answer.accept.response": "˙ʍou ǝןqɐʞɐǝɹq os sʞooן buıɥʇʎɹǝʌƎ ˙sɯɹɐ ɹnoʎ ɥbnoɹɥʇ sǝbɹns ɹǝʍoԀ", + "reflection.cosmiccore.bargain.violence.answer.accept.text": "˙sʇuıɐɹʇsǝɹ ʎɯ ǝʌoɯǝᴚ ˙ʇı ןןnԀ", + "reflection.cosmiccore.bargain.violence.answer.refuse.response": "˙ɥɔuǝןɔun sʇsıɟ ɹnoʎ ˙sןןnp ssǝudɹɐɥs ǝɥ⟘", + "reflection.cosmiccore.bargain.violence.answer.refuse.text": "˙ɥʇbuǝɹʇs uʍo sʇı sı ʇuıɐɹʇsǝᴚ ˙ʇı ǝʌɐǝꞀ", + "reflection.cosmiccore.bargain.violence.description": "˙ǝןqɐʞɐǝɹq sǝɯoɔǝq buıɥʇʎɹǝʌƎ ˙ǝʌןossıp sʇuıɐɹʇsǝɹ ɹnoʎ", + "reflection.cosmiccore.bargain.violence.dialogue.0": "˙buıɥʇǝɯos ʇnɔ oʇ sʇuɐʍ ʇI ˙pǝbbɐᴚ ˙dɹɐɥs sı pɐǝɹɥʇ sıɥ⟘", + "reflection.cosmiccore.bargain.violence.dialogue.1": "˙op pןnoɔ noʎ ǝbɐɯɐp ǝɥʇ sɹɐǝɟ noʎ ɟo ʇɹɐd ǝɯoS ˙buıʍs ʎɹǝʌǝ ʞɔɐq pןoɥ noʎ", + "reflection.cosmiccore.bargain.violence.dialogue.2": "˙ʎןǝǝɹɟ ʍoןɟ ʇı ʇǝꞀ ˙ʇuıɐɹʇsǝɹ ʇɐɥʇ ǝʌoɯǝɹ pןnoʍ sıɥ⟘", + "reflection.cosmiccore.bargain.violence.dialogue.3": "˙ɹǝısɐǝ ʞɐǝɹq puɐ — ɹǝısɐǝ sbuıɥʇ ʞɐǝɹq p,noʎ ˙sʎɐʍ ɥʇoq sʍoןɟ ǝɔuǝןoıʌ ʇnᗺ", + "reflection.cosmiccore.bargain.violence.dialogue.4": "˙ǝɔɹoɟ ʇsnſ ˙buıpıɥ oN ˙spןǝıɥs oN", + "reflection.cosmiccore.bargain.violence.name": "ǝɔuǝןoıΛ", + "reflection.cosmiccore.bargain.violence.on_accept": "˙ǝǝɹɟ s,ʇı ʍoN ˙ǝɹǝɥʇ sʎɐʍןɐ sɐʍ ǝbɐɹ ǝɥ⟘ ˙ǝpısuı ǝsooן sdɐus buıɥʇǝɯoS", + "reflection.cosmiccore.bargain.violence.on_defy": "˙ʇɥbıǝʍ ןɐʇɹoɯ oʇ uɹnʇǝɹ sʍoןq ɹnoʎ ˙ʎɐʍɐ suıɐɹp ǝbɐɹ ǝɥ⟘", + "reflection.cosmiccore.bargain.violence.question": "¿ןןnd noʎ oᗡ ˙ɹǝbɐǝ puɐ dɹɐɥs sı pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.vitality.answer.accept.drawback.0": "ǝʇɐɹ uoıʇɐɹǝuǝbǝɹ ןɐɹnʇɐu %0ϛ-", + "reflection.cosmiccore.bargain.vitality.answer.accept.drawback.1": "ǝʌıʇɔǝɟɟǝ ssǝן %0Ɛ suoıʇod buıןɐǝH", + "reflection.cosmiccore.bargain.vitality.answer.accept.power.0": ")sʇɹɐǝɥ ɐɹʇxǝ ϛ( ɥʇןɐǝɥ xɐɯ 0Ɩ+", + "reflection.cosmiccore.bargain.vitality.answer.accept.power.1": "ɹǝɟɟnq uoıʇdɹosqɐ ǝbɐɯɐp pǝsɐǝɹɔuI", + "reflection.cosmiccore.bargain.vitality.answer.accept.response": "˙ʍou dɯnd oʇ ǝɹoɯ sɐɥ ʇI ˙ʎןןɐɹǝʇıꞀ ˙sןןǝʍs ʇɹɐǝɥ ɹnoʎ", + "reflection.cosmiccore.bargain.vitality.answer.accept.text": "˙ǝɟıן ǝɹoɯ ǝɯ ǝʌı⅁ ˙ʇı ןןnԀ", + "reflection.cosmiccore.bargain.vitality.answer.refuse.response": "˙ɯɥʇʎɥɹ sʇı sdǝǝʞ ʇɹɐǝɥ ɹnoʎ ˙sǝpɐɟ ǝsןnd ǝɥ⟘", + "reflection.cosmiccore.bargain.vitality.answer.refuse.text": "˙ǝʌɐɥ I ʇɐɥʍ ɥʇıʍ ʞɹoʍ ןן,I ˙ʇı ǝʌɐǝꞀ", + "reflection.cosmiccore.bargain.vitality.description": "puǝɯ oʇ ɹǝʍoןs ʇnq 'ǝɟıן ǝɹoW", + "reflection.cosmiccore.bargain.vitality.dialogue.0": "˙ʇɐǝqʇɹɐǝɥ puoɔǝs Ɐ ˙ʇı uı ǝsןnd ɐ ןǝǝɟ uɐɔ noʎ ˙sqoɹɥʇ pɐǝɹɥʇ sıɥ⟘", + "reflection.cosmiccore.bargain.vitality.dialogue.1": "˙puǝ ǝɥʇ ǝɹoɟǝq sʇɐǝqʇɹɐǝɥ ǝɹoW ˙ɥʇɐǝɹq ǝɹoW ˙pooןq ǝɹoW", + "reflection.cosmiccore.bargain.vitality.dialogue.2": "˙ʍoןs pןnoʍ buıןɐǝH ˙uıɥʇ noʎ sǝɥɔʇǝɹʇs ssǝɔxǝ ǝɥʇ ʇnᗺ", + "reflection.cosmiccore.bargain.vitality.dialogue.3": "˙ןןıɟǝɹ oʇ ɹǝbuoן sǝʞɐʇ ʇɐɥʇ ǝuo ʇnq 'ןǝssǝʌ ɹǝbbıq Ɐ", + "reflection.cosmiccore.bargain.vitality.dialogue.4": "˙ǝpɐɹʇ ǝɥʇ s,ʇɐɥ⟘ ˙ǝɔuǝıןısǝɹ ɹoɟ ʎɹǝʌoɔǝᴚ", + "reflection.cosmiccore.bargain.vitality.name": "ʎʇıןɐʇıΛ", + "reflection.cosmiccore.bargain.vitality.on_accept": "˙ʇuǝsǝɹd ǝɹoɯ sןǝǝɟ buıɥʇʎɹǝʌƎ ˙ɹobıʌ ʍǝu ɥʇıʍ ǝbɹns suıǝʌ ɹnoʎ", + "reflection.cosmiccore.bargain.vitality.on_defy": "˙ǝɹoɯ ǝɔuo pǝzıs-ןɐʇɹoɯ ǝɹɐ noʎ ˙ʎɐʍɐ suıɐɹp ssǝɔxǝ ǝɥ⟘", + "reflection.cosmiccore.bargain.vitality.question": "¿ןןnd noʎ oᗡ ˙ǝɟıן ɥʇıʍ sǝsןnd pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.drawback.0": ")ssǝɔɔɐ ʎʞs( sɐǝɹɐ ʇıן uı ǝbɐɯɐp %ϛᄅ-", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.drawback.1": "ǝɹnsodxǝ ʇɥbıןuns ʇɔǝɹıp ɯoɹɟ ǝbɐɯɐp sǝʞɐ⟘", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.power.0": ")0 < ʎ( ʎʇıunɯɯı ǝbɐɯɐp pıoΛ", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.power.1": "pıoʌ buıɹǝʇuǝ uǝɥʍ ǝɔɐɟɹns oʇ ʇɹodǝןǝ⟘", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.response": "˙ʍou noʎ sʍouʞ pıoʌ ǝɥ⟘ ˙ןnos ɹnoʎ sǝɥɔnoʇ pןoɔ buıɥʇǝɯoS", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.text": "˙pıoʌ ǝɥʇ ɹoɟ ǝɯ ʞɹɐW ˙ʇı ןןnԀ", + "reflection.cosmiccore.bargain.void_anchor.answer.refuse.response": "˙ʍou ɹoℲ ˙ǝɹǝɥ ǝɹǝʍ noʎ sʇǝbɹoɟ pıoʌ ǝɥ⟘ ˙sǝpǝɔǝɹ pןoɔ ǝɥ⟘", + "reflection.cosmiccore.bargain.void_anchor.answer.refuse.text": "˙ʇɥbıן ǝɥʇ uı ʎɐʇs ןן,I ˙ʇı ǝʌɐǝꞀ", + "reflection.cosmiccore.bargain.void_anchor.description": "ʇı oʇ sbuoןǝq ʇɐɥʍ ʎoɹʇsǝp ʇouuɐɔ pıoʌ ǝɥ⟘", + "reflection.cosmiccore.bargain.void_anchor.dialogue.0": "˙buıɥʇou ǝʞıꞀ ˙ǝɔuǝsqɐ ǝʞıן pןoɔ — ǝɔı ǝʞıן pןoɔ ʇoN ˙pןoɔ sı pɐǝɹɥʇ sıɥ⟘", + "reflection.cosmiccore.bargain.void_anchor.dialogue.1": "˙ןןɐɟ ssǝןpuǝ ʇɐɥ⟘ ˙pןɹoʍ ǝɥʇ ɥʇɐǝuǝq pıoʌ ǝɥʇ ɟo ןןnd ǝɥʇ ʇןǝɟ ǝʌ,noʎ", + "reflection.cosmiccore.bargain.void_anchor.dialogue.2": "˙ssǝuʞɹɐp ʇɐɥʇ ɟo ʇɹɐd noʎ ǝʞɐW ˙noʎ ʞɹɐɯ pןnoʍ pɐǝɹɥʇ sıɥ⟘", + "reflection.cosmiccore.bargain.void_anchor.dialogue.3": "˙uʍo sʇı sɐ sǝzıuboɔǝɹ ʇı ʇɐɥʍ ʎoɹʇsǝp ʇ,uɐɔ pıoʌ ǝɥ⟘", + "reflection.cosmiccore.bargain.void_anchor.dialogue.4": "˙noʎ ǝɯoɔןǝM ˙noʎ ɥɔʇɐɔ pןnoʍ ssǝuʞɹɐp ǝɥ⟘ ˙ǝʞıן noʎ sɐ ɹɐɟ sɐ ןןɐℲ", + "reflection.cosmiccore.bargain.void_anchor.dialogue.5": "˙uıʞs pǝʞɹɐɯ uo buoɹʍ ןǝǝɟ pןnoʍ ʇɥbıןunS ˙buıʇs pןnoʍ ʇɥbıן ǝɥʇ ʇnᗺ", + "reflection.cosmiccore.bargain.void_anchor.name": "ɹoɥɔuⱯ pıoΛ", + "reflection.cosmiccore.bargain.void_anchor.on_accept": "˙ʍou noʎ ʇɹnɥ ʇ,uoʍ pıoʌ ǝɥ⟘ ˙ʇuǝuɐɯɹǝԀ ˙dǝǝᗡ ˙noʎ sʞɹɐɯ pןoɔ buıɥʇǝɯoS", + "reflection.cosmiccore.bargain.void_anchor.on_defy": "˙ǝɯıʇ ʇxǝu ןnɟıɔɹǝɯ ǝq ʇou ןןıʍ ʇI ˙noʎ sʇǝbɹoɟ pıoʌ ǝɥ⟘ ˙ʎɐʍɐ suɹnq ʞɹɐɯ ǝɥ⟘", + "reflection.cosmiccore.bargain.void_anchor.question": "¿ןןnd noʎ oᗡ ˙buıɥʇou ǝɥʇ oʇuı sǝɥɔɐǝɹ pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.ui.acknowledge": "]puɐʇsɹǝpun I[", + "reflection.cosmiccore.ui.available_bargains": "suıɐbɹɐᗺ ǝןqɐןıɐʌⱯ", + "reflection.cosmiccore.ui.back": "]ʞɔɐᗺ[", + "reflection.cosmiccore.ui.browse.interesting_choice": "˙pɐǝɹɥʇ ɐ ɹoɟ ɥɔɐǝɹ noʎ", + "reflection.cosmiccore.ui.browse_bargains": "]spɐǝɹɥʇ %s ɹoɟ ɥɔɐǝᴚ[", + "reflection.cosmiccore.ui.cancel": "]ןǝɔuɐƆ[", + "reflection.cosmiccore.ui.click_to_bargain": "uıɐbɹɐq oʇ ʞɔıןƆ", + "reflection.cosmiccore.ui.click_to_defy": ")uoısoɹǝ %d( ʎɟǝp oʇ ʞɔıןƆ", + "reflection.cosmiccore.ui.confirm_defiance": "]ǝɔuɐıɟǝᗡ ɯɹıɟuoƆ[", + "reflection.cosmiccore.ui.constellation_title": "spɐǝɹɥ⟘ ǝɥ⟘", + "reflection.cosmiccore.ui.continue": "]ǝnuıʇuoƆ[", + "reflection.cosmiccore.ui.cost": "uoısoɹǝ %d :ʇsoƆ", + "reflection.cosmiccore.ui.defiance": "ǝɔuɐıɟǝᗡ", + "reflection.cosmiccore.ui.defiance.cancel": "]ʇı ǝʌɐǝן 'oN[", + "reflection.cosmiccore.ui.defiance.cannot_undo": "ǝuopun ǝq ʇouuɐɔ sıɥ⟘", + "reflection.cosmiccore.ui.defiance.confirm": "]ʞɔɐq ʇı ɥsnd 'sǝʎ[", + "reflection.cosmiccore.ui.defiance.cost_amount": "uoısoɹǝ %d ʇsoɔ ןןıʍ sıɥ⟘", + "reflection.cosmiccore.ui.defiance.lose_power": "ǝpɐɟ ןןıʍ pɐǝɹɥʇ sıɥʇ ɯoɹɟ ɹǝʍod ǝɥ⟘", + "reflection.cosmiccore.ui.defiance.question": "¿ʞɔɐq pɐǝɹɥʇ sıɥʇ ɥsnԀ", + "reflection.cosmiccore.ui.defiance.scar_remains": "ɹǝʌǝɹoɟ — sɐʍ ʇı ǝɹǝɥʍ uıɐɯǝɹ ןןıʍ ʇouʞ Ɐ", + "reflection.cosmiccore.ui.defiance.so_be_it": "˙sʇɹnɥ ʇI ˙ǝsooן sɹɐǝʇ pɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.ui.defiance.warning1": "¿%s ɟo pɐǝɹɥʇ ǝɥʇ ʞɔɐq ɥsnԀ", + "reflection.cosmiccore.ui.defiance.warning2": "˙uoısoɹǝ %d sı ǝɔuɐıɟǝp ɟo ʇsoɔ ǝɥ⟘", + "reflection.cosmiccore.ui.defiance.warning3": "˙ʇou ןןıʍ ɹɐɔs ǝɥ⟘ ˙ǝʌɐǝן ןןıʍ ɹǝʍod ǝɥ⟘", + "reflection.cosmiccore.ui.defiance.warning4": "¿uıɐʇɹǝɔ noʎ ǝɹⱯ", + "reflection.cosmiccore.ui.defiance.will_lose": "%s :ǝsoן ןןıʍ noʎ", + "reflection.cosmiccore.ui.defiance.wise": "˙spןoɥ pɐǝɹɥʇ ǝɥ⟘ ˙ʎɐʇs ʇı ʇǝן noʎ", + "reflection.cosmiccore.ui.defiance_cost": "uoısoɹǝ %d ʇsoɔ ןןıʍ ǝɔuɐıɟǝᗡ", + "reflection.cosmiccore.ui.defiance_warning": "˙ןnos ɹnoʎ ɟo ǝɯos ǝɹoʇsǝɹ ʇnq ɹǝʍod noʎ ʇsoɔ ןןıʍ uıɐbɹɐq ɐ buıʎɟǝᗡ", + "reflection.cosmiccore.ui.defy": "ʎɟǝᗡ", + "reflection.cosmiccore.ui.defy_bargain": "]uıɐbɹɐᗺ sıɥ⟘ ʎɟǝᗡ[", + "reflection.cosmiccore.ui.dialogue_continue": "˙˙˙ǝnuıʇuoɔ oʇ ʞɔıןƆ", + "reflection.cosmiccore.ui.drawback": "ʞɔɐqʍɐɹᗡ", + "reflection.cosmiccore.ui.drawbacks": ":sʞɔɐqʍɐɹᗡ", + "reflection.cosmiccore.ui.enter_defiance": "]ǝpoW ǝɔuɐıɟǝᗡ ɹǝʇuƎ[", + "reflection.cosmiccore.ui.erosion": "uoısoɹǝ", + "reflection.cosmiccore.ui.exit": "]ǝʌɐǝꞀ[", + "reflection.cosmiccore.ui.forever_scarred": "pǝɹɹɐɔS ɹǝʌǝɹoℲ", + "reflection.cosmiccore.ui.gaze_constellation": "]spɐǝɹɥʇ ǝɥʇ ʇɐ ʞooꞀ[", + "reflection.cosmiccore.ui.hub.browse.power": "ɥɔɐǝɹ uıɥʇıʍ ǝɹɐ spɐǝɹɥʇ ʇɐɥʍ ǝǝS", + "reflection.cosmiccore.ui.hub.browse.response": "˙ʎuɐɯ oS ˙ʞɹɐp ǝɥʇ uı ɹǝʇʇɐɔs spɐǝɹɥ⟘", + "reflection.cosmiccore.ui.hub.browse.response_empty": "˙ʇǝʎ ˙ɥɔɐǝɹ uıɥʇıʍ buıɥʇoN", + "reflection.cosmiccore.ui.hub.greeting.erosion_no_bargains.0": "˙ǝbuɐɹʇS ˙ʇı ɯoɹɟ ןıɐɹʇ spɐǝɹɥʇ ou ʇnq 'uɹoʍ sı ןןǝɥs ɹnoʎ", + "reflection.cosmiccore.ui.hub.greeting.erosion_no_bargains.1": "˙noʎ ʇɐ buıɹɐǝʍ uǝǝq sɐɥ ǝsןǝ buıɥʇǝɯoS", + "reflection.cosmiccore.ui.hub.greeting.erosion_no_bargains.2": "˙ǝɯıʇ s,ʇı ǝqʎɐW ˙ʇıɐʍ ןןıʇs spɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.ui.hub.greeting.fresh.0": "˙pǝɥɔnoʇu∩ ˙ǝsuǝᗡ ˙ǝןoɥʍ sı ןןǝɥs ǝɥ⟘", + "reflection.cosmiccore.ui.hub.greeting.fresh.1": "˙buıʇıɐM ˙noʎ punoɹɐ pןǝıɟɹɐʇs ǝɥʇ uıd spɐǝɹɥ⟘", + "reflection.cosmiccore.ui.hub.greeting.has_bargains.0": "˙ʎsnq uǝǝq ǝʌ,noʎ ˙pןǝıɟɹɐʇs ǝɥʇ oʇuı noʎ ɯoɹɟ ןıɐɹʇ spɐǝɹɥ⟘", + "reflection.cosmiccore.ui.hub.greeting.has_bargains.1": "˙ʞɹɐp ǝɥʇ uı pǝuuıԀ ˙ʇıɐʍ ןןıʇs spɐǝɹɥʇ ǝɹoW", + "reflection.cosmiccore.ui.hub.greeting.has_scars.0": "˙ǝןbuɐʇun ʇ,uoʍ ʇɐɥʇ sʇouʞ ˙pǝıɟǝp ǝɹǝʍ spɐǝɹɥʇ ǝɹǝɥʍ sɹɐɔS", + "reflection.cosmiccore.ui.hub.greeting.has_scars.1": "˙uıɐɯǝɹ sʞɹɐɯ ǝɥ⟘ ˙ʞɔɐq pǝɥsnd uǝɥʇ 'pǝןןnd noʎ", + "reflection.cosmiccore.ui.hub.greeting.has_scars.2": "¿ɥbıɥ ooʇ ɯǝɥʇ buıdǝǝʞ ɟo ʇsoɔ ǝɥʇ sɐM", + "reflection.cosmiccore.ui.hub.greeting.many_bargains.0": "˙ʞɹɐp ǝɥʇ oʇuı pɹɐʍʇno ןıɐɹʇ spɐǝɹɥ⟘ ˙buıuuıɥʇ sı ןןǝɥs ǝɥ⟘", + "reflection.cosmiccore.ui.hub.greeting.many_bargains.1": "˙pǝsodxǝ ǝɹoɯ ǝןʇʇıן ɐ sǝʌɐǝן pǝןןnd pɐǝɹɥʇ ɥɔɐƎ", + "reflection.cosmiccore.ui.hub.greeting.many_bargains_high.0": "˙ɯǝɥʇ ɥbnoɹɥʇ ǝɹoɔ ɹnoʎ ǝǝs uɐɔ noʎ ˙ןןǝɥs ǝɥʇ uı sdɐb ʎuɐɯ oS", + "reflection.cosmiccore.ui.hub.greeting.many_bargains_high.1": "¿ǝןoɥʍ ǝʞıן pǝʞooן ןןǝɥs ǝɥʇ ʇɐɥʍ ɹǝqɯǝɯǝɹ uǝʌǝ noʎ oᗡ", + "reflection.cosmiccore.ui.hub.greeting.question": "˙ɹoɹɹıɯ ǝɥʇ oʇuı ʞooן noʎ", + "reflection.cosmiccore.ui.hub.leave_response": "˙ɹoɹɹıɯ ǝɥʇ ɯoɹɟ ʎɐʍɐ uɹnʇ noʎ", + "reflection.cosmiccore.ui.hub.mutilate_soul": "]ǝɹoƆ ɹnoʎ ǝdɐɥsǝᴚ[", + "reflection.cosmiccore.ui.hub.reflect.power": "ǝɯoɔǝq ǝʌ,noʎ ʇɐɥʍ ʇɐ ʞooꞀ", + "reflection.cosmiccore.ui.hub.reflect_response": "˙ʞooן ʎןןɐǝᴚ ˙ɟןǝsɹnoʎ ʇɐ ʞooן noʎ", + "reflection.cosmiccore.ui.hub.review.drawback": "pɐǝɹɥʇ ɐ buıʎɟǝp ɹǝpısuoƆ", + "reflection.cosmiccore.ui.hub.review.power": "ǝsooן pǝןןnd ǝʌ,noʎ ʇɐɥʍ ǝǝS", + "reflection.cosmiccore.ui.hub.review_response": "˙ʎןʇuıɐɟ ʍoןb spɐǝɹɥʇ pǝןןnd ǝɥ⟘", + "reflection.cosmiccore.ui.just_look": "]ɟןǝsɹnoʎ ʇɐ ʞooן ˙˙˙ʇsnſ[", + "reflection.cosmiccore.ui.leave": "]ǝɔɐןd sıɥʇ ǝʌɐǝꞀ[", + "reflection.cosmiccore.ui.no_available_bargains": "˙ʍou ɹoɟ ˙˙˙ɥɔɐǝɹ uıɥʇıʍ spɐǝɹɥʇ oN", + "reflection.cosmiccore.ui.no_bargains": "˙ʇǝʎ pǝʇdǝɔɔɐ suıɐbɹɐq oN", + "reflection.cosmiccore.ui.of": "ɟo", + "reflection.cosmiccore.ui.power": "ɹǝʍoԀ", + "reflection.cosmiccore.ui.powers": ":sɹǝʍoԀ", + "reflection.cosmiccore.ui.reflection.extreme_erosion.0": "˙ǝɹɐqpɐǝɹɥʇ sı ןןǝɥs ǝɥ⟘ ˙ןןnd oʇ ʇɟǝן buıɥʇou ʇsoɯןⱯ", + "reflection.cosmiccore.ui.reflection.extreme_erosion.1": "˙pıoʌ ǝɥʇ puɐ ǝɹoɔ ɹnoʎ uǝǝʍʇǝq buıɥʇou s,ǝɹǝɥʇ puɐ pɐǝɹɥʇ ǝɹoɯ ǝuO", + "reflection.cosmiccore.ui.reflection.has_bargains.0": "˙pןǝıɟɹɐʇs ǝɥʇ oʇuı noʎ ɯoɹɟ ןıɐɹʇ spɐǝɹɥ⟘", + "reflection.cosmiccore.ui.reflection.has_bargains.1": "˙ǝsooן pǝןןnd 'ɟןǝsɹnoʎ ɟo ǝɔǝıd ɐ ǝuo ɥɔɐƎ", + "reflection.cosmiccore.ui.reflection.high_erosion.0": "˙ʍou ǝןıbɐɹɟ sı ןןǝɥs ǝɥ⟘ ˙ǝsooן pǝןןnd spɐǝɹɥʇ ʎuɐɯ oS", + "reflection.cosmiccore.ui.reflection.high_erosion.1": "˙pǝsodxƎ ˙ʍɐᴚ ˙ǝןqısıʌ ʎןןnɟ ʇsoɯןɐ sı ǝɹoɔ ɹnoʎ", + "reflection.cosmiccore.ui.reflection.low_erosion.0": "˙ʇɹɐʇs ǝɥʇ ʇsnſ ˙ןןǝɥs ǝɥʇ ɯoɹɟ sןıɐɹʇ oʍʇ ɹo pɐǝɹɥʇ Ɐ", + "reflection.cosmiccore.ui.reflection.low_erosion.1": "˙ǝןqısıʌ ʎןǝɹɐᗺ ˙ןןɐɯs ǝɹɐ sdɐb ǝɥ⟘", + "reflection.cosmiccore.ui.reflection.mid_erosion.0": "˙sdɐb ǝɥʇ ɥbnoɹɥʇ sʍoןb ǝɹoɔ ɹnoʎ ˙buıuuıɥʇ sı ןןǝɥs ǝɥ⟘", + "reflection.cosmiccore.ui.reflection.mid_erosion.1": "˙ssǝן ɟo buıןǝǝɟ ǝɥʇ oʇ pǝsn buıʇʇǝb ǝɹ,noʎ", + "reflection.cosmiccore.ui.reflection.no_erosion.0": "˙pǝɥɔnoʇu∩ ˙ǝsuǝᗡ ˙ǝןoɥM", + "reflection.cosmiccore.ui.reflection.no_erosion.1": "˙ʇuǝıʇɐd puɐ pǝuuıd 'ʞɹɐp ǝɥʇ uı ʇıɐʍ spɐǝɹɥʇ ǝɥ⟘", + "reflection.cosmiccore.ui.reflection.no_erosion.2": "˙ʇǝʎ buıɥʇʎuɐ pǝןןnd ʇ,uǝʌɐɥ noʎ", + "reflection.cosmiccore.ui.review_bargains": "]spɐǝɹɥʇ %s ɹnoʎ ǝuıɯɐxƎ[", + "reflection.cosmiccore.ui.scroll_down": "uʍop ןןoɹɔS ▼", + "reflection.cosmiccore.ui.scroll_up": "dn ןןoɹɔS ▲", + "reflection.cosmiccore.ui.select": "]ʇɔǝןǝS[", + "reflection.cosmiccore.ui.select_to_view": "sןıɐʇǝp ʍǝıʌ oʇ uıɐbɹɐq ɐ ʇɔǝןǝS", + "reflection.cosmiccore.ui.soul_erosion": "%d%% :uoısoɹƎ ןnoS", + "reflection.cosmiccore.ui.soul_erosion_display": "%s%% :uoısoɹƎ ןnoS", + "reflection.cosmiccore.ui.soul_label": "ןnoS", + "reflection.cosmiccore.ui.soul_shape.complete.0": "˙pǝbuɐɥɔ ןɐʇuǝɯɐpunɟ buıɥʇǝɯoS ˙%s ʍou ǝɹɐ noʎ", + "reflection.cosmiccore.ui.soul_shape.complete.1": "˙ǝɹǝʍ noʎ ʇɐɥʍ oʇ buıuɹnʇǝɹ ou s,ǝɹǝɥ⟘", + "reflection.cosmiccore.ui.soul_shape.intro.0": "˙ǝɹɐ noʎ ʇɐɥʍ ǝuıɟǝpǝɹ ןןıʍ sıɥ⟘ ˙ǝɹoɔ ɹnoʎ ʇsuıɐbɐ sʇsǝɹ ǝpɐןq ǝɥ⟘", + "reflection.cosmiccore.ui.soul_shape.intro.1": "˙ǝɔuo pǝdɐɥs ǝq ʎןuo uɐɔ ǝɹoɔ ɹnoʎ ˙ʇuǝuɐɯɹǝd sı ǝdɐɥs ǝɥʇ 'ʇnɔ ǝɔuO", + "reflection.cosmiccore.ui.soul_shape.intro.2": "˙ʞɔɐq buıob ou s,ǝɹǝɥ⟘ ˙ʎןןnɟǝɹɐɔ sıɥʇ ɥbnoɹɥʇ ʞuıɥ⟘", + "reflection.cosmiccore.ui.soul_shape.select_header": "ǝdɐɥS ɹnoʎ ǝsooɥƆ", + "reflection.cosmiccore.ui.soul_shape.transforming.0": "˙ʇnɔ noʎ", + "reflection.cosmiccore.ui.soul_shape.transforming.1": "˙˙˙%s oʇuı ʇɟıɥs noʎ sɐ ǝɹıɟ uo sןǝǝɟ buıǝq ǝɹıʇuǝ ɹnoʎ", + "reflection.cosmiccore.ui.soul_shape.warning_permanent": "˙ǝuopun ǝq ʇouuɐɔ puɐ ʇuǝuɐɯɹǝd sı ǝɔıoɥɔ sıɥ⟘", + "reflection.cosmiccore.ui.tooltip.no_details": "sןıɐʇǝp ןɐuoıʇıppɐ oN", + "reflection.cosmiccore.ui.unlock_cost": "uoısoɹǝ ןnos %d :ʇsoƆ", + "reflection.cosmiccore.ui.view_active": "]suıɐbɹɐᗺ ɹnoʎ ʍǝıΛ[", + "reflection.cosmiccore.ui.view_bargains": "]suıɐbɹɐᗺ ǝןqɐןıɐʌⱯ ʍǝıΛ[", + "reflection.cosmiccore.ui.void_title": "ɹoɹɹıW ǝɥ⟘", + "reflection.cosmiccore.ui.your_bargains": "suıɐbɹɐᗺ ɹnoʎ", + "tagprefix.alve_foil_insulator": "ɹoʇɐןnsuI ǝʌןⱯ %s", + "tagprefix.heavy_beam": "ɯɐǝᗺ %s ʎʌɐǝH", + "tagprefix.leached_ore": "ǝɹO %s pǝɥɔɐǝꞀ", + "tagprefix.modular_shelling": "buıןןǝɥS ɹɐןnpoW %s", + "tagprefix.plasmites": "sǝʇıɯsɐןԀ %s", + "tagprefix.prisma_frothed_ore": "ǝɹO %s pǝɥʇoɹℲ ɐɯsıɹԀ", + "tagprefix.raw_ore_cubic": "ǝɹO %s ɔıqnƆ", + "tagprefix.shape_memory_foil": "ןıoℲ ʎɹoɯǝW buıdɐɥS %s", + "tagprefix.ultradense_plate": "ǝʇɐןԀ %s ǝsuǝpɐɹʇן∩", + "tagprefix.wire_spool": "ןoodS ǝɹıM %s", + "tooltip.cosmiccore.asteroid.tier": "suoʇoןıʞ %s :ǝzıS pıoɹǝʇsⱯ", + "tooltip.cosmiccore.asteroid.tiny": "uʍouʞu∩ :ǝzıS pıoɹǝʇsⱯ", + "tooltip.cosmiccore.asteroid_chip.lock": "%s%% :ɥʇbuǝɹʇS ʞɔoꞀ", + "tooltip.cosmiccore.asteroid_chip.mode": "%s :ǝpoW", + "tooltip.cosmiccore.asteroid_chip.sector": "%s :ɹoʇɔǝS", + "tooltip.cosmiccore.asteroid_chip.target": "%s :ᗡI ʇǝbɹɐ⟘", + "tooltip.cosmiccore.asteroid_chip.tier": "%s :ɹǝı⟘ uoıʇısınbɔⱯ", + "tooltip.cosmiccore.asteroid_chip.type": "%s :ǝdʎ⟘", + "tooltip.cosmiccore.asteroid_chip.unprogrammed": "ɐʇɐp ʇǝbɹɐʇ ou — pǝɯɯɐɹboɹdu∩", + "tooltip.cosmiccore.ember_hatch.capacity": "%s 9§:ɟ§ʎʇıɔɐdɐɔ ɹǝqɯƎ xɐWɔ§", + "tooltip.cosmiccore.ember_hatch.consumption": "%s 9§:ɟ§uoıʇdɯnsuoƆ ɹǝqɯƎ xɐWɔ§", + "tooltip.cosmiccore.soul_hatch.input": "%s 9§:ɟ§ʇnduI ǝdıɔǝᴚ xɐWɔ§", + "tooltip.cosmiccore.soul_hatch.output": "%s 9§:ɟ§ʎʇıɔɐdɐƆ ʞɹoʍʇǝN ןnoS xɐWɔ§", + "tooltip.cosmiccore.thermia_hatch_limit": "ʞ%s :ʇıɯıꞀ ˙dɯǝ⟘ɔ§", + "tooltip.gt_scythe.energy": "∩Ǝ %s / %s :ʎbɹǝuƎ", + "tooltip.gt_scythe.no_energy": "˙ʎbɹǝuǝ ɥbnouǝ ʇoNɔ§", + "tooltip.gt_scythe.per_hit": "ʇıɥ / ∩Ǝ %s :ʇsoƆ" } \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/lang/en_us.json b/src/generated/resources/assets/cosmiccore/lang/en_us.json index 5cc4a8948..ad5f9acd0 100644 --- a/src/generated/resources/assets/cosmiccore/lang/en_us.json +++ b/src/generated/resources/assets/cosmiccore/lang/en_us.json @@ -1,99 +1,2091 @@ { - "block.cosmiccore.alternator_flux_coiling": "Alternator Flux Coiling", - "block.cosmiccore.causal_fabric_coil_block": "Causal Fabric Coil Block", - "block.cosmiccore.drygmy_grove": "Drygmy Grove", - "block.cosmiccore.dyson_solar_cell": "Dyson Solar Cell", - "block.cosmiccore.fusion_grade_magnet": "Fusion Grade Magnet", - "block.cosmiccore.high_powered_magnet": "High Powered Magnet", - "block.cosmiccore.high_temperature_fission_casing": "High Temperature Fission Casing", - "block.cosmiccore.highly_conductive_fission_casing": "Highly Conductive Fission Casing", - "block.cosmiccore.iv_soul_input_hatch": "§9IV Soul Input Hatch", - "block.cosmiccore.iv_soul_output_hatch": "§9IV Soul Output Hatch", - "block.cosmiccore.living_igniclad_coil_block": "Living Igniclad Coil Block", - "block.cosmiccore.luv_soul_input_hatch": "§dLuV Soul Input Hatch", - "block.cosmiccore.luv_soul_output_hatch": "§dLuV Soul Output Hatch", - "block.cosmiccore.naquadah_pressure_resistant_casing": "Naquadah Pressure Resistant Casing", - "block.cosmiccore.naquadric_superalloy_coil_block": "Naquadric Superalloy Coil Block", - "block.cosmiccore.naquahine_pressure_reactor": "Naquahine Pressure Reactor", - "block.cosmiccore.opv_soul_input_hatch": "§9§lOpV Soul Input Hatch", - "block.cosmiccore.opv_soul_output_hatch": "§9§lOpV Soul Output Hatch", - "block.cosmiccore.plated_aerocloud": "Plated Aerocloud", - "block.cosmiccore.prismatic_tungstensteel_coil_block": "Prismatic Tungstensteel Coil Block", - "block.cosmiccore.programable_matter_coil_block": "Programable Matter Coil Block", - "block.cosmiccore.psionic_galvorn_coil_block": "Psionic Galvorn Coil Block", - "block.cosmiccore.resonant_virtue_meld_coil_block": "Resonant Virtue Meld Coil Block", - "block.cosmiccore.resonantly_tuned_virtue_meld_casing": "Resonantly Tuned Virtue Meld Casing", - "block.cosmiccore.shimmering_neutronium_coil_block": "Shimmering Neutronium Coil Block", - "block.cosmiccore.trinavine_coil_block": "Trinavine Coil Block", - "block.cosmiccore.uev_soul_input_hatch": "§aUEV Soul Input Hatch", - "block.cosmiccore.uev_soul_output_hatch": "§aUEV Soul Output Hatch", - "block.cosmiccore.uhv_soul_input_hatch": "§4UHV Soul Input Hatch", - "block.cosmiccore.uhv_soul_output_hatch": "§4UHV Soul Output Hatch", - "block.cosmiccore.uiv_soul_input_hatch": "§2UIV Soul Input Hatch", - "block.cosmiccore.uiv_soul_output_hatch": "§2UIV Soul Output Hatch", - "block.cosmiccore.uv_soul_input_hatch": "§3UV Soul Input Hatch", - "block.cosmiccore.uv_soul_output_hatch": "§3UV Soul Output Hatch", - "block.cosmiccore.uxv_soul_input_hatch": "§eUXV Soul Input Hatch", - "block.cosmiccore.uxv_soul_output_hatch": "§eUXV Soul Output Hatch", - "block.cosmiccore.zpm_soul_input_hatch": "§cZPM Soul Input Hatch", - "block.cosmiccore.zpm_soul_output_hatch": "§cZPM Soul Output Hatch", - "cosmiccore.multiblock.current_field_strength": "§fField Strength: %s", - "cosmiccore.multiblock.magnetic_field_strength": "§fMax Field Strength§f:§6 %s", - "cosmiccore.multiblock.magnetic_regen": "§aField Recovery Rate§f:§6 %sT/t", - "cosmiccore.recipe.fieldDecay": "§fField Decay: %sT/t", - "cosmiccore.recipe.fieldSlam": "§fField Consumed: %sT", - "cosmiccore.recipe.minField": "§fMin. Field Strength: %sT", - "cosmiccore.recipe.soulIn": "Soul Input: %s", - "cosmiccore.recipe.soulOut": "Soul Output: %s", - "cosmiccore.wire_coil.eu_multiplier": " §aMagnet EU Cost: §c%s EU/t", - "cosmiccore.wire_coil.magnet_capacity": " §fMax Field Strength: §f%s Tesla", - "cosmiccore.wire_coil.magnet_regen": " §5Field Regen Rate: %s Tesla/t", - "cosmiccore.wire_coil.magnet_stats": "§8Magnet Stats", - "gtceu.naquahine_reactor": "§bNaquahine Reactor", - "item.cosmiccore.blackstone_pustule": "Blackstone Pustule", - "item.cosmiccore.cosmic_processor": "Cosmic Processor", - "item.cosmiccore.cosmic_processor_assembly": "Cosmic Processor Assembly", - "item.cosmiccore.cosmic_processor_mainframe": "Cosmic Processor Mainframe", - "item.cosmiccore.cosmic_processor_supercomputer": "Cosmic Processor Supercomputer", - "item.cosmiccore.donk": "Donk", - "item.cosmiccore.echo_processor": "Echo Processor", - "item.cosmiccore.echo_processor_assembly": "Echo Processor Assembly", - "item.cosmiccore.echo_processor_mainframe": "Echo Processor Mainframe", - "item.cosmiccore.echo_processor_supercomputer": "Echo Processor Supercomputer", - "item.cosmiccore.macroverse_processor": "Macroverse Processor", - "item.cosmiccore.macroverse_processor_assembly": "Macroverse Processor Assembly", - "item.cosmiccore.macroverse_processor_mainframe": "Macroverse Processor Mainframe", - "item.cosmiccore.macroverse_processor_supercomputer": "Macroverse Processor Supercomputer", - "item.cosmiccore.optical_processor": "Optical Processor", - "item.cosmiccore.optical_processor_assembly": "Optical Processor Assembly", - "item.cosmiccore.optical_processor_mainframe": "Optical Processor Mainframe", - "item.cosmiccore.optical_processor_supercomputer": "Optical Processor Supercomputer", - "item.cosmiccore.overloaded_pearls": "Overloaded Pearls", - "item.cosmiccore.psionic_processor": "Psionic Processor", - "item.cosmiccore.psionic_processor_assembly": "Psionic Processor Assembly", - "item.cosmiccore.psionic_processor_mainframe": "Psionic Processor Mainframe", - "item.cosmiccore.psionic_processor_supercomputer": "Psionic Processor Supercomputer", - "item.cosmiccore.space_advanced_nanomuscle_chestplate": "Advanced NanoMuscle™ Space Suite Chestplate", - "item.cosmiccore.space_advanced_quarktech_chestplate": "Advanced QuarkTech™ Space Suite Chestplate", - "item.cosmiccore.space_nanomuscle_chestplate": "NanoMuscle™ Space Suite Chestplate", - "item.cosmiccore.space_quarktech_chestplate": "QuarkTech™ Space Suite Chestplate", - "item.cosmiccore.waxed_leather": "Waxed Leather", - "itemGroup.cosmiccore.creative_tab": "Cosmic Core", - "material.cosmiccore.causal_fabric": "Causal Fabric", - "material.cosmiccore.diluted_prisma": "Diluted Prisma", - "material.cosmiccore.living_igniclad": "Living Igniclad", - "material.cosmiccore.naquadric_superalloy": "Naquadric Superalloy", - "material.cosmiccore.prisma": "Prisma", - "material.cosmiccore.prismatic_tungstensteel": "Prismatic Tungstensteel", - "material.cosmiccore.programmable_matter": "Programmable Matter", - "material.cosmiccore.psionic_galvorn": "Psionic Galvorn", - "material.cosmiccore.resonant_virtue_meld": "Resonant Virtue Meld", - "material.cosmiccore.shimmering_neutronium": "Shimmering Neutronium", - "material.cosmiccore.trinavine": "Trinavine", - "material.cosmiccore.trinium_naqide": "Trinium Naqide", - "material.cosmiccore.virtue_meld": "Virtue Meld", - "tagprefix.leached_ore": "Leached %s Ore", - "tagprefix.prisma_frothed_ore": "Prisma Frothed %s Ore", - "tooltip.cosmiccore.soul_hatch.input": "§cMax Recipe Input§f:§6 %s", - "tooltip.cosmiccore.soul_hatch.output": "§cMax Soul Network Capacity§f:§6 %s" + "allele.forestry.bee_species.cosmiccore.bee_abrasive": "Abrasive", + "allele.forestry.bee_species.cosmiccore.bee_absent": "Absent", + "allele.forestry.bee_species.cosmiccore.bee_ambrosic": "Ambrosic", + "allele.forestry.bee_species.cosmiccore.bee_architect": "Architect", + "allele.forestry.bee_species.cosmiccore.bee_argon": "Lofty Argon", + "allele.forestry.bee_species.cosmiccore.bee_ashen": "Ashen", + "allele.forestry.bee_species.cosmiccore.bee_biohazard": "Biohazard", + "allele.forestry.bee_species.cosmiccore.bee_citrus_polymer": "Citrus Polymer", + "allele.forestry.bee_species.cosmiccore.bee_cobbled": "Cobbled", + "allele.forestry.bee_species.cosmiccore.bee_constructive": "Constructive", + "allele.forestry.bee_species.cosmiccore.bee_cosmos": "Cosmos", + "allele.forestry.bee_species.cosmiccore.bee_energized": "Energized", + "allele.forestry.bee_species.cosmiccore.bee_exhaustive": "Exhaustive", + "allele.forestry.bee_species.cosmiccore.bee_fate": "Fate", + "allele.forestry.bee_species.cosmiccore.bee_fracking": "Fracking", + "allele.forestry.bee_species.cosmiccore.bee_grand_garden": "Grand Garden", + "allele.forestry.bee_species.cosmiccore.bee_hadal": "Hadal", + "allele.forestry.bee_species.cosmiccore.bee_hellsmith": "Hellsmith", + "allele.forestry.bee_species.cosmiccore.bee_hydraulic": "Hydraulic", + "allele.forestry.bee_species.cosmiccore.bee_hydrogen": "Lofty Hydrogen", + "allele.forestry.bee_species.cosmiccore.bee_illusive": "Illusive", + "allele.forestry.bee_species.cosmiccore.bee_inquisitive": "Inquisitive", + "allele.forestry.bee_species.cosmiccore.bee_lunar": "Lunar", + "allele.forestry.bee_species.cosmiccore.bee_nitrogen": "Lofty Nitrogen", + "allele.forestry.bee_species.cosmiccore.bee_oxygen": "Lofty Oxygen", + "allele.forestry.bee_species.cosmiccore.bee_pale": "Pale", + "allele.forestry.bee_species.cosmiccore.bee_prismatic": "Prismatic", + "allele.forestry.bee_species.cosmiccore.bee_pyrolytic": "Pyrolytic", + "allele.forestry.bee_species.cosmiccore.bee_radoxia": "Radoxia", + "allele.forestry.bee_species.cosmiccore.bee_rose_polymer": "Rose Polymer", + "allele.forestry.bee_species.cosmiccore.bee_runic": "Runic", + "allele.forestry.bee_species.cosmiccore.bee_shaman": "Shaman", + "allele.forestry.bee_species.cosmiccore.bee_slick": "Slick", + "allele.forestry.bee_species.cosmiccore.bee_solar": "Solar", + "allele.forestry.bee_species.cosmiccore.bee_soul": "Soul", + "allele.forestry.bee_species.cosmiccore.bee_virtue": "Virtue", + "allele.forestry.bee_species.cosmiccore.bee_waxy_polymer": "Waxy Polymer", + "behavior.wireless_data.owner.network": "§3Network Owner: §r", + "behavior.wireless_data.owner.player": "§3Player Name: §r", + "behavior.wireless_data.owner.team": "§3Team Name: §r", + "block.cosmiccore.alternator_flux_coiling": "Alternator Flux Coiling", + "block.cosmiccore.alveary_casing": "Alveary Casing", + "block.cosmiccore.arcane_crucible": "Arcane Crucible", + "block.cosmiccore.arcane_distillery": "§6Arcane Distillery", + "block.cosmiccore.atmo_pump": "§6Atmospheric Siphon", + "block.cosmiccore.atomic_reconstructor": "§6Radbolt Atomic Reconstructor", + "block.cosmiccore.bichromal_nevramite_casing": "Bichromal Nevramite Casing", + "block.cosmiccore.biovat": "Biovat", + "block.cosmiccore.blank_rune": "Blank Rune", + "block.cosmiccore.bolted_heavy_frame_casing": "Bolted Heavy Frame Casing", + "block.cosmiccore.botanical_simulation_complex": "§aBotanical Simulation Complex", + "block.cosmiccore.capacitor_array": "Capacitor Array", + "block.cosmiccore.causal_fabric_coil_block": "Causal Fabric Coil Block", + "block.cosmiccore.chromatic_distillation_plant": "Chromatic Distillation Plant", + "block.cosmiccore.chromatic_flotation_plant": "Chromatic Flotation Plant", + "block.cosmiccore.cinder_hearth": "Cinder Hearth", + "block.cosmiccore.component_assembly_line": "§aComponent Assembly Line", + "block.cosmiccore.cosmic_me_assemblyline_bus": "ME Assembly Line Bus", + "block.cosmiccore.cosmic_me_assemblyline_hatch": "ME Assembly Line Hatch", + "block.cosmiccore.creative_thermal": "Creative Thermal", + "block.cosmiccore.crop_holder": "Crop Holder", + "block.cosmiccore.cryogenic_casing": "Cryogenic Casing", + "block.cosmiccore.cryogenics_chamber": "§bCryogenics Chamber", + "block.cosmiccore.cyclozine_chemically_repelling_casing": "Cyclozine Chemically Repelling Casing", + "block.cosmiccore.cyclozine_chemically_repelling_pipe": "Cyclozine Chemically Repelling Pipe", + "block.cosmiccore.cyclozine_high_rigidity_casing": "Cyclozine High Rigidity Casing", + "block.cosmiccore.dawn_forge": "Dawn Forge", + "block.cosmiccore.dawnforge_eclipsed": "Dawnforge [Eclipsed]", + "block.cosmiccore.dimensional_energy_capacitor": "Power Substation", + "block.cosmiccore.dimensional_energy_interface": "Power Substation Dimensional Interface", + "block.cosmiccore.diving_bell": "Diving Bell", + "block.cosmiccore.diving_bell_escape_pad": "Diving Bell Escape Pad", + "block.cosmiccore.dreamers_basin": "Dreamer's Basin", + "block.cosmiccore.drone_maintenance_interface": "Drone Maintenance Interface", + "block.cosmiccore.drone_station": "Drone Station", + "block.cosmiccore.drygmy_grove": "Drygmy Grove", + "block.cosmiccore.dyson_solar_cell": "Dyson Solar Cell", + "block.cosmiccore.ethersteel_plated_ash_tiles": "Ethersteel Plated Ash Tiles", + "block.cosmiccore.ev_biolab": "§5Advanced Bio Lab III§r", + "block.cosmiccore.ev_calx_reactor": "Ev Calx Reactor", + "block.cosmiccore.ev_mana_leaching_tub": "Ev Mana Leaching Tub", + "block.cosmiccore.ev_roaster": "Ev Roaster", + "block.cosmiccore.ev_thermomagnitizer": "Ev Thermomagnitizer", + "block.cosmiccore.ev_vacuum_bubbler": "Ev Vacuum Bubbler", + "block.cosmiccore.ev_wireless_charger": "EV Wireless Charger", + "block.cosmiccore.extreme_combustion_engine_cc": "Extreme Combustion Engine Cc", + "block.cosmiccore.fulgorinth_prime_casing": "Fulgorinth Prime Casing", + "block.cosmiccore.fusion_grade_magnet": "Fusion Grade Magnet", + "block.cosmiccore.gilded_pthanterum_casing": "Gilded Pthanterum Casing", + "block.cosmiccore.heat_fan": "Heat Fan", + "block.cosmiccore.heavy_assembler": "§9Heavy Assembler", + "block.cosmiccore.heavy_frost_proof_casing": "Heavy Frost Proof Casing", + "block.cosmiccore.hellfire_foundry": "§cHellfire Foundry", + "block.cosmiccore.hemophagic_transfuser": "§aHemophagic Transfuser", + "block.cosmiccore.high_powered_magnet": "High Powered Magnet", + "block.cosmiccore.high_pressure_assembler": "High Pressure Assembler", + "block.cosmiccore.high_temperature_fission_casing": "High Temperature Fission Casing", + "block.cosmiccore.high_tolerance_rhenium_casing": "High Tolerance Rhenium Casing", + "block.cosmiccore.highly_conductive_fission_casing": "Highly Conductive Fission Casing", + "block.cosmiccore.highly_flexible_reinforced_trinavine_casing": "Highly Flexible Reinforced Trinavine Casing", + "block.cosmiccore.hp_steam_bender": "High Pressure Steam Bender", + "block.cosmiccore.hp_steam_wiremill": "High Pressure Steam Wiremill", + "block.cosmiccore.huge_sterilization_hatch": "Sterilzation Hatch", + "block.cosmiccore.hv_calx_reactor": "Hv Calx Reactor", + "block.cosmiccore.hv_energy_output_hatch_16a": "§6HV 16A Dynamo Hatch", + "block.cosmiccore.hv_energy_output_hatch_4a": "§6HV 4A Dynamo Hatch", + "block.cosmiccore.hv_input_hatch_4x": "§6HV Quadruple Input Hatch", + "block.cosmiccore.hv_mana_leaching_tub": "Hv Mana Leaching Tub", + "block.cosmiccore.hv_output_hatch_4x": "§6HV Quadruple Output Hatch", + "block.cosmiccore.hv_roaster": "Hv Roaster", + "block.cosmiccore.hv_thermomagnitizer": "Hv Thermomagnitizer", + "block.cosmiccore.hv_vacuum_bubbler": "Hv Vacuum Bubbler", + "block.cosmiccore.hv_wireless_charger": "HV Wireless Charger", + "block.cosmiccore.industrial_chemical_vat": "Industrial Chemical Vat", + "block.cosmiccore.industrial_primitive_blast_furnace": "Industrial Primitive Blast Furnace", + "block.cosmiccore.iron_plated_deepslate_tile": "Iron Plated Deepslate Tile", + "block.cosmiccore.iron_plated_deepslate_tile_slab": "Iron Plated Deepslate Tile Slab", + "block.cosmiccore.iron_plated_deepslate_tile_stairs": "Iron Plated Deepslate Tile Stairs", + "block.cosmiccore.iv_16a_wireless_energy_dynamo": "§9IV 16A Wireless Energy Dynamo", + "block.cosmiccore.iv_16a_wireless_energy_hatch": "§9IV 16A Wireless Energy Hatch", + "block.cosmiccore.iv_4a_wireless_energy_dynamo": "§9IV 4A Wireless Energy Dynamo", + "block.cosmiccore.iv_4a_wireless_energy_hatch": "§9IV 4A Wireless Energy Hatch", + "block.cosmiccore.iv_biolab": "§9Elite Bio Lab §r", + "block.cosmiccore.iv_calx_reactor": "Iv Calx Reactor", + "block.cosmiccore.iv_mana_leaching_tub": "Iv Mana Leaching Tub", + "block.cosmiccore.iv_naquahine_mini_reactor": "§9Elite Naquahine Mini Reactor Generator §r", + "block.cosmiccore.iv_roaster": "Iv Roaster", + "block.cosmiccore.iv_soul_input_hatch": "§9IV Soul Input Hatch", + "block.cosmiccore.iv_soul_output_hatch": "§9IV Soul Output Hatch", + "block.cosmiccore.iv_thermia_export_hatch": "Iv Thermia Export Hatch", + "block.cosmiccore.iv_thermia_import_hatch": "Iv Thermia Import Hatch", + "block.cosmiccore.iv_thermomagnitizer": "Iv Thermomagnitizer", + "block.cosmiccore.iv_vacuum_bubbler": "Iv Vacuum Bubbler", + "block.cosmiccore.iv_wireless_charger": "IV Wireless Charger", + "block.cosmiccore.iv_wireless_energy_dynamo": "§9IV Wireless Energy Dynamo", + "block.cosmiccore.iv_wireless_energy_hatch": "§9IV Wireless Energy Hatch", + "block.cosmiccore.large_combustion_engine_cc": "Large Combustion Engine Cc", + "block.cosmiccore.large_laminator": "§1Large Laminator", + "block.cosmiccore.large_roaster": "§cLarge Roaster", + "block.cosmiccore.large_spooling_machine": "Large Spooling Machine", + "block.cosmiccore.larva": "Logistic Asteroid Reclamation and Valuing Assembly [LARVA]", + "block.cosmiccore.light_dawnstone_casing": "Light Dawnstone Casing", + "block.cosmiccore.light_ritual_stone": "Light Ritual Stone", + "block.cosmiccore.link_test_station": "Link Test Station", + "block.cosmiccore.living_igniclad_coil_block": "Living Igniclad Coil Block", + "block.cosmiccore.livingrock_tiles": "Livingrock Tiles", + "block.cosmiccore.lp_steam_bender": "I DO NOT EXIST", + "block.cosmiccore.lp_steam_wiremill": "I DO NOT EXIST", + "block.cosmiccore.ludicrious_intake": "Ludicrious Intake", + "block.cosmiccore.ludicrous_combustion_engine_cc": "Ludicrous Combustion Engine Cc", + "block.cosmiccore.lunar_sheer_hammer": "§9Lunar Hammer", + "block.cosmiccore.luv_16a_wireless_energy_dynamo": "§dLuV 16A Wireless Energy Dynamo", + "block.cosmiccore.luv_16a_wireless_energy_hatch": "§dLuV 16A Wireless Energy Hatch", + "block.cosmiccore.luv_4a_wireless_energy_dynamo": "§dLuV 4A Wireless Energy Dynamo", + "block.cosmiccore.luv_4a_wireless_energy_hatch": "§dLuV 4A Wireless Energy Hatch", + "block.cosmiccore.luv_biolab": "§dElite Bio Lab II§r", + "block.cosmiccore.luv_calx_reactor": "Luv Calx Reactor", + "block.cosmiccore.luv_mana_leaching_tub": "Luv Mana Leaching Tub", + "block.cosmiccore.luv_naquahine_mini_reactor": "§dElite Naquahine Mini Reactor Generator II§r", + "block.cosmiccore.luv_roaster": "Luv Roaster", + "block.cosmiccore.luv_soul_input_hatch": "§dLuV Soul Input Hatch", + "block.cosmiccore.luv_soul_output_hatch": "§dLuV Soul Output Hatch", + "block.cosmiccore.luv_thermia_export_hatch": "Luv Thermia Export Hatch", + "block.cosmiccore.luv_thermia_import_hatch": "Luv Thermia Import Hatch", + "block.cosmiccore.luv_thermomagnitizer": "Luv Thermomagnitizer", + "block.cosmiccore.luv_vacuum_bubbler": "Luv Vacuum Bubbler", + "block.cosmiccore.luv_wireless_charger": "LuV Wireless Charger", + "block.cosmiccore.luv_wireless_energy_dynamo": "§dLuV Wireless Energy Dynamo", + "block.cosmiccore.luv_wireless_energy_hatch": "§dLuV Wireless Energy Hatch", + "block.cosmiccore.lv_calx_reactor": "Lv Calx Reactor", + "block.cosmiccore.lv_energy_output_hatch_16a": "§7LV 16A Dynamo Hatch", + "block.cosmiccore.lv_energy_output_hatch_4a": "§7LV 4A Dynamo Hatch", + "block.cosmiccore.lv_mana_leaching_tub": "Lv Mana Leaching Tub", + "block.cosmiccore.lv_roaster": "Lv Roaster", + "block.cosmiccore.lv_thermomagnitizer": "Lv Thermomagnitizer", + "block.cosmiccore.lv_vacuum_bubbler": "Lv Vacuum Bubbler", + "block.cosmiccore.machine_casing_gearbox_naquadria": "Machine Casing Gearbox Naquadria", + "block.cosmiccore.machine_casing_gearbox_pthanterum": "Machine Casing Gearbox Pthanterum", + "block.cosmiccore.mana_etching_factory": "Mana Etching Factory", + "block.cosmiccore.mantle_bore": "Mantle Bore", + "block.cosmiccore.moth_cargo_drop_off": "Moth Cargo Drop Off", + "block.cosmiccore.moth_cargo_station": "Moth Cargo Station", + "block.cosmiccore.moth_home_t1": "Moth Home (T1)", + "block.cosmiccore.moth_home_t2": "Moth Home (T2)", + "block.cosmiccore.moth_home_t3": "Moth Home (T3)", + "block.cosmiccore.moth_home_t4": "Moth Home (T4)", + "block.cosmiccore.moth_station_casing": "Moth Station Casing", + "block.cosmiccore.multi_purpose_interstellar_grade_casing": "Multi Purpose Interstellar Grade Casing", + "block.cosmiccore.mv_calx_reactor": "Mv Calx Reactor", + "block.cosmiccore.mv_energy_output_hatch_16a": "§bMV 16A Dynamo Hatch", + "block.cosmiccore.mv_energy_output_hatch_4a": "§bMV 4A Dynamo Hatch", + "block.cosmiccore.mv_mana_leaching_tub": "Mv Mana Leaching Tub", + "block.cosmiccore.mv_roaster": "Mv Roaster", + "block.cosmiccore.mv_thermomagnitizer": "Mv Thermomagnitizer", + "block.cosmiccore.mv_vacuum_bubbler": "Mv Vacuum Bubbler", + "block.cosmiccore.naquadah_pressure_resistant_casing": "Naquadah Pressure Resistant Casing", + "block.cosmiccore.naquadric_superalloy_coil_block": "Naquadric Superalloy Coil Block", + "block.cosmiccore.naquahine_pressure_reactor": "Naquahine Pressure Reactor", + "block.cosmiccore.neutronium_buoy": "Neutronium Buoy", + "block.cosmiccore.oneiric_sieve": "Oneiric Sieve", + "block.cosmiccore.opv_16a_wireless_energy_dynamo": "§9§lOpV 16A Wireless Energy Dynamo", + "block.cosmiccore.opv_16a_wireless_energy_hatch": "§9§lOpV 16A Wireless Energy Hatch", + "block.cosmiccore.opv_4a_wireless_energy_dynamo": "§9§lOpV 4A Wireless Energy Dynamo", + "block.cosmiccore.opv_4a_wireless_energy_hatch": "§9§lOpV 4A Wireless Energy Hatch", + "block.cosmiccore.opv_calx_reactor": "Opv Calx Reactor", + "block.cosmiccore.opv_mana_leaching_tub": "Opv Mana Leaching Tub", + "block.cosmiccore.opv_roaster": "Opv Roaster", + "block.cosmiccore.opv_soul_input_hatch": "§9§lOpV Soul Input Hatch", + "block.cosmiccore.opv_soul_output_hatch": "§9§lOpV Soul Output Hatch", + "block.cosmiccore.opv_thermia_export_hatch": "Opv Thermia Export Hatch", + "block.cosmiccore.opv_thermia_import_hatch": "Opv Thermia Import Hatch", + "block.cosmiccore.opv_thermomagnitizer": "Opv Thermomagnitizer", + "block.cosmiccore.opv_vacuum_bubbler": "Opv Vacuum Bubbler", + "block.cosmiccore.opv_wireless_energy_dynamo": "§9§lOpV Wireless Energy Dynamo", + "block.cosmiccore.opv_wireless_energy_hatch": "§9§lOpV Wireless Energy Hatch", + "block.cosmiccore.orbital_tempering_forge": "Orbital Tempering Forge", + "block.cosmiccore.ore_extraction_drill_hv": "§6HV Ore Extraction Drill", + "block.cosmiccore.ore_extraction_drill_iv": "§9IV Ore Extraction Drill", + "block.cosmiccore.ore_extraction_drill_lv": "§7LV Ore Extraction Drill", + "block.cosmiccore.ore_extraction_drill_zpm": "§cZPM Ore Extraction Drill", + "block.cosmiccore.oscillating_gilded_pthanterum_casings": "Oscillating Gilded Pthanterum Casings", + "block.cosmiccore.pcb_foundry": "§ePCB Foundry", + "block.cosmiccore.plasmite_distillery": "§9Plasmite Distillery", + "block.cosmiccore.plated_aerocloud": "Plated Aerocloud", + "block.cosmiccore.polymerizer": "§aPolymerizer", + "block.cosmiccore.pressure_containment_casing": "Pressure Containment Casing", + "block.cosmiccore.prismatic_ore_foundry": "Prismatic Ore Foundry", + "block.cosmiccore.prismatic_tungstensteel_coil_block": "Prismatic Tungstensteel Coil Block", + "block.cosmiccore.programable_matter_coil_block": "Programable Matter Coil Block", + "block.cosmiccore.psionic_galvorn_coil_block": "Psionic Galvorn Coil Block", + "block.cosmiccore.pthanterum_wave_breakers": "Pthanterum Wave Breakers", + "block.cosmiccore.pyrothermic_refinery": "Pyrothermic Refinery", + "block.cosmiccore.radioactive_filter_casing": "Radioactive Filter Casing", + "block.cosmiccore.reflective_starmetal_casing": "Reflective Starmetal Casing", + "block.cosmiccore.reinforced_dawnstone_casing": "Reinforced Dawnstone Casing", + "block.cosmiccore.reinforced_naquadria_casing": "Reinforced Naquadria Casing", + "block.cosmiccore.reinforced_trinavine_coil_block": "Reinforced Trinavine Coil Block", + "block.cosmiccore.resonant_virtue_meld_coil_block": "Resonant Virtue Meld Coil Block", + "block.cosmiccore.resonantly_tuned_virtue_meld_casing": "Resonantly Tuned Virtue Meld Casing", + "block.cosmiccore.rigid_high_speed_steel_casing": "Rigid High Speed Steel Casing", + "block.cosmiccore.ritual_stone": "Ritual Stone", + "block.cosmiccore.royal_ichorium_casing": "Royal Ichorium Casing", + "block.cosmiccore.rust_stained_casing": "Rust Stained Casing", + "block.cosmiccore.rust_weave_casing": "Rust Weave Casing", + "block.cosmiccore.self_healing_pthanterum_casing": "Self Healing Pthanterum Casing", + "block.cosmiccore.sensor_hatch": "Sensor Hatch", + "block.cosmiccore.shimmering_neutronium_coil_block": "Shimmering Neutronium Coil Block", + "block.cosmiccore.somarust_casing": "Somarust Casing", + "block.cosmiccore.soul_muted_casing": "Soul Muted Casing", + "block.cosmiccore.soul_stained_steel_aluminium_plated_casing": "Soul Stained Steel Aluminium Plated Casing", + "block.cosmiccore.soul_tester": "Soul Tester", + "block.cosmiccore.spirit_crucible": "Spirit Crucible", + "block.cosmiccore.star_ladder": "Star Ladder", + "block.cosmiccore.star_ladder_research_hub": "Star Ladder Research Hub", + "block.cosmiccore.steam_caster": "Steam Caster", + "block.cosmiccore.steam_fluid_input_hatch": "Fluid Input Hatch (Steam)", + "block.cosmiccore.steam_fluid_output_hatch": "Fluid Output Hatch (Steam)", + "block.cosmiccore.steam_large_turbine": "Steam Large Turbine", + "block.cosmiccore.steam_mixing_vessel": "Steam Mixing Vessel", + "block.cosmiccore.steel_plated_bronze_casing": "Steel Plated Bronze Casing", + "block.cosmiccore.steel_rose_lantern": "Steel Rose Lantern", + "block.cosmiccore.steel_rose_light": "Steel Rose Light", + "block.cosmiccore.steel_rose_light_slab": "Steel Rose Light Slab", + "block.cosmiccore.steel_rose_light_stairs": "Steel Rose Light Stairs", + "block.cosmiccore.stellar_iris": "Stellar Iris", + "block.cosmiccore.stellar_neutronium_grade_magnet": "Stellar Neutronium Grade Magnet", + "block.cosmiccore.stellar_smelting_module": "Ignition Complex : GRAND FORGE", + "block.cosmiccore.sterilization_hatch": "Sterilzation Hatch", + "block.cosmiccore.submerged_welder": "§3Submerged Welder", + "block.cosmiccore.suffering_chamber": "§cSuffering Chamber", + "block.cosmiccore.superheavy_steel_casing": "Superheavy Steel Casing", + "block.cosmiccore.titan_fusion_reactor": "§9Titan Fusion Reactor", + "block.cosmiccore.tritanium_lined_heavy_neutronium_casing": "Tritanium Lined Heavy Neutronium Casing", + "block.cosmiccore.uev_16a_wireless_energy_dynamo": "§aUEV 16A Wireless Energy Dynamo", + "block.cosmiccore.uev_16a_wireless_energy_hatch": "§aUEV 16A Wireless Energy Hatch", + "block.cosmiccore.uev_4a_wireless_energy_dynamo": "§aUEV 4A Wireless Energy Dynamo", + "block.cosmiccore.uev_4a_wireless_energy_hatch": "§aUEV 4A Wireless Energy Hatch", + "block.cosmiccore.uev_calx_reactor": "Uev Calx Reactor", + "block.cosmiccore.uev_cosmic_parallel_hatch": "WarpTech Parallel Control Hatch", + "block.cosmiccore.uev_mana_leaching_tub": "Uev Mana Leaching Tub", + "block.cosmiccore.uev_module_hatch": "Elite Module Hatch", + "block.cosmiccore.uev_roaster": "Uev Roaster", + "block.cosmiccore.uev_soul_input_hatch": "§aUEV Soul Input Hatch", + "block.cosmiccore.uev_soul_output_hatch": "§aUEV Soul Output Hatch", + "block.cosmiccore.uev_thermia_export_hatch": "Uev Thermia Export Hatch", + "block.cosmiccore.uev_thermia_import_hatch": "Uev Thermia Import Hatch", + "block.cosmiccore.uev_thermomagnitizer": "Uev Thermomagnitizer", + "block.cosmiccore.uev_vacuum_bubbler": "Uev Vacuum Bubbler", + "block.cosmiccore.uev_wireless_charger": "UEV Wireless Charger", + "block.cosmiccore.uev_wireless_energy_dynamo": "§aUEV Wireless Energy Dynamo", + "block.cosmiccore.uev_wireless_energy_hatch": "§aUEV Wireless Energy Hatch", + "block.cosmiccore.uhv_16a_wireless_energy_dynamo": "§4UHV 16A Wireless Energy Dynamo", + "block.cosmiccore.uhv_16a_wireless_energy_hatch": "§4UHV 16A Wireless Energy Hatch", + "block.cosmiccore.uhv_4a_wireless_energy_dynamo": "§4UHV 4A Wireless Energy Dynamo", + "block.cosmiccore.uhv_4a_wireless_energy_hatch": "§4UHV 4A Wireless Energy Hatch", + "block.cosmiccore.uhv_calx_reactor": "Uhv Calx Reactor", + "block.cosmiccore.uhv_cosmic_parallel_hatch": "Extreme Parallel Control Hatch", + "block.cosmiccore.uhv_mana_leaching_tub": "Uhv Mana Leaching Tub", + "block.cosmiccore.uhv_module_hatch": "Advanced Module Hatch", + "block.cosmiccore.uhv_naquahine_mini_reactor": "§4Epic Naquahine Mini Reactor Generator §r", + "block.cosmiccore.uhv_roaster": "Uhv Roaster", + "block.cosmiccore.uhv_soul_input_hatch": "§4UHV Soul Input Hatch", + "block.cosmiccore.uhv_soul_output_hatch": "§4UHV Soul Output Hatch", + "block.cosmiccore.uhv_thermia_export_hatch": "Uhv Thermia Export Hatch", + "block.cosmiccore.uhv_thermia_import_hatch": "Uhv Thermia Import Hatch", + "block.cosmiccore.uhv_thermomagnitizer": "Uhv Thermomagnitizer", + "block.cosmiccore.uhv_vacuum_bubbler": "Uhv Vacuum Bubbler", + "block.cosmiccore.uhv_wireless_charger": "UHV Wireless Charger", + "block.cosmiccore.uhv_wireless_energy_dynamo": "§4UHV Wireless Energy Dynamo", + "block.cosmiccore.uhv_wireless_energy_hatch": "§4UHV Wireless Energy Hatch", + "block.cosmiccore.uiv_16a_wireless_energy_dynamo": "§2UIV 16A Wireless Energy Dynamo", + "block.cosmiccore.uiv_16a_wireless_energy_hatch": "§2UIV 16A Wireless Energy Hatch", + "block.cosmiccore.uiv_4a_wireless_energy_dynamo": "§2UIV 4A Wireless Energy Dynamo", + "block.cosmiccore.uiv_4a_wireless_energy_hatch": "§2UIV 4A Wireless Energy Hatch", + "block.cosmiccore.uiv_calx_reactor": "Uiv Calx Reactor", + "block.cosmiccore.uiv_cosmic_parallel_hatch": "Simple Parallel Control Hatch", + "block.cosmiccore.uiv_mana_leaching_tub": "Uiv Mana Leaching Tub", + "block.cosmiccore.uiv_roaster": "Uiv Roaster", + "block.cosmiccore.uiv_soul_input_hatch": "§2UIV Soul Input Hatch", + "block.cosmiccore.uiv_soul_output_hatch": "§2UIV Soul Output Hatch", + "block.cosmiccore.uiv_thermia_export_hatch": "Uiv Thermia Export Hatch", + "block.cosmiccore.uiv_thermia_import_hatch": "Uiv Thermia Import Hatch", + "block.cosmiccore.uiv_thermomagnitizer": "Uiv Thermomagnitizer", + "block.cosmiccore.uiv_vacuum_bubbler": "Uiv Vacuum Bubbler", + "block.cosmiccore.uiv_wireless_charger": "UIV Wireless Charger", + "block.cosmiccore.uiv_wireless_energy_dynamo": "§2UIV Wireless Energy Dynamo", + "block.cosmiccore.uiv_wireless_energy_hatch": "§2UIV Wireless Energy Hatch", + "block.cosmiccore.ultimate_combustion_engine_cc": "Ultimate Combustion Engine Cc", + "block.cosmiccore.ultimate_intake": "Ultimate Intake", + "block.cosmiccore.ultra_powered_casing": "Ultra Powered Casing", + "block.cosmiccore.ulv_energy_output_hatch_16a": "§8ULV 16A Dynamo Hatch", + "block.cosmiccore.ulv_energy_output_hatch_4a": "§8ULV 4A Dynamo Hatch", + "block.cosmiccore.uv_16a_wireless_energy_dynamo": "§3UV 16A Wireless Energy Dynamo", + "block.cosmiccore.uv_16a_wireless_energy_hatch": "§3UV 16A Wireless Energy Hatch", + "block.cosmiccore.uv_4a_wireless_energy_dynamo": "§3UV 4A Wireless Energy Dynamo", + "block.cosmiccore.uv_4a_wireless_energy_hatch": "§3UV 4A Wireless Energy Hatch", + "block.cosmiccore.uv_biolab": "§3Ultimate Bio Lab §r", + "block.cosmiccore.uv_calx_reactor": "Uv Calx Reactor", + "block.cosmiccore.uv_cosmic_parallel_hatch": "Simple Parallel Control Hatch", + "block.cosmiccore.uv_mana_leaching_tub": "Uv Mana Leaching Tub", + "block.cosmiccore.uv_module_hatch": "Basic Module Hatch", + "block.cosmiccore.uv_naquahine_mini_reactor": "§3Ultimate Naquahine Mini Reactor Generator §r", + "block.cosmiccore.uv_roaster": "Uv Roaster", + "block.cosmiccore.uv_soul_input_hatch": "§3UV Soul Input Hatch", + "block.cosmiccore.uv_soul_output_hatch": "§3UV Soul Output Hatch", + "block.cosmiccore.uv_thermia_export_hatch": "Uv Thermia Export Hatch", + "block.cosmiccore.uv_thermia_import_hatch": "Uv Thermia Import Hatch", + "block.cosmiccore.uv_thermomagnitizer": "Uv Thermomagnitizer", + "block.cosmiccore.uv_vacuum_bubbler": "Uv Vacuum Bubbler", + "block.cosmiccore.uv_wireless_charger": "UV Wireless Charger", + "block.cosmiccore.uv_wireless_energy_dynamo": "§3UV Wireless Energy Dynamo", + "block.cosmiccore.uv_wireless_energy_hatch": "§3UV Wireless Energy Hatch", + "block.cosmiccore.uxv_16a_wireless_energy_dynamo": "§eUXV 16A Wireless Energy Dynamo", + "block.cosmiccore.uxv_16a_wireless_energy_hatch": "§eUXV 16A Wireless Energy Hatch", + "block.cosmiccore.uxv_4a_wireless_energy_dynamo": "§eUXV 4A Wireless Energy Dynamo", + "block.cosmiccore.uxv_4a_wireless_energy_hatch": "§eUXV 4A Wireless Energy Hatch", + "block.cosmiccore.uxv_calx_reactor": "Uxv Calx Reactor", + "block.cosmiccore.uxv_mana_leaching_tub": "Uxv Mana Leaching Tub", + "block.cosmiccore.uxv_roaster": "Uxv Roaster", + "block.cosmiccore.uxv_soul_input_hatch": "§eUXV Soul Input Hatch", + "block.cosmiccore.uxv_soul_output_hatch": "§eUXV Soul Output Hatch", + "block.cosmiccore.uxv_thermia_export_hatch": "Uxv Thermia Export Hatch", + "block.cosmiccore.uxv_thermia_import_hatch": "Uxv Thermia Import Hatch", + "block.cosmiccore.uxv_thermomagnitizer": "Uxv Thermomagnitizer", + "block.cosmiccore.uxv_vacuum_bubbler": "Uxv Vacuum Bubbler", + "block.cosmiccore.uxv_wireless_energy_dynamo": "§eUXV Wireless Energy Dynamo", + "block.cosmiccore.uxv_wireless_energy_hatch": "§eUXV Wireless Energy Hatch", + "block.cosmiccore.vibrant_rubidium_casing": "Vibrant Rubidium Casing", + "block.cosmiccore.vile_fission": "§cFestering Fission Reactor", + "block.cosmiccore.void_fluid_rig": "§cVoid Fluid Rig", + "block.cosmiccore.void_miner": "§cVoid Miner", + "block.cosmiccore.void_salt_fissiom": "§5Voidtouched Salt Fission Reactor", + "block.cosmiccore.vomahine_celestial_laser_bore": "Vomahine Celestial Laser Bore", + "block.cosmiccore.vorax_reactor": "Vorax Reactor", + "block.cosmiccore.wailing_ichor_casing": "Wailing Ichor Casing", + "block.cosmiccore.wasp": "Wide Asteroid Separation Platform [WASP]", + "block.cosmiccore.wear_resistant_ruridit_casing": "Wear Resistant Ruridit Casing", + "block.cosmiccore.wireless_data_hatch": "Wireless Data Hatch", + "block.cosmiccore.wireless_data_transmitter": "Wireless Data Transmitter", + "block.cosmiccore.zblan_glass": "Zblan Glass", + "block.cosmiccore.zpm_16a_wireless_energy_dynamo": "§cZPM 16A Wireless Energy Dynamo", + "block.cosmiccore.zpm_16a_wireless_energy_hatch": "§cZPM 16A Wireless Energy Hatch", + "block.cosmiccore.zpm_4a_wireless_energy_dynamo": "§cZPM 4A Wireless Energy Dynamo", + "block.cosmiccore.zpm_4a_wireless_energy_hatch": "§cZPM 4A Wireless Energy Hatch", + "block.cosmiccore.zpm_biolab": "§cElite Bio Lab III§r", + "block.cosmiccore.zpm_calx_reactor": "Zpm Calx Reactor", + "block.cosmiccore.zpm_cosmic_parallel_hatch": "Simple Parallel Control Hatch", + "block.cosmiccore.zpm_mana_leaching_tub": "Zpm Mana Leaching Tub", + "block.cosmiccore.zpm_naquahine_mini_reactor": "§cElite Naquahine Mini Reactor Generator III§r", + "block.cosmiccore.zpm_roaster": "Zpm Roaster", + "block.cosmiccore.zpm_soul_input_hatch": "§cZPM Soul Input Hatch", + "block.cosmiccore.zpm_soul_output_hatch": "§cZPM Soul Output Hatch", + "block.cosmiccore.zpm_thermia_export_hatch": "Zpm Thermia Export Hatch", + "block.cosmiccore.zpm_thermia_import_hatch": "Zpm Thermia Import Hatch", + "block.cosmiccore.zpm_thermomagnitizer": "Zpm Thermomagnitizer", + "block.cosmiccore.zpm_vacuum_bubbler": "Zpm Vacuum Bubbler", + "block.cosmiccore.zpm_wireless_charger": "ZPM Wireless Charger", + "block.cosmiccore.zpm_wireless_energy_dynamo": "§cZPM Wireless Energy Dynamo", + "block.cosmiccore.zpm_wireless_energy_hatch": "§cZPM Wireless Energy Hatch", + "block.gtceu.extreme_combustion_engine_cc": "Extreme Combustion Engine", + "block.gtceu.high_pressure_assembler": "High Pressure Assembler", + "block.gtceu.hp_steam_bender": "High Pressure Steam Bender", + "block.gtceu.hp_steam_wiremill": "High Pressure Steam Wiremill", + "block.gtceu.industrial_primitive_blast_furnace": "Industrial Primitive Blast Furnace", + "block.gtceu.iv_naquahine_mini_reactor": "§3Micro Naquahine Reactor§r", + "block.gtceu.large_combustion_engine_cc": "Large Combustion Engine", + "block.gtceu.lp_steam_bender": "I Don't Actually Exist", + "block.gtceu.lp_steam_wiremill": "I Don't Actually Exist", + "block.gtceu.ludicrous_combustion_engine_cc": "Ludicrous Combustion Engine", + "block.gtceu.luv_naquahine_mini_reactor": "§dAdvanced Micro Naquahine Reactor§r", + "block.gtceu.steam_caster": "Steam Caster Solidifier", + "block.gtceu.steam_fluid_input_hatch": "Bronze Input Hatch", + "block.gtceu.steam_fluid_output_hatch": "Bronze Output Hatch", + "block.gtceu.steam_mixing_vessel": "§6Large Steam Mixing Vessel", + "block.gtceu.uhv_naquahine_mini_reactor": "§4Epic Micro Naquahine Reactor§r", + "block.gtceu.ultimate_combustion_engine_cc": "Ultimate Combustion Engine", + "block.gtceu.uv_naquahine_mini_reactor": "§3Ultimate Micro Naquahine Reactor§r", + "block.gtceu.zpm_naquahine_mini_reactor": "§cElite Micro Naquahine Reactor§r", + "config.jade.plugin_cosmiccore.drone_maintenance_interface": "[CosmicCore] Drone Maintenance Interface", + "config.jade.plugin_cosmiccore.drone_station": "[CosmicCore] Drone Station Info", + "config.jade.plugin_cosmiccore.pcb_parallel": "[CosmicCore] PCB Foundry Parallel", + "config.jade.plugin_cosmiccore.stellar_module": "[CosmicCore] Stellar Module Info", + "cosmic.command.wireless.energy.active": " §bActive:§b %s", + "cosmic.command.wireless.energy.buffered": " §bBuffered:§b %s EU", + "cosmic.command.wireless.energy.capacitor": " §bCapacitor Location:§b ", + "cosmic.command.wireless.energy.capacity": " §bCapacity:§b %s EU", + "cosmic.command.wireless.energy.header": "§eWireless Energy Network Info (§e %s §e)§e:", + "cosmic.command.wireless.energy.input": " §bInput:§b %s EU/t", + "cosmic.command.wireless.energy.location.format": "%s : x=%d y=%d z=%d", + "cosmic.command.wireless.energy.no.capacitor": "No Formed Capacitor", + "cosmic.command.wireless.energy.output": " §bOutput:§b %s EU/t", + "cosmic.command.wireless.energy.player": "§aPlayer:§a %s", + "cosmic.command.wireless.energy.stored": " §bStored:§b %s EU", + "cosmic.command.wireless.energy.team": "§aTeam:§a %s", + "cosmic.gui.wireless.energy.active": " §bActive:§b %s", + "cosmic.gui.wireless.energy.buffered": " §bBuffered:§b %s EU", + "cosmic.gui.wireless.energy.capacitor": " §bCapacitor Location:§b ", + "cosmic.gui.wireless.energy.capacity": " §bCapacity:§b %s EU", + "cosmic.gui.wireless.energy.header": "§eWireless Energy Network Info (§e %s §e)§e:", + "cosmic.gui.wireless.energy.input": "§aIN:§b %s EU/t", + "cosmic.gui.wireless.energy.location.format": "%s : x=%d y=%d z=%d", + "cosmic.gui.wireless.energy.net": " §aEU NET: %s EU/t", + "cosmic.gui.wireless.energy.no.capacitor": "No Formed Capacitor", + "cosmic.gui.wireless.energy.output": "§cOUTt:§b %s EU/t", + "cosmic.gui.wireless.energy.player": "§aPlayer:§a %s", + "cosmic.gui.wireless.energy.stored": "§eStorage §b%s §f%s/%s", + "cosmic.gui.wireless.energy.team": "§aTeam:§a %s", + "cosmic.multiblock.capacitor.buffered": "§7Buffered: %s §7EU", + "cosmic.multiblock.capacitor.duplicate.multiblock.1": "This multiblock is a duplicate", + "cosmic.multiblock.capacitor.duplicate.multiblock.2": "Only one can exist", + "cosmic.multiblock.capacitor.info.global": "Global", + "cosmic.multiblock.capacitor.info.local": "Local", + "cosmic.multiblock.capacitor.info.tittle.global": "Global Network Info", + "cosmic.multiblock.capacitor.info.tittle.local": "Local Buffer Info ", + "cosmic.multiblock.capacitor.owner.null": "Owner not found", + "cosmic.multiblock.orvex_count": "§fOrvex Residue Extracted§7: %s", + "cosmic.multiblock.orvex_tier": "§fReactor Tier§7: §6%s", + "cosmic.multiblock.orvex_upgrade_check": "§fUpgrade Status: §a%s", + "cosmic.multiblock.orvex_upgrade_requires": "§fUpgrade Requires§7: %s", + "cosmic.multiblock.parallel": "Overloading Parallels by 4x\nMax Parallel: %d\nOriginal Parallel: %d", + "cosmic.multiblock.parallel.exact": "Performing %d Recipes in Parallel", + "cosmic.multiblock.parallel_fixed_64": "Max Parallel: %d", + "cosmic.multiblock.parallel_fixed_64.exact": "Performing %d Recipes in Parallel", + "cosmiccore.arklys.1": "§6Ark - Structure", + "cosmiccore.arklys.2": "§6Lys - Release", + "cosmiccore.armor.sanguinewarptech.hud.LP": "§4Life Force: §c%s", + "cosmiccore.armor.sanguinewarptech.hud.shieldstate": "Sanguine Shield: %s", + "cosmiccore.armor.sanguinewarptech.message.death_defiance": "Your sanguine armor protected you from death!", + "cosmiccore.booster.tooltip.prefix": "§bBooster:§r Tier %s", + "cosmiccore.boots.hud.jump": "Jump: %s", + "cosmiccore.boots.hud.speed": "Speed: %s %s", + "cosmiccore.boots.hud.speed_simple": "Speed: %s", + "cosmiccore.boots.inertia_cancel": "Inertia Dampening: %s", + "cosmiccore.boots.jump_modifier": "Jump Modifier: %s", + "cosmiccore.boots.max_speed": "Max Speed: %s", + "cosmiccore.boots.message.inertia": "Inertia Dampening: %s", + "cosmiccore.boots.message.jump": "Jump Modifier: %s", + "cosmiccore.boots.message.speed": "Speed Modifier: %s", + "cosmiccore.boots.message.step": "Step Assist: %s", + "cosmiccore.boots.speed_modifier": "Speed Modifier: %s", + "cosmiccore.boots.step_assist": "Step Assist: %s", + "cosmiccore.calorific.tooltip.prefix": "§5Calorific:§r %s", + "cosmiccore.calx_reactor.desc": "Working wonders with the Arcane", + "cosmiccore.circuit.lore.tier.max.0": "MAX Tier Circuit", + "cosmiccore.circuit.lore.tier.max.1": "Not a processor- but an Obituary.", + "cosmiccore.circuit.lore.tier.max.2": "Input: Existence.", + "cosmiccore.circuit.lore.tier.max.3": "Output: A single conclusion.", + "cosmiccore.conjuct_arklythar.1": "§6Ark - Structure", + "cosmiccore.conjuct_arklythar.2": "§6Thar - Forge", + "cosmiccore.conjuct_arklythar_emotion.1": "§bE.R.A - Resolve", + "cosmiccore.conjuct_kholys.1": "§6Khor - Space", + "cosmiccore.conjuct_kholys.2": "§6Lys - Release", + "cosmiccore.conjuct_kholys_emotion.1": "§bE.R.A - Confidence", + "cosmiccore.conjuct_valkruth.1": "§6Val - Overwhelming", + "cosmiccore.conjuct_valkruth.2": "§6Ruth - Foundation", + "cosmiccore.conjuct_valkruth_emotion.1": "§bE.R.A - Convergence", + "cosmiccore.datastick.link_copied": "Link: %s", + "cosmiccore.ember.capacity": "§cEmber Capacity:§6 %s", + "cosmiccore.ember.transfer": "§cEmber Transfer Rate:§6 %s", + "cosmiccore.errors.bad_fuel": "§aInsufficient Fuel Quality! \n Fuel Output Must be >720 EU total per unit", + "cosmiccore.gui.stellar.show_modules": "Show Module Control", + "cosmiccore.gui.stellar.show_star": "Show Star View", + "cosmiccore.item.linked_terminal.boundTo": "Bound to %s", + "cosmiccore.item.spraycan.actionbar.color": "Spray Can Color: %s", + "cosmiccore.item.spraycan.gui.solvent": "Solvent (Strip Color)", + "cosmiccore.item.spraycan.gui.title": "Prismatic Spray Can", + "cosmiccore.item.spraycan.locked": "Spray Can is locked", + "cosmiccore.item.spraycan.now_locked": "Spray Can locked", + "cosmiccore.item.spraycan.now_unlocked": "Spray Can unlocked", + "cosmiccore.item.spraycan.tooltip.current_color": "Current Color: %s", + "cosmiccore.item.spraycan.tooltip.lclick": "§4Left Click: §8Cycle color", + "cosmiccore.item.spraycan.tooltip.lclick_sneak": "§4Left Click + Sneak: §8Cycle color", + "cosmiccore.item.spraycan.tooltip.locked": "Spraycan is locked", + "cosmiccore.item.spraycan.tooltip.rclick": "§4Right Click: §8Paint block", + "cosmiccore.item.spraycan.tooltip.rclick_offhand": "§5Right Click in Offhand: §8Place & paint", + "cosmiccore.item.spraycan.tooltip.rclick_sneak": "§5Right Click + Sneak: §8Open UI", + "cosmiccore.item.spraycan.tooltip.solvent_mode": "Spraycan in SOLVENT mode", + "cosmiccore.jade.stellar_module.connected": "Iris: Connected", + "cosmiccore.jade.stellar_module.energy_usage": "Usage: %s", + "cosmiccore.jade.stellar_module.iris_not_ready": "Iris: Not Ready", + "cosmiccore.jade.stellar_module.no_wireless": "No Wireless Network", + "cosmiccore.jade.stellar_module.not_connected": "Iris: Not Connected", + "cosmiccore.jade.stellar_module.speed_bonus": "Speed: %s", + "cosmiccore.jade.stellar_module.stage": "Stage: %s", + "cosmiccore.khoruth.1": "§6Khor - Space", + "cosmiccore.khoruth.2": "§6Ruth - Foundation", + "cosmiccore.link.already_linked": "These machines are already linked", + "cosmiccore.link.cannot_self_link": "Cannot link a machine to itself", + "cosmiccore.link.copied": "Link data copied from %s", + "cosmiccore.link.different_owner": "Cannot link machines owned by different teams", + "cosmiccore.link.established": "Link established: %s ↔ %s", + "cosmiccore.link.incompatible_partner": "Partner machine cannot link to this type", + "cosmiccore.link.incompatible_roles": "Incompatible link roles: %s cannot link to %s", + "cosmiccore.link.incompatible_self": "This machine cannot link to that type", + "cosmiccore.link.invalid_data": "Invalid link data on datastick", + "cosmiccore.link.limit_reached_partner": "Partner machine has reached its link limit", + "cosmiccore.link.limit_reached_self": "This machine has reached its link limit", + "cosmiccore.link.not_linkable": "Target machine does not support linking", + "cosmiccore.link.not_ready": "Machine not ready for linking", + "cosmiccore.link.partner_missing": "Partner machine no longer exists", + "cosmiccore.link.partner_not_loaded": "Partner machine must be loaded to establish link", + "cosmiccore.link.partner_offline": "Linked partner offline", + "cosmiccore.link.too_far": "Partner is too far away to force-load for linking", + "cosmiccore.lore.broken_virtue.0": "Perpetuity Shudders Softly", + "cosmiccore.lore.broken_virtue.1": "Something has gone very wrong.", + "cosmiccore.lore.shard_huge.0": "§3An abnormally massive cluster from past eternity.", + "cosmiccore.lore.shard_huge.1": "§3it screams and wails at you to undo history.", + "cosmiccore.lore.shard_huge.2": "§cYour mind shatters trying to understand this.", + "cosmiccore.lore.shard_large.0": "§aA large fragment from a past eternity", + "cosmiccore.lore.shard_large.1": "§ait echos to rewrite fate.", + "cosmiccore.lore.shard_small.0": "§6A shard from a past eternity", + "cosmiccore.lore.shard_small.1": "§6it subtly echos to rewrite fate.", + "cosmiccore.lubricant.tooltip.prefix": "§6Lubricant:§r Tier %s", + "cosmiccore.machine.capacitor_array.tooltip.0": "§7Local Dense Power Storage§r", + "cosmiccore.machine.capacitor_array.tooltip.1": "§7Can use any capacitor and be expanded vertically up to 18 times§r", + "cosmiccore.machine.capacitor_array.tooltip.2": "§7Accepts §6Laser Hatches§r", + "cosmiccore.machine.dreamers_basin.eu_budget_header": "Energy Budget", + "cosmiccore.machine.dreamers_basin.eu_per_thread": "%s EU/t per thread (%s)", + "cosmiccore.machine.dreamers_basin.status_idle": "Idle - No recipe", + "cosmiccore.machine.dreamers_basin.status_suspended": "Suspended", + "cosmiccore.machine.dreamers_basin.status_unknown": "Unknown", + "cosmiccore.machine.dreamers_basin.status_waiting": "Waiting for inputs", + "cosmiccore.machine.dreamers_basin.thread_header": "Thread Status", + "cosmiccore.machine.dreamers_basin.threads_summary": "%s running / %s active / %s max", + "cosmiccore.machine.dreamers_basin.time_remaining": "Time: %s remaining", + "cosmiccore.machine.dreamers_basin.tooltip.0": "§bRuns multiple unique recipes simultaneously", + "cosmiccore.machine.dreamers_basin.tooltip.1": "§fEach thread requires a uniquely §6colored§f input bus/hatch", + "cosmiccore.machine.dreamers_basin.tooltip.2": "§fMax threads = Energy Hatch amperage (4A=4, 16A=16)", + "cosmiccore.machine.dreamers_basin.tooltip.3": "§aAll threads share output buses/hatches", + "cosmiccore.machine.dreamers_basin.tooltip.crafting": "Crafting:", + "cosmiccore.machine.dreamers_basin.tooltip.duration": "Recipe duration: %s", + "cosmiccore.machine.dreamers_basin.tooltip.no_recipe": "No recipe data", + "cosmiccore.machine.dreamers_basin.tooltip.processing": " Processing...", + "cosmiccore.machine.fluid_drilling_rig.depletion": "§bDepletion Rate: 0%", + "cosmiccore.machine.fluid_drilling_rig.description.0": "§bDrills infinite fluid from", + "cosmiccore.machine.fluid_drilling_rig.description.1": "§bliquid pockets suspended throughout the void.", + "cosmiccore.machine.fluid_drilling_rig.production": "§eProduction Multiplier: 256x", + "cosmiccore.machine.me.stocking_item.tooltip.0": "§fAutomatically pulls products into a singular item slot§r", + "cosmiccore.machine.me.stocking_item.tooltip.1": "§bAllows Advanced Automation of the Assembly line§r", + "cosmiccore.machine.me.stocking_item.tooltip.2": "§fCan be set to automatically pull the first item from AE2§r", + "cosmiccore.machine.me.stocking_item.tooltip.3": "§bor manually filtered.§r", + "cosmiccore.machine.me.stocking_item.tooltip.4": "§fFilter data can be copy/pasted with a data stick§r", + "cosmiccore.machine.me.stocking_item.tooltip.5": "§b'If you're wondering how to parallel assembly lines§r", + "cosmiccore.machine.me.stocking_item.tooltip.6": "§fthis is how. Welcome to subnets!§r", + "cosmiccore.machine.multithreaded.active_threads": "§7Active: §a%s§7/§f%s", + "cosmiccore.machine.multithreaded.max_threads": "§7Max Threads: §f%s", + "cosmiccore.machine.multithreaded.thread_status": "§b=== Thread Status ===", + "cosmiccore.machine.ore_extraction_drill.restarted": "Drill scan restarted", + "cosmiccore.machine.ore_extraction_drill.tooltip.0": "§bExtracts ores from a 9x9 chunk area below the drill while only requiring the drill to be chunk loaded", + "cosmiccore.machine.ore_extraction_drill.tooltip.1": "§fRemoval Chance: §e%s §f(chance to deplete ore per extraction)", + "cosmiccore.machine.ore_extraction_drill.tooltip.2": "§fEffective Yield: §a%sx §f(average extractions per ore)", + "cosmiccore.machine.ore_extraction_drill.tooltip.3": "§7Use screwdriver to restart scan after completion, will run until no ore is present", + "cosmiccore.mana_leaching_tub.desc": "Mana Soaker 9000", + "cosmiccore.multiblock.advanced.star_ladder_tier": "§aVomahine StarLadderOld Tether Tier§f: §b%s \n §aMax Research Modules§f: §b%s", + "cosmiccore.multiblock.booster_used": "Booster: %s", + "cosmiccore.multiblock.chemvat.tooltip.0": "§aA massive chemical plant capable of parallel", + "cosmiccore.multiblock.chemvat.tooltip.1": "§fWhen parallelized, adds the cumulative time of all recipes together.", + "cosmiccore.multiblock.chemvat.tooltip.2": "§fReduces total time of any recipe ran by 75% afterwards.", + "cosmiccore.multiblock.chemvat.tooltip.3": "§6Accepts Laser hatches.", + "cosmiccore.multiblock.chemvat.tooltip.4": "§6Accepts Cosmic Parallel Hatches.", + "cosmiccore.multiblock.cleaning_status": "§aCleaning Status: %s", + "cosmiccore.multiblock.cleaning_status.error": "§cCleaning Status: §4No Cleaning Agent!", + "cosmiccore.multiblock.contagion_rate": "§cContagion Rate: %s/t", + "cosmiccore.multiblock.current_contagion": "§6Contagion Strength: %s", + "cosmiccore.multiblock.current_field_strength": "§fField Strength: %s", + "cosmiccore.multiblock.drone_maintenance_interface.connection_location": "Currently connected to (%s, %s, %s)", + "cosmiccore.multiblock.drone_maintenance_interface.no_connection": "Not connected", + "cosmiccore.multiblock.drone_station_machine.current_tier": "Current tier: %s", + "cosmiccore.multiblock.drone_station_machine.drone_amount": "Currently serving %s drones", + "cosmiccore.multiblock.drone_station_machine.no_drones": "No drones connected", + "cosmiccore.multiblock.drone_station_machine.tier.0": "Plasmatic", + "cosmiccore.multiblock.drone_station_machine.tier.1": "Sanguine", + "cosmiccore.multiblock.drone_station_machine.tier.2": "Industrial", + "cosmiccore.multiblock.drone_station_machine.tier.3": "Robust", + "cosmiccore.multiblock.drone_station_machine.tier.4": "Rusty", + "cosmiccore.multiblock.drone_station_machine.tier.5": "None", + "cosmiccore.multiblock.fuel_star": "§a§lFuel Star Core", + "cosmiccore.multiblock.heat_capacity": "§cMax Heat: %s", + "cosmiccore.multiblock.heat_value": "§6Current Heat: %s", + "cosmiccore.multiblock.hpca.incomplete-array": "Incomplete Array will not generate", + "cosmiccore.multiblock.hpsassem.tooltip.0": "§7§oLet's build an empire!", + "cosmiccore.multiblock.hpsassem.tooltip.1": "§fA large but powerful assembler made of steel", + "cosmiccore.multiblock.hpsassem.tooltip.2": "§aParallel Amount§f: §b4x§r", + "cosmiccore.multiblock.ipbf.tooltip.0": "§7§oTurn up the heat!", + "cosmiccore.multiblock.ipbf.tooltip.1": "§fConsumes creosote with recipes to improve efficiency.", + "cosmiccore.multiblock.ipbf.tooltip.2": "§aRecipes are §f25% §aFaster.", + "cosmiccore.multiblock.ipbf.tooltip.3": "§aParallel Amount§f: §b8x§r", + "cosmiccore.multiblock.iris.star_stage_early_star": "§aStar Core Stage§f: §6Infant Star", + "cosmiccore.multiblock.iris.star_stage_empty": "§aStar Core Stage§f: §6Compressed Gas Cloud", + "cosmiccore.multiblock.iris.star_stage_request": "§cStar Core Requires \n§r%s \n§cfor Next Stage.", + "cosmiccore.multiblock.iris.star_stage_sustain": "§cStar Requires \n§r%s \n§cto avoid §lcataclysmic failure!", + "cosmiccore.multiblock.iris.tooltip.0": "§cYour Mind Shatters Trying to Understand This", + "cosmiccore.multiblock.iris.tooltip.1": "§c§lDANGER: DO NOT RENDER THE JEI PREVIEW", + "cosmiccore.multiblock.iris.tooltip.2": "§c§lDANGER: YOU WILL LAG OR CRASH YOUR GAME", + "cosmiccore.multiblock.iris.tooltip.3": "§aFuture Multiblock - JEI preview will be disabled/optimized", + "cosmiccore.multiblock.lubricant_used": "Lubricant: %s", + "cosmiccore.multiblock.magnetic_field_strength": "§fMax Field Strength§f:§6 %s", + "cosmiccore.multiblock.magnetic_regen": "§aField Recovery Rate§f:§6 %sT/t", + "cosmiccore.multiblock.naqreactor.tooltip.0": "§cA massive reactor powered by explosions and reactive fuel", + "cosmiccore.multiblock.naqreactor.tooltip.1": "§bWill always attempt to parallel to 16x output.", + "cosmiccore.multiblock.naqreactor.tooltip.2": "§cOnly Accepts Laser hatches.", + "cosmiccore.multiblock.pattern.stellar_module_slot": "§7Module Slot (Air or Formed Module)", + "cosmiccore.multiblock.reboot_powergrid": "§aReboot All Connected Machines", + "cosmiccore.multiblock.send_orbit_data": "§a§lSend Research Payload", + "cosmiccore.multiblock.sleep_powergrid": "§cSuspend All Connected Machines", + "cosmiccore.multiblock.star_ladder.tooltip.0": "§cThe peaks of creation reach out into the stars", + "cosmiccore.multiblock.star_ladder.tooltip.1": "§c§lDANGER: DATA LOSS PRESENT", + "cosmiccore.multiblock.star_ladder.tooltip.2": "§c§lDANGER: RECOVERY IS POSSIBLE", + "cosmiccore.multiblock.star_ladder.tooltip.3": "§aPinacle Multiblock : The Final Goal of ACT1 (Steam to IV)", + "cosmiccore.multiblock.stellar_module.connected": "§aConnected to Stellar Iris", + "cosmiccore.multiblock.stellar_module.energy_usage": "§eWireless EU/t: §f%s", + "cosmiccore.multiblock.stellar_module.iris_not_formed": "§cStellar Iris Not Formed", + "cosmiccore.multiblock.stellar_module.iris_not_ready": "§eStellar Iris Not Ready", + "cosmiccore.multiblock.stellar_module.loading": "§7Loading...", + "cosmiccore.multiblock.stellar_module.no_wireless": "§cNo Wireless Energy Network", + "cosmiccore.multiblock.stellar_module.not_connected": "§cNot Connected to Stellar Iris", + "cosmiccore.multiblock.stellar_module.parallel": "§7Parallel Limit: §b%s", + "cosmiccore.multiblock.stellar_module.power_config": "§7Config: §b%s §7@ §a%dx §7Parallel", + "cosmiccore.multiblock.stellar_module.power_failure": "§c§lPOWER FAILURE - Insufficient Energy!", + "cosmiccore.multiblock.stellar_module.speed_bonus": "§7Speed Bonus: §a%s", + "cosmiccore.multiblock.stellar_module.stage": "§7Iris Stage: §e%s", + "cosmiccore.omnia_circuit.ev": "§6Works as any EV Circuit.", + "cosmiccore.omnia_circuit.hv": "§6Works as any HV Circuit.", + "cosmiccore.omnia_circuit.iv": "§6Works as any IV Circuit.", + "cosmiccore.omnia_circuit.luv": "§6Works as any LuV Circuit.", + "cosmiccore.omnia_circuit.lv": "§6Works as any LV Circuit.", + "cosmiccore.omnia_circuit.mv": "§6Works as any MV Circuit.", + "cosmiccore.omnia_circuit.opv": "§6Works as any OPV Circuit.", + "cosmiccore.omnia_circuit.uev": "§6Works as any UEV Circuit.", + "cosmiccore.omnia_circuit.uhv": "§6Works as any UHV Circuit.", + "cosmiccore.omnia_circuit.uiv": "§6Works as any UIV Circuit.", + "cosmiccore.omnia_circuit.uv": "§6Works as any UV Circuit.", + "cosmiccore.omnia_circuit.uxv": "§6Works as any UXV Circuit.", + "cosmiccore.omnia_circuit.zpm": "§6Works as any ZPM Circuit.", + "cosmiccore.recipe.asteroid_weight_greater_1": "Greater Yields\nfrom Larger Asteroids", + "cosmiccore.recipe.condition.linked_partner.formed": "Requires %s linked partner(s) with valid structure", + "cosmiccore.recipe.condition.linked_partner.tooltip": "Requires %s linked partner(s)", + "cosmiccore.recipe.condition.linked_partner.working": "Requires %s linked partner(s) actively working", + "cosmiccore.recipe.condition.linked_partner_dimension.tooltip": "Requires linked partner in %s", + "cosmiccore.recipe.condition.linked_partner_dimension_fluid.tooltip": "Requires %smB %s in partner in %s", + "cosmiccore.recipe.condition.linked_partner_dimension_item.tooltip": "Requires %sx %s in partner in %s", + "cosmiccore.recipe.condition.titan.tooltip": "Requires Titan Reactor Tier: %s", + "cosmiccore.recipe.ember_in": "Ember Input: %s", + "cosmiccore.recipe.ember_out": "Ember Output: %s", + "cosmiccore.recipe.fieldDecay": "§fField Decay: %sT/t", + "cosmiccore.recipe.fieldSlam": "§fField Consumed: %sT", + "cosmiccore.recipe.minField": "§fMin. Field Strength: %sT", + "cosmiccore.recipe.soul_in": "Soul Input: %s", + "cosmiccore.recipe.soul_out": "Soul Output: %s", + "cosmiccore.recipe.sterile_in": "Sterilizer: %s %s", + "cosmiccore.recipe.sterile_out": "ERROR?", + "cosmiccore.recipe.waiting_for_partner": "Waiting for linked partner", + "cosmiccore.roaster.desc": "Marshmallows not included", + "cosmiccore.rune_emotion_weak.1": "§7§oAn incomplete ERA reaction is observed.", + "cosmiccore.rune_emotion_weak.2": "§7§oStrong emotional and chemical reactions cause the slate to vibrate.", + "cosmiccore.rune_vague": "§7§oLatent emotions seem to be missing.", + "cosmiccore.soul_mutilator.already_shaped": "Your soul is already shaped as %s.", + "cosmiccore.soul_mutilator.not_awakened": "Your soul has not yet awakened. Die a few more times.", + "cosmiccore.soul_mutilator.select_shape": "Select a Soul Shape:", + "cosmiccore.soul_mutilator.shape_selected": "Your soul has been mutilated into %s.", + "cosmiccore.soul_shape.bloodthirst.description": "Kill or be killed. Damage bargains are empowered, defense is cursed.", + "cosmiccore.soul_shape.bloodthirst.name": "The Bloodthirst", + "cosmiccore.soul_shape.bloodthirst.super.description": "Enter a frenzy. Kill a mob, dash to the next, execute low-health enemies. RIP. AND. TEAR.", + "cosmiccore.soul_shape.bloodthirst.super.name": "Rip and Tear", + "cosmiccore.soul_shape.bloodthirst.tagline": "I end things before they begin.", + "cosmiccore.soul_shape.bulwark.description": "You don't dodge. You don't retreat. You take it. Defensive bargains are empowered, mobility is cursed.", + "cosmiccore.soul_shape.bulwark.name": "The Bulwark", + "cosmiccore.soul_shape.bulwark.super.description": "Plant yourself. Emit a damaging aura, take massively reduced damage, reflect damage to attackers.", + "cosmiccore.soul_shape.bulwark.super.name": "Last Stand", + "cosmiccore.soul_shape.bulwark.tagline": "I endure what would break you.", + "cosmiccore.soul_shape.engine.description": "You are the cog work. Efficiency. Throughput. Optimization. Speed-related bargains are empowered.", + "cosmiccore.soul_shape.engine.name": "The Engine", + "cosmiccore.soul_shape.engine.super.description": "Overclock for a breif moment. Attack, move, mine, and build at massively boosted speeds.", + "cosmiccore.soul_shape.engine.super.name": "Overclock", + "cosmiccore.soul_shape.engine.tagline": "The factory must grow. And I must too.", + "cosmiccore.soul_shape.globedancer.description": "Movement is identity. You are not hit because you are not there. Mobility bargains are empowered, defense is cursed.", + "cosmiccore.soul_shape.globedancer.name": "The Globedancer", + "cosmiccore.soul_shape.globedancer.super.description": "Become untouchable. No fall damage, no collision. Pure fluid motion.", + "cosmiccore.soul_shape.globedancer.super.name": "Slipstream", + "cosmiccore.soul_shape.globedancer.tagline": "I am never where you strike.", + "cosmiccore.soul_shape.hollow.description": "You gain nothing passively. You take. Everything you have, you took from something else.", + "cosmiccore.soul_shape.hollow.name": "The Hollow", + "cosmiccore.soul_shape.hollow.super.description": "Consume an entity whole. Gain Nourishment and leech a stat from what you ate.", + "cosmiccore.soul_shape.hollow.super.name": "Devour", + "cosmiccore.soul_shape.hollow.tagline": "I am empty. Consume All.", + "cosmiccore.soul_shape.revenant.description": "You've died so many times that death itself is just a phase. Death-related bargains are empowered.", + "cosmiccore.soul_shape.revenant.name": "The Revenant", + "cosmiccore.soul_shape.revenant.super.description": "When you would die, you don't. Enter a fury state with massive lifesteal. Heal to full or die for real.", + "cosmiccore.soul_shape.revenant.super.name": "Defy", + "cosmiccore.soul_shape.revenant.tagline": "I was the first to die. I'll be the last to fall.", + "cosmiccore.soul_shape.unshaped.description": "You have not yet chosen a shape. Your potential is limitless, but so is your lack of direction.", + "cosmiccore.soul_shape.unshaped.name": "Unshaped", + "cosmiccore.soul_shape.unshaped.tagline": "Your soul remains formless, undefined.", + "cosmiccore.star_ladder.abort": "ABORT", + "cosmiccore.star_ladder.confirm": "CONFIRM", + "cosmiccore.star_ladder.demands_soul": "The Ladder demands Refined Soul.", + "cosmiccore.star_ladder.drain_rate": "Drain rate: %d/s", + "cosmiccore.star_ladder.established": "UPLINK ESTABLISHED", + "cosmiccore.star_ladder.hub_name": "Research Hub", + "cosmiccore.star_ladder.hub_tier": "Hub Tier: T%d", + "cosmiccore.star_ladder.initiate": "INITIATE UPLINK", + "cosmiccore.star_ladder.interrupted": "UPLINK INTERRUPTED", + "cosmiccore.star_ladder.requisition": "REQUISITION:", + "cosmiccore.star_ladder.resisting": "Something is resisting.", + "cosmiccore.star_ladder.soul_drain": "SOUL DRAIN: %d/s", + "cosmiccore.star_ladder.title": "STAR LADDER", + "cosmiccore.star_ladder.uplink_progress": "UPLINK PROGRESS", + "cosmiccore.star_ladder.whisper.ambient.p1.air_tastes_iron": "The air tastes like iron.", + "cosmiccore.star_ladder.whisper.ambient.p1.conduits_heating": "The conduits are heating up.", + "cosmiccore.star_ladder.whisper.ambient.p1.dust_falling": "Dust falling from the ceiling, cracks in the walls.", + "cosmiccore.star_ladder.whisper.ambient.p1.floor_vibrating": "The floor is vibrating.", + "cosmiccore.star_ladder.whisper.ambient.p1.groaning_walls": "Something groans in the walls.", + "cosmiccore.star_ladder.whisper.ambient.p1.lights_flicker": "The lights flicker and fail.", + "cosmiccore.star_ladder.whisper.ambient.p1.low_hum": "A low hum, rising.", + "cosmiccore.star_ladder.whisper.ambient.p1.metal_ticking": "Metal ticking as it expands, twisting.", + "cosmiccore.star_ladder.whisper.ambient.p1.pipes_rattling": "Pipes rattling somewhere deep, steam hisses.", + "cosmiccore.star_ladder.whisper.ambient.p1.pressure_dropping": "Pressure dropping, the rushing sound of air.", + "cosmiccore.star_ladder.whisper.ambient.p1.shadows_wrong": "The shadows are wrong, the stars sway.", + "cosmiccore.star_ladder.whisper.ambient.p1.smell_of_ozone": "Smell of petrichor, the taste of sulfur.", + "cosmiccore.star_ladder.whisper.ambient.p1.something_woke_up": "Something woke up, and it's mad.", + "cosmiccore.star_ladder.whisper.ambient.p1.sparks_corner": "Sparks crackle at the corners of the terminal.", + "cosmiccore.star_ladder.whisper.ambient.p1.static_on_skin": "Static crawling across your skin, the air electrified.", + "cosmiccore.star_ladder.whisper.ambient.p2.blood_in_mouth": "Taste of blood in your mouth grows.", + "cosmiccore.star_ladder.whisper.ambient.p2.bolts_shearing": "Bolts shearing off the frame, the structure feels unstable.", + "cosmiccore.star_ladder.whisper.ambient.p2.ears_ringing": "Your ears are ringing, you swear you hear words.", + "cosmiccore.star_ladder.whisper.ambient.p2.floor_buckling": "The floor is buckling, the world is revolting.", + "cosmiccore.star_ladder.whisper.ambient.p2.gravity_hiccup": "Gravity hiccups, just for a moment.", + "cosmiccore.star_ladder.whisper.ambient.p2.heat_distortion": "Heat distortion in the air, the sky burns orange.", + "cosmiccore.star_ladder.whisper.ambient.p2.light_bends": "Light bends where it shouldn't, your eyes are playing tricks.", + "cosmiccore.star_ladder.whisper.ambient.p2.machine_screams": "The machine screams, it's in pain.", + "cosmiccore.star_ladder.whisper.ambient.p2.metal_expanding": "Metal expanding, popping, hissing, cracking.", + "cosmiccore.star_ladder.whisper.ambient.p2.smell_of_burning": "Smell of burning that isn't there, the taste of flesh and souls unknown.", + "cosmiccore.star_ladder.whisper.ambient.p2.something_cracks": "Something cracks, the earth shifts below.", + "cosmiccore.star_ladder.whisper.ambient.p2.structure_resonating": "The structure is resonating, a song is forming.", + "cosmiccore.star_ladder.whisper.ambient.p2.temperature_climbing": "The temperature is climbing, your body is soaked in sweat.", + "cosmiccore.star_ladder.whisper.ambient.p2.time_stutters": "Time stutters and jumps.", + "cosmiccore.star_ladder.whisper.ambient.p2.vision_doubles": "Your vision doubles, you see a woman cloaked in silver.", + "cosmiccore.star_ladder.whisper.ambient.p2.walls_humming": "The walls are humming a note you can't name, discordantly.", + "cosmiccore.star_ladder.whisper.ambient.p3.air_tastes_of_stars": "The air tastes of star dust", + "cosmiccore.star_ladder.whisper.ambient.p3.colors_wrong": "You're perceiving new colors no human could", + "cosmiccore.star_ladder.whisper.ambient.p3.edges_dissolving": "The edge of consciousness dissolves", + "cosmiccore.star_ladder.whisper.ambient.p3.everything_shaking": "Everything shakes in unison.", + "cosmiccore.star_ladder.whisper.ambient.p3.gravity_uncertain": "Gravity feels like second nature", + "cosmiccore.star_ladder.whisper.ambient.p3.ground_not_solid": "The ground shatters under you.", + "cosmiccore.star_ladder.whisper.ambient.p3.hands_shaking": "Your hands are shaking, traces of blood not of yours cover them", + "cosmiccore.star_ladder.whisper.ambient.p3.heartbeat_in_walls": "You can hear your heartbeat in the walls", + "cosmiccore.star_ladder.whisper.ambient.p3.light_bending_wrong": "Light bends and reveals countless faces", + "cosmiccore.star_ladder.whisper.ambient.p3.reality_thins": "Reality thickens and thins at random", + "cosmiccore.star_ladder.whisper.ambient.p3.sky_too_close": "The heavens feel infinitely close", + "cosmiccore.star_ladder.whisper.ambient.p3.something_looking_back": "Something beyond you is glaring intensely", + "cosmiccore.star_ladder.whisper.ambient.p3.sound_from_nowhere": "A sound from inside your mind", + "cosmiccore.star_ladder.whisper.ambient.p3.static_all_frequencies": "Your mind feels the static noise of the world", + "cosmiccore.star_ladder.whisper.ambient.p3.tinnitus_screaming": "The sound is deafening", + "cosmiccore.star_ladder.whisper.ambient.p3.veil_fraying": "The veil is fraying, the sky realigns", + "cosmiccore.star_ladder.whisper.ambient.p3.walls_breathing": "The walls are breathing in tune with you.", + "cosmiccore.star_ladder.whisper.interrupted.no": "Hm?", + "cosmiccore.star_ladder.whisper.interrupted.pressure": "Pressure.", + "cosmiccore.star_ladder.whisper.interrupted.silence": "Silence.", + "cosmiccore.star_ladder.whisper.observer.p1.leave": "Begone.", + "cosmiccore.star_ladder.whisper.observer.p1.no": "There is nothing for you here.", + "cosmiccore.star_ladder.whisper.observer.p1.not_here": "This isn't your calling.", + "cosmiccore.star_ladder.whisper.observer.p1.stop": "Curious.", + "cosmiccore.star_ladder.whisper.observer.p2.dont_understand": "You don't understand what you're doing, this is beyond you.", + "cosmiccore.star_ladder.whisper.observer.p2.enough": "Enough.", + "cosmiccore.star_ladder.whisper.observer.p2.i_was_patient": "I was patient, you're testing that.", + "cosmiccore.star_ladder.whisper.observer.p2.not_yours": "This is not yours to take, you were mine to create", + "cosmiccore.star_ladder.whisper.observer.p2.still_time": "There is still time to stop, I'll neglect it this once.", + "cosmiccore.star_ladder.whisper.observer.p2.you_were_warned": "You're digging into things that should be left in the past", + "cosmiccore.star_ladder.whisper.observer.p3.congratulations": "Congratulations, you've done something beyond me.", + "cosmiccore.star_ladder.whisper.observer.p3.door_opens_both_ways": "The door opens both ways, to me, and to you.", + "cosmiccore.star_ladder.whisper.observer.p3.fine": "Fine, make yourself into a monster", + "cosmiccore.star_ladder.whisper.observer.p3.remember_this": "Remember this, you started this", + "cosmiccore.star_ladder.whisper.observer.p3.see_what_happens": "Let's see what happens, find me.", + "cosmiccore.star_ladder.whisper.observer.p3.will_not_forget": "I will not forget, I won't let you forget.", + "cosmiccore.star_ladder.whisper.observer.p3.you_chose_this": "You chose this and there's no going back.", + "cosmiccore.star_ladder.whisper.reflection.p1.hold": "Hold steady, my creation.", + "cosmiccore.star_ladder.whisper.reflection.p1.its_working": "It works, I need to keep on pushing.", + "cosmiccore.star_ladder.whisper.reflection.p1.keep_feeding": "I need to keep fueling it.", + "cosmiccore.star_ladder.whisper.reflection.p2.channel_widening": "The data stream is surging- I've made progress", + "cosmiccore.star_ladder.whisper.reflection.p2.dont_stop": "Don't stop, this is it!", + "cosmiccore.star_ladder.whisper.reflection.p2.halfway": "Still standing, halfway there.", + "cosmiccore.star_ladder.whisper.reflection.p3.almost_through": "Almost through, closing in.", + "cosmiccore.star_ladder.whisper.reflection.p3.can_feel_it": "I can feel everything around myself", + "cosmiccore.star_ladder.whisper.reflection.p3.one_more_push": "One more push, I can feel it", + "cosmiccore.star_ladder.whisper.transition.complete": "A loud scream followed by complete silence, you've made it.", + "cosmiccore.star_ladder.whisper.transition.phase_2": "Something shifts and groans.", + "cosmiccore.star_ladder.whisper.transition.phase_3": "The barrier is cracking, the world is crying.", + "cosmiccore.stellar.branch.collapse": "Collapse", + "cosmiccore.stellar.branch.fusion": "Fusion", + "cosmiccore.stellar.branch.ignition": "Ignition", + "cosmiccore.stellar.branch.void": "Void", + "cosmiccore.stellar.context.blackhole_line1": "Singularity contained", + "cosmiccore.stellar.context.blackhole_line2": "Exotic processing", + "cosmiccore.stellar.context.death_graceful_line1": "Controlled shutdown", + "cosmiccore.stellar.context.death_graceful_line2": "in progress...", + "cosmiccore.stellar.context.death_line1": "CRITICAL FAILURE", + "cosmiccore.stellar.context.death_line2": "SOUL FUSE ENGAGED", + "cosmiccore.stellar.context.empty_line1": "Insert star seed and", + "cosmiccore.stellar.context.empty_line2": "provide stellar gases", + "cosmiccore.stellar.context.empty_line3": "to begin ignition.", + "cosmiccore.stellar.context.growing_line1": "Stellar fusion", + "cosmiccore.stellar.context.growing_line2": "initiating...", + "cosmiccore.stellar.context.star_line1": "Stable fusion active", + "cosmiccore.stellar.context.star_line2": "Processing available", + "cosmiccore.stellar.context.superstar_line1": "WARNING: Critical mass", + "cosmiccore.stellar.context.superstar_line2": "Collapse imminent", + "cosmiccore.stellar.convergence.title": "Stellar Convergence", + "cosmiccore.stellar.ignition.breaking": "!!! BREAKING !!!", + "cosmiccore.stellar.ignition.ignite": "IGNITE", + "cosmiccore.stellar.ignition.requires_star": "REQUIRES ACTIVE STAR", + "cosmiccore.stellar.module.config": "Module Config", + "cosmiccore.stellar.module.current": "Current", + "cosmiccore.stellar.module.iris_limit": "Iris Limit", + "cosmiccore.stellar.module.max_eut": "Max EU/t", + "cosmiccore.stellar.module.not_linked": "Not linked to Stellar Iris", + "cosmiccore.stellar.module.parallel": "Parallel", + "cosmiccore.stellar.module.parallel_max": "%sx (max %s)", + "cosmiccore.stellar.module.speed_bonus": "Speed Bonus", + "cosmiccore.stellar.module.stage": "Stage", + "cosmiccore.stellar.module.status": "Status", + "cosmiccore.stellar.module.status.disconnected": "DISCONNECTED", + "cosmiccore.stellar.module.status.idle": "IDLE", + "cosmiccore.stellar.module.status.iris_inactive": "IRIS INACTIVE", + "cosmiccore.stellar.module.status.no_wireless": "NO WIRELESS", + "cosmiccore.stellar.module.status.offline": "OFFLINE", + "cosmiccore.stellar.module.status.power_fail": "POWER FAIL", + "cosmiccore.stellar.module.status.processing": "PROCESSING", + "cosmiccore.stellar.module.status.ready": "READY", + "cosmiccore.stellar.module.waiting_iris": "Waiting for Iris", + "cosmiccore.stellar.power.max_parallel": "Maximum Parallel", + "cosmiccore.stellar.power.title": "Power Control Panel", + "cosmiccore.stellar.power.voltage_per_parallel": "Voltage Per Parallel", + "cosmiccore.stellar.prestige.continue": "[Click anywhere to continue]", + "cosmiccore.stellar.prestige.current_tier": "CURRENT TIER", + "cosmiccore.stellar.prestige.max_tier": "MAXIMUM TIER REACHED", + "cosmiccore.stellar.prestige.next_tier": "%s pts for %s", + "cosmiccore.stellar.prestige.points_earned": "POINTS EARNED", + "cosmiccore.stellar.prestige.tier.apprentice": "APPRENTICE", + "cosmiccore.stellar.prestige.tier.expert": "EXPERT", + "cosmiccore.stellar.prestige.tier.grandmaster": "GRANDMASTER", + "cosmiccore.stellar.prestige.tier.journeyman": "JOURNEYMAN", + "cosmiccore.stellar.prestige.tier.master": "MASTER", + "cosmiccore.stellar.prestige.tier.novice": "NOVICE", + "cosmiccore.stellar.prestige.tier.unknown": "UNKNOWN", + "cosmiccore.stellar.prestige.tier_up": "TIER UP!", + "cosmiccore.stellar.prestige.title": "STELLAR CONVERGENCE", + "cosmiccore.stellar.prestige.total_points": "Total: %s points", + "cosmiccore.stellar.slot.star_seed": "Star Seed", + "cosmiccore.stellar.stage.controlled_shutdown": "CONTROLLED SHUTDOWN", + "cosmiccore.stellar.stage.critical_mass": "CRITICAL MASS", + "cosmiccore.stellar.stage.emergency_protocols": "EMERGENCY PROTOCOLS", + "cosmiccore.stellar.stage.initialization": "INITIALIZATION", + "cosmiccore.stellar.stage.singularity_control": "SINGULARITY CONTROL", + "cosmiccore.stellar.stage.stellar_ignition": "STELLAR IGNITION", + "cosmiccore.stellar.stage.stellar_operations": "STELLAR OPERATIONS", + "cosmiccore.stellar.upgrade.abyss_walker": "Abyss Walker", + "cosmiccore.stellar.upgrade.abyss_walker.desc": "Void energy passively accumulates, boosting exotic recipes", + "cosmiccore.stellar.upgrade.annihilation_yield": "Annihilation Yield", + "cosmiccore.stellar.upgrade.annihilation_yield.desc": "BLACK_HOLE prestige gives 5x base points, destroys the star", + "cosmiccore.stellar.upgrade.antimatter_injection": "Antimatter Injection", + "cosmiccore.stellar.upgrade.antimatter_injection.desc": "Unlock antimatter fuel. +100% speed when fueled with antimatter", + "cosmiccore.stellar.upgrade.available": "Click to unlock", + "cosmiccore.stellar.upgrade.cascading_collapse": "Cascading Collapse", + "cosmiccore.stellar.upgrade.cascading_collapse.desc": "Prestige triggers grant bonus points to connected modules", + "cosmiccore.stellar.upgrade.chromatic_tuning": "Chromatic Tuning", + "cosmiccore.stellar.upgrade.chromatic_tuning.desc": "Custom star color provides +5% to matching element recipes", + "cosmiccore.stellar.upgrade.core_harmonics": "Core Harmonics", + "cosmiccore.stellar.upgrade.core_harmonics.desc": "-20% additional fuel consumption", + "cosmiccore.stellar.upgrade.corona_expansion": "Corona Expansion", + "cosmiccore.stellar.upgrade.corona_expansion.desc": "Module connection range doubled", + "cosmiccore.stellar.upgrade.cosmic_tithe": "Cosmic Tithe", + "cosmiccore.stellar.upgrade.cosmic_tithe.desc": "Passively generate prestige points (1/min per tier)", + "cosmiccore.stellar.upgrade.cost": "Cost: %d pts", + "cosmiccore.stellar.upgrade.dark_matter_lens": "Dark Matter Lens", + "cosmiccore.stellar.upgrade.dark_matter_lens.desc": "BLACK_HOLE passively produces Dark Matter (1/min)", + "cosmiccore.stellar.upgrade.decay_resistance": "Decay Resistance", + "cosmiccore.stellar.upgrade.decay_resistance.desc": "+3% decay resistance per level (max 10 levels)", + "cosmiccore.stellar.upgrade.dual_sacrifice": "Dual Sacrifice", + "cosmiccore.stellar.upgrade.dual_sacrifice.desc": "Can consume 2 prestige items for 2.5x points", + "cosmiccore.stellar.upgrade.dyson_lattice": "Dyson Lattice", + "cosmiccore.stellar.upgrade.dyson_lattice.desc": "Passive energy generation scales with star stage (up to 32k EU/t)", + "cosmiccore.stellar.upgrade.early_harvest": "Early Harvest", + "cosmiccore.stellar.upgrade.early_harvest.desc": "Can prestige at STAR stage (50% points)", + "cosmiccore.stellar.upgrade.echo_of_collapse": "Echo of Collapse", + "cosmiccore.stellar.upgrade.echo_of_collapse.desc": "Prestige grants a temporary 20% speed boost for 5 minutes", + "cosmiccore.stellar.upgrade.efficient_consumption": "Efficient Consumption", + "cosmiccore.stellar.upgrade.efficient_consumption.desc": "15% chance prestige doesn't consume prestige item", + "cosmiccore.stellar.upgrade.eldritch_insight": "Eldritch Insight", + "cosmiccore.stellar.upgrade.eldritch_insight.desc": "Reveals hidden recipe bonuses based on star configuration", + "cosmiccore.stellar.upgrade.energy_optimization": "Energy Optimization", + "cosmiccore.stellar.upgrade.energy_optimization.desc": "-3% energy cost per level (max 10 levels)", + "cosmiccore.stellar.upgrade.entropy_engine": "Entropy Engine", + "cosmiccore.stellar.upgrade.entropy_engine.desc": "Failed recipes contribute to prestige point pool", + "cosmiccore.stellar.upgrade.entropy_harvest": "Entropy Harvest", + "cosmiccore.stellar.upgrade.entropy_harvest.desc": "Gain bonus points based on star lifetime before prestige", + "cosmiccore.stellar.upgrade.ergosphere_tap": "Ergosphere Tap", + "cosmiccore.stellar.upgrade.ergosphere_tap.desc": "Extract rotational energy from BLACK_HOLE (8192 EU/t passive)", + "cosmiccore.stellar.upgrade.eternal_ember": "Eternal Ember", + "cosmiccore.stellar.upgrade.eternal_ember.desc": "Stars at STAR stage never naturally decay", + "cosmiccore.stellar.upgrade.eternal_void": "Eternal Void", + "cosmiccore.stellar.upgrade.eternal_void.desc": "All BLACK_HOLE bonuses are doubled. Void effects persist 30s after leaving BLACK_HOLE.", + "cosmiccore.stellar.upgrade.event_horizon_lock": "Event Horizon Lock", + "cosmiccore.stellar.upgrade.event_horizon_lock.desc": "BLACK_HOLE never decays to DEATH", + "cosmiccore.stellar.upgrade.exotic_matter_tap": "Exotic Matter Tap", + "cosmiccore.stellar.upgrade.exotic_matter_tap.desc": "Unlock exotic matter processing recipes", + "cosmiccore.stellar.upgrade.false_vacuum": "False Vacuum", + "cosmiccore.stellar.upgrade.false_vacuum.desc": "Reality unravels. All Void bonuses tripled. Unlock False Vacuum recipes.", + "cosmiccore.stellar.upgrade.fuel_efficiency": "Fuel Efficiency", + "cosmiccore.stellar.upgrade.fuel_efficiency.desc": "-2% fuel consumption per level (max 10 levels)", + "cosmiccore.stellar.upgrade.fusion_catalyst": "Fusion Catalyst", + "cosmiccore.stellar.upgrade.fusion_catalyst.desc": "Stars grow to next stage 25% faster", + "cosmiccore.stellar.upgrade.fusion_overdrive": "Fusion Overdrive", + "cosmiccore.stellar.upgrade.fusion_overdrive.desc": "+50% processing speed, +25% fuel consumption", + "cosmiccore.stellar.upgrade.gravitational_mastery": "Gravitational Mastery", + "cosmiccore.stellar.upgrade.gravitational_mastery.desc": "BLACK_HOLE stage grants +3 parallels", + "cosmiccore.stellar.upgrade.graviton_lens": "Graviton Lens", + "cosmiccore.stellar.upgrade.graviton_lens.desc": "+1 parallel per star stage", + "cosmiccore.stellar.upgrade.growth_catalyst": "Growth Catalyst", + "cosmiccore.stellar.upgrade.growth_catalyst.desc": "+3% growth speed per level (max 10 levels)", + "cosmiccore.stellar.upgrade.hawking_radiator": "Hawking Radiator", + "cosmiccore.stellar.upgrade.hawking_radiator.desc": "BLACK_HOLE generates 2048 EU/t passively", + "cosmiccore.stellar.upgrade.heat_death": "Heat Death", + "cosmiccore.stellar.upgrade.heat_death.desc": "The end of all things. All Collapse bonuses tripled. Prestige is instant.", + "cosmiccore.stellar.upgrade.helios_forge": "Helios Forge", + "cosmiccore.stellar.upgrade.helios_forge.desc": "Unlock Helios-tier recipes requiring extreme stellar conditions", + "cosmiccore.stellar.upgrade.hyperdense_core": "Hyperdense Core", + "cosmiccore.stellar.upgrade.hyperdense_core.desc": "+50% parallel limit from all sources", + "cosmiccore.stellar.upgrade.infinite_recursion": "Infinite Recursion", + "cosmiccore.stellar.upgrade.infinite_recursion.desc": "Prestige gives 2x points. 25% chance to keep prestige item.", + "cosmiccore.stellar.upgrade.kerr_extraction": "Kerr Extraction", + "cosmiccore.stellar.upgrade.kerr_extraction.desc": "Spinning BLACK_HOLE grants +6 parallels and exotic byproducts", + "cosmiccore.stellar.upgrade.level": "Level %d / %d", + "cosmiccore.stellar.upgrade.locked": "Locked", + "cosmiccore.stellar.upgrade.magnetic_confinement": "Magnetic Confinement", + "cosmiccore.stellar.upgrade.magnetic_confinement.desc": "Star stage cannot drop during active processing", + "cosmiccore.stellar.upgrade.mass_conversion": "Mass Conversion", + "cosmiccore.stellar.upgrade.mass_conversion.desc": "Convert excess materials into prestige points (1000:1 ratio)", + "cosmiccore.stellar.upgrade.mass_efficiency": "Mass Efficiency", + "cosmiccore.stellar.upgrade.mass_efficiency.desc": "-15% additional energy cost", + "cosmiccore.stellar.upgrade.max_level": "MAX LEVEL", + "cosmiccore.stellar.upgrade.negative_mass": "Negative Mass", + "cosmiccore.stellar.upgrade.negative_mass.desc": "Recipes in BLACK_HOLE have inverted energy costs (gain EU)", + "cosmiccore.stellar.upgrade.neutron_cascade": "Neutron Cascade", + "cosmiccore.stellar.upgrade.neutron_cascade.desc": "Recipe completions have 15% chance to trigger twice", + "cosmiccore.stellar.upgrade.not_enough_points": "Not enough points", + "cosmiccore.stellar.upgrade.omega_compression": "Omega Compression", + "cosmiccore.stellar.upgrade.omega_compression.desc": "Ultimate processing. All Fusion bonuses tripled. Unlock Omega recipes.", + "cosmiccore.stellar.upgrade.owned": "OWNED", + "cosmiccore.stellar.upgrade.parallel_manifold": "Parallel Manifold", + "cosmiccore.stellar.upgrade.parallel_manifold.desc": "+2 base parallel limit", + "cosmiccore.stellar.upgrade.parallel_threading": "Parallel Threading", + "cosmiccore.stellar.upgrade.parallel_threading.desc": "+1 parallel per level (max 8 levels)", + "cosmiccore.stellar.upgrade.particle_storm": "Particle Storm", + "cosmiccore.stellar.upgrade.particle_storm.desc": "+4 base parallels, unlocks particle storm recipes", + "cosmiccore.stellar.upgrade.penrose_process": "Penrose Process", + "cosmiccore.stellar.upgrade.penrose_process.desc": "Throw matter into BLACK_HOLE to extract 130% of its energy value", + "cosmiccore.stellar.upgrade.perpetual_ignition": "Perpetual Ignition", + "cosmiccore.stellar.upgrade.perpetual_ignition.desc": "Stars are immune to decay. Fuel costs halved.", + "cosmiccore.stellar.upgrade.phoenix_protocol": "Phoenix Protocol", + "cosmiccore.stellar.upgrade.phoenix_protocol.desc": "When star would die, 25% chance to return to STAR stage instead", + "cosmiccore.stellar.upgrade.photon_sphere": "Photon Sphere", + "cosmiccore.stellar.upgrade.photon_sphere.desc": "Light-based recipes get +200% speed in BLACK_HOLE", + "cosmiccore.stellar.upgrade.planck_resonance": "Planck Resonance", + "cosmiccore.stellar.upgrade.planck_resonance.desc": "Minimum recipe time reduced to 1 tick", + "cosmiccore.stellar.upgrade.plasma_conduits": "Plasma Conduits", + "cosmiccore.stellar.upgrade.plasma_conduits.desc": "-10% fuel consumption per tick", + "cosmiccore.stellar.upgrade.plasma_hurricane": "Plasma Hurricane", + "cosmiccore.stellar.upgrade.plasma_hurricane.desc": "Star growth speed increased by 40%", + "cosmiccore.stellar.upgrade.point_amplifier": "Point Amplifier", + "cosmiccore.stellar.upgrade.point_amplifier.desc": "+30% prestige points (stacks with Shard Collector)", + "cosmiccore.stellar.upgrade.prereqs_needed": "Prerequisites needed", + "cosmiccore.stellar.upgrade.prestige_amplifier": "Prestige Amplifier", + "cosmiccore.stellar.upgrade.prestige_amplifier.desc": "+5% prestige points per level (max 10 levels)", + "cosmiccore.stellar.upgrade.prestige_momentum": "Prestige Momentum", + "cosmiccore.stellar.upgrade.prestige_momentum.desc": "Each consecutive prestige gives +10% points (max 50%)", + "cosmiccore.stellar.upgrade.primordial_flame": "Primordial Flame", + "cosmiccore.stellar.upgrade.primordial_flame.desc": "The first fire. All Ignition bonuses doubled. Stars cannot die.", + "cosmiccore.stellar.upgrade.proton_recycler": "Proton Recycler", + "cosmiccore.stellar.upgrade.proton_recycler.desc": "8% chance to not consume fuel on tick", + "cosmiccore.stellar.upgrade.quantum_tunneling": "Quantum Tunneling", + "cosmiccore.stellar.upgrade.quantum_tunneling.desc": "10% chance to complete recipe instantly", + "cosmiccore.stellar.upgrade.quark_gluon_plasma": "Quark-Gluon Plasma", + "cosmiccore.stellar.upgrade.quark_gluon_plasma.desc": "Unlock QGP recipes. +8 parallels for QGP recipes only", + "cosmiccore.stellar.upgrade.relativistic_processing": "Relativistic Processing", + "cosmiccore.stellar.upgrade.relativistic_processing.desc": "Recipes under 20 ticks complete instantly", + "cosmiccore.stellar.upgrade.resonant_sacrifice": "Resonant Sacrifice", + "cosmiccore.stellar.upgrade.resonant_sacrifice.desc": "Prestige at SUPERSTAR gives BLACK_HOLE rewards", + "cosmiccore.stellar.upgrade.sacrifice_amplifier": "Sacrifice Amplifier", + "cosmiccore.stellar.upgrade.sacrifice_amplifier.desc": "Prestige items give 4x points but are always consumed", + "cosmiccore.stellar.upgrade.schwarzschild_radius": "Schwarzschild Radius", + "cosmiccore.stellar.upgrade.schwarzschild_radius.desc": "Increase BLACK_HOLE event horizon - more items can process simultaneously", + "cosmiccore.stellar.upgrade.shard_collector": "Shard Collector", + "cosmiccore.stellar.upgrade.shard_collector.desc": "+20% prestige points earned", + "cosmiccore.stellar.upgrade.singularity_engine": "Singularity Engine", + "cosmiccore.stellar.upgrade.singularity_engine.desc": "Double all speed/parallel bonuses. Energy costs -40%.", + "cosmiccore.stellar.upgrade.singularity_siphon": "Singularity Siphon", + "cosmiccore.stellar.upgrade.singularity_siphon.desc": "BLACK_HOLE stage reduces recipe energy cost by 20%", + "cosmiccore.stellar.upgrade.solar_dominion": "Solar Dominion", + "cosmiccore.stellar.upgrade.solar_dominion.desc": "All star lifecycle bonuses increased by 50%", + "cosmiccore.stellar.upgrade.solar_genesis": "Solar Genesis", + "cosmiccore.stellar.upgrade.solar_genesis.desc": "Can spawn secondary micro-stars that provide bonus parallels", + "cosmiccore.stellar.upgrade.stellar_compression": "Stellar Compression", + "cosmiccore.stellar.upgrade.stellar_compression.desc": "+25% speed at SUPERSTAR or higher", + "cosmiccore.stellar.upgrade.stellar_debt": "Stellar Debt", + "cosmiccore.stellar.upgrade.stellar_debt.desc": "Borrow prestige points from future prestiges (150% payback)", + "cosmiccore.stellar.upgrade.stellar_efficiency": "Stellar Efficiency", + "cosmiccore.stellar.upgrade.stellar_efficiency.desc": "+2% speed per level (max 10 levels)", + "cosmiccore.stellar.upgrade.stellar_nursery": "Stellar Nursery", + "cosmiccore.stellar.upgrade.stellar_nursery.desc": "New stars begin at GROWING stage instead of EMPTY", + "cosmiccore.stellar.upgrade.stellar_regeneration": "Stellar Regeneration", + "cosmiccore.stellar.upgrade.stellar_regeneration.desc": "3% chance per tick for star to gain stage", + "cosmiccore.stellar.upgrade.subspace_harmonics": "Subspace Harmonics", + "cosmiccore.stellar.upgrade.subspace_harmonics.desc": "Energy costs scale inversely with recipe duration", + "cosmiccore.stellar.upgrade.superconducting_grid": "Superconducting Grid", + "cosmiccore.stellar.upgrade.superconducting_grid.desc": "-10% energy cost for all recipes", + "cosmiccore.stellar.upgrade.supernova_core": "Supernova Core", + "cosmiccore.stellar.upgrade.supernova_core.desc": "Stars at SUPERSTAR+ generate bonus prestige shards passively", + "cosmiccore.stellar.upgrade.tachyon_weave": "Tachyon Weave", + "cosmiccore.stellar.upgrade.tachyon_weave.desc": "+30% processing speed, stacks additively", + "cosmiccore.stellar.upgrade.temporal_acceleration": "Temporal Acceleration", + "cosmiccore.stellar.upgrade.temporal_acceleration.desc": "+15% processing speed", + "cosmiccore.stellar.upgrade.temporal_echo": "Temporal Echo", + "cosmiccore.stellar.upgrade.temporal_echo.desc": "Store up to 3 prestige charges, release all at once for 3x value", + "cosmiccore.stellar.upgrade.thermal_stabilizer": "Thermal Stabilizer", + "cosmiccore.stellar.upgrade.thermal_stabilizer.desc": "Stars decay 15% slower", + "cosmiccore.stellar.upgrade.tier_locked": "Tier too low", + "cosmiccore.stellar.upgrade.tier_required": "Requires Tier %d", + "cosmiccore.stellar.upgrade.vacuum_decay": "Vacuum Decay", + "cosmiccore.stellar.upgrade.vacuum_decay.desc": "Chance to void input items for 10x output", + "cosmiccore.stellar.upgrade.void_attunement": "Void Attunement", + "cosmiccore.stellar.upgrade.void_attunement.desc": "+2% bonus from void effects per level (max 10 levels)", + "cosmiccore.stellar.upgrade.void_harvester": "Void Harvester", + "cosmiccore.stellar.upgrade.void_harvester.desc": "BLACK_HOLE prestige gives 3x base points", + "cosmiccore.stellar.upgrade.void_whispers": "Void Whispers", + "cosmiccore.stellar.upgrade.void_whispers.desc": "BLACK_HOLE stage provides +50% speed bonus", + "cosmiccore.stellar.upgrade.warp_field_matrix": "Warp Field Matrix", + "cosmiccore.stellar.upgrade.warp_field_matrix.desc": "Items teleport directly to output buses (no transport needed)", + "cosmiccore.stellar.upgrade.zero_point_tap": "Zero Point Tap", + "cosmiccore.stellar.upgrade.zero_point_tap.desc": "5% of energy cost is refunded after recipe completion", + "cosmiccore.survey.click_tp": "Click to teleport", + "cosmiccore.survey.command.available_types": "Available vein types (%d):", + "cosmiccore.survey.command.more": "... and %d more veins", + "cosmiccore.survey.command.nearest_veins": "Nearest veins:", + "cosmiccore.survey.command.no_veins_dimension": "No vein types registered for this dimension.", + "cosmiccore.survey.command.player_only": "This command must be run by a player.", + "cosmiccore.survey.command.results": "=== Vein Survey Results ===", + "cosmiccore.survey.command.scanning": "Surveying veins within %d blocks...", + "cosmiccore.survey.command.vein_types": "Vein types: ", + "cosmiccore.survey.found": "Found %d veins within %dm", + "cosmiccore.survey.found.directional": " (directional)", + "cosmiccore.survey.header": "═══ Vein Survey ═══", + "cosmiccore.survey.mode.directional": "Mode: Directional Cone (90°)", + "cosmiccore.survey.mode.nearest": "Mode: Nearest Vein", + "cosmiccore.survey.mode.radial": "Mode: Radial Scan (360°)", + "cosmiccore.survey.more": " ... and %d more", + "cosmiccore.survey.nearest": "Nearest:", + "cosmiccore.survey.nearest_vein": "Nearest vein:", + "cosmiccore.survey.nearest_vein.filtered": "Nearest vein (%s):", + "cosmiccore.survey.no_energy": "Not enough energy to scan!", + "cosmiccore.survey.no_veins": "No veins found", + "cosmiccore.survey.no_veins.directional": "No veins found in that direction", + "cosmiccore.survey.no_veins.filtered": "No veins found matching '%s'", + "cosmiccore.survey.tooltip.filter": "Vein Filter: ", + "cosmiccore.survey.tooltip.mode": "Current Mode: ", + "cosmiccore.survey.tooltip.radius": "Scan Radius: %d blocks", + "cosmiccore.survey.tooltip.shift": "§7Shift+Use: Change mode", + "cosmiccore.survey.tooltip.use": "§7Use: Scan for veins", + "cosmiccore.survey.types": "Types: ", + "cosmiccore.tenura.1": "§6Ten - Control", + "cosmiccore.tenura.2": "§6Ura - Flow", + "cosmiccore.thermomagnitizer.desc": "Heating and Magnets, what could go wrong", + "cosmiccore.tylomir.1": "§6Tylo - Formation", + "cosmiccore.tylomir.2": "§6Mir - World", + "cosmiccore.universal.boosting_agents.0": "§aCan consume various boosters to increase EU/t multiplier", + "cosmiccore.universal.boosting_agents.1": "§6Oxygen §ffor §a3x §fEu/t @ §b20mb/s ", + "cosmiccore.universal.boosting_agents.2": "§6Liquid Oxygen §ffor §a6x §fEu/t @ §b80mb/s ", + "cosmiccore.universal.boosting_agents.3": "§6Ichor §ffor §a9x §fEu/t @ §b10mb/s ", + "cosmiccore.universal.tooltip.energy_usage": "§eConsumes 1 ZPM Amp while operating.", + "cosmiccore.universal.tooltip.lube_info.0": "§aProviding Better Lubricants increases the total EU created", + "cosmiccore.universal.tooltip.lube_info.1": "§eLubricant§f: §c1x §fEU total @ 1000mb/hr", + "cosmiccore.universal.tooltip.lube_info.2": "§eAdv Lubricant§f: §c1.5x §fEU total @ 500mb/hr", + "cosmiccore.universal.tooltip.lube_info.3": "§eTears of the Universe§f: §c2x §fEU total @ 250mb/hr", + "cosmiccore.vaccum_bubbler.desc": "Floatation Station Machination", + "cosmiccore.valdris.1": "§6Val - Overwhelm", + "cosmiccore.valdris.2": "§6Dris - Connect", + "cosmiccore.wire_coil.eu_multiplier": " §aMagnet EU Cost: §c%s EU/t", + "cosmiccore.wire_coil.magnet_capacity": " §fMax Field Strength: §f%s Tesla", + "cosmiccore.wire_coil.magnet_regen": " §5Field Regen Rate: %s Tesla/t", + "cosmiccore.wire_coil.magnet_stats": "§8Magnet Stats", + "cosmiccore.wireless_charger.enter_range": "You have entered charging range [Range - %s blocks]", + "cosmiccore.wireless_charger.left_range": "You have left charging range [Range - %s blocks]", + "cosmiccore.wireless_charger.mode.0": "Set charger mode: SUPERCHARGER [Range - %s blocks]", + "cosmiccore.wireless_charger.mode.1": "Set charger mode: STANDARD [Range - %s blocks]", + "cosmiccore.wireless_charger.range.mixed": "When in Standard Charge mode, supplies 1A within %s blocks", + "cosmiccore.wireless_charger.range.single": "When in Supercharger mode, supplies 4A within %s blocks", + "cosmiccore.zelothar.1": "§6Zelos - Zeal", + "cosmiccore.zelothar.2": "§6Thar - Forge", + "debug.owner.uuid": "§aOwner UUID:§a %s", + "debug.team.uuid": "§aTeam UUID:§a %s", + "emi.category.cosmiccore.asteroid_mining": "Asteroid Mining Operations", + "gtceu.hellfire_foundry": "§cHellfire Foundry", + "gtceu.industrial_chemvat": "§aIndustrial Chemvat", + "gtceu.machine.dec.tooltip.0": "Stores power in an interdimensional pocket.", + "gtceu.machine.dec.tooltip.1": "Can send/receive power to/from §bPower Substation Dimensional Interfaces", + "gtceu.machine.dec.tooltip.2": "Can only create §cONE§r Power Substation per team/player.", + "gtceu.machine.dec.tooltip.3": "§cDuplicates will not function.", + "gtceu.machine.dec.tooltip.4": "§7Can Insert and Extract from your wireless networked linked to your §aPower Substation§r", + "gtceu.machine.steam_fluid_hatch_notice": "This hatch is for Fluid ingredients! Not to power with steam!", + "gtceu.naquahine_reactor": "§bNaquahine Reactor", + "gtceu.titan_fusion": "Titan Fusion Reactor", + "gui.ae2.units.eu": "EU", + "gui.cosmiccore.ember_hatch.ember": "Ember Stored: %s", + "gui.cosmiccore.ember_hatch.label.export": "Ember Output Hatch", + "gui.cosmiccore.ember_hatch.label.import": "Ember Input Hatch", + "gui.cosmiccore.iapiary": "Industrial Apiary", + "gui.cosmiccore.iapiary.duration": "Duration: %d", + "gui.cosmiccore.iapiary.production_amp": "Production Amp: %d", + "gui.cosmiccore.iapiary.yield": "Yield: %d", + "gui.cosmiccore.soul.empty_network": "Network is empty.", + "gui.cosmiccore.soul.envious.name": "Envious", + "gui.cosmiccore.soul.gluttonous.name": "Gluttonous", + "gui.cosmiccore.soul.greedy.name": "Greedy", + "gui.cosmiccore.soul.lustful.name": "Lustful", + "gui.cosmiccore.soul.network_contents": "Network Contents:", + "gui.cosmiccore.soul.proud.name": "Proud", + "gui.cosmiccore.soul.raw.name": "Raw", + "gui.cosmiccore.soul.refined.name": "Refined", + "gui.cosmiccore.soul.reset": "Soul network has been reset.", + "gui.cosmiccore.soul.slothful.name": "Slothful", + "gui.cosmiccore.soul.temporal.name": "Temporal", + "gui.cosmiccore.soul.wrathful.name": "Wrathful", + "gui.cosmiccore.soul_hatch.label.export": "Soul Output Hatch", + "gui.cosmiccore.soul_hatch.label.import": "Soul Input Hatch", + "gui.cosmiccore.soul_hatch.lp": "LP Stored: %s", + "gui.cosmiccore.soul_hatch.owner": "Network Owner: %s", + "gui.cosmiccore.sterilization_hatch": "Sterilization Hatch", + "gui.cosmiccore.thermia_hatch.hatch_limit": "§cTemp. Limit:", + "gui.cosmiccore.thermia_hatch.label.export": "§6Thermia Output Vent", + "gui.cosmiccore.thermia_hatch.label.import": "§6Thermia Input Socket", + "gui.cosmiccore.thermia_hatch.stored_temp": "§6Current Temp:", + "item.cosmicbees.bee.modifier.aging_multiplier": "Age Multiplier", + "item.cosmiccore.aberrant_essence": "§6Aberrant Essence", + "item.cosmiccore.abrasive_rosin_millstones": "Abrasive Rosin Millstones", + "item.cosmiccore.advanced_gene_kit": "Advanced Gene Kit", + "item.cosmiccore.air_bladder": "Air Bladder", + "item.cosmiccore.akashic_processor": "Akashic Processor", + "item.cosmiccore.akashic_processor_assembly": "Akashic Processor Assembly", + "item.cosmiccore.akashic_processor_mainframe": "Akashic Processor Mainframe", + "item.cosmiccore.akashic_processor_supercomputer": "Akashic Processor Supercomputer", + "item.cosmiccore.alchemia_wafer": "Alchemica Wafer [Chemistry]", + "item.cosmiccore.ambrion": "Vexil - [Ambrion]", + "item.cosmiccore.aram_chip": "ARAM Chip", + "item.cosmiccore.aram_wafer": "ARAM Wafer", + "item.cosmiccore.armored_freight_beetle_grade_1": "Armored Freight Beetle Mk.1", + "item.cosmiccore.armored_freight_beetle_grade_2": "Armored Freight Beetle Mk.2", + "item.cosmiccore.armored_freight_beetle_grade_3": "Armored Freight Beetle Mk.3", + "item.cosmiccore.armored_freight_beetle_grade_4": "Armored Freight Beetle Mk.4", + "item.cosmiccore.armored_freight_beetle_grade_5": "Armored Freight Beetle Mk.5", + "item.cosmiccore.asteroid_targeting_chip": "Asteroid Targeting Chip", + "item.cosmiccore.auric_asteroid": "Auric Asteroid", + "item.cosmiccore.basic_gene_kit": "Basic Gene Kit", + "item.cosmiccore.bee_comb_abrasive": "Abrasive Comb", + "item.cosmiccore.bee_comb_absent": "Absent Comb", + "item.cosmiccore.bee_comb_ambrosic": "Ambrosic Comb", + "item.cosmiccore.bee_comb_architect": "Architect Comb", + "item.cosmiccore.bee_comb_ashen": "Ashen Comb", + "item.cosmiccore.bee_comb_biohazard": "Biohazard Comb", + "item.cosmiccore.bee_comb_citrus_polymer": "Citrus Polymer Comb", + "item.cosmiccore.bee_comb_cobbled": "Cobbled Comb", + "item.cosmiccore.bee_comb_constructive": "Constructive Comb", + "item.cosmiccore.bee_comb_cosmos": "Cosmos Comb", + "item.cosmiccore.bee_comb_energized": "Energized Comb", + "item.cosmiccore.bee_comb_exhaustive": "Exhaustive Comb", + "item.cosmiccore.bee_comb_fate": "Fate Comb", + "item.cosmiccore.bee_comb_fracking": "Fracking Comb", + "item.cosmiccore.bee_comb_grand_garden": "Grand Garden Comb", + "item.cosmiccore.bee_comb_hadal": "Hadal Comb", + "item.cosmiccore.bee_comb_hellsmith": "Hellsmith Comb", + "item.cosmiccore.bee_comb_hydraulic": "Hydraulic Comb", + "item.cosmiccore.bee_comb_illusive": "Illusive Comb", + "item.cosmiccore.bee_comb_inquisitive": "Inquisitive Comb", + "item.cosmiccore.bee_comb_lofty_argon": "Lofty Argon Comb", + "item.cosmiccore.bee_comb_lofty_hydrogen": "Lofty Hydrogen Comb", + "item.cosmiccore.bee_comb_lofty_nitrogen": "Lofty Nitrogen Comb", + "item.cosmiccore.bee_comb_lofty_oxygen": "Lofty Oxygen Comb", + "item.cosmiccore.bee_comb_lunar": "Lunar Comb", + "item.cosmiccore.bee_comb_pale": "Pale Comb", + "item.cosmiccore.bee_comb_prismatic": "Prismatic Comb", + "item.cosmiccore.bee_comb_pyrolytic": "Pyrolytic Comb", + "item.cosmiccore.bee_comb_radoxia": "Radoxia Comb", + "item.cosmiccore.bee_comb_rose_polymer": "Rose Polymer Comb", + "item.cosmiccore.bee_comb_runic": "Runic Comb", + "item.cosmiccore.bee_comb_shaman": "Shaman Comb", + "item.cosmiccore.bee_comb_slick": "Slick Comb", + "item.cosmiccore.bee_comb_solar": "Solar Comb", + "item.cosmiccore.bee_comb_soul": "Soul Comb", + "item.cosmiccore.bee_comb_virtue": "Virtue Comb", + "item.cosmiccore.bee_comb_waxy_polymer": "Waxy Polymer Comb", + "item.cosmiccore.bifidobacterium_breve": "Bifidobacterium Breve", + "item.cosmiccore.bifidobacterium_breve_culture": "Bifidobacterium Breve Culture", + "item.cosmiccore.bitumen_wax": "Bitumen Wax", + "item.cosmiccore.blackstone_pustule": "Blackstone Pustule", + "item.cosmiccore.blazing_mote": "Blazing Mote", + "item.cosmiccore.bright_mote": "Bright Mote", + "item.cosmiccore.brimstone_asteroid": "Brimstone Asteroid", + "item.cosmiccore.bronze_supply_tank": "Bronze Supply Tank", + "item.cosmiccore.capacity_chip": "Capacity Chip", + "item.cosmiccore.carbon_asteroid_base": "Carbonic Asteroid", + "item.cosmiccore.chronia": "Vexil - [Chronia]", + "item.cosmiccore.clear_mote": "Clear Mote", + "item.cosmiccore.cluster_of_perpetuity": "Cluster of Perpetuity", + "item.cosmiccore.computation_support_unit": "Computation Support Unit", + "item.cosmiccore.contaminated_petri_dish": "Contaminated Petri Dish", + "item.cosmiccore.crucible_mantis_grade_1": "Crucible Mantis Mk.1", + "item.cosmiccore.crusher_wasps_grade_1": "Crusher Wasps Mk.1", + "item.cosmiccore.crusher_wasps_grade_2": "Crusher Wasps Mk.2", + "item.cosmiccore.crusher_wasps_grade_3": "Crusher Wasps Mk.3", + "item.cosmiccore.crusher_wasps_grade_4": "Crusher Wasps Mk.4", + "item.cosmiccore.crusher_wasps_grade_5": "Crusher Wasps Mk.5", + "item.cosmiccore.crystal_chiplet_base": "Crystal Chiplet Base", + "item.cosmiccore.crystal_chiplet_mask": "Crystal Chiplet Mask", + "item.cosmiccore.crystala": "Vexil - [Crystala]", + "item.cosmiccore.crystalline_capacitor": "Crystalline Capacitor", + "item.cosmiccore.crystalline_diode": "Crystalline Diode", + "item.cosmiccore.crystalline_inductor": "Crystalline Inductor", + "item.cosmiccore.crystalline_resistor": "Crystalline Resistor", + "item.cosmiccore.crystalline_transistor": "Crystalline Transistor", + "item.cosmiccore.debug.structure_writer.export_order": "Pattern Export Order:\n §cC:%s§l§d/§aS:%s§l§d/§bA:%s", + "item.cosmiccore.debug.structure_writer.export_to_log": "Print Aisles to Log", + "item.cosmiccore.debug.structure_writer.output_successful": "Output Successful! Check your log file!", + "item.cosmiccore.debug.structure_writer.rotate_along_x_axis": "Rotate X Axis", + "item.cosmiccore.debug.structure_writer.rotate_along_y_axis": "Rotate Y Axis", + "item.cosmiccore.debug.structure_writer.structural_scale": "Structure size: X:%s Y:%s Z:%s", + "item.cosmiccore.debug_structure_writer": "Debug Structure Writer", + "item.cosmiccore.decaying_cosmic_upgrade": "Decaying Upgrade", + "item.cosmiccore.decaying_cosmic_upgrade.tooltip": "§cInstantly Kills Bees and overloads the lifetime cycle", + "item.cosmiccore.dilumixal_naquadah_doped_silicon_boule": "DiLumixal Naquadah-doped Silicon Boule", + "item.cosmiccore.dilumixal_naquadah_doped_silicon_wafer": "DiLumixal Naquadah-doped Silicon Wafer", + "item.cosmiccore.dim_mote": "Dim Mote", + "item.cosmiccore.donk": "Donk", + "item.cosmiccore.drone_frame_1": "Drone Frame Mk.1", + "item.cosmiccore.drone_frame_2": "Drone Frame Mk.2", + "item.cosmiccore.drone_frame_3": "Drone Frame Mk.3", + "item.cosmiccore.drone_frame_4": "Drone Frame Mk.4", + "item.cosmiccore.drone_frame_5": "Drone Frame Mk.5", + "item.cosmiccore.dulia_lily": "Dulia Lily", + "item.cosmiccore.dynamia": "Luminon - [Dynamia]", + "item.cosmiccore.echon": "Luminon - [Echon]", + "item.cosmiccore.efficacy_chip": "Efficacy Chip", + "item.cosmiccore.empty_fuel_rod": "Empty Fuel Rod", + "item.cosmiccore.energized_silk": "Energized Silk", + "item.cosmiccore.engraved_crystal_chiplet": "Engraved Crystal Chiplet", + "item.cosmiccore.enthelic_processor": "Enthelic Processor", + "item.cosmiccore.enthelic_processor_assembly": "Enthelic Processor Assembly", + "item.cosmiccore.enthelic_processor_mainframe": "Enthelic Processor Mainframe", + "item.cosmiccore.enthelic_processor_supercomputer": "Enthelic Processor Supercomputer", + "item.cosmiccore.eschaton_processor": "Eschaton Processor", + "item.cosmiccore.eschaton_processor_assembly": "Eschaton Processor Assembly", + "item.cosmiccore.eschaton_processor_mainframe": "Eschaton Processor Mainframe", + "item.cosmiccore.eschaton_processor_supercomputer": "Eschaton Processor Supercomputer", + "item.cosmiccore.escherichia_coli": "Escherichia Coli", + "item.cosmiccore.escherichia_coli_culture": "Escherichia Coli Culture", + "item.cosmiccore.esson": "Luminon - [Esson]", + "item.cosmiccore.eterna_wafer": "Eterna Wafer [Aionology]", + "item.cosmiccore.ether_wisp": "Ether Wisp", + "item.cosmiccore.ethera": "Vexil - [Ethera]", + "item.cosmiccore.ev_radio_module": "EV Radio Module", + "item.cosmiccore.ev_wildfire_core": "EV Wildfire Core", + "item.cosmiccore.faint_mote": "Faint Mote", + "item.cosmiccore.fermium_rad_charges": "Fermium Radiation Charge", + "item.cosmiccore.ferric_asteroid": "Ferric Asteroid", + "item.cosmiccore.fiber_mesh_ingot_frame": "Fiber Mesh Ingot Frame", + "item.cosmiccore.fireclay_ball": "Fireclay Ball", + "item.cosmiccore.flawed_resonant_wafer": "Flawed Harmonic Wafer", + "item.cosmiccore.flesh_packed_neptunium_fuel": "Flesh Packed Neptunium Fuel", + "item.cosmiccore.flesh_packed_plutonium_fuel": "Flesh Packed Plutonium Fuel", + "item.cosmiccore.flesh_packed_uranium_fuel": "Flesh Packed Uranium Fuel", + "item.cosmiccore.fleshy_neptunium_waste": "Bio-Metallic Fleshy Neptunium Waste", + "item.cosmiccore.fleshy_plutonium_waste": "Bio-Metallic Fleshy Plutonium Waste", + "item.cosmiccore.fleshy_uranium_waste": "Bio-Metallic Fleshy Uranium Waste", + "item.cosmiccore.freight_beetle_grade_1": "Freight Beetle Mk.1", + "item.cosmiccore.freight_beetle_grade_2": "Freight Beetle Mk.2", + "item.cosmiccore.freight_beetle_grade_3": "Freight Beetle Mk.3", + "item.cosmiccore.freight_beetle_grade_4": "Freight Beetle Mk.4", + "item.cosmiccore.freight_beetle_grade_5": "Freight Beetle Mk.5", + "item.cosmiccore.fused_wafer_of_esoterica": "Fused Harmonic Wafer of Esoterica", + "item.cosmiccore.fused_wafer_of_logos": "Fused Harmonic Wafer of Logos", + "item.cosmiccore.gelatin_scaffold": "Gelatin Scaffold", + "item.cosmiccore.hardened_resin": "Hardened Resin", + "item.cosmiccore.harmonic_chiplet_oscillating": "Harmonic Central Processing Unit", + "item.cosmiccore.harmonic_processor": "Harmonic Processor", + "item.cosmiccore.harmonic_processor_assembly": "Harmonic Processor Assembly", + "item.cosmiccore.harmonic_processor_mainframe": "Harmonic Processor Mainframe", + "item.cosmiccore.harmonic_processor_supercomputer": "Harmonic Processor Supercomputer", + "item.cosmiccore.harmonically_tuned_circuit_board": "Harmonically Tuned Circuit Board", + "item.cosmiccore.harmonically_tuned_printed_circuit_board": "Harmonically Tuned Printed Circuit Board", + "item.cosmiccore.heme_ring": "Heme Ring", + "item.cosmiccore.hex_processor": "Hex Processor", + "item.cosmiccore.hex_processor_assembly": "Hex Processor Assembly", + "item.cosmiccore.hex_processor_mainframe": "Hex Processor Mainframe", + "item.cosmiccore.hex_processor_supercomputer": "Hex Processor Supercomputer", + "item.cosmiccore.hv_radio_module": "HV Radio Module", + "item.cosmiccore.hv_wildfire_core": "HV Wildfire Core", + "item.cosmiccore.hydraulic_boots": "Hydraulic Globetrotters Boots", + "item.cosmiccore.incandescent_mote": "Incandescent Mote", + "item.cosmiccore.industrial_drone": "Industrial Drone", + "item.cosmiccore.inert_fungal_spores": "Inert Fungal Spores", + "item.cosmiccore.infinite_spray_can": "§lPrismatic Spray Can", + "item.cosmiccore.intermediate_gene_kit": "Intermediate Gene Kit", + "item.cosmiccore.iv_radio_module": "IV Radio Module", + "item.cosmiccore.iv_wildfire_core": "IV Wildfire Core", + "item.cosmiccore.large_shard_of_perpetuity": "Large Shard of Perpetuity", + "item.cosmiccore.latent_capacity_wafer": "Latent Capacity Wafer", + "item.cosmiccore.latent_efficacy_wafer": "Latent Efficacy Wafer", + "item.cosmiccore.latent_potency_wafer": "Latent Potency Wafer", + "item.cosmiccore.latent_verbosity_wafer": "Latent Verbosity Wafer", + "item.cosmiccore.linked_terminal": "Linked Terminal", + "item.cosmiccore.lith_asteroid": "Lith Asteroid", + "item.cosmiccore.livingrock_aluminate_boule": "Livingrock Aluminate Boule", + "item.cosmiccore.livirock_aluminite_wafer": "Livingrock Aluminate Wafer", + "item.cosmiccore.lucid_cpu_wafer": "Lucid CPU Wafer", + "item.cosmiccore.lucidic_processor": "Lucidic Processor", + "item.cosmiccore.lucidic_processor_assembly": "Lucidic Processor Assembly", + "item.cosmiccore.lucidic_processor_mainframe": "Lucidic Processor Mainframe", + "item.cosmiccore.lucidic_processor_supercomputer": "Lucidic Processor Supercomputer", + "item.cosmiccore.lucidity_cpu_mask": "Lucidity CPU Mask", + "item.cosmiccore.luv_radio_module": "LuV Radio Module", + "item.cosmiccore.luv_wildfire_core": "LuV Wildfire Core", + "item.cosmiccore.lv_wildfire_core": "LV Wildfire Core", + "item.cosmiccore.mafic_asteroid": "Mafic Asteroid", + "item.cosmiccore.masked_crystal_chiplet_package": "Masked Crystal Chiplet Package", + "item.cosmiccore.mossy_asteroid": "Mossy Asteroid", + "item.cosmiccore.multilayered_enthel_circuit_board": "Multilayered Enthel Circuit Board", + "item.cosmiccore.mv_wildfire_core": "MV Wildfire Core", + "item.cosmiccore.mystrix": "Luminon - [Mystrix]", + "item.cosmiccore.nano_boots": "NanoMuscle™ Globetrotters Boots", + "item.cosmiccore.neuro_processing_assembly": "Neuroprocessing Assembly Board", + "item.cosmiccore.null_refined_resonant_wafer": "Nullified Harmonic Wafer", + "item.cosmiccore.nullified_harmonics_wafer": "Nullified Harmonic Wafer", + "item.cosmiccore.nyxon": "Luminon - [Nyxon]", + "item.cosmiccore.occult_asteroid": "Occult Asteroid", + "item.cosmiccore.omnia_circuit_ev": "EV Omnia Circuit", + "item.cosmiccore.omnia_circuit_hv": "HV Omnia Circuit", + "item.cosmiccore.omnia_circuit_iv": "IV Omnia Circuit", + "item.cosmiccore.omnia_circuit_luv": "LuV Omnia Circuit", + "item.cosmiccore.omnia_circuit_lv": "LV Omnia Circuit", + "item.cosmiccore.omnia_circuit_mv": "MV Omnia Circuit", + "item.cosmiccore.omnia_circuit_opv": "OPV Omnia Circuit", + "item.cosmiccore.omnia_circuit_uev": "UEV Omnia Circuit", + "item.cosmiccore.omnia_circuit_uhv": "UHV Omnia Circuit", + "item.cosmiccore.omnia_circuit_uiv": "UIV Omnia Circuit", + "item.cosmiccore.omnia_circuit_uv": "UV Omnia Circuit", + "item.cosmiccore.omnia_circuit_uxv": "UXV Omnia Circuit", + "item.cosmiccore.omnia_circuit_zpm": "ZPM Omnia Circuit", + "item.cosmiccore.oneiric_signet_t1": "Oneiric Signet Mk.I", + "item.cosmiccore.oneiric_signet_t2": "Oneiric Signet Mk.II", + "item.cosmiccore.oneiric_signet_t3": "Oneiric Signet Mk.III", + "item.cosmiccore.oneiric_signet_t4": "Oneiric Signet Mk.IV", + "item.cosmiccore.oneiric_signet_t5": "Oneiric Signet Mk.V", + "item.cosmiccore.optical_processing_assembly": "Optical Processor Assembly", + "item.cosmiccore.optical_processor": "Optical Processor", + "item.cosmiccore.optical_processor_assembly": "Optical Processor Assembly", + "item.cosmiccore.optical_processor_mainframe": "Optical Processor Mainframe", + "item.cosmiccore.optical_processor_supercomputer": "Optical Processor Supercomputer", + "item.cosmiccore.optically_refined_circuit_board": "Optically Refined Circuit Board", + "item.cosmiccore.optically_refined_printed_circuit_board": "Optically Refined Printed Circuit Board", + "item.cosmiccore.opv_gyroscope": "OPv Gyroscope", + "item.cosmiccore.opv_powercell": "OPv Power Cell", + "item.cosmiccore.opv_radio_module": "OPV Radio Module", + "item.cosmiccore.opv_thruster": "OPv Thruster", + "item.cosmiccore.overloaded_pearls": "Overloaded Pearls", + "item.cosmiccore.oxide_asteroid": "Oxide Asteroid", + "item.cosmiccore.pale_mote": "Pale Mote", + "item.cosmiccore.pale_saw": "Pale Saw", + "item.cosmiccore.pale_scrap": "Pale Scrap", + "item.cosmiccore.para_mod_1": "Parallelization Module Mk.1", + "item.cosmiccore.para_mod_2": "Parallelization Module Mk.2", + "item.cosmiccore.para_mod_3": "Parallelization Module Mk.3", + "item.cosmiccore.para_mod_4": "Parallelization Module Mk.4", + "item.cosmiccore.persona_core_assisted_circuit_board": "Persona Core Assisted Circuit Board", + "item.cosmiccore.persona_core_assisted_printed_circuit_board": "Persona Core Assisted Printed Circuit Board", + "item.cosmiccore.phantnon": "Luminon - [Phantnon]", + "item.cosmiccore.plasmatic_drone": "plasmatic_drone", + "item.cosmiccore.plastic_circuit_board": "Mana-doped Plastic Circuit Board", + "item.cosmiccore.portable_gravity_core": "§6Portable Gravity Core", + "item.cosmiccore.portable_gravity_core.tooltip": "§aNormalizes Gravity to Match Earth.", + "item.cosmiccore.potency_chip": "Potency Chip", + "item.cosmiccore.prepared_lucid_wafer": "Prepared Lucid Wafer", + "item.cosmiccore.prepared_petri_dish": "Prepared Petri Dish", + "item.cosmiccore.pressurized_rebreather": "Pressurized Rebreather", + "item.cosmiccore.pressurized_rebreather.tooltip": "§6Enables oxygen tank usage. Works in §cNo Air§6 environments.", + "item.cosmiccore.prod_mod_1": "Productivity Module Mk.1", + "item.cosmiccore.prod_mod_2": "Productivity Module Mk.2", + "item.cosmiccore.prod_mod_3": "Productivity Module Mk.3", + "item.cosmiccore.prod_mod_4": "Productivity Module Mk.4", + "item.cosmiccore.programmable_mote": "§5Programmable Mote", + "item.cosmiccore.protocyte_mod": "Protocyte Module", + "item.cosmiccore.pulverizing_beetle_grade_1": "Pulverizing Beetle Mk.1", + "item.cosmiccore.pulverizing_beetle_grade_2": "Pulverizing Beetle Mk.2", + "item.cosmiccore.pulverizing_beetle_grade_3": "Pulverizing Beetle Mk.3", + "item.cosmiccore.pulverizing_beetle_grade_4": "Pulverizing Beetle Mk.4", + "item.cosmiccore.pulverizing_beetle_grade_5": "Pulverizing Beetle Mk.5", + "item.cosmiccore.pyretic_ichor": "Pyretic Ichor", + "item.cosmiccore.pyrith": "Vexil - [Pyrith]", + "item.cosmiccore.quark_boots": "QuarkTech™ Globetrotters Boots", + "item.cosmiccore.radiant_mote": "Radiant Mote", + "item.cosmiccore.rare_metals_asteroid": "Exotic Metals Asteroid", + "item.cosmiccore.raymarching_dandilifeon": "Dulia Lily", + "item.cosmiccore.razor_hornet_grade_1": "Razor Hornet Mk.1", + "item.cosmiccore.razor_hornet_grade_2": "Crucible Mantis Mk.2", + "item.cosmiccore.razor_hornet_grade_3": "Crucible Mantis Mk.3", + "item.cosmiccore.razor_hornet_grade_4": "Crucible Mantis Mk.4", + "item.cosmiccore.razor_hornet_grade_5": "Crucible Mantis Mk.5", + "item.cosmiccore.record_keeping_processor_assembly": "Record Keeping Processor Assembly", + "item.cosmiccore.record_kept_circuit_board": "Record Kept Circuit Board", + "item.cosmiccore.record_kept_printed_circuit_board": "Record Kept Printed Circuit Board", + "item.cosmiccore.refined_harmonics_wafer": "Refined Harmonic Wafer", + "item.cosmiccore.refined_resonant_wafer": "Refined Harmonic Wafer", + "item.cosmiccore.reflection_mirror": "Mirror of Erosion", + "item.cosmiccore.resipiratory_sculk_hemocytoblast": "Respiratory Sculk Hemocytoblast", + "item.cosmiccore.resonant_mod": "Fusion Module Mk.1", + "item.cosmiccore.robust_drone": "Robust Drone", + "item.cosmiccore.rune_conjunction_arklythar": "Rune Conjunction [Arklythar]", + "item.cosmiccore.rune_conjunction_kholys": "Rune Conjunction [Kholys]", + "item.cosmiccore.rune_conjunction_valkruth": "Rune Conjunction [Valkruth]", + "item.cosmiccore.rune_slate_arklys": "Rune Slate [Arklys]", + "item.cosmiccore.rune_slate_khoruth": "Rune Slate [Khoruth]", + "item.cosmiccore.rune_slate_tenura": "Rune Slate [Tenura]", + "item.cosmiccore.rune_slate_tylomir": "Rune Slate [Tylomir]", + "item.cosmiccore.rune_slate_valdris": "Rune Slate [Valdris]", + "item.cosmiccore.rune_slate_zelothar": "Rune Slate [Zelothar]", + "item.cosmiccore.runewoven_plastic_circuit_board": "Runewoven Plastic Circuit Board", + "item.cosmiccore.runic_hex_cpu": "Hex Etched CPU Chip", + "item.cosmiccore.runic_hex_cpu_wafer": "Hex Etched CPU Wafer", + "item.cosmiccore.rusty_drone": "Rusty Drone", + "item.cosmiccore.sanguine_asteroid": "Sanguine Asteroid", + "item.cosmiccore.sanguine_boots": "Sanguine Globetrotters Boots", + "item.cosmiccore.sanguine_drone": "Sanguine Drone", + "item.cosmiccore.sanguine_warptech_boots": "Sanguine WarpTech Boots", + "item.cosmiccore.sanguine_warptech_chestplate": "Sanguine WarpTech Gravplate", + "item.cosmiccore.sanguine_warptech_helmet": "Sanguine WarpTech Helmet", + "item.cosmiccore.sanguine_warptech_leggings": "Sanguine WarpTech Leggings", + "item.cosmiccore.saturated_sculk_hemocytoblast": "Saturated Sculk Hemocytoblast", + "item.cosmiccore.sculk_fibroblast": "Sculk Fibroblast", + "item.cosmiccore.sculk_myofibroblast": "Sculk Myofibroblast", + "item.cosmiccore.self_aware_processing_assembly": "Self Aware Processor Assembly", + "item.cosmiccore.seraphon": "Luminon - [Seraphon]", + "item.cosmiccore.shard_of_perpetuity": "Shard of Perpetuity", + "item.cosmiccore.simple_rebreather": "Simple Rebreather", + "item.cosmiccore.simple_rebreather.tooltip": "§7Reduces oxygen drain in §bThin Air§7 environments.", + "item.cosmiccore.somatic_processing_assembly": "Somatoprocessing Assembly Board", + "item.cosmiccore.somnolent_dew": "Somnolent Dew", + "item.cosmiccore.soul_cut_lucid_cpu_chip": "Soul Cut Lucid CPU Chip", + "item.cosmiccore.soul_mutilator": "Soul Mutilator", + "item.cosmiccore.soul_mutilator.tooltip": "A twisted instrument that can reshape your very soul.", + "item.cosmiccore.soul_mutilator.tooltip.warning": "This choice is permanent. Choose wisely.", + "item.cosmiccore.soul_reader": "Soul Network Reader", + "item.cosmiccore.space_radio": "Space Radio", + "item.cosmiccore.space_radio.tooltip": "§6Lets you hear sounds in space!", + "item.cosmiccore.spectil": "Luminon - [Spectil]", + "item.cosmiccore.spent_flesh_packed_neptunium_fuel": "Spent Flesh Packed Neptunium Fuel", + "item.cosmiccore.spent_flesh_packed_plutonium_fuel": "Spent Flesh Packed Plutonium Fuel", + "item.cosmiccore.spent_flesh_packed_uranium_fuel": "Spent Flesh Packed Uranium Fuel", + "item.cosmiccore.spirit_engraved_enthel_circuit_board": "Spirit Engraved Enthel Circuit Board", + "item.cosmiccore.spirit_runed_enthel_cpu": "Spirit Runed Enthel CPU", + "item.cosmiccore.spirit_runed_enthel_cpu_wafer": "Spirit Runed Enthel CPU Wafer", + "item.cosmiccore.stasis_brine": "Stasis Brine", + "item.cosmiccore.steel_supply_tank": "Steel Supply Tank", + "item.cosmiccore.streptococcus_pyogenes": "Streptococcus Pyogenes", + "item.cosmiccore.streptococcus_pyogenes_culture": "Streptococcus Pyogenes Culture", + "item.cosmiccore.suelescent_processor": "Suelescent Processor", + "item.cosmiccore.suelescent_processor_assembly": "Suelescent Processor Assembly", + "item.cosmiccore.suelescent_processor_mainframe": "Suelescent Processor Mainframe", + "item.cosmiccore.suelescent_processor_supercomputer": "Suelescent Processor Supercomputer", + "item.cosmiccore.superheated_fuel_rod": "Superheated Fuel Rod", + "item.cosmiccore.tau_fruit": "Tau Fruit", + "item.cosmiccore.tau_oil": "Tau Oil", + "item.cosmiccore.temporal_reinforced_lucid_circuit_board": "Temporal Reinforced Lucid Circuit Board", + "item.cosmiccore.temporal_reinforced_lucid_printed_circuit_board": "Temporal Reinforced Lucid Printed Circuit Board", + "item.cosmiccore.temporal_stable_thundering_wafer": "Temporal Stable Thundering Wafer", + "item.cosmiccore.tenaebrum": "Vexil - [Tenaebrum]", + "item.cosmiccore.tessaron": "Vexil - [Tessaron]", + "item.cosmiccore.tethering_resin": "Tethering Resin", + "item.cosmiccore.thaumica_wafer": "Thaumica Wafer [Arcana]", + "item.cosmiccore.the_one_ring": "The One Ring", + "item.cosmiccore.the_one_ring.tooltip.0": "§6§oOne Ring to rule them all, One Ring to find them, One Ring to bring them all and in the darkness bind them.§r", + "item.cosmiccore.the_one_ring.tooltip.1": "You might find it hard to take off.", + "item.cosmiccore.thermal_chain_agent": "Thermal Chain Agent", + "item.cosmiccore.transcendent_mote": "Transcendent Mote", + "item.cosmiccore.trinavine_nanolattice_spool": "Trinavine Nanolattice Spool", + "item.cosmiccore.tungstensteel_nanolattice_spool": "Tungstensteel Nanolattice Spool", + "item.cosmiccore.uev_gyroscope": "UEV Gyroscope", + "item.cosmiccore.uev_powercell": "UEV Power Cell", + "item.cosmiccore.uev_radio_module": "UEV Radio Module", + "item.cosmiccore.uev_thruster": "UEV Thruster", + "item.cosmiccore.uhv_gyroscope": "UHV Gyroscope", + "item.cosmiccore.uhv_powercell": "UHV Power Cell", + "item.cosmiccore.uhv_radio_module": "UHV Radio Module", + "item.cosmiccore.uhv_thruster": "UHV Thruster", + "item.cosmiccore.uiv_gyroscope": "UIV Gyroscope", + "item.cosmiccore.uiv_powercell": "UIV Power Cell", + "item.cosmiccore.uiv_radio_module": "UIV Radio Module", + "item.cosmiccore.uiv_thruster": "UIV Thruster", + "item.cosmiccore.ultrasonic_homogenizer": "Ultrasonic Homogenizer", + "item.cosmiccore.unsealed_crystal_cpu": "Unsealed Crystal CPU", + "item.cosmiccore.uv_gyroscope": "UV Gyroscope", + "item.cosmiccore.uv_powercell": "UV Power Cell", + "item.cosmiccore.uv_radio_module": "UV Radio Module", + "item.cosmiccore.uv_thruster": " Thruster", + "item.cosmiccore.uxv_gyroscope": "UXV Gyroscope", + "item.cosmiccore.uxv_powercell": "UXV Power Cell", + "item.cosmiccore.uxv_radio_module": "UXV Radio Module", + "item.cosmiccore.uxv_thruster": "UXV Thruster", + "item.cosmiccore.vein_survey_scanner_hv": "Precision Vein Survey Scanner (HV)", + "item.cosmiccore.vein_survey_scanner_lv": "Vein Survey Scanner (LV)", + "item.cosmiccore.vein_survey_scanner_mv": "Advanced Vein Survey Scanner (MV)", + "item.cosmiccore.verbosity_chip": "Verbosity Chip", + "item.cosmiccore.verdant_anima": "Verdant Anima", + "item.cosmiccore.vexiun": "Vexil - [Vexiun]", + "item.cosmiccore.vivid_mote": "Vivid Mote", + "item.cosmiccore.wafer_pragmiso": "Pragmiso Wafer [Physics]", + "item.cosmiccore.wailing_cosmic_upgrade": "Wailing Upgrade", + "item.cosmiccore.wailing_cosmic_upgrade.tooltip": "§cMaximum Mutation", + "item.cosmiccore.wasteland_asteroid": "Wasteland Asteroid", + "item.cosmiccore.waxed_leather": "Waxed Leather", + "item.cosmiccore.wicked_essence": "Wicked Essence", + "item.cosmiccore.wired_petri_dish": "Wired Petri Dish", + "item.cosmiccore.wireless_pda": "Wireless Data PDA", + "item.cosmiccore.wrapped_blazing_mote": "Wrapped Blazing Mote", + "item.cosmiccore.wrapped_bright_mote": "Wrapped Bright Mote", + "item.cosmiccore.wrapped_clear_mote": "Wrapped Clear Mote", + "item.cosmiccore.wrapped_dim_mote": "Wrapped Dim Mote", + "item.cosmiccore.wrapped_faint_mote": "Wrapped Faint Mote", + "item.cosmiccore.wrapped_incandescent_mote": "Wrapped Incandescent Mote", + "item.cosmiccore.wrapped_pale_mote": "Wrapped Pale Mote", + "item.cosmiccore.wrapped_radiant_mote": "Wrapped Radiant Mote", + "item.cosmiccore.wrapped_transcendent_mote": "Wrapped Transcendent Mote", + "item.cosmiccore.wrapped_vivid_mote": "Wrapped Vivid Mote", + "item.cosmiccore.zpm_radio_module": "ZPM Radio Module", + "item.cosmiccore.zpm_wildfire_core": "ZPM Wildfire Core", + "item.gtceu.tool.luv_meld_tool": "%s Meld Multitool", + "itemGroup.cosmiccore.creative_tab": "Cosmic Core", + "key.categories.cosmiccore.boots": "Cosmic Boots", + "key.categories.cosmiccore.emi": "CosmicCore - EMI", + "key.categories.cosmiccore.movement": "Quake Movement", + "key.cosmiccore.boots.jump_decrease": "Boots: Decrease Jump", + "key.cosmiccore.boots.jump_increase": "Boots: Increase Jump", + "key.cosmiccore.boots.speed_decrease": "Boots: Decrease Speed", + "key.cosmiccore.boots.speed_increase": "Boots: Increase Speed", + "key.cosmiccore.boots.toggle_inertia": "Boots: Toggle Inertia Dampening", + "key.cosmiccore.boots.toggle_step": "Boots: Toggle Step Assist", + "key.cosmiccore.emi.create_bookmark_group": "Create Bookmark Group", + "key.cosmiccore.emi.next_bookmark_group": "Next Bookmark Group", + "key.cosmiccore.emi.prev_bookmark_group": "Previous Bookmark Group", + "key.cosmiccore.movement.dash": "Dash", + "material.cosmiccore.advanced_overclock_nutrient": "Advanced Overclock Nutrient", + "material.cosmiccore.advanced_production_nutrient": "Advanced Production Nutrient", + "material.cosmiccore.basic_overclock_nutrient": "Basic Overclock Nutrient", + "material.cosmiccore.basic_production_nutrient": "Basic Production Nutrient", + "material.cosmiccore.blinkward_alloy": "Blinkward Alloy", + "material.cosmiccore.causal_fabric": "Causal Fabric", + "material.cosmiccore.chlorophyte": "Chlorophyte", + "material.cosmiccore.chronon": "Chronon", + "material.cosmiccore.cosmocite": "Cosmocite", + "material.cosmiccore.diluted_prisma": "Diluted Prisma", + "material.cosmiccore.draconic_tarragon": "Draconic Tarragon", + "material.cosmiccore.enderium": "Enderium", + "material.cosmiccore.energetic_alloy": "Energetic Alloy", + "material.cosmiccore.enraged_stygian_plague": "Enraged Stygian Plague", + "material.cosmiccore.halizine": "Halizine", + "material.cosmiccore.ichor": "Ichor", + "material.cosmiccore.ichorium": "Ichorium", + "material.cosmiccore.infinity": "Infinity", + "material.cosmiccore.kuvite": "Kuvite", + "material.cosmiccore.living_igniclad": "Living Igniclad", + "material.cosmiccore.lumium": "Lumium", + "material.cosmiccore.melodic_alloy": "Melodic Alloy", + "material.cosmiccore.moondrop": "Moondrop", + "material.cosmiccore.naquadric_superalloy": "Naquadric Superalloy", + "material.cosmiccore.neutronite": "Neutronite", + "material.cosmiccore.nevramite": "Nevramite", + "material.cosmiccore.pale_oil": "Pale Oil", + "material.cosmiccore.pale_steel": "Pale Steel", + "material.cosmiccore.perfect_overclock_nutrient": "Perfect Overclock Nutrient", + "material.cosmiccore.perfect_production_nutrient": "Perfect Production Nutrient", + "material.cosmiccore.prisma": "Prisma", + "material.cosmiccore.prismatic_tungstensteel": "Prismatic Tungstensteel", + "material.cosmiccore.programmable_matter": "Programmable Matter", + "material.cosmiccore.psionic_galvorn": "Psionic Galvorn", + "material.cosmiccore.reclaimed_pale_ore": "Reclaimed Pale Ore", + "material.cosmiccore.resonant_virtue_meld": "Resonant Virtue Meld", + "material.cosmiccore.rosmotosin": "Rosmotosin", + "material.cosmiccore.shimmering_neutronium": "Shimmering Neutronium", + "material.cosmiccore.signalum": "Signalum", + "material.cosmiccore.sol_steel": "Sol Steel", + "material.cosmiccore.somanone": "Somanone", + "material.cosmiccore.spacetime": "Spacetime", + "material.cosmiccore.starmetal": "Starmetal", + "material.cosmiccore.starstruck_halite": "Starstruck Halite", + "material.cosmiccore.stygian_plague": "Stygian Plague", + "material.cosmiccore.super_overclock_nutrient": "Super Overclock Nutrient", + "material.cosmiccore.super_production_nutrient": "Super Production Nutrient", + "material.cosmiccore.superheavy_bedrock_alloy": "Superheavy Bedrock Alloy", + "material.cosmiccore.taranium": "Taranium", + "material.cosmiccore.temmerite": "Temmerite", + "material.cosmiccore.tenbrium": "Tenbrium", + "material.cosmiccore.trinavine": "Trinavine", + "material.cosmiccore.trinium_naqide": "Trinium Naqide", + "material.cosmiccore.triphenylphosphine": "Triphenylphosphine", + "material.cosmiccore.universe_tears": "Universe Tears", + "material.cosmiccore.vibrant_alloy": "Vibrant Alloy", + "material.cosmiccore.virtue_meld": "Virtue Meld", + "material.cosmiccore.vitrius": "Vitrius", + "material.cosmiccore.voidspark": "Voidspark", + "recipe.cosmiccore.envious_soul_in": "Envious Soul Input: %s", + "recipe.cosmiccore.envious_soul_out": "Envious Soul Output: %s", + "recipe.cosmiccore.gluttonous_soul_in": "Gluttonous Soul Input: %s", + "recipe.cosmiccore.gluttonous_soul_out": "Gluttonous Soul Output: %s", + "recipe.cosmiccore.greedy_soul_in": "Greedy Soul Input: %s", + "recipe.cosmiccore.greedy_soul_out": "Greedy Soul Output: %s", + "recipe.cosmiccore.lustful_soul_in": "Lustful Soul Input: %s", + "recipe.cosmiccore.lustful_soul_out": "Lustful Soul Output: %s", + "recipe.cosmiccore.proud_soul_in": "Proud Soul Input: %s", + "recipe.cosmiccore.proud_soul_out": "Proud Soul Output: %s", + "recipe.cosmiccore.raw_soul_in": "Raw Soul Input: %s", + "recipe.cosmiccore.raw_soul_out": "Raw Soul Output: %s", + "recipe.cosmiccore.refined_soul_in": "Refined Soul Input: %s", + "recipe.cosmiccore.refined_soul_out": "Refined Soul Output: %s", + "recipe.cosmiccore.slothful_soul_in": "Slothful Soul Input: %s", + "recipe.cosmiccore.slothful_soul_out": "Slothful Soul Output: %s", + "recipe.cosmiccore.temporal_soul_in": "Temporal Soul Input: %s", + "recipe.cosmiccore.temporal_soul_out": "Temporal Soul Output: %s", + "recipe.cosmiccore.wrathful_soul_in": "Wrathful Soul Input: %s", + "recipe.cosmiccore.wrathful_soul_out": "Wrathful Soul Output: %s", + "reflection.cosmiccore.bargain.ascension.answer.ready.drawback.0": "-30% movement speed when not flying", + "reflection.cosmiccore.bargain.ascension.answer.ready.drawback.1": "Vulnerable in no-fly zones or enclosed spaces", + "reflection.cosmiccore.bargain.ascension.answer.ready.power.0": "Creative-style flight (toggle with jump while airborne)", + "reflection.cosmiccore.bargain.ascension.answer.ready.power.1": "Fly indefinitely without hunger or stamina cost", + "reflection.cosmiccore.bargain.ascension.answer.ready.power.2": "Full 3D movement control while flying", + "reflection.cosmiccore.bargain.ascension.answer.ready.power.3": "No fall damage while flight is active", + "reflection.cosmiccore.bargain.ascension.answer.ready.response": "Weight leaves you. The sky opens. You are no longer earth-bound.", + "reflection.cosmiccore.bargain.ascension.answer.ready.text": "Pull it. I'm ready to fly.", + "reflection.cosmiccore.bargain.ascension.answer.refuse.response": "The thread floats back. Your feet stay heavy. Grounded.", + "reflection.cosmiccore.bargain.ascension.answer.refuse.text": "Leave it. The ground has served me well.", + "reflection.cosmiccore.bargain.ascension.description": "The sky opens. The ground becomes alien.", + "reflection.cosmiccore.bargain.ascension.dialogue.0": "This thread drifts upward. It tugs at you. Your feet feel heavy.", + "reflection.cosmiccore.bargain.ascension.dialogue.1": "Not gliding. Not falling with style. True flight.", + "reflection.cosmiccore.bargain.ascension.dialogue.2": "The sky would open like a door. You'd never need the ground again.", + "reflection.cosmiccore.bargain.ascension.dialogue.3": "But the ground would become alien. Uncomfortable. Wrong.", + "reflection.cosmiccore.bargain.ascension.dialogue.4": "Your legs would grow sluggish. Walking would feel like punishment.", + "reflection.cosmiccore.bargain.ascension.dialogue.5": "You'd belong to the sky. Not the earth.", + "reflection.cosmiccore.bargain.ascension.name": "Ascension", + "reflection.cosmiccore.bargain.ascension.on_accept": "Something unravels downward. The sky opens. You rise.", + "reflection.cosmiccore.bargain.ascension.on_defy": "Gravity reclaims you. The ground pulls you back, possessively.", + "reflection.cosmiccore.bargain.ascension.question": "The thread pulls upward. Do you follow it?", + "reflection.cosmiccore.bargain.back.answer.accept.drawback.0": "5 erosion cost per teleport use", + "reflection.cosmiccore.bargain.back.answer.accept.drawback.1": "Marker fades after 10 minutes", + "reflection.cosmiccore.bargain.back.answer.accept.power.0": "Teleport to death location (once per death)", + "reflection.cosmiccore.bargain.back.answer.accept.power.1": "Death marker visible through walls", + "reflection.cosmiccore.bargain.back.answer.accept.response": "Death becomes a waypoint now. Not an ending — a detour.", + "reflection.cosmiccore.bargain.back.answer.accept.text": "Pull it. Let me find my way back.", + "reflection.cosmiccore.bargain.back.answer.refuse.response": "The thread dims. Death keeps its finality.", + "reflection.cosmiccore.bargain.back.answer.refuse.text": "Leave it. Death should have consequences.", + "reflection.cosmiccore.bargain.back.description": "A thread to where you last fell", + "reflection.cosmiccore.bargain.back.dialogue.0": "This thread feels like deja vu. Like remembering where you left something.", + "reflection.cosmiccore.bargain.back.dialogue.1": "Death scatters you. But this would leave a trail back.", + "reflection.cosmiccore.bargain.back.dialogue.2": "A connection to where you fell. Follow it back, once per death.", + "reflection.cosmiccore.bargain.back.name": "The Way Back", + "reflection.cosmiccore.bargain.back.on_accept": "A thread connects you to your last breath. You can follow it back.", + "reflection.cosmiccore.bargain.back.on_defy": "The thread snaps. Death becomes final once more.", + "reflection.cosmiccore.bargain.back.question": "The thread would remember your deaths. Do you pull?", + "reflection.cosmiccore.bargain.carapace.answer.refuse.response": "The rigidity eases. Your skin stays soft. Fragile. Yours.", + "reflection.cosmiccore.bargain.carapace.answer.refuse.text": "Leave it. I'd rather feel than merely endure.", + "reflection.cosmiccore.bargain.carapace.answer.survive.drawback.0": "-20% healing from all sources", + "reflection.cosmiccore.bargain.carapace.answer.survive.drawback.1": "Reduced potion effectiveness", + "reflection.cosmiccore.bargain.carapace.answer.survive.power.0": "+8 armor points (4 full armor icons)", + "reflection.cosmiccore.bargain.carapace.answer.survive.power.1": "Stacks with worn armor", + "reflection.cosmiccore.bargain.carapace.answer.survive.response": "Your skin tightens. Hardens. Something more durable.", + "reflection.cosmiccore.bargain.carapace.answer.survive.text": "Pull it. I choose survival.", + "reflection.cosmiccore.bargain.carapace.description": "Your flesh hardens into something enduring", + "reflection.cosmiccore.bargain.carapace.dialogue.0": "This thread is rigid. Hard. Your skin tightens just touching it.", + "reflection.cosmiccore.bargain.carapace.dialogue.1": "It would harden you. Blows would glance off. Damage would diminish.", + "reflection.cosmiccore.bargain.carapace.dialogue.2": "But there's a numbness woven through it.", + "reflection.cosmiccore.bargain.carapace.dialogue.3": "Touch would become distant. Healing, slower.", + "reflection.cosmiccore.bargain.carapace.dialogue.4": "Survival at the cost of sensation.", + "reflection.cosmiccore.bargain.carapace.name": "Carapace", + "reflection.cosmiccore.bargain.carapace.on_accept": "Your flesh ripples and tightens. It doesn't hurt. That's the point.", + "reflection.cosmiccore.bargain.carapace.on_defy": "Sensation floods back — every breeze, every texture. You are soft again.", + "reflection.cosmiccore.bargain.carapace.question": "The thread would harden your flesh. Do you pull?", + "reflection.cosmiccore.bargain.cinder.answer.burn.drawback.0": "2x damage from freezing and cold sources", + "reflection.cosmiccore.bargain.cinder.answer.burn.drawback.1": "Water extinguishes slower, feels unpleasant", + "reflection.cosmiccore.bargain.cinder.answer.burn.power.0": "Complete fire and lava immunity", + "reflection.cosmiccore.bargain.cinder.answer.burn.power.1": "Can swim in lava safely", + "reflection.cosmiccore.bargain.cinder.answer.burn.response": "Heat floods through you, then recedes. Fire will never frighten you again.", + "reflection.cosmiccore.bargain.cinder.answer.burn.text": "Pull it. Burn me completely.", + "reflection.cosmiccore.bargain.cinder.answer.refuse.response": "The thread cools. The heat stays outside where it belongs.", + "reflection.cosmiccore.bargain.cinder.answer.refuse.text": "Leave it. Fire should be respected.", + "reflection.cosmiccore.bargain.cinder.description": "Fire cannot harm what has already burned", + "reflection.cosmiccore.bargain.cinder.dialogue.0": "This thread is hot. It smolders. Your fingers don't burn — they should.", + "reflection.cosmiccore.bargain.cinder.dialogue.1": "Ash and ember. Something in this thread has already burned completely.", + "reflection.cosmiccore.bargain.cinder.dialogue.2": "Pull it, and fire would lose its claim on you. You'd walk through infernos.", + "reflection.cosmiccore.bargain.cinder.dialogue.3": "But the cold would sharpen. Water would sting. Heat is a one-way door.", + "reflection.cosmiccore.bargain.cinder.dialogue.4": "Burn once, completely, and never burn again.", + "reflection.cosmiccore.bargain.cinder.name": "Cinder", + "reflection.cosmiccore.bargain.cinder.on_accept": "Something inside ignites and dies in the same instant. Ash. Freedom.", + "reflection.cosmiccore.bargain.cinder.on_defy": "The warmth drains away. Flames flicker hungrily when they see you now.", + "reflection.cosmiccore.bargain.cinder.question": "The thread smolders with old fire. Do you pull?", + "reflection.cosmiccore.bargain.darksight.answer.refuse.response": "The thread fades. The torchlight feels brighter for a moment.", + "reflection.cosmiccore.bargain.darksight.answer.refuse.text": "Leave it. The light serves me well enough.", + "reflection.cosmiccore.bargain.darksight.answer.yes.drawback.0": "Blindness effect in bright sunlight", + "reflection.cosmiccore.bargain.darksight.answer.yes.drawback.1": "Must stay underground during day", + "reflection.cosmiccore.bargain.darksight.answer.yes.power.0": "Permanent Night Vision effect", + "reflection.cosmiccore.bargain.darksight.answer.yes.power.1": "See in complete darkness", + "reflection.cosmiccore.bargain.darksight.answer.yes.response": "Your pupils dilate... and keep dilating. The dark becomes your domain.", + "reflection.cosmiccore.bargain.darksight.answer.yes.text": "Pull it. Let me see.", + "reflection.cosmiccore.bargain.darksight.description": "Your eyes learn to drink the shadow", + "reflection.cosmiccore.bargain.darksight.dialogue.0": "This thread is dark. Obviously. But it's warm somehow.", + "reflection.cosmiccore.bargain.darksight.dialogue.1": "You can feel what it offers — the shadow surrendering its secrets.", + "reflection.cosmiccore.bargain.darksight.dialogue.2": "Every hidden corner, laid bare. No torch needed.", + "reflection.cosmiccore.bargain.darksight.dialogue.3": "But there's a sting at the other end. The sun. It would burn.", + "reflection.cosmiccore.bargain.darksight.dialogue.4": "Trade daylight for the gift of seeing in the dark.", + "reflection.cosmiccore.bargain.darksight.name": "Darksight", + "reflection.cosmiccore.bargain.darksight.on_accept": "The shadows retreat from your vision. You see everything now.", + "reflection.cosmiccore.bargain.darksight.on_defy": "Light floods back. The darkness closes its secrets to you once more.", + "reflection.cosmiccore.bargain.darksight.question": "The thread would open your eyes to the dark. Do you pull?", + "reflection.cosmiccore.bargain.depths.answer.embrace.drawback.0": "Instant death when oxygen fully depletes", + "reflection.cosmiccore.bargain.depths.answer.embrace.drawback.1": "No drowning damage warning - just death", + "reflection.cosmiccore.bargain.depths.answer.embrace.power.0": "5x oxygen capacity underwater", + "reflection.cosmiccore.bargain.depths.answer.embrace.power.1": "Extended breath in toxic atmospheres", + "reflection.cosmiccore.bargain.depths.answer.embrace.response": "Your chest feels hollow. The new capacity needs room.", + "reflection.cosmiccore.bargain.depths.answer.embrace.text": "Pull it. Remake me for the depths.", + "reflection.cosmiccore.bargain.depths.answer.refuse.response": "The thread sinks back into the dark. The depths wait.", + "reflection.cosmiccore.bargain.depths.answer.refuse.text": "Leave it. I'll keep my mortal breath.", + "reflection.cosmiccore.bargain.depths.description": "Your breath stretches beyond mortal limits", + "reflection.cosmiccore.bargain.depths.dialogue.0": "This thread is cold. Wet. It smells like deep water.", + "reflection.cosmiccore.bargain.depths.dialogue.1": "You remember the burn in your lungs. The panic of drowning.", + "reflection.cosmiccore.bargain.depths.dialogue.2": "Something in this thread could stretch your breath. Remake it.", + "reflection.cosmiccore.bargain.depths.dialogue.3": "But there's a sharpness at the end. A finality.", + "reflection.cosmiccore.bargain.depths.dialogue.4": "When the breath runs out, there will be no warning.", + "reflection.cosmiccore.bargain.depths.dialogue.5": "No gasps. No fading. Just silence.", + "reflection.cosmiccore.bargain.depths.name": "The Depths", + "reflection.cosmiccore.bargain.depths.on_accept": "Something shifts in your chest. The air tastes different now.", + "reflection.cosmiccore.bargain.depths.on_defy": "Your lungs remember panic, remember struggle. You are mortal again.", + "reflection.cosmiccore.bargain.depths.question": "The thread could reshape your breath. Do you pull it?", + "reflection.cosmiccore.bargain.home.answer.accept.drawback.0": "10 erosion cost per teleport", + "reflection.cosmiccore.bargain.home.answer.accept.drawback.1": "-10% XP gain while far from home", + "reflection.cosmiccore.bargain.home.answer.accept.power.0": "Instant teleport to spawn/bed point", + "reflection.cosmiccore.bargain.home.answer.accept.power.1": "5 minute cooldown between uses", + "reflection.cosmiccore.bargain.home.answer.accept.response": "A cord stretches between you and home. Pull it anytime.", + "reflection.cosmiccore.bargain.home.answer.accept.text": "Pull it. Bind me to home.", + "reflection.cosmiccore.bargain.home.answer.refuse.response": "The warmth fades. Home stays where it is. You'll walk.", + "reflection.cosmiccore.bargain.home.answer.refuse.text": "Leave it. Home should be earned.", + "reflection.cosmiccore.bargain.home.description": "Home is never more than a thought away", + "reflection.cosmiccore.bargain.home.dialogue.0": "This thread is warm. Familiar. It smells like your bed, your walls.", + "reflection.cosmiccore.bargain.home.dialogue.1": "Home. The anchor. It could be instant. Unbreakable.", + "reflection.cosmiccore.bargain.home.dialogue.2": "But the tether costs something each time. And wandering far dulls you.", + "reflection.cosmiccore.bargain.home.name": "Homeward", + "reflection.cosmiccore.bargain.home.on_accept": "A cord of void stretches between you and home. Pull it anytime.", + "reflection.cosmiccore.bargain.home.on_defy": "The cord dissolves. Home is a journey again, not a shortcut.", + "reflection.cosmiccore.bargain.home.question": "The thread leads home. Do you pull?", + "reflection.cosmiccore.bargain.quake_movement.answer.refuse.response": "The thread stills. The ache fades. For now.", + "reflection.cosmiccore.bargain.quake_movement.answer.refuse.text": "Leave it. My feet know their own rhythm.", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.drawback.0": "Movement feels unnatural to observers", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.power.0": "Bunny hopping preserves and builds momentum", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.power.1": "Air strafing for mid-air direction control", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.response": "Your joints crack. Your muscles rewire. Movement becomes instinct.", + "reflection.cosmiccore.bargain.quake_movement.answer.yes.text": "Let them remember.", + "reflection.cosmiccore.bargain.quake_movement.description": "Something in your legs remembers a different way to move", + "reflection.cosmiccore.bargain.quake_movement.dialogue.0": "This thread hums with motion. Your legs ache just touching it.", + "reflection.cosmiccore.bargain.quake_movement.dialogue.1": "There's a memory in it — of moving differently. Before physics became rigid.", + "reflection.cosmiccore.bargain.quake_movement.dialogue.2": "Your muscles twitch. They want to remember.", + "reflection.cosmiccore.bargain.quake_movement.dialogue.3": "Pull it, and your body will never be content with stillness again.", + "reflection.cosmiccore.bargain.quake_movement.name": "Velocity", + "reflection.cosmiccore.bargain.quake_movement.on_accept": "Something unravels. Your stride breaks open into something new.", + "reflection.cosmiccore.bargain.quake_movement.on_defy": "The speed fades like a dream you can't quite hold onto.", + "reflection.cosmiccore.bargain.quake_movement.question": "Your legs remember something. Do you let them?", + "reflection.cosmiccore.bargain.reach.answer.further.drawback.0": "-15% mining speed", + "reflection.cosmiccore.bargain.reach.answer.further.drawback.1": "Item pickup range reduced", + "reflection.cosmiccore.bargain.reach.answer.further.power.0": "+3 block reach (build from further)", + "reflection.cosmiccore.bargain.reach.answer.further.power.1": "+2 attack reach", + "reflection.cosmiccore.bargain.reach.answer.further.response": "Something shifts in your shoulders. Your arms remember being longer.", + "reflection.cosmiccore.bargain.reach.answer.further.text": "Pull it. Stretch me further.", + "reflection.cosmiccore.bargain.reach.answer.refuse.response": "The thread contracts. The world stays at arm's length.", + "reflection.cosmiccore.bargain.reach.answer.refuse.text": "Leave it. My reach is sufficient.", + "reflection.cosmiccore.bargain.reach.description": "Your grasp extends beyond what's natural", + "reflection.cosmiccore.bargain.reach.dialogue.0": "This thread stretches. Long. Your arms ache near it.", + "reflection.cosmiccore.bargain.reach.dialogue.1": "Everything just slightly out of reach — this thread would close that gap.", + "reflection.cosmiccore.bargain.reach.dialogue.2": "Build farther. Strike farther. But your hands would feel wrong.", + "reflection.cosmiccore.bargain.reach.dialogue.3": "Slower to work. Harder to pick things up close. The price of extension.", + "reflection.cosmiccore.bargain.reach.name": "Reach", + "reflection.cosmiccore.bargain.reach.on_accept": "Something shifts in your shoulders. Your arms remember being longer.", + "reflection.cosmiccore.bargain.reach.on_defy": "Your arms contract back to normal. The world feels close and small again.", + "reflection.cosmiccore.bargain.reach.question": "The thread stretches outward. Do you pull?", + "reflection.cosmiccore.bargain.satiated.answer.empty.drawback.0": "You can not regenerate health normally", + "reflection.cosmiccore.bargain.satiated.answer.empty.drawback.1": "Cannot benefit from food-based buffs", + "reflection.cosmiccore.bargain.satiated.answer.empty.power.0": "Hunger depletes 80% slower", + "reflection.cosmiccore.bargain.satiated.answer.empty.power.1": "Food provides 3x saturation", + "reflection.cosmiccore.bargain.satiated.answer.empty.response": "The gnawing stops. Silence in your belly. Freedom.", + "reflection.cosmiccore.bargain.satiated.answer.empty.text": "Pull it. Free me from this hunger.", + "reflection.cosmiccore.bargain.satiated.answer.refuse.response": "The emptiness settles back. Your stomach growls. Familiar.", + "reflection.cosmiccore.bargain.satiated.answer.refuse.text": "Leave it. I enjoy my meals.", + "reflection.cosmiccore.bargain.satiated.description": "Hunger fades to a distant memory", + "reflection.cosmiccore.bargain.satiated.dialogue.0": "This thread is hollow. Empty. Your stomach quiets near it.", + "reflection.cosmiccore.bargain.satiated.dialogue.1": "The constant gnawing would stop. Fullness would be your natural state.", + "reflection.cosmiccore.bargain.satiated.dialogue.2": "You'd eat for taste, for ritual — never for need.", + "reflection.cosmiccore.bargain.satiated.dialogue.3": "But taste itself would dull. Food becomes fuel. Nothing more.", + "reflection.cosmiccore.bargain.satiated.dialogue.4": "And without hunger's edge, your body forgets how to mend itself.", + "reflection.cosmiccore.bargain.satiated.name": "Satiated", + "reflection.cosmiccore.bargain.satiated.on_accept": "The gnawing stops. Silence in your belly. Freedom.", + "reflection.cosmiccore.bargain.satiated.on_defy": "Hunger returns with a vengeance. You remember what need feels like.", + "reflection.cosmiccore.bargain.satiated.question": "The thread would silence your hunger. Do you pull?", + "reflection.cosmiccore.bargain.soft_landing.answer.refuse.response": "The thread settles. Gravity keeps its hold.", + "reflection.cosmiccore.bargain.soft_landing.answer.refuse.text": "Leave it. Fear keeps me cautious.", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.drawback.0": "+15% damage taken from all sources", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.drawback.1": "Reduced knockback resistance", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.power.0": "80% fall damage immunity", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.power.1": "Short falls do almost nothing", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.response": "Weight leaves you. The ground will catch you now.", + "reflection.cosmiccore.bargain.soft_landing.answer.yes.text": "Pull it. Take away the fear of falling.", + "reflection.cosmiccore.bargain.soft_landing.description": "Gravity loosens its grip on you", + "reflection.cosmiccore.bargain.soft_landing.dialogue.0": "This thread is light. Weightless. It drifts when you touch it.", + "reflection.cosmiccore.bargain.soft_landing.dialogue.1": "You remember falling. The sickening moment before impact.", + "reflection.cosmiccore.bargain.soft_landing.dialogue.2": "This would soften every landing. The ground would forgive you.", + "reflection.cosmiccore.bargain.soft_landing.dialogue.3": "But something else loosens with it. You'd be more fragile overall.", + "reflection.cosmiccore.bargain.soft_landing.dialogue.4": "Lighter. Softer. Easier to break in other ways.", + "reflection.cosmiccore.bargain.soft_landing.name": "Soft Landing", + "reflection.cosmiccore.bargain.soft_landing.on_accept": "Your relationship with gravity shifts. It still pulls, but gently now.", + "reflection.cosmiccore.bargain.soft_landing.on_defy": "Weight crashes back into your bones. Every fall matters again.", + "reflection.cosmiccore.bargain.soft_landing.question": "The thread would catch your falls. Do you pull?", + "reflection.cosmiccore.bargain.stride.answer.accept.drawback.0": "Cannot crouch-walk off edges", + "reflection.cosmiccore.bargain.stride.answer.accept.power.0": "Auto step-up to 1 block height", + "reflection.cosmiccore.bargain.stride.answer.accept.power.1": "Smooth terrain traversal", + "reflection.cosmiccore.bargain.stride.answer.accept.response": "The earth shifts slightly. Terrain reshapes itself for your step.", + "reflection.cosmiccore.bargain.stride.answer.accept.text": "Pull it. Let the world flatten.", + "reflection.cosmiccore.bargain.stride.answer.refuse.response": "The thread settles back. The world keeps its edges.", + "reflection.cosmiccore.bargain.stride.answer.refuse.text": "Leave it. I'll climb my own way.", + "reflection.cosmiccore.bargain.stride.description": "The ground rises to meet your feet", + "reflection.cosmiccore.bargain.stride.dialogue.0": "A smooth thread. Flat. The ground seems to yield just touching it.", + "reflection.cosmiccore.bargain.stride.dialogue.1": "Every ledge, every small obstacle — they'd simply accommodate you.", + "reflection.cosmiccore.bargain.stride.dialogue.2": "Your feet would never need to leave the ground.", + "reflection.cosmiccore.bargain.stride.dialogue.3": "But edges would lose their grip on you too. No catching yourself.", + "reflection.cosmiccore.bargain.stride.name": "Stride", + "reflection.cosmiccore.bargain.stride.on_accept": "Something loosens underfoot. The world smooths itself for you.", + "reflection.cosmiccore.bargain.stride.on_defy": "Every ledge is a challenge again. The ground doesn't care about you.", + "reflection.cosmiccore.bargain.stride.question": "The ground could flatten before you. Do you pull?", + "reflection.cosmiccore.bargain.swiftness.answer.accept.drawback.0": "Increased hunger when standing still", + "reflection.cosmiccore.bargain.swiftness.answer.accept.power.0": "+40% movement speed", + "reflection.cosmiccore.bargain.swiftness.answer.accept.power.1": "Sprint without hunger drain", + "reflection.cosmiccore.bargain.swiftness.answer.accept.response": "Lightning arcs through your muscles. You twitch with restless energy.", + "reflection.cosmiccore.bargain.swiftness.answer.accept.text": "Pull it. Let me run.", + "reflection.cosmiccore.bargain.swiftness.answer.refuse.response": "The vibration stills. The world keeps its pace.", + "reflection.cosmiccore.bargain.swiftness.answer.refuse.text": "Leave it. I'm content with my pace.", + "reflection.cosmiccore.bargain.swiftness.description": "The world slows down around you", + "reflection.cosmiccore.bargain.swiftness.dialogue.0": "This thread vibrates. Fast. Everything around it seems sluggish.", + "reflection.cosmiccore.bargain.swiftness.dialogue.1": "Your blood aches to race. Your legs want to blur.", + "reflection.cosmiccore.bargain.swiftness.dialogue.2": "But speed has a hunger to it. Stillness will gnaw at you.", + "reflection.cosmiccore.bargain.swiftness.name": "Swiftness", + "reflection.cosmiccore.bargain.swiftness.on_accept": "Something unwinds. The world blurs at the edges.", + "reflection.cosmiccore.bargain.swiftness.on_defy": "The world speeds back up around you. Merely human once more.", + "reflection.cosmiccore.bargain.swiftness.question": "The thread hums with speed. Do you pull it?", + "reflection.cosmiccore.bargain.violence.answer.accept.drawback.0": "+20% damage taken from all sources", + "reflection.cosmiccore.bargain.violence.answer.accept.drawback.1": "Cannot use shields", + "reflection.cosmiccore.bargain.violence.answer.accept.power.0": "+30% melee damage dealt", + "reflection.cosmiccore.bargain.violence.answer.accept.power.1": "+15% attack speed", + "reflection.cosmiccore.bargain.violence.answer.accept.response": "Power surges through your arms. Everything looks so breakable now.", + "reflection.cosmiccore.bargain.violence.answer.accept.text": "Pull it. Remove my restraints.", + "reflection.cosmiccore.bargain.violence.answer.refuse.response": "The sharpness dulls. Your fists unclench.", + "reflection.cosmiccore.bargain.violence.answer.refuse.text": "Leave it. Restraint is its own strength.", + "reflection.cosmiccore.bargain.violence.description": "Your restraints dissolve. Everything becomes breakable.", + "reflection.cosmiccore.bargain.violence.dialogue.0": "This thread is sharp. Ragged. It wants to cut something.", + "reflection.cosmiccore.bargain.violence.dialogue.1": "You hold back every swing. Some part of you fears the damage you could do.", + "reflection.cosmiccore.bargain.violence.dialogue.2": "This would remove that restraint. Let it flow freely.", + "reflection.cosmiccore.bargain.violence.dialogue.3": "But violence flows both ways. You'd break things easier — and break easier.", + "reflection.cosmiccore.bargain.violence.dialogue.4": "No shields. No hiding. Just force.", + "reflection.cosmiccore.bargain.violence.name": "Violence", + "reflection.cosmiccore.bargain.violence.on_accept": "Something snaps loose inside. The rage was always there. Now it's free.", + "reflection.cosmiccore.bargain.violence.on_defy": "The rage drains away. Your blows return to mortal weight.", + "reflection.cosmiccore.bargain.violence.question": "The thread is sharp and eager. Do you pull?", + "reflection.cosmiccore.bargain.vitality.answer.accept.drawback.0": "-50% natural regeneration rate", + "reflection.cosmiccore.bargain.vitality.answer.accept.drawback.1": "Healing potions 30% less effective", + "reflection.cosmiccore.bargain.vitality.answer.accept.power.0": "+10 max health (5 extra hearts)", + "reflection.cosmiccore.bargain.vitality.answer.accept.power.1": "Increased damage absorption buffer", + "reflection.cosmiccore.bargain.vitality.answer.accept.response": "Your heart swells. Literally. It has more to pump now.", + "reflection.cosmiccore.bargain.vitality.answer.accept.text": "Pull it. Give me more life.", + "reflection.cosmiccore.bargain.vitality.answer.refuse.response": "The pulse fades. Your heart keeps its rhythm.", + "reflection.cosmiccore.bargain.vitality.answer.refuse.text": "Leave it. I'll work with what I have.", + "reflection.cosmiccore.bargain.vitality.description": "More life, but slower to mend", + "reflection.cosmiccore.bargain.vitality.dialogue.0": "This thread throbs. You can feel a pulse in it. A second heartbeat.", + "reflection.cosmiccore.bargain.vitality.dialogue.1": "More blood. More breath. More heartbeats before the end.", + "reflection.cosmiccore.bargain.vitality.dialogue.2": "But the excess stretches you thin. Healing would slow.", + "reflection.cosmiccore.bargain.vitality.dialogue.3": "A bigger vessel, but one that takes longer to refill.", + "reflection.cosmiccore.bargain.vitality.dialogue.4": "Recovery for resilience. That's the trade.", + "reflection.cosmiccore.bargain.vitality.name": "Vitality", + "reflection.cosmiccore.bargain.vitality.on_accept": "Your veins surge with new vigor. Everything feels more present.", + "reflection.cosmiccore.bargain.vitality.on_defy": "The excess drains away. You are mortal-sized once more.", + "reflection.cosmiccore.bargain.vitality.question": "The thread pulses with life. Do you pull?", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.drawback.0": "-25% damage in lit areas (sky access)", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.drawback.1": "Takes damage from direct sunlight exposure", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.power.0": "Void damage immunity (Y < 0)", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.power.1": "Teleport to surface when entering void", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.response": "Something cold touches your soul. The void knows you now.", + "reflection.cosmiccore.bargain.void_anchor.answer.anchor.text": "Pull it. Mark me for the void.", + "reflection.cosmiccore.bargain.void_anchor.answer.refuse.response": "The cold recedes. The void forgets you were here. For now.", + "reflection.cosmiccore.bargain.void_anchor.answer.refuse.text": "Leave it. I'll stay in the light.", + "reflection.cosmiccore.bargain.void_anchor.description": "The void cannot destroy what belongs to it", + "reflection.cosmiccore.bargain.void_anchor.dialogue.0": "This thread is cold. Not cold like ice — cold like absence. Like nothing.", + "reflection.cosmiccore.bargain.void_anchor.dialogue.1": "You've felt the pull of the void beneath the world. That endless fall.", + "reflection.cosmiccore.bargain.void_anchor.dialogue.2": "This thread would mark you. Make you part of that darkness.", + "reflection.cosmiccore.bargain.void_anchor.dialogue.3": "The void can't destroy what it recognizes as its own.", + "reflection.cosmiccore.bargain.void_anchor.dialogue.4": "Fall as far as you like. The darkness would catch you. Welcome you.", + "reflection.cosmiccore.bargain.void_anchor.dialogue.5": "But the light would sting. Sunlight would feel wrong on marked skin.", + "reflection.cosmiccore.bargain.void_anchor.name": "Void Anchor", + "reflection.cosmiccore.bargain.void_anchor.on_accept": "Something cold marks you. Deep. Permanent. The void won't hurt you now.", + "reflection.cosmiccore.bargain.void_anchor.on_defy": "The mark burns away. The void forgets you. It will not be merciful next time.", + "reflection.cosmiccore.bargain.void_anchor.question": "The thread reaches into the nothing. Do you pull?", + "reflection.cosmiccore.ui.acknowledge": "[I understand]", + "reflection.cosmiccore.ui.available_bargains": "Available Bargains", + "reflection.cosmiccore.ui.back": "[Back]", + "reflection.cosmiccore.ui.browse.interesting_choice": "You reach for a thread.", + "reflection.cosmiccore.ui.browse_bargains": "[Reach for %s threads]", + "reflection.cosmiccore.ui.cancel": "[Cancel]", + "reflection.cosmiccore.ui.click_to_bargain": "Click to bargain", + "reflection.cosmiccore.ui.click_to_defy": "Click to defy (%d erosion)", + "reflection.cosmiccore.ui.confirm_defiance": "[Confirm Defiance]", + "reflection.cosmiccore.ui.constellation_title": "The Threads", + "reflection.cosmiccore.ui.continue": "[Continue]", + "reflection.cosmiccore.ui.cost": "Cost: %d erosion", + "reflection.cosmiccore.ui.defiance": "Defiance", + "reflection.cosmiccore.ui.defiance.cancel": "[No, leave it]", + "reflection.cosmiccore.ui.defiance.cannot_undo": "This cannot be undone", + "reflection.cosmiccore.ui.defiance.confirm": "[Yes, push it back]", + "reflection.cosmiccore.ui.defiance.cost_amount": "This will cost %d erosion", + "reflection.cosmiccore.ui.defiance.lose_power": "The power from this thread will fade", + "reflection.cosmiccore.ui.defiance.question": "Push this thread back?", + "reflection.cosmiccore.ui.defiance.scar_remains": "A knot will remain where it was — forever", + "reflection.cosmiccore.ui.defiance.so_be_it": "The thread tears loose. It hurts.", + "reflection.cosmiccore.ui.defiance.warning1": "Push back the thread of %s?", + "reflection.cosmiccore.ui.defiance.warning2": "The cost of defiance is %d erosion.", + "reflection.cosmiccore.ui.defiance.warning3": "The power will leave. The scar will not.", + "reflection.cosmiccore.ui.defiance.warning4": "Are you certain?", + "reflection.cosmiccore.ui.defiance.will_lose": "You will lose: %s", + "reflection.cosmiccore.ui.defiance.wise": "You let it stay. The thread holds.", + "reflection.cosmiccore.ui.defiance_cost": "Defiance will cost %d erosion", + "reflection.cosmiccore.ui.defiance_warning": "Defying a bargain will cost you power but restore some of your soul.", + "reflection.cosmiccore.ui.defy": "Defy", + "reflection.cosmiccore.ui.defy_bargain": "[Defy This Bargain]", + "reflection.cosmiccore.ui.dialogue_continue": "Click to continue...", + "reflection.cosmiccore.ui.drawback": "Drawback", + "reflection.cosmiccore.ui.drawbacks": "Drawbacks:", + "reflection.cosmiccore.ui.enter_defiance": "[Enter Defiance Mode]", + "reflection.cosmiccore.ui.erosion": "erosion", + "reflection.cosmiccore.ui.exit": "[Leave]", + "reflection.cosmiccore.ui.forever_scarred": "Forever Scarred", + "reflection.cosmiccore.ui.gaze_constellation": "[Look at the threads]", + "reflection.cosmiccore.ui.hub.browse.power": "See what threads are within reach", + "reflection.cosmiccore.ui.hub.browse.response": "Threads scatter in the dark. So many.", + "reflection.cosmiccore.ui.hub.browse.response_empty": "Nothing within reach. Yet.", + "reflection.cosmiccore.ui.hub.greeting.erosion_no_bargains.0": "Your shell is worn, but no threads trail from it. Strange.", + "reflection.cosmiccore.ui.hub.greeting.erosion_no_bargains.1": "Something else has been wearing at you.", + "reflection.cosmiccore.ui.hub.greeting.erosion_no_bargains.2": "The threads still wait. Maybe it's time.", + "reflection.cosmiccore.ui.hub.greeting.fresh.0": "The shell is whole. Dense. Untouched.", + "reflection.cosmiccore.ui.hub.greeting.fresh.1": "Threads pin the starfield around you. Waiting.", + "reflection.cosmiccore.ui.hub.greeting.has_bargains.0": "Threads trail from you into the starfield. You've been busy.", + "reflection.cosmiccore.ui.hub.greeting.has_bargains.1": "More threads still wait. Pinned in the dark.", + "reflection.cosmiccore.ui.hub.greeting.has_scars.0": "Scars where threads were defied. Knots that won't untangle.", + "reflection.cosmiccore.ui.hub.greeting.has_scars.1": "You pulled, then pushed back. The marks remain.", + "reflection.cosmiccore.ui.hub.greeting.has_scars.2": "Was the cost of keeping them too high?", + "reflection.cosmiccore.ui.hub.greeting.many_bargains.0": "The shell is thinning. Threads trail outward into the dark.", + "reflection.cosmiccore.ui.hub.greeting.many_bargains.1": "Each thread pulled leaves a little more exposed.", + "reflection.cosmiccore.ui.hub.greeting.many_bargains_high.0": "So many gaps in the shell. You can see your core through them.", + "reflection.cosmiccore.ui.hub.greeting.many_bargains_high.1": "Do you even remember what the shell looked like whole?", + "reflection.cosmiccore.ui.hub.greeting.question": "You look into the mirror.", + "reflection.cosmiccore.ui.hub.leave_response": "You turn away from the mirror.", + "reflection.cosmiccore.ui.hub.mutilate_soul": "[Reshape Your Core]", + "reflection.cosmiccore.ui.hub.reflect.power": "Look at what you've become", + "reflection.cosmiccore.ui.hub.reflect_response": "You look at yourself. Really look.", + "reflection.cosmiccore.ui.hub.review.drawback": "Consider defying a thread", + "reflection.cosmiccore.ui.hub.review.power": "See what you've pulled loose", + "reflection.cosmiccore.ui.hub.review_response": "The pulled threads glow faintly.", + "reflection.cosmiccore.ui.just_look": "[Just... look at yourself]", + "reflection.cosmiccore.ui.leave": "[Leave this place]", + "reflection.cosmiccore.ui.no_available_bargains": "No threads within reach... for now.", + "reflection.cosmiccore.ui.no_bargains": "No bargains accepted yet.", + "reflection.cosmiccore.ui.of": "of", + "reflection.cosmiccore.ui.power": "Power", + "reflection.cosmiccore.ui.powers": "Powers:", + "reflection.cosmiccore.ui.reflection.extreme_erosion.0": "Almost nothing left to pull. The shell is threadbare.", + "reflection.cosmiccore.ui.reflection.extreme_erosion.1": "One more thread and there's nothing between your core and the void.", + "reflection.cosmiccore.ui.reflection.has_bargains.0": "Threads trail from you into the starfield.", + "reflection.cosmiccore.ui.reflection.has_bargains.1": "Each one a piece of yourself, pulled loose.", + "reflection.cosmiccore.ui.reflection.high_erosion.0": "So many threads pulled loose. The shell is fragile now.", + "reflection.cosmiccore.ui.reflection.high_erosion.1": "Your core is almost fully visible. Raw. Exposed.", + "reflection.cosmiccore.ui.reflection.low_erosion.0": "A thread or two trails from the shell. Just the start.", + "reflection.cosmiccore.ui.reflection.low_erosion.1": "The gaps are small. Barely visible.", + "reflection.cosmiccore.ui.reflection.mid_erosion.0": "The shell is thinning. Your core glows through the gaps.", + "reflection.cosmiccore.ui.reflection.mid_erosion.1": "You're getting used to the feeling of less.", + "reflection.cosmiccore.ui.reflection.no_erosion.0": "Whole. Dense. Untouched.", + "reflection.cosmiccore.ui.reflection.no_erosion.1": "The threads wait in the dark, pinned and patient.", + "reflection.cosmiccore.ui.reflection.no_erosion.2": "You haven't pulled anything yet.", + "reflection.cosmiccore.ui.review_bargains": "[Examine your %s threads]", + "reflection.cosmiccore.ui.scroll_down": "▼ Scroll down", + "reflection.cosmiccore.ui.scroll_up": "▲ Scroll up", + "reflection.cosmiccore.ui.select": "[Select]", + "reflection.cosmiccore.ui.select_to_view": "Select a bargain to view details", + "reflection.cosmiccore.ui.soul_erosion": "Soul Erosion: %d%%", + "reflection.cosmiccore.ui.soul_erosion_display": "Soul Erosion: %s%%", + "reflection.cosmiccore.ui.soul_label": "Soul", + "reflection.cosmiccore.ui.soul_shape.complete.0": "You are now %s. Something fundamental changed.", + "reflection.cosmiccore.ui.soul_shape.complete.1": "There's no returning to what you were.", + "reflection.cosmiccore.ui.soul_shape.intro.0": "The blade rests against your core. This will redefine what you are.", + "reflection.cosmiccore.ui.soul_shape.intro.1": "Once cut, the shape is permanent. Your core can only be shaped once.", + "reflection.cosmiccore.ui.soul_shape.intro.2": "Think through this carefully. There's no going back.", + "reflection.cosmiccore.ui.soul_shape.select_header": "Choose Your Shape", + "reflection.cosmiccore.ui.soul_shape.transforming.0": "You cut.", + "reflection.cosmiccore.ui.soul_shape.transforming.1": "Your entire being feels on fire as you shift into %s...", + "reflection.cosmiccore.ui.soul_shape.warning_permanent": "This choice is permanent and cannot be undone.", + "reflection.cosmiccore.ui.tooltip.no_details": "No additional details", + "reflection.cosmiccore.ui.unlock_cost": "Cost: %d soul erosion", + "reflection.cosmiccore.ui.view_active": "[View Your Bargains]", + "reflection.cosmiccore.ui.view_bargains": "[View Available Bargains]", + "reflection.cosmiccore.ui.void_title": "The Mirror", + "reflection.cosmiccore.ui.your_bargains": "Your Bargains", + "tagprefix.alve_foil_insulator": "%s Alve Insulator", + "tagprefix.heavy_beam": "Heavy %s Beam", + "tagprefix.leached_ore": "Leached %s Ore", + "tagprefix.modular_shelling": "%s Modular Shelling", + "tagprefix.plasmites": "%s Plasmites", + "tagprefix.prisma_frothed_ore": "Prisma Frothed %s Ore", + "tagprefix.raw_ore_cubic": "Cubic %s Ore", + "tagprefix.shape_memory_foil": "%s Shaping Memory Foil", + "tagprefix.ultradense_plate": "Ultradense %s Plate", + "tagprefix.wire_spool": "%s Wire Spool", + "tooltip.cosmiccore.asteroid.tier": "Asteroid Size: %s Kilotons", + "tooltip.cosmiccore.asteroid.tiny": "Asteroid Size: Unknown", + "tooltip.cosmiccore.asteroid_chip.lock": "Lock Strength: %s%%", + "tooltip.cosmiccore.asteroid_chip.mode": "Mode: %s", + "tooltip.cosmiccore.asteroid_chip.sector": "Sector: %s", + "tooltip.cosmiccore.asteroid_chip.target": "Target ID: %s", + "tooltip.cosmiccore.asteroid_chip.tier": "Acquisition Tier: %s", + "tooltip.cosmiccore.asteroid_chip.type": "Type: %s", + "tooltip.cosmiccore.asteroid_chip.unprogrammed": "Unprogrammed — no target data", + "tooltip.cosmiccore.ember_hatch.capacity": "§cMax Ember capacity§f:§6 %s", + "tooltip.cosmiccore.ember_hatch.consumption": "§cMax Ember Consumption§f:§6 %s", + "tooltip.cosmiccore.soul_hatch.input": "§cMax Recipe Input§f:§6 %s", + "tooltip.cosmiccore.soul_hatch.output": "§cMax Soul Network Capacity§f:§6 %s", + "tooltip.cosmiccore.thermia_hatch_limit": "§cTemp. Limit: %sK", + "tooltip.gt_scythe.energy": "Energy: %s / %s EU", + "tooltip.gt_scythe.no_energy": "§cNot enough energy.", + "tooltip.gt_scythe.per_hit": "Cost: %s EU / hit" } \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/alternator_flux_coiling.json b/src/generated/resources/assets/cosmiccore/models/block/alternator_flux_coiling.json new file mode 100644 index 000000000..9c0e7a006 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/alternator_flux_coiling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/alternator_flux_coiling_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/alveary_casing.json b/src/generated/resources/assets/cosmiccore/models/block/alveary_casing.json new file mode 100644 index 000000000..b55ae66a3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/alveary_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/alveary_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/bichromal_nevramite_casing.json b/src/generated/resources/assets/cosmiccore/models/block/bichromal_nevramite_casing.json new file mode 100644 index 000000000..473381b59 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/bichromal_nevramite_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/bichromal_nevramite_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/blank_rune.json b/src/generated/resources/assets/cosmiccore/models/block/blank_rune.json new file mode 100644 index 000000000..7bf6d2a6e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/blank_rune.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/bolted_heavy_frame_casing.json b/src/generated/resources/assets/cosmiccore/models/block/bolted_heavy_frame_casing.json new file mode 100644 index 000000000..b9028b18c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/bolted_heavy_frame_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/bolted_heavy_frame_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/causal_fabric_coil_block.json b/src/generated/resources/assets/cosmiccore/models/block/causal_fabric_coil_block.json new file mode 100644 index 000000000..f30a582f8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/causal_fabric_coil_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/coils/causal_fabric_off" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/causal_fabric_coil_block_active.json b/src/generated/resources/assets/cosmiccore/models/block/causal_fabric_coil_block_active.json new file mode 100644 index 000000000..d6aa24470 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/causal_fabric_coil_block_active.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/coils/causal_fabric" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/cryogenic_casing.json b/src/generated/resources/assets/cosmiccore/models/block/cryogenic_casing.json new file mode 100644 index 000000000..7dffcfb18 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/cryogenic_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/cryogenic_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/cyclozine_chemically_repelling_casing.json b/src/generated/resources/assets/cosmiccore/models/block/cyclozine_chemically_repelling_casing.json new file mode 100644 index 000000000..1abe8ee73 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/cyclozine_chemically_repelling_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/cyclozine_chemically_repelling_pipe.json b/src/generated/resources/assets/cosmiccore/models/block/cyclozine_chemically_repelling_pipe.json new file mode 100644 index 000000000..6fca8080a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/cyclozine_chemically_repelling_pipe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_pipe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/cyclozine_high_rigidity_casing.json b/src/generated/resources/assets/cosmiccore/models/block/cyclozine_high_rigidity_casing.json new file mode 100644 index 000000000..84549580e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/cyclozine_high_rigidity_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/cyclozine_high_rigidity_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/diving_bell_escape_pad.json b/src/generated/resources/assets/cosmiccore/models/block/diving_bell_escape_pad.json new file mode 100644 index 000000000..ed225b8f8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/diving_bell_escape_pad.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/diving_bell_escape_pad" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/dyson_solar_cell.json b/src/generated/resources/assets/cosmiccore/models/block/dyson_solar_cell.json new file mode 100644 index 000000000..70858279f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/dyson_solar_cell.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/dyson_solar_cell" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/ethersteel_plated_ash_tiles.json b/src/generated/resources/assets/cosmiccore/models/block/ethersteel_plated_ash_tiles.json new file mode 100644 index 000000000..b1f16fc0c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/ethersteel_plated_ash_tiles.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/fulgorinth_prime_casing.json b/src/generated/resources/assets/cosmiccore/models/block/fulgorinth_prime_casing.json new file mode 100644 index 000000000..918dff53f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/fulgorinth_prime_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/fulgorinth_prime_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/fusion_grade_magnet.json b/src/generated/resources/assets/cosmiccore/models/block/fusion_grade_magnet.json new file mode 100644 index 000000000..0262fe1a9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/fusion_grade_magnet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/magnet_fusion_grade" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/fusion_grade_magnet_active.json b/src/generated/resources/assets/cosmiccore/models/block/fusion_grade_magnet_active.json new file mode 100644 index 000000000..8562b1623 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/fusion_grade_magnet_active.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/cube_2_layer/all", + "textures": { + "bot_all": "cosmiccore:block/casings/solid/magnet_fusion_grade", + "top_all": "cosmiccore:block/casings/solid/magnet_fusion_grade_bloom" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/gilded_pthanterum_casing.json b/src/generated/resources/assets/cosmiccore/models/block/gilded_pthanterum_casing.json new file mode 100644 index 000000000..780c78451 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/gilded_pthanterum_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/gilded_pthanterum_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/heavy_frost_proof_casing.json b/src/generated/resources/assets/cosmiccore/models/block/heavy_frost_proof_casing.json new file mode 100644 index 000000000..e520c1920 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/heavy_frost_proof_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/heavy_frost_proof_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/high_powered_magnet.json b/src/generated/resources/assets/cosmiccore/models/block/high_powered_magnet.json new file mode 100644 index 000000000..9c0e7a006 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/high_powered_magnet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/alternator_flux_coiling_copper" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/high_powered_magnet_active.json b/src/generated/resources/assets/cosmiccore/models/block/high_powered_magnet_active.json new file mode 100644 index 000000000..c3b8b2294 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/high_powered_magnet_active.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/cube_2_layer/all", + "textures": { + "bot_all": "cosmiccore:block/casings/solid/alternator_flux_coiling_copper", + "top_all": "cosmiccore:block/casings/solid/alternator_flux_coiling_copper_bloom" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/high_temperature_fission_casing.json b/src/generated/resources/assets/cosmiccore/models/block/high_temperature_fission_casing.json new file mode 100644 index 000000000..f6966a129 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/high_temperature_fission_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/high_tolerance_rhenium_casing.json b/src/generated/resources/assets/cosmiccore/models/block/high_tolerance_rhenium_casing.json new file mode 100644 index 000000000..492430f0d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/high_tolerance_rhenium_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/high_tolerance_rhenium_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/highly_conductive_fission_casing.json b/src/generated/resources/assets/cosmiccore/models/block/highly_conductive_fission_casing.json new file mode 100644 index 000000000..d4350f9a2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/highly_conductive_fission_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_conductive_fission_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/highly_flexible_reinforced_trinavine_casing.json b/src/generated/resources/assets/cosmiccore/models/block/highly_flexible_reinforced_trinavine_casing.json new file mode 100644 index 000000000..2eb2b3e4f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/highly_flexible_reinforced_trinavine_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile.json b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile.json new file mode 100644 index 000000000..347b872dd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_slab.json b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_slab.json new file mode 100644 index 000000000..366f72089 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "side": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "top": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_slab_top.json b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_slab_top.json new file mode 100644 index 000000000..1de8dce9b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_slab_top.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab_top", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "side": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "top": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_stairs.json b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_stairs.json new file mode 100644 index 000000000..eb65956a7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "side": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "top": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_stairs_inner.json b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_stairs_inner.json new file mode 100644 index 000000000..cad5061ca --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "side": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "top": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_stairs_outer.json b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_stairs_outer.json new file mode 100644 index 000000000..97d15a4cd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/iron_plated_deepslate_tile_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "side": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile", + "top": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/light_dawnstone_casing.json b/src/generated/resources/assets/cosmiccore/models/block/light_dawnstone_casing.json new file mode 100644 index 000000000..7faa3c8b6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/light_dawnstone_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/light_ritual_stone.json b/src/generated/resources/assets/cosmiccore/models/block/light_ritual_stone.json new file mode 100644 index 000000000..7bf6d2a6e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/light_ritual_stone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/living_igniclad_coil_block.json b/src/generated/resources/assets/cosmiccore/models/block/living_igniclad_coil_block.json new file mode 100644 index 000000000..8471d2867 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/living_igniclad_coil_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/coils/living_igniclad" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/living_igniclad_coil_block_active.json b/src/generated/resources/assets/cosmiccore/models/block/living_igniclad_coil_block_active.json new file mode 100644 index 000000000..7236fdc07 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/living_igniclad_coil_block_active.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/cube_2_layer/all", + "textures": { + "bot_all": "cosmiccore:block/casings/coils/living_igniclad", + "top_all": "cosmiccore:block/casings/coils/living_igniclad_bloom" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/livingrock_tiles.json b/src/generated/resources/assets/cosmiccore/models/block/livingrock_tiles.json new file mode 100644 index 000000000..9f2e62e4f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/livingrock_tiles.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/arcane_crucible.json b/src/generated/resources/assets/cosmiccore/models/block/machine/arcane_crucible.json new file mode 100644 index 000000000..2583d789a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/arcane_crucible.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:arcane_crucible", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/arcane_distillery.json b/src/generated/resources/assets/cosmiccore/models/block/machine/arcane_distillery.json new file mode 100644 index 000000000..e197547c3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/arcane_distillery.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:arcane_distillery", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/atmo_pump.json b/src/generated/resources/assets/cosmiccore/models/block/machine/atmo_pump.json new file mode 100644 index 000000000..f6b20ec94 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/atmo_pump.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:atmo_pump", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/atomic_reconstructor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/atomic_reconstructor.json new file mode 100644 index 000000000..cf846c208 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/atomic_reconstructor.json @@ -0,0 +1,98 @@ +{ + "parent": "minecraft:block/block", + "dynamic_renders": [ + { + "type": "cosmiccore:hellfire_foundry_parts", + "casing_block": { + "Name": "cosmiccore:highly_conductive_fission_casing" + } + } + ], + "loader": "gtceu:machine", + "machine": "cosmiccore:atomic_reconstructor", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/biovat.json b/src/generated/resources/assets/cosmiccore/models/block/machine/biovat.json new file mode 100644 index 000000000..4fc965dae --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/biovat.json @@ -0,0 +1,95 @@ +{ + "parent": "minecraft:block/block", + "dynamic_renders": [ + { + "type": "cosmiccore:biovat_render" + } + ], + "loader": "gtceu:machine", + "machine": "cosmiccore:biovat", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/reinforced_naquadria_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_naquadria_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_naquadria_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_naquadria_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_naquadria_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_naquadria_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_naquadria_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_naquadria_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_naquadria_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/botanical_simulation_complex.json b/src/generated/resources/assets/cosmiccore/models/block/machine/botanical_simulation_complex.json new file mode 100644 index 000000000..411f3c73f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/botanical_simulation_complex.json @@ -0,0 +1,86 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:botanical_simulation_complex", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/capacitor_array.json b/src/generated/resources/assets/cosmiccore/models/block/machine/capacitor_array.json new file mode 100644 index 000000000..78eb1f540 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/capacitor_array.json @@ -0,0 +1,86 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:capacitor_array", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_palladium_substation" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_palladium_substation", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_palladium_substation", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_palladium_substation", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_palladium_substation", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_palladium_substation", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_palladium_substation", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_palladium_substation", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_palladium_substation", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/chromatic_distillation_plant.json b/src/generated/resources/assets/cosmiccore/models/block/machine/chromatic_distillation_plant.json new file mode 100644 index 000000000..539fc55b1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/chromatic_distillation_plant.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:chromatic_distillation_plant", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/chromatic_flotation_plant.json b/src/generated/resources/assets/cosmiccore/models/block/machine/chromatic_flotation_plant.json new file mode 100644 index 000000000..afe7a39c5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/chromatic_flotation_plant.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:chromatic_flotation_plant", + "texture_overrides": { + "all": "gtceu:block/casings/gcym/watertight_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/watertight_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/watertight_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/watertight_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/watertight_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/watertight_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/watertight_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/watertight_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/watertight_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/cinder_hearth.json b/src/generated/resources/assets/cosmiccore/models/block/machine/cinder_hearth.json new file mode 100644 index 000000000..cc01c15e5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/cinder_hearth.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:cinder_hearth", + "texture_overrides": { + "all": "cosmiccore:block/embers/archaic_large_bricks" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/embers/archaic_large_bricks", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/embers/archaic_large_bricks", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/embers/archaic_large_bricks", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/embers/archaic_large_bricks", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/embers/archaic_large_bricks", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/embers/archaic_large_bricks", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/embers/archaic_large_bricks", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/embers/archaic_large_bricks", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/component_assembly_line.json b/src/generated/resources/assets/cosmiccore/models/block/machine/component_assembly_line.json new file mode 100644 index 000000000..1a5a8f05b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/component_assembly_line.json @@ -0,0 +1,86 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:component_assembly_line", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/bichromal_nevramite_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/bichromal_nevramite_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/bichromal_nevramite_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/bichromal_nevramite_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/bichromal_nevramite_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/bichromal_nevramite_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/bichromal_nevramite_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/bichromal_nevramite_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/bichromal_nevramite_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/cosmic_me_assemblyline_bus.json b/src/generated/resources/assets/cosmiccore/models/block/machine/cosmic_me_assemblyline_bus.json new file mode 100644 index 000000000..eb9e58826 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/cosmic_me_assemblyline_bus.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:cosmic_me_assemblyline_bus", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/item_me_assemblyline", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/item_me_assemblyline", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/cosmic_me_assemblyline_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/cosmic_me_assemblyline_hatch.json new file mode 100644 index 000000000..5f18bca6f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/cosmic_me_assemblyline_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:cosmic_me_assemblyline_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/fluid_me_assemblyline", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/fluid_me_assemblyline", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/creative_thermal.json b/src/generated/resources/assets/cosmiccore/models/block/machine/creative_thermal.json new file mode 100644 index 000000000..1cdfb52c4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/creative_thermal.json @@ -0,0 +1,24 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:creative_thermal", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "": { + "model": { + "parent": "gtceu:block/machine/template/sided/single", + "textures": { + "bottom": "gtceu:block/casings/voltage/ulv/bottom", + "overlay": "gtceu:block/void", + "overlay_emissive": "gtceu:block/overlay/machine/overlay_energy_emitter", + "side": "gtceu:block/casings/voltage/ulv/side", + "top": "gtceu:block/casings/voltage/ulv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/crop_holder.json b/src/generated/resources/assets/cosmiccore/models/block/machine/crop_holder.json new file mode 100644 index 000000000..2aae1fb0d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/crop_holder.json @@ -0,0 +1,80 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:crop_holder", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/object_holder/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/object_holder/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/object_holder/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/object_holder/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/cryogenics_chamber.json b/src/generated/resources/assets/cosmiccore/models/block/machine/cryogenics_chamber.json new file mode 100644 index 000000000..dd7ad464c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/cryogenics_chamber.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:cryogenics_chamber", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/cryogenic_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/heavy_frost_proof_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/heavy_frost_proof_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/heavy_frost_proof_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/heavy_frost_proof_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/heavy_frost_proof_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/heavy_frost_proof_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/heavy_frost_proof_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/heavy_frost_proof_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/dawn_forge.json b/src/generated/resources/assets/cosmiccore/models/block/machine/dawn_forge.json new file mode 100644 index 000000000..109dff86b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/dawn_forge.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:dawn_forge", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/dawnforge_eclipsed.json b/src/generated/resources/assets/cosmiccore/models/block/machine/dawnforge_eclipsed.json new file mode 100644 index 000000000..08f920fd5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/dawnforge_eclipsed.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:dawnforge_eclipsed", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/dimensional_energy_capacitor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/dimensional_energy_capacitor.json new file mode 100644 index 000000000..efe83cf7f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/dimensional_energy_capacitor.json @@ -0,0 +1,86 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:dimensional_energy_capacitor", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_palladium_substation" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_palladium_substation", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_palladium_substation", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_palladium_substation", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_palladium_substation", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_palladium_substation", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_palladium_substation", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_palladium_substation", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_palladium_substation", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/dimensional_energy_interface.json b/src/generated/resources/assets/cosmiccore/models/block/machine/dimensional_energy_interface.json new file mode 100644 index 000000000..463fe77c1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/dimensional_energy_interface.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:dimensional_energy_interface", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_front": "gtceu:block/multiblock/data_bank/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/data_bank/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_front": "gtceu:block/multiblock/data_bank/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/data_bank/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_front": "gtceu:block/multiblock/data_bank/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/data_bank/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_front": "gtceu:block/multiblock/data_bank/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/data_bank/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_front": "gtceu:block/multiblock/data_bank/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/data_bank/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_front": "gtceu:block/multiblock/data_bank/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/data_bank/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_front": "gtceu:block/multiblock/data_bank/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/data_bank/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_front": "gtceu:block/multiblock/data_bank/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/data_bank/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/diving_bell.json b/src/generated/resources/assets/cosmiccore/models/block/machine/diving_bell.json new file mode 100644 index 000000000..d14bfcf4e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/diving_bell.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:diving_bell", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/dreamers_basin.json b/src/generated/resources/assets/cosmiccore/models/block/machine/dreamers_basin.json new file mode 100644 index 000000000..05a78f90f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/dreamers_basin.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:dreamers_basin", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/drone_maintenance_interface.json b/src/generated/resources/assets/cosmiccore/models/block/machine/drone_maintenance_interface.json new file mode 100644 index 000000000..6baee11df --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/drone_maintenance_interface.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:drone_maintenance_interface", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/drone_hatch_maint", + "textures": { + "bottom": "gtceu:block/casings/voltage/ev/bottom", + "side": "gtceu:block/casings/voltage/ev/side", + "top": "gtceu:block/casings/voltage/ev/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/drone_hatch_maint", + "textures": { + "bottom": "gtceu:block/casings/voltage/ev/bottom", + "side": "gtceu:block/casings/voltage/ev/side", + "top": "gtceu:block/casings/voltage/ev/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/drone_station.json b/src/generated/resources/assets/cosmiccore/models/block/machine/drone_station.json new file mode 100644 index 000000000..4f3aa1284 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/drone_station.json @@ -0,0 +1,86 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:drone_station", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/drygmy_grove.json b/src/generated/resources/assets/cosmiccore/models/block/machine/drygmy_grove.json new file mode 100644 index 000000000..f30d59900 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/drygmy_grove.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:drygmy_grove", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/data_bank/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/data_bank/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/data_bank/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/data_bank/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/data_bank/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/data_bank/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/data_bank/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/data_bank/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/data_bank/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/data_bank/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/data_bank/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/data_bank/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/data_bank/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/data_bank/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/data_bank/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/data_bank/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ev_biolab.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_biolab.json new file mode 100644 index 000000000..922125ca5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_biolab.json @@ -0,0 +1,51 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ev_biolab", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ev_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_calx_reactor.json new file mode 100644 index 000000000..067a6efce --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ev_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ev_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_mana_leaching_tub.json new file mode 100644 index 000000000..941627584 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ev_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ev_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_roaster.json new file mode 100644 index 000000000..0cf044338 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ev_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ev_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_thermomagnitizer.json new file mode 100644 index 000000000..991de3ac5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ev_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ev_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_vacuum_bubbler.json new file mode 100644 index 000000000..35648d308 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_vacuum_bubbler.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ev_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ev_wireless_charger.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_wireless_charger.json new file mode 100644 index 000000000..1db248c74 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ev_wireless_charger.json @@ -0,0 +1,43 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ev_wireless_charger", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/ev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/extreme_combustion_engine_cc.json b/src/generated/resources/assets/cosmiccore/models/block/machine/extreme_combustion_engine_cc.json new file mode 100644 index 000000000..1b1d8dd0e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/extreme_combustion_engine_cc.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:extreme_combustion_engine_cc", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/heavy_assembler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/heavy_assembler.json new file mode 100644 index 000000000..f76757862 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/heavy_assembler.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:heavy_assembler", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_interstellar_grade_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_interstellar_grade_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_interstellar_grade_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_interstellar_grade_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_interstellar_grade_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_interstellar_grade_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_interstellar_grade_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_interstellar_grade_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_interstellar_grade_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hellfire_foundry.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hellfire_foundry.json new file mode 100644 index 000000000..584751927 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hellfire_foundry.json @@ -0,0 +1,98 @@ +{ + "parent": "minecraft:block/block", + "dynamic_renders": [ + { + "type": "cosmiccore:hellfire_foundry_parts", + "casing_block": { + "Name": "cosmiccore:highly_conductive_fission_casing" + } + } + ], + "loader": "gtceu:machine", + "machine": "cosmiccore:hellfire_foundry", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/highly_conductive_fission_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hemophagic_transfuser.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hemophagic_transfuser.json new file mode 100644 index 000000000..c86883ed8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hemophagic_transfuser.json @@ -0,0 +1,95 @@ +{ + "parent": "minecraft:block/block", + "dynamic_renders": [ + { + "type": "cosmiccore:hemographic_transfuser" + } + ], + "loader": "gtceu:machine", + "machine": "cosmiccore:hemophagic_transfuser", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/high_pressure_assembler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/high_pressure_assembler.json new file mode 100644 index 000000000..48854f16f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/high_pressure_assembler.json @@ -0,0 +1,110 @@ +{ + "parent": "minecraft:block/block", + "dynamic_renders": [ + { + "type": "gtceu:boiler_multi_parts", + "casing_block": { + "Name": "cosmiccore:steel_plated_bronze_casing" + }, + "firebox_active": { + "Name": "gtceu:steel_firebox_casing", + "Properties": { + "active": "true" + } + }, + "firebox_idle": { + "Name": "gtceu:steel_firebox_casing", + "Properties": { + "active": "false" + } + } + } + ], + "loader": "gtceu:machine", + "machine": "cosmiccore:high_pressure_assembler", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/steel_plated_bronze_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/steel_plated_bronze_casing", + "overlay_front": "gtceu:block/multiblock/steam_oven/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/steam_oven/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/steel_plated_bronze_casing", + "overlay_front": "gtceu:block/multiblock/steam_oven/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/steam_oven/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/steel_plated_bronze_casing", + "overlay_front": "gtceu:block/multiblock/steam_oven/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/steam_oven/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/steel_plated_bronze_casing", + "overlay_front": "gtceu:block/multiblock/steam_oven/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/steam_oven/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/steel_plated_bronze_casing", + "overlay_front": "gtceu:block/multiblock/steam_oven/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/steam_oven/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/steel_plated_bronze_casing", + "overlay_front": "gtceu:block/multiblock/steam_oven/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/steam_oven/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/steel_plated_bronze_casing", + "overlay_front": "gtceu:block/multiblock/steam_oven/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/steam_oven/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/steel_plated_bronze_casing", + "overlay_front": "gtceu:block/multiblock/steam_oven/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/steam_oven/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hp_steam_bender.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hp_steam_bender.json new file mode 100644 index 000000000..e258c8338 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hp_steam_bender.json @@ -0,0 +1,61 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hp_steam_bender", + "multipart": [ + { + "apply": { + "model": { + "parent": "gtceu:block/casings/steam/bricked_steel", + "textures": { + "overlay_front": "gtceu:block/machines/bender/overlay_front" + } + } + }, + "when": { + "recipe_logic_status": "idle" + } + }, + { + "apply": { + "model": { + "parent": "gtceu:block/casings/steam/bricked_steel", + "textures": { + "overlay_front": "gtceu:block/machines/bender/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/bender/overlay_front_active_emissive" + } + } + }, + "when": { + "recipe_logic_status": "working" + } + }, + { + "apply": { + "model": { + "parent": "gtceu:block/casings/steam/bricked_steel", + "textures": { + "overlay_front": "gtceu:block/machines/bender/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/bender/overlay_front_active_emissive" + } + } + }, + "when": { + "recipe_logic_status": "waiting" + } + }, + { + "apply": { + "model": { + "parent": "gtceu:block/casings/steam/bricked_steel", + "textures": { + "overlay_front": "gtceu:block/machines/bender/overlay_front" + } + } + }, + "when": { + "recipe_logic_status": "suspend" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hp_steam_wiremill.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hp_steam_wiremill.json new file mode 100644 index 000000000..a080c46f0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hp_steam_wiremill.json @@ -0,0 +1,130 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hp_steam_wiremill", + "multipart": [ + { + "apply": { + "model": { + "parent": "gtceu:block/casings/steam/bricked_steel", + "textures": { + "overlay_front": "gtceu:block/machines/wiremill/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/wiremill/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/wiremill/overlay_side", + "overlay_top": "gtceu:block/machines/wiremill/overlay_top", + "overlay_top_emissive": "gtceu:block/machines/wiremill/overlay_top_emissive" + } + } + }, + "when": { + "recipe_logic_status": "idle" + } + }, + { + "apply": { + "model": { + "parent": "gtceu:block/casings/steam/bricked_steel", + "textures": { + "overlay_front": "gtceu:block/machines/wiremill/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/wiremill/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/wiremill/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/wiremill/overlay_side_active_emissive", + "overlay_top": "gtceu:block/machines/wiremill/overlay_top_active", + "overlay_top_emissive": "gtceu:block/machines/wiremill/overlay_top_active_emissive" + } + } + }, + "when": { + "recipe_logic_status": "working" + } + }, + { + "apply": { + "model": { + "parent": "gtceu:block/casings/steam/bricked_steel", + "textures": { + "overlay_front": "gtceu:block/machines/wiremill/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/wiremill/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/wiremill/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/wiremill/overlay_side_active_emissive", + "overlay_top": "gtceu:block/machines/wiremill/overlay_top_active", + "overlay_top_emissive": "gtceu:block/machines/wiremill/overlay_top_active_emissive" + } + } + }, + "when": { + "recipe_logic_status": "waiting" + } + }, + { + "apply": { + "model": { + "parent": "gtceu:block/casings/steam/bricked_steel", + "textures": { + "overlay_front": "gtceu:block/machines/wiremill/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/machines/wiremill/overlay_front_paused_emissive", + "overlay_side": "gtceu:block/machines/wiremill/overlay_side", + "overlay_top": "gtceu:block/machines/wiremill/overlay_top_paused", + "overlay_top_emissive": "gtceu:block/machines/wiremill/overlay_top_paused_emissive" + } + } + }, + "when": { + "recipe_logic_status": "suspend" + } + }, + { + "apply": { + "model": "gtceu:block/overlay/machine/overlay_steam_vent", + "x": 270 + }, + "when": { + "steam_vent": "up" + } + }, + { + "apply": { + "model": "gtceu:block/overlay/machine/overlay_steam_vent", + "x": 90 + }, + "when": { + "steam_vent": "down" + } + }, + { + "apply": { + "model": "gtceu:block/overlay/machine/overlay_steam_vent", + "y": 270 + }, + "when": { + "steam_vent": "left" + } + }, + { + "apply": { + "model": "gtceu:block/overlay/machine/overlay_steam_vent", + "y": 90 + }, + "when": { + "steam_vent": "right" + } + }, + { + "apply": { + "model": "gtceu:block/overlay/machine/overlay_steam_vent" + }, + "when": { + "steam_vent": "front" + } + }, + { + "apply": { + "model": "gtceu:block/overlay/machine/overlay_steam_vent", + "y": 180 + }, + "when": { + "steam_vent": "back" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/huge_sterilization_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/huge_sterilization_hatch.json new file mode 100644 index 000000000..3ac8f8336 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/huge_sterilization_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:huge_sterilization_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/cleaning_cover", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/cleaning_cover", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_calx_reactor.json new file mode 100644 index 000000000..855cb2ad8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_energy_output_hatch_16a.json new file mode 100644 index 000000000..94b9f897c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_energy_output_hatch_16a.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_energy_output_hatch_16a", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_energy_output_hatch_4a.json new file mode 100644 index 000000000..2fde54e9c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_energy_output_hatch_4a.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_energy_output_hatch_4a", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_input_hatch_4x.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_input_hatch_4x.json new file mode 100644 index 000000000..43d1bf319 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_input_hatch_4x.json @@ -0,0 +1,64 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_input_hatch_4x", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false,is_painted=false": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "overlay": "cosmiccore:block/overlay/machine/overlay_pipe_in_emissive", + "overlay_emissive": "cosmiccore:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "cosmiccore:block/overlay/machine/overlay_pipe_4x", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=false,is_painted=true": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "overlay": "cosmiccore:block/overlay/machine/overlay_pipe_in_emissive", + "overlay_emissive": "cosmiccore:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "cosmiccore:block/overlay/machine/overlay_pipe_4x", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=true,is_painted=false": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "overlay": "cosmiccore:block/overlay/machine/overlay_pipe_in_emissive", + "overlay_emissive": "cosmiccore:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "cosmiccore:block/overlay/machine/overlay_pipe_4x", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=true,is_painted=true": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "overlay": "cosmiccore:block/overlay/machine/overlay_pipe_in_emissive", + "overlay_emissive": "cosmiccore:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "cosmiccore:block/overlay/machine/overlay_pipe_4x", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_mana_leaching_tub.json new file mode 100644 index 000000000..4d37cfd1e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_output_hatch_4x.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_output_hatch_4x.json new file mode 100644 index 000000000..a7d3d5ee1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_output_hatch_4x.json @@ -0,0 +1,64 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_output_hatch_4x", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false,is_painted=false": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "overlay": "cosmiccore:block/overlay/machine/overlay_pipe_out_emissive", + "overlay_emissive": "cosmiccore:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "cosmiccore:block/overlay/machine/overlay_pipe_4x", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=false,is_painted=true": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "overlay": "cosmiccore:block/overlay/machine/overlay_pipe_out_emissive", + "overlay_emissive": "cosmiccore:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "cosmiccore:block/overlay/machine/overlay_pipe_4x", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=true,is_painted=false": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "overlay": "cosmiccore:block/overlay/machine/overlay_pipe_out_emissive", + "overlay_emissive": "cosmiccore:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "cosmiccore:block/overlay/machine/overlay_pipe_4x", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + }, + "is_formed=true,is_painted=true": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", + "textures": { + "bottom": "gtceu:block/casings/voltage/hv/bottom", + "overlay": "cosmiccore:block/overlay/machine/overlay_pipe_out_emissive", + "overlay_emissive": "cosmiccore:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "cosmiccore:block/overlay/machine/overlay_pipe_4x", + "side": "gtceu:block/casings/voltage/hv/side", + "top": "gtceu:block/casings/voltage/hv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_roaster.json new file mode 100644 index 000000000..58fef08d7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_thermomagnitizer.json new file mode 100644 index 000000000..c220bc747 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_vacuum_bubbler.json new file mode 100644 index 000000000..d72cafc34 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_vacuum_bubbler.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/hv_wireless_charger.json b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_wireless_charger.json new file mode 100644 index 000000000..d5ecb308b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/hv_wireless_charger.json @@ -0,0 +1,43 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:hv_wireless_charger", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/hv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/industrial_chemical_vat.json b/src/generated/resources/assets/cosmiccore/models/block/machine/industrial_chemical_vat.json new file mode 100644 index 000000000..d548c9027 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/industrial_chemical_vat.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:industrial_chemical_vat", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/industrial_primitive_blast_furnace.json b/src/generated/resources/assets/cosmiccore/models/block/machine/industrial_primitive_blast_furnace.json new file mode 100644 index 000000000..8b2abca02 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/industrial_primitive_blast_furnace.json @@ -0,0 +1,118 @@ +{ + "parent": "minecraft:block/block", + "dynamic_renders": [ + { + "type": "gtceu:boiler_multi_parts", + "casing_block": { + "Name": "cosmiccore:steel_plated_bronze_casing" + }, + "firebox_active": { + "Name": "gtceu:steel_firebox_casing", + "Properties": { + "active": "true" + } + }, + "firebox_idle": { + "Name": "gtceu:steel_firebox_casing", + "Properties": { + "active": "false" + } + } + }, + { + "type": "gtceu:fluid_area", + "block_light": 15, + "fixed_fluid": "minecraft:lava", + "offset_face": -0.125, + "overwrite_light": true, + "sky_light": 15 + } + ], + "loader": "gtceu:machine", + "machine": "cosmiccore:industrial_primitive_blast_furnace", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_primitive_bricks" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_primitive_bricks", + "overlay_front": "gtceu:block/multiblock/primitive_blast_furnace/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/primitive_blast_furnace/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_primitive_bricks", + "overlay_front": "gtceu:block/multiblock/primitive_blast_furnace/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/primitive_blast_furnace/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_primitive_bricks", + "overlay_front": "gtceu:block/multiblock/primitive_blast_furnace/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/primitive_blast_furnace/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_primitive_bricks", + "overlay_front": "gtceu:block/multiblock/primitive_blast_furnace/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/primitive_blast_furnace/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_primitive_bricks", + "overlay_front": "gtceu:block/multiblock/primitive_blast_furnace/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/primitive_blast_furnace/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_primitive_bricks", + "overlay_front": "gtceu:block/multiblock/primitive_blast_furnace/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/primitive_blast_furnace/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_primitive_bricks", + "overlay_front": "gtceu:block/multiblock/primitive_blast_furnace/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/primitive_blast_furnace/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_primitive_bricks", + "overlay_front": "gtceu:block/multiblock/primitive_blast_furnace/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/primitive_blast_furnace/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..2103c4da2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_16a_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_16a_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..7cdd61add --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_16a_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_16a_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..c5ddd0f90 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_4a_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_4a_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..aeb3a7ce8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_4a_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_4a_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_biolab.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_biolab.json new file mode 100644 index 000000000..15561d453 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_biolab.json @@ -0,0 +1,51 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_biolab", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_calx_reactor.json new file mode 100644 index 000000000..fd40ed495 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_mana_leaching_tub.json new file mode 100644 index 000000000..e85c708a6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_naquahine_mini_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_naquahine_mini_reactor.json new file mode 100644 index 000000000..5b8a035b1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_naquahine_mini_reactor.json @@ -0,0 +1,59 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_naquahine_mini_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back_active", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side_active", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top_active", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back_active", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side_active", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top_active", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_roaster.json new file mode 100644 index 000000000..dc8234a8a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_soul_input_hatch.json new file mode 100644 index 000000000..2e695da24 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_soul_input_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_soul_input_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_soul_output_hatch.json new file mode 100644 index 000000000..c8e936695 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_soul_output_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_soul_output_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_thermia_export_hatch.json new file mode 100644 index 000000000..be9f7b95f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_thermia_export_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_thermia_export_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_output_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_output_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_thermia_import_hatch.json new file mode 100644 index 000000000..c82abd814 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_thermia_import_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_thermia_import_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_input_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_input_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_thermomagnitizer.json new file mode 100644 index 000000000..d71990d91 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_vacuum_bubbler.json new file mode 100644 index 000000000..bd338baf1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_vacuum_bubbler.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_wireless_charger.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_wireless_charger.json new file mode 100644 index 000000000..b69bfda9c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_wireless_charger.json @@ -0,0 +1,43 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_wireless_charger", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/iv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_wireless_energy_dynamo.json new file mode 100644 index 000000000..339602e9a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/iv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_wireless_energy_hatch.json new file mode 100644 index 000000000..f21945905 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/iv_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:iv_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/iv/bottom", + "side": "gtceu:block/casings/voltage/iv/side", + "top": "gtceu:block/casings/voltage/iv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/large_combustion_engine_cc.json b/src/generated/resources/assets/cosmiccore/models/block/machine/large_combustion_engine_cc.json new file mode 100644 index 000000000..8ce1fb1d8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/large_combustion_engine_cc.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:large_combustion_engine_cc", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_stable_titanium" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_stable_titanium", + "overlay_front": "gtceu:block/multiblock/generator/large_combustion_engine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_combustion_engine/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_stable_titanium", + "overlay_front": "gtceu:block/multiblock/generator/large_combustion_engine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_combustion_engine/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_stable_titanium", + "overlay_front": "gtceu:block/multiblock/generator/large_combustion_engine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_combustion_engine/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_stable_titanium", + "overlay_front": "gtceu:block/multiblock/generator/large_combustion_engine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_combustion_engine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_stable_titanium", + "overlay_front": "gtceu:block/multiblock/generator/large_combustion_engine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_combustion_engine/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_stable_titanium", + "overlay_front": "gtceu:block/multiblock/generator/large_combustion_engine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_combustion_engine/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_stable_titanium", + "overlay_front": "gtceu:block/multiblock/generator/large_combustion_engine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_combustion_engine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_stable_titanium", + "overlay_front": "gtceu:block/multiblock/generator/large_combustion_engine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_combustion_engine/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/large_laminator.json b/src/generated/resources/assets/cosmiccore/models/block/machine/large_laminator.json new file mode 100644 index 000000000..54f2580b0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/large_laminator.json @@ -0,0 +1,86 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:large_laminator", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/power_substation/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/power_substation/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/large_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/large_roaster.json new file mode 100644 index 000000000..d26c55389 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/large_roaster.json @@ -0,0 +1,74 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:large_roaster", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_heatproof" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_heatproof" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_heatproof" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_heatproof" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_heatproof" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_heatproof" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_heatproof" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_heatproof" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_heatproof" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/large_spooling_machine.json b/src/generated/resources/assets/cosmiccore/models/block/machine/large_spooling_machine.json new file mode 100644 index 000000000..498520b5b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/large_spooling_machine.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:large_spooling_machine", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/ruridit_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ruridit_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ruridit_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ruridit_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ruridit_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ruridit_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ruridit_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ruridit_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/ruridit_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/larva.json b/src/generated/resources/assets/cosmiccore/models/block/machine/larva.json new file mode 100644 index 000000000..278648abf --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/larva.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:larva", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/link_test_station.json b/src/generated/resources/assets/cosmiccore/models/block/machine/link_test_station.json new file mode 100644 index 000000000..226c22b79 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/link_test_station.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:link_test_station", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lp_steam_bender.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lp_steam_bender.json new file mode 100644 index 000000000..bb4624fa3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lp_steam_bender.json @@ -0,0 +1,61 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lp_steam_bender", + "multipart": [ + { + "apply": { + "model": { + "parent": "gtceu:block/casings/steam/bricked_bronze", + "textures": { + "overlay_front": "gtceu:block/machines/bender/overlay_front" + } + } + }, + "when": { + "recipe_logic_status": "idle" + } + }, + { + "apply": { + "model": { + "parent": "gtceu:block/casings/steam/bricked_bronze", + "textures": { + "overlay_front": "gtceu:block/machines/bender/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/bender/overlay_front_active_emissive" + } + } + }, + "when": { + "recipe_logic_status": "working" + } + }, + { + "apply": { + "model": { + "parent": "gtceu:block/casings/steam/bricked_bronze", + "textures": { + "overlay_front": "gtceu:block/machines/bender/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/bender/overlay_front_active_emissive" + } + } + }, + "when": { + "recipe_logic_status": "waiting" + } + }, + { + "apply": { + "model": { + "parent": "gtceu:block/casings/steam/bricked_bronze", + "textures": { + "overlay_front": "gtceu:block/machines/bender/overlay_front" + } + } + }, + "when": { + "recipe_logic_status": "suspend" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lp_steam_wiremill.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lp_steam_wiremill.json new file mode 100644 index 000000000..3c8b70755 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lp_steam_wiremill.json @@ -0,0 +1,130 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lp_steam_wiremill", + "multipart": [ + { + "apply": { + "model": { + "parent": "gtceu:block/casings/steam/bricked_bronze", + "textures": { + "overlay_front": "gtceu:block/machines/wiremill/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/wiremill/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/wiremill/overlay_side", + "overlay_top": "gtceu:block/machines/wiremill/overlay_top", + "overlay_top_emissive": "gtceu:block/machines/wiremill/overlay_top_emissive" + } + } + }, + "when": { + "recipe_logic_status": "idle" + } + }, + { + "apply": { + "model": { + "parent": "gtceu:block/casings/steam/bricked_bronze", + "textures": { + "overlay_front": "gtceu:block/machines/wiremill/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/wiremill/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/wiremill/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/wiremill/overlay_side_active_emissive", + "overlay_top": "gtceu:block/machines/wiremill/overlay_top_active", + "overlay_top_emissive": "gtceu:block/machines/wiremill/overlay_top_active_emissive" + } + } + }, + "when": { + "recipe_logic_status": "working" + } + }, + { + "apply": { + "model": { + "parent": "gtceu:block/casings/steam/bricked_bronze", + "textures": { + "overlay_front": "gtceu:block/machines/wiremill/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/wiremill/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/wiremill/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/wiremill/overlay_side_active_emissive", + "overlay_top": "gtceu:block/machines/wiremill/overlay_top_active", + "overlay_top_emissive": "gtceu:block/machines/wiremill/overlay_top_active_emissive" + } + } + }, + "when": { + "recipe_logic_status": "waiting" + } + }, + { + "apply": { + "model": { + "parent": "gtceu:block/casings/steam/bricked_bronze", + "textures": { + "overlay_front": "gtceu:block/machines/wiremill/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/machines/wiremill/overlay_front_paused_emissive", + "overlay_side": "gtceu:block/machines/wiremill/overlay_side", + "overlay_top": "gtceu:block/machines/wiremill/overlay_top_paused", + "overlay_top_emissive": "gtceu:block/machines/wiremill/overlay_top_paused_emissive" + } + } + }, + "when": { + "recipe_logic_status": "suspend" + } + }, + { + "apply": { + "model": "gtceu:block/overlay/machine/overlay_steam_vent", + "x": 270 + }, + "when": { + "steam_vent": "up" + } + }, + { + "apply": { + "model": "gtceu:block/overlay/machine/overlay_steam_vent", + "x": 90 + }, + "when": { + "steam_vent": "down" + } + }, + { + "apply": { + "model": "gtceu:block/overlay/machine/overlay_steam_vent", + "y": 270 + }, + "when": { + "steam_vent": "left" + } + }, + { + "apply": { + "model": "gtceu:block/overlay/machine/overlay_steam_vent", + "y": 90 + }, + "when": { + "steam_vent": "right" + } + }, + { + "apply": { + "model": "gtceu:block/overlay/machine/overlay_steam_vent" + }, + "when": { + "steam_vent": "front" + } + }, + { + "apply": { + "model": "gtceu:block/overlay/machine/overlay_steam_vent", + "y": 180 + }, + "when": { + "steam_vent": "back" + } + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ludicrous_combustion_engine_cc.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ludicrous_combustion_engine_cc.json new file mode 100644 index 000000000..d0a33b1b9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ludicrous_combustion_engine_cc.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ludicrous_combustion_engine_cc", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/gilded_pthanterum_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/gilded_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/gilded_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/gilded_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/gilded_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/gilded_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/gilded_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/gilded_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/gilded_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lunar_sheer_hammer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lunar_sheer_hammer.json new file mode 100644 index 000000000..2c147d24f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lunar_sheer_hammer.json @@ -0,0 +1,95 @@ +{ + "parent": "minecraft:block/block", + "dynamic_renders": [ + { + "type": "cosmiccore:tester_render" + } + ], + "loader": "gtceu:machine", + "machine": "cosmiccore:lunar_sheer_hammer", + "texture_overrides": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..70dd46795 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_16a_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_16a_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..3af539f64 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_16a_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_16a_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..465699686 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_4a_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_4a_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..86c8fb1ff --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_4a_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_4a_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_biolab.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_biolab.json new file mode 100644 index 000000000..ba8eda02a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_biolab.json @@ -0,0 +1,51 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_biolab", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_calx_reactor.json new file mode 100644 index 000000000..8734d3f4d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_mana_leaching_tub.json new file mode 100644 index 000000000..a1c9cab9d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_naquahine_mini_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_naquahine_mini_reactor.json new file mode 100644 index 000000000..289c5598b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_naquahine_mini_reactor.json @@ -0,0 +1,59 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_naquahine_mini_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back_active", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side_active", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top_active", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back_active", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side_active", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top_active", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_roaster.json new file mode 100644 index 000000000..7b50cba2f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_soul_input_hatch.json new file mode 100644 index 000000000..9e12beb59 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_soul_input_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_soul_input_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_soul_output_hatch.json new file mode 100644 index 000000000..95466d9ed --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_soul_output_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_soul_output_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_thermia_export_hatch.json new file mode 100644 index 000000000..a1e497e5d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_thermia_export_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_thermia_export_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_output_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_output_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_thermia_import_hatch.json new file mode 100644 index 000000000..936e251cf --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_thermia_import_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_thermia_import_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_input_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_input_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_thermomagnitizer.json new file mode 100644 index 000000000..bb8606a86 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_vacuum_bubbler.json new file mode 100644 index 000000000..564753239 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_vacuum_bubbler.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_wireless_charger.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_wireless_charger.json new file mode 100644 index 000000000..f1018932f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_wireless_charger.json @@ -0,0 +1,43 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_wireless_charger", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/luv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_wireless_energy_dynamo.json new file mode 100644 index 000000000..7572c7a3b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/luv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_wireless_energy_hatch.json new file mode 100644 index 000000000..b594605b6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/luv_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:luv_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/luv/bottom", + "side": "gtceu:block/casings/voltage/luv/side", + "top": "gtceu:block/casings/voltage/luv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_calx_reactor.json new file mode 100644 index 000000000..fe73cf968 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_energy_output_hatch_16a.json new file mode 100644 index 000000000..5cb842c66 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_energy_output_hatch_16a.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lv_energy_output_hatch_16a", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/lv/bottom", + "side": "gtceu:block/casings/voltage/lv/side", + "top": "gtceu:block/casings/voltage/lv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/lv/bottom", + "side": "gtceu:block/casings/voltage/lv/side", + "top": "gtceu:block/casings/voltage/lv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_energy_output_hatch_4a.json new file mode 100644 index 000000000..4819397e6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_energy_output_hatch_4a.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lv_energy_output_hatch_4a", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/lv/bottom", + "side": "gtceu:block/casings/voltage/lv/side", + "top": "gtceu:block/casings/voltage/lv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/lv/bottom", + "side": "gtceu:block/casings/voltage/lv/side", + "top": "gtceu:block/casings/voltage/lv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_mana_leaching_tub.json new file mode 100644 index 000000000..5a59dd2a7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_roaster.json new file mode 100644 index 000000000..334b14e54 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_thermomagnitizer.json new file mode 100644 index 000000000..920ebda12 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/lv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_vacuum_bubbler.json new file mode 100644 index 000000000..caf705139 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/lv_vacuum_bubbler.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:lv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/lv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mana_etching_factory.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mana_etching_factory.json new file mode 100644 index 000000000..7e30691c8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mana_etching_factory.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mana_etching_factory", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/livingrock_tiles", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mantle_bore.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mantle_bore.json new file mode 100644 index 000000000..02f6d5cf8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mantle_bore.json @@ -0,0 +1,95 @@ +{ + "parent": "minecraft:block/block", + "dynamic_renders": [ + { + "type": "cosmiccore:tester_render" + } + ], + "loader": "gtceu:machine", + "machine": "cosmiccore:mantle_bore", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/moth_cargo_drop_off.json b/src/generated/resources/assets/cosmiccore/models/block/machine/moth_cargo_drop_off.json new file mode 100644 index 000000000..38a5ee47c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/moth_cargo_drop_off.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:moth_cargo_drop_off", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/moth_cargo_station.json b/src/generated/resources/assets/cosmiccore/models/block/machine/moth_cargo_station.json new file mode 100644 index 000000000..705efd090 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/moth_cargo_station.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:moth_cargo_station", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_calx_reactor.json new file mode 100644 index 000000000..000b1a9e7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_energy_output_hatch_16a.json new file mode 100644 index 000000000..e8c480200 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_energy_output_hatch_16a.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mv_energy_output_hatch_16a", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/mv/bottom", + "side": "gtceu:block/casings/voltage/mv/side", + "top": "gtceu:block/casings/voltage/mv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/mv/bottom", + "side": "gtceu:block/casings/voltage/mv/side", + "top": "gtceu:block/casings/voltage/mv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_energy_output_hatch_4a.json new file mode 100644 index 000000000..dd3f988cc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_energy_output_hatch_4a.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mv_energy_output_hatch_4a", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/mv/bottom", + "side": "gtceu:block/casings/voltage/mv/side", + "top": "gtceu:block/casings/voltage/mv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/mv/bottom", + "side": "gtceu:block/casings/voltage/mv/side", + "top": "gtceu:block/casings/voltage/mv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_mana_leaching_tub.json new file mode 100644 index 000000000..a48772620 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_roaster.json new file mode 100644 index 000000000..f0fd6d131 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_thermomagnitizer.json new file mode 100644 index 000000000..c9a98e655 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/mv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_vacuum_bubbler.json new file mode 100644 index 000000000..e93d9b09a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/mv_vacuum_bubbler.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:mv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/mv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/naquahine_pressure_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/naquahine_pressure_reactor.json new file mode 100644 index 000000000..15ca7d474 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/naquahine_pressure_reactor.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:naquahine_pressure_reactor", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/naquadah_pressure_resistant_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/naquadah_pressure_resistant_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/naquadah_pressure_resistant_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/naquadah_pressure_resistant_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/naquadah_pressure_resistant_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/naquadah_pressure_resistant_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/naquadah_pressure_resistant_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/naquadah_pressure_resistant_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/naquadah_pressure_resistant_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/oneiric_sieve.json b/src/generated/resources/assets/cosmiccore/models/block/machine/oneiric_sieve.json new file mode 100644 index 000000000..2261fb4db --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/oneiric_sieve.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:oneiric_sieve", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_front": "gtceu:block/multiblock/implosion_compressor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/implosion_compressor/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..1346328c6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_16a_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_16a_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..cb53a7c3f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_16a_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_16a_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..f25aa2812 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_4a_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_4a_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..67e805da7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_4a_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_4a_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_calx_reactor.json new file mode 100644 index 000000000..96e8a67ef --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_mana_leaching_tub.json new file mode 100644 index 000000000..57a2678a7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_roaster.json new file mode 100644 index 000000000..cb82ccf3c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_soul_input_hatch.json new file mode 100644 index 000000000..3eec836fe --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_soul_input_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_soul_input_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_soul_output_hatch.json new file mode 100644 index 000000000..c9f4751f9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_soul_output_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_soul_output_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_thermia_export_hatch.json new file mode 100644 index 000000000..ea461fb3b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_thermia_export_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_thermia_export_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_output_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_output_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_thermia_import_hatch.json new file mode 100644 index 000000000..db598a1aa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_thermia_import_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_thermia_import_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_input_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_input_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_thermomagnitizer.json new file mode 100644 index 000000000..dba379418 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_vacuum_bubbler.json new file mode 100644 index 000000000..c6308deda --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_vacuum_bubbler.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/opv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_wireless_energy_dynamo.json new file mode 100644 index 000000000..feba56505 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/opv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_wireless_energy_hatch.json new file mode 100644 index 000000000..26589eb63 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/opv_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:opv_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/opv/bottom", + "side": "gtceu:block/casings/voltage/opv/side", + "top": "gtceu:block/casings/voltage/opv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/orbital_tempering_forge.json b/src/generated/resources/assets/cosmiccore/models/block/machine/orbital_tempering_forge.json new file mode 100644 index 000000000..fa233e714 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/orbital_tempering_forge.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:orbital_tempering_forge", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ore_extraction_drill_hv.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ore_extraction_drill_hv.json new file mode 100644 index 000000000..a2f415a85 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ore_extraction_drill_hv.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ore_extraction_drill_hv", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_clean_stainless_steel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ore_extraction_drill_iv.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ore_extraction_drill_iv.json new file mode 100644 index 000000000..f0d4a6dba --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ore_extraction_drill_iv.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ore_extraction_drill_iv", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_stable_titanium" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_stable_titanium", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_stable_titanium", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_stable_titanium", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_stable_titanium", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_stable_titanium", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_stable_titanium", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_stable_titanium", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_stable_titanium", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ore_extraction_drill_lv.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ore_extraction_drill_lv.json new file mode 100644 index 000000000..7c2fe7cd8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ore_extraction_drill_lv.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ore_extraction_drill_lv", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_solid_steel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ore_extraction_drill_zpm.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ore_extraction_drill_zpm.json new file mode 100644 index 000000000..76379b81a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ore_extraction_drill_zpm.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ore_extraction_drill_zpm", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_robust_tungstensteel", + "overlay_front": "gtceu:block/multiblock/large_miner/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/large_miner/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/pcb_foundry.json b/src/generated/resources/assets/cosmiccore/models/block/machine/pcb_foundry.json new file mode 100644 index 000000000..50231db2c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/pcb_foundry.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:pcb_foundry", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/bichromal_nevramite_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/bichromal_nevramite_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/bichromal_nevramite_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/bichromal_nevramite_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/bichromal_nevramite_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/bichromal_nevramite_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/bichromal_nevramite_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/bichromal_nevramite_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/bichromal_nevramite_casing", + "overlay_front": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/vomahine_chemplant/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/plasmite_distillery.json b/src/generated/resources/assets/cosmiccore/models/block/machine/plasmite_distillery.json new file mode 100644 index 000000000..5676ee3b5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/plasmite_distillery.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:plasmite_distillery", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/polymerizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/polymerizer.json new file mode 100644 index 000000000..194dd9dde --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/polymerizer.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:polymerizer", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_tolerance_rhenium_casing", + "overlay_front": "gtceu:block/multiblock/assembly_line/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/assembly_line/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_tolerance_rhenium_casing", + "overlay_front": "gtceu:block/multiblock/assembly_line/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/assembly_line/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_tolerance_rhenium_casing", + "overlay_front": "gtceu:block/multiblock/assembly_line/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/assembly_line/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_tolerance_rhenium_casing", + "overlay_front": "gtceu:block/multiblock/assembly_line/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/assembly_line/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_tolerance_rhenium_casing", + "overlay_front": "gtceu:block/multiblock/assembly_line/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/assembly_line/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_tolerance_rhenium_casing", + "overlay_front": "gtceu:block/multiblock/assembly_line/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/assembly_line/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_tolerance_rhenium_casing", + "overlay_front": "gtceu:block/multiblock/assembly_line/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/assembly_line/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_tolerance_rhenium_casing", + "overlay_front": "gtceu:block/multiblock/assembly_line/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/assembly_line/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/prismatic_ore_foundry.json b/src/generated/resources/assets/cosmiccore/models/block/machine/prismatic_ore_foundry.json new file mode 100644 index 000000000..3d8429673 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/prismatic_ore_foundry.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:prismatic_ore_foundry", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/self_healing_pthanterum_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/self_healing_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/self_healing_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/self_healing_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/self_healing_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/self_healing_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/self_healing_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/self_healing_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/self_healing_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/pyrothermic_refinery.json b/src/generated/resources/assets/cosmiccore/models/block/machine/pyrothermic_refinery.json new file mode 100644 index 000000000..390790b91 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/pyrothermic_refinery.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:pyrothermic_refinery", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/light_dawnstone_casing", + "overlay_front": "cosmiccore:block/multiblock/dawnforge/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/dawnforge/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/sensor_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/sensor_hatch.json new file mode 100644 index 000000000..42571c85c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/sensor_hatch.json @@ -0,0 +1,80 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:sensor_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/ulv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/ulv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/ulv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/object_holder/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/ulv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/object_holder/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/ulv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/ulv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/ulv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/object_holder/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/ulv", + "textures": { + "overlay_front": "gtceu:block/machines/object_holder/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/object_holder/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/soul_tester.json b/src/generated/resources/assets/cosmiccore/models/block/machine/soul_tester.json new file mode 100644 index 000000000..f06ad9cce --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/soul_tester.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:soul_tester", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", + "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", + "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", + "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", + "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", + "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", + "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", + "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_inert_ptfe", + "overlay_front": "gtceu:block/multiblock/coke_oven/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/coke_oven/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/spirit_crucible.json b/src/generated/resources/assets/cosmiccore/models/block/machine/spirit_crucible.json new file mode 100644 index 000000000..4d358fcbe --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/spirit_crucible.json @@ -0,0 +1,95 @@ +{ + "parent": "minecraft:block/block", + "dynamic_renders": [ + { + "type": "cosmiccore:spirit_crucible" + } + ], + "loader": "gtceu:machine", + "machine": "cosmiccore:spirit_crucible", + "texture_overrides": { + "all": "gtceu:block/casings/gcym/atomic_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/atomic_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/atomic_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/atomic_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/atomic_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/atomic_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/atomic_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/atomic_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/atomic_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/star_ladder.json b/src/generated/resources/assets/cosmiccore/models/block/machine/star_ladder.json new file mode 100644 index 000000000..80e39b1aa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/star_ladder.json @@ -0,0 +1,95 @@ +{ + "parent": "minecraft:block/block", + "dynamic_renders": [ + { + "type": "cosmiccore:star_ladder_render" + } + ], + "loader": "gtceu:machine", + "machine": "cosmiccore:star_ladder", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/star_ladder_research_hub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/star_ladder_research_hub.json new file mode 100644 index 000000000..0ba38eccd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/star_ladder_research_hub.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:star_ladder_research_hub", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/steam_caster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_caster.json new file mode 100644 index 000000000..e4c19578a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_caster.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:steam_caster", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_coke_bricks" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_coke_bricks", + "overlay_front": "cosmiccore:block/multiblock/solidifier/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/solidifier/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_coke_bricks", + "overlay_front": "cosmiccore:block/multiblock/solidifier/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/solidifier/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_coke_bricks", + "overlay_front": "cosmiccore:block/multiblock/solidifier/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/solidifier/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_coke_bricks", + "overlay_front": "cosmiccore:block/multiblock/solidifier/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/solidifier/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_coke_bricks", + "overlay_front": "cosmiccore:block/multiblock/solidifier/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/solidifier/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_coke_bricks", + "overlay_front": "cosmiccore:block/multiblock/solidifier/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/solidifier/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_coke_bricks", + "overlay_front": "cosmiccore:block/multiblock/solidifier/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/solidifier/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_coke_bricks", + "overlay_front": "cosmiccore:block/multiblock/solidifier/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/solidifier/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_input_hatch.json new file mode 100644 index 000000000..f36a730e3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_input_hatch.json @@ -0,0 +1,64 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:steam_fluid_input_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false,is_painted=false": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", + "textures": { + "bottom": "gtceu:block/casings/steam/bronze/bottom", + "overlay": "gtceu:block/overlay/machine/overlay_pipe", + "overlay_emissive": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "side": "gtceu:block/casings/steam/bronze/side", + "top": "gtceu:block/casings/steam/bronze/top" + } + } + }, + "is_formed=false,is_painted=true": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", + "textures": { + "bottom": "gtceu:block/casings/steam/bronze/bottom", + "overlay": "gtceu:block/overlay/machine/overlay_pipe", + "overlay_emissive": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "side": "gtceu:block/casings/steam/bronze/side", + "top": "gtceu:block/casings/steam/bronze/top" + } + } + }, + "is_formed=true,is_painted=false": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", + "textures": { + "bottom": "gtceu:block/casings/steam/bronze/bottom", + "overlay": "gtceu:block/overlay/machine/overlay_pipe", + "overlay_emissive": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "side": "gtceu:block/casings/steam/bronze/side", + "top": "gtceu:block/casings/steam/bronze/top" + } + } + }, + "is_formed=true,is_painted=true": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", + "textures": { + "bottom": "gtceu:block/casings/steam/bronze/bottom", + "overlay": "gtceu:block/overlay/machine/overlay_pipe", + "overlay_emissive": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "side": "gtceu:block/casings/steam/bronze/side", + "top": "gtceu:block/casings/steam/bronze/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_output_hatch.json new file mode 100644 index 000000000..4b6aab8b7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_fluid_output_hatch.json @@ -0,0 +1,64 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:steam_fluid_output_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false,is_painted=false": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", + "textures": { + "bottom": "gtceu:block/casings/steam/bronze/bottom", + "overlay": "gtceu:block/overlay/machine/overlay_pipe", + "overlay_emissive": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "side": "gtceu:block/casings/steam/bronze/side", + "top": "gtceu:block/casings/steam/bronze/top" + } + } + }, + "is_formed=false,is_painted=true": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", + "textures": { + "bottom": "gtceu:block/casings/steam/bronze/bottom", + "overlay": "gtceu:block/overlay/machine/overlay_pipe", + "overlay_emissive": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "side": "gtceu:block/casings/steam/bronze/side", + "top": "gtceu:block/casings/steam/bronze/top" + } + } + }, + "is_formed=true,is_painted=false": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive", + "textures": { + "bottom": "gtceu:block/casings/steam/bronze/bottom", + "overlay": "gtceu:block/overlay/machine/overlay_pipe", + "overlay_emissive": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "side": "gtceu:block/casings/steam/bronze/side", + "top": "gtceu:block/casings/steam/bronze/top" + } + } + }, + "is_formed=true,is_painted=true": { + "model": { + "parent": "gtceu:block/machine/template/part/hatch_machine_emissive_color_ring", + "textures": { + "bottom": "gtceu:block/casings/steam/bronze/bottom", + "overlay": "gtceu:block/overlay/machine/overlay_pipe", + "overlay_emissive": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "overlay_pipe": "gtceu:block/overlay/machine/overlay_fluid_hatch", + "side": "gtceu:block/casings/steam/bronze/side", + "top": "gtceu:block/casings/steam/bronze/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/steam_large_turbine.json b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_large_turbine.json new file mode 100644 index 000000000..76ed598af --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_large_turbine.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:steam_large_turbine", + "texture_overrides": { + "all": "gtceu:block/casings/mechanic/machine_casing_turbine_steel" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/mechanic/machine_casing_turbine_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/mechanic/machine_casing_turbine_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/mechanic/machine_casing_turbine_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/mechanic/machine_casing_turbine_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/mechanic/machine_casing_turbine_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/mechanic/machine_casing_turbine_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/mechanic/machine_casing_turbine_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/mechanic/machine_casing_turbine_steel", + "overlay_front": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_steam_turbine/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/steam_mixing_vessel.json b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_mixing_vessel.json new file mode 100644 index 000000000..f8eade89a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/steam_mixing_vessel.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:steam_mixing_vessel", + "texture_overrides": { + "all": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks", + "overlay_front": "cosmiccore:block/multiblock/mixing_vessel/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/mixing_vessel/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks", + "overlay_front": "cosmiccore:block/multiblock/mixing_vessel/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/mixing_vessel/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks", + "overlay_front": "cosmiccore:block/multiblock/mixing_vessel/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/mixing_vessel/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks", + "overlay_front": "cosmiccore:block/multiblock/mixing_vessel/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/mixing_vessel/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks", + "overlay_front": "cosmiccore:block/multiblock/mixing_vessel/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/mixing_vessel/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks", + "overlay_front": "cosmiccore:block/multiblock/mixing_vessel/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/mixing_vessel/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks", + "overlay_front": "cosmiccore:block/multiblock/mixing_vessel/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/mixing_vessel/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/solid/machine_casing_bronze_plated_bricks", + "overlay_front": "cosmiccore:block/multiblock/mixing_vessel/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/mixing_vessel/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/stellar_iris.json b/src/generated/resources/assets/cosmiccore/models/block/machine/stellar_iris.json new file mode 100644 index 000000000..809ee2e07 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/stellar_iris.json @@ -0,0 +1,95 @@ +{ + "parent": "minecraft:block/block", + "dynamic_renders": [ + { + "type": "cosmiccore:stellar_iris" + } + ], + "loader": "gtceu:machine", + "machine": "cosmiccore:stellar_iris", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/stellar_smelting_module.json b/src/generated/resources/assets/cosmiccore/models/block/machine/stellar_smelting_module.json new file mode 100644 index 000000000..a0d2c1d4d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/stellar_smelting_module.json @@ -0,0 +1,74 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:stellar_smelting_module", + "texture_overrides": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/gcym/high_temperature_smelting_casing" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/sterilization_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/sterilization_hatch.json new file mode 100644 index 000000000..90166c566 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/sterilization_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:sterilization_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/cleaning_cover", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/cleaning_cover", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/submerged_welder.json b/src/generated/resources/assets/cosmiccore/models/block/machine/submerged_welder.json new file mode 100644 index 000000000..37632402f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/submerged_welder.json @@ -0,0 +1,95 @@ +{ + "parent": "minecraft:block/block", + "dynamic_renders": [ + { + "type": "cosmiccore:welder_arm_render" + } + ], + "loader": "gtceu:machine", + "machine": "cosmiccore:submerged_welder", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/naquadah_pressure_resistant_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/naquadah_pressure_resistant_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/naquadah_pressure_resistant_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/naquadah_pressure_resistant_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/naquadah_pressure_resistant_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/naquadah_pressure_resistant_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/naquadah_pressure_resistant_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/naquadah_pressure_resistant_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/naquadah_pressure_resistant_casing", + "overlay_front": "gtceu:block/multiblock/hpca/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/hpca/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/suffering_chamber.json b/src/generated/resources/assets/cosmiccore/models/block/machine/suffering_chamber.json new file mode 100644 index 000000000..aa7a1f2f9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/suffering_chamber.json @@ -0,0 +1,95 @@ +{ + "parent": "minecraft:block/block", + "dynamic_renders": [ + { + "type": "cosmiccore:suffering_chamber" + } + ], + "loader": "gtceu:machine", + "machine": "cosmiccore:suffering_chamber", + "texture_overrides": { + "all": "gtceu:block/casings/gcym/stress_proof_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing", + "overlay_front": "gtceu:block/multiblock/network_switch/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/network_switch/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/titan_fusion_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/titan_fusion_reactor.json new file mode 100644 index 000000000..d79d793ac --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/titan_fusion_reactor.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:titan_fusion_reactor", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..823ef5915 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_16a_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_16a_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..98c4106ee --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_16a_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_16a_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..647f8daf4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_4a_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_4a_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..e064b2746 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_4a_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_4a_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_calx_reactor.json new file mode 100644 index 000000000..e1db4c6a1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_cosmic_parallel_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_cosmic_parallel_hatch.json new file mode 100644 index 000000000..6d30dba72 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_cosmic_parallel_hatch.json @@ -0,0 +1,27 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_cosmic_parallel_hatch", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uev" + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uev" + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uev" + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uev" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_mana_leaching_tub.json new file mode 100644 index 000000000..35c45986b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_module_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_module_hatch.json new file mode 100644 index 000000000..4e9669621 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_module_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_module_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/module_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/module_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_roaster.json new file mode 100644 index 000000000..a9b7af73b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_soul_input_hatch.json new file mode 100644 index 000000000..d751abe6c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_soul_input_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_soul_input_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_soul_output_hatch.json new file mode 100644 index 000000000..6ac1c8519 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_soul_output_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_soul_output_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_thermia_export_hatch.json new file mode 100644 index 000000000..adaebe0d3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_thermia_export_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_thermia_export_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_output_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_output_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_thermia_import_hatch.json new file mode 100644 index 000000000..499f8c1da --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_thermia_import_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_thermia_import_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_input_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_input_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_thermomagnitizer.json new file mode 100644 index 000000000..765490d5f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_vacuum_bubbler.json new file mode 100644 index 000000000..16741036f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_vacuum_bubbler.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_wireless_charger.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_wireless_charger.json new file mode 100644 index 000000000..663341d66 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_wireless_charger.json @@ -0,0 +1,43 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_wireless_charger", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uev", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_wireless_energy_dynamo.json new file mode 100644 index 000000000..33ecf02e8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uev_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_wireless_energy_hatch.json new file mode 100644 index 000000000..0de8b4dbf --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uev_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uev_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..10dea7405 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_16a_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_16a_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..3070bd6c0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_16a_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_16a_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..9a1e41d14 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_4a_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_4a_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..1c1bc6844 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_4a_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_4a_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_calx_reactor.json new file mode 100644 index 000000000..4c74a7ab5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_cosmic_parallel_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_cosmic_parallel_hatch.json new file mode 100644 index 000000000..813078a1e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_cosmic_parallel_hatch.json @@ -0,0 +1,27 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_cosmic_parallel_hatch", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv" + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv" + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv" + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_mana_leaching_tub.json new file mode 100644 index 000000000..65bb1a710 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_module_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_module_hatch.json new file mode 100644 index 000000000..d6b530cbe --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_module_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_module_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/module_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/module_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_naquahine_mini_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_naquahine_mini_reactor.json new file mode 100644 index 000000000..15616d363 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_naquahine_mini_reactor.json @@ -0,0 +1,59 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_naquahine_mini_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back_active", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side_active", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top_active", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back_active", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side_active", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top_active", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_roaster.json new file mode 100644 index 000000000..33d907e18 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_soul_input_hatch.json new file mode 100644 index 000000000..6704fafae --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_soul_input_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_soul_input_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_soul_output_hatch.json new file mode 100644 index 000000000..428a2f709 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_soul_output_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_soul_output_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_thermia_export_hatch.json new file mode 100644 index 000000000..0d6e57699 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_thermia_export_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_thermia_export_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_output_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_output_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_thermia_import_hatch.json new file mode 100644 index 000000000..10a298de8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_thermia_import_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_thermia_import_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_input_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_input_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_thermomagnitizer.json new file mode 100644 index 000000000..9c812aedd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_vacuum_bubbler.json new file mode 100644 index 000000000..fc8bce846 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_vacuum_bubbler.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_wireless_charger.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_wireless_charger.json new file mode 100644 index 000000000..96922f594 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_wireless_charger.json @@ -0,0 +1,43 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_wireless_charger", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uhv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_wireless_energy_dynamo.json new file mode 100644 index 000000000..777373711 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_wireless_energy_hatch.json new file mode 100644 index 000000000..053c58c9d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uhv_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uhv_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uhv/bottom", + "side": "gtceu:block/casings/voltage/uhv/side", + "top": "gtceu:block/casings/voltage/uhv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..4ef429cba --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_16a_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_16a_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..1a9b255e1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_16a_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_16a_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..d2d0d5343 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_4a_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_4a_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..28e3fd0eb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_4a_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_4a_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_calx_reactor.json new file mode 100644 index 000000000..679e6e105 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_cosmic_parallel_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_cosmic_parallel_hatch.json new file mode 100644 index 000000000..5eae82ce9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_cosmic_parallel_hatch.json @@ -0,0 +1,27 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_cosmic_parallel_hatch", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv" + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv" + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv" + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv" + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_mana_leaching_tub.json new file mode 100644 index 000000000..4cfe32b26 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_roaster.json new file mode 100644 index 000000000..a4f289299 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_soul_input_hatch.json new file mode 100644 index 000000000..047ef111e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_soul_input_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_soul_input_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_soul_output_hatch.json new file mode 100644 index 000000000..40b67d6f6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_soul_output_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_soul_output_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_thermia_export_hatch.json new file mode 100644 index 000000000..523578e6e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_thermia_export_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_thermia_export_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_output_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_output_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_thermia_import_hatch.json new file mode 100644 index 000000000..6d11b6633 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_thermia_import_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_thermia_import_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_input_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_input_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_thermomagnitizer.json new file mode 100644 index 000000000..172777ab0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_vacuum_bubbler.json new file mode 100644 index 000000000..95af09fdd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_vacuum_bubbler.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_wireless_charger.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_wireless_charger.json new file mode 100644 index 000000000..6a8ef9e0f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_wireless_charger.json @@ -0,0 +1,43 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_wireless_charger", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uiv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_wireless_energy_dynamo.json new file mode 100644 index 000000000..79ccde8f0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_wireless_energy_hatch.json new file mode 100644 index 000000000..5de910c86 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uiv_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uiv_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uiv/bottom", + "side": "gtceu:block/casings/voltage/uiv/side", + "top": "gtceu:block/casings/voltage/uiv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ultimate_combustion_engine_cc.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ultimate_combustion_engine_cc.json new file mode 100644 index 000000000..09147b7d6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ultimate_combustion_engine_cc.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ultimate_combustion_engine_cc", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/reinforced_naquadria_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_naquadria_casing", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_naquadria_casing", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_naquadria_casing", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_naquadria_casing", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_naquadria_casing", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_naquadria_casing", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_naquadria_casing", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_naquadria_casing", + "overlay_front": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/extreme_combustion_engine/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ulv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ulv_energy_output_hatch_16a.json new file mode 100644 index 000000000..71d091acb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ulv_energy_output_hatch_16a.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ulv_energy_output_hatch_16a", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/ulv/bottom", + "side": "gtceu:block/casings/voltage/ulv/side", + "top": "gtceu:block/casings/voltage/ulv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/ulv/bottom", + "side": "gtceu:block/casings/voltage/ulv/side", + "top": "gtceu:block/casings/voltage/ulv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/ulv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/models/block/machine/ulv_energy_output_hatch_4a.json new file mode 100644 index 000000000..0f624e427 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/ulv_energy_output_hatch_4a.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:ulv_energy_output_hatch_4a", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/ulv/bottom", + "side": "gtceu:block/casings/voltage/ulv/side", + "top": "gtceu:block/casings/voltage/ulv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/energy_output_hatch_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/ulv/bottom", + "side": "gtceu:block/casings/voltage/ulv/side", + "top": "gtceu:block/casings/voltage/ulv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..d2150c6a0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_16a_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_16a_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..c6a112271 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_16a_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_16a_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..b40eeff08 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_4a_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_4a_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..371ba254d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_4a_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_4a_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_biolab.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_biolab.json new file mode 100644 index 000000000..1c55b231d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_biolab.json @@ -0,0 +1,51 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_biolab", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_calx_reactor.json new file mode 100644 index 000000000..79d015c41 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_cosmic_parallel_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_cosmic_parallel_hatch.json new file mode 100644 index 000000000..5bed3c05d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_cosmic_parallel_hatch.json @@ -0,0 +1,43 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_cosmic_parallel_hatch", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/parallel_hatch_mk4/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/parallel_hatch_mk4/overlay_front_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/parallel_hatch_mk4/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/parallel_hatch_mk4/overlay_front_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/parallel_hatch_mk4/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/parallel_hatch_mk4/overlay_front_active_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "gtceu:block/machines/parallel_hatch_mk4/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/parallel_hatch_mk4/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_mana_leaching_tub.json new file mode 100644 index 000000000..d3cccc9d5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_module_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_module_hatch.json new file mode 100644 index 000000000..f88fc8a0c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_module_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_module_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/module_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/module_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_naquahine_mini_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_naquahine_mini_reactor.json new file mode 100644 index 000000000..6a1075770 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_naquahine_mini_reactor.json @@ -0,0 +1,59 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_naquahine_mini_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back_active", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side_active", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top_active", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back_active", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side_active", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top_active", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_roaster.json new file mode 100644 index 000000000..2cc059e66 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_soul_input_hatch.json new file mode 100644 index 000000000..86e82c5af --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_soul_input_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_soul_input_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_soul_output_hatch.json new file mode 100644 index 000000000..b1cf3ff87 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_soul_output_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_soul_output_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_thermia_export_hatch.json new file mode 100644 index 000000000..01339504b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_thermia_export_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_thermia_export_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_output_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_output_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_thermia_import_hatch.json new file mode 100644 index 000000000..49fe6c116 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_thermia_import_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_thermia_import_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_input_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_input_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_thermomagnitizer.json new file mode 100644 index 000000000..3bbc20fd2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_vacuum_bubbler.json new file mode 100644 index 000000000..44cfd4df6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_vacuum_bubbler.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_wireless_charger.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_wireless_charger.json new file mode 100644 index 000000000..0b7ae4de3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_wireless_charger.json @@ -0,0 +1,43 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_wireless_charger", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_wireless_energy_dynamo.json new file mode 100644 index 000000000..97815572c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_wireless_energy_hatch.json new file mode 100644 index 000000000..442cb1552 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uv_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uv_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uv/bottom", + "side": "gtceu:block/casings/voltage/uv/side", + "top": "gtceu:block/casings/voltage/uv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..e143f9f6d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_16a_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_16a_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..d28027d4c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_16a_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_16a_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..3fe8dcc36 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_4a_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_4a_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..f401f2c12 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_4a_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_4a_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_calx_reactor.json new file mode 100644 index 000000000..f4b430c3d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_mana_leaching_tub.json new file mode 100644 index 000000000..91facfee0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_roaster.json new file mode 100644 index 000000000..69a8661b2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_soul_input_hatch.json new file mode 100644 index 000000000..51858f6cb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_soul_input_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_soul_input_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_soul_output_hatch.json new file mode 100644 index 000000000..5144673cb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_soul_output_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_soul_output_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_thermia_export_hatch.json new file mode 100644 index 000000000..1269792ef --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_thermia_export_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_thermia_export_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_output_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_output_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_thermia_import_hatch.json new file mode 100644 index 000000000..4afc629ee --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_thermia_import_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_thermia_import_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_input_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_input_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_thermomagnitizer.json new file mode 100644 index 000000000..5af03238a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_vacuum_bubbler.json new file mode 100644 index 000000000..98ac916f9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_vacuum_bubbler.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/uxv", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_wireless_energy_dynamo.json new file mode 100644 index 000000000..1fab102db --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_wireless_energy_hatch.json new file mode 100644 index 000000000..5d99e877f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/uxv_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:uxv_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/uxv/bottom", + "side": "gtceu:block/casings/voltage/uxv/side", + "top": "gtceu:block/casings/voltage/uxv/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/vile_fission.json b/src/generated/resources/assets/cosmiccore/models/block/machine/vile_fission.json new file mode 100644 index 000000000..8bcdf3d2f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/vile_fission.json @@ -0,0 +1,82 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:vile_fission", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/void_fluid_rig.json b/src/generated/resources/assets/cosmiccore/models/block/machine/void_fluid_rig.json new file mode 100644 index 000000000..228b575e5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/void_fluid_rig.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:void_fluid_rig", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/gilded_pthanterum_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/gilded_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/gilded_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/gilded_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/gilded_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/gilded_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/gilded_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/gilded_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/gilded_pthanterum_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/void_miner.json b/src/generated/resources/assets/cosmiccore/models/block/machine/void_miner.json new file mode 100644 index 000000000..908fc4f63 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/void_miner.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:void_miner", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/high_tolerance_rhenium_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_tolerance_rhenium_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_tolerance_rhenium_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_tolerance_rhenium_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_tolerance_rhenium_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_tolerance_rhenium_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_tolerance_rhenium_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_tolerance_rhenium_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_tolerance_rhenium_casing", + "overlay_front": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/generator/large_gas_turbine/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/void_salt_fissiom.json b/src/generated/resources/assets/cosmiccore/models/block/machine/void_salt_fissiom.json new file mode 100644 index 000000000..b2465be5f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/void_salt_fissiom.json @@ -0,0 +1,82 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:void_salt_fissiom", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/high_temperature_fission_casing", + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/vomahine_celestial_laser_bore.json b/src/generated/resources/assets/cosmiccore/models/block/machine/vomahine_celestial_laser_bore.json new file mode 100644 index 000000000..76d4b0aa7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/vomahine_celestial_laser_bore.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:vomahine_celestial_laser_bore", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/vorax_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/vorax_reactor.json new file mode 100644 index 000000000..681b605f1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/vorax_reactor.json @@ -0,0 +1,95 @@ +{ + "parent": "minecraft:block/block", + "dynamic_renders": [ + { + "type": "cosmiccore:concept_incinerator" + } + ], + "loader": "gtceu:machine", + "machine": "cosmiccore:vorax_reactor", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing", + "overlay_front": "gtceu:block/multiblock/fusion_reactor/overlay_front_active", + "overlay_front_emissive": "gtceu:block/multiblock/fusion_reactor/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/wasp.json b/src/generated/resources/assets/cosmiccore/models/block/machine/wasp.json new file mode 100644 index 000000000..cfd5909eb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/wasp.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:wasp", + "texture_overrides": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing", + "overlay_top": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active", + "overlay_top_emissive": "cosmiccore:block/multiblock/mantle_bore/overlay_top_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/wireless_data_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/wireless_data_hatch.json new file mode 100644 index 000000000..78179fe60 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/wireless_data_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:wireless_data_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_data_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_data_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/uev/bottom", + "side": "gtceu:block/casings/voltage/uev/side", + "top": "gtceu:block/casings/voltage/uev/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/wireless_data_transmitter.json b/src/generated/resources/assets/cosmiccore/models/block/machine/wireless_data_transmitter.json new file mode 100644 index 000000000..ea172329c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/wireless_data_transmitter.json @@ -0,0 +1,90 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:wireless_data_transmitter", + "texture_overrides": { + "all": "gtceu:block/casings/hpca/high_power_casing" + }, + "variants": { + "is_formed=false,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/hpca/high_power_casing", + "overlay_front": "cosmiccore:block/multiblock/wireless_data_transmitter/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/wireless_data_transmitter/overlay_front_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/hpca/high_power_casing", + "overlay_front": "cosmiccore:block/multiblock/wireless_data_transmitter/overlay_front_paused", + "overlay_front_emissive": "cosmiccore:block/multiblock/wireless_data_transmitter/overlay_front_paused_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/hpca/high_power_casing", + "overlay_front": "cosmiccore:block/multiblock/wireless_data_transmitter/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/wireless_data_transmitter/overlay_front_active_emissive" + } + } + }, + "is_formed=false,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/hpca/high_power_casing", + "overlay_front": "cosmiccore:block/multiblock/wireless_data_transmitter/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/wireless_data_transmitter/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/hpca/high_power_casing", + "overlay_front": "cosmiccore:block/multiblock/wireless_data_transmitter/overlay_front", + "overlay_front_emissive": "cosmiccore:block/multiblock/wireless_data_transmitter/overlay_front_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/hpca/high_power_casing", + "overlay_front": "cosmiccore:block/multiblock/wireless_data_transmitter/overlay_front_paused", + "overlay_front_emissive": "cosmiccore:block/multiblock/wireless_data_transmitter/overlay_front_paused_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/hpca/high_power_casing", + "overlay_front": "cosmiccore:block/multiblock/wireless_data_transmitter/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/wireless_data_transmitter/overlay_front_active_emissive" + } + } + }, + "is_formed=true,recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/cube_all/sided", + "textures": { + "all": "gtceu:block/casings/hpca/high_power_casing", + "overlay_front": "cosmiccore:block/multiblock/wireless_data_transmitter/overlay_front_active", + "overlay_front_emissive": "cosmiccore:block/multiblock/wireless_data_transmitter/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..b437432e5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_16a_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_16a_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..5ca5f040f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_16a_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_16a_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_16a", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..5801ca19b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_4a_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_4a_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..94a11b8b5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_4a_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_4a_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_4a", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_biolab.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_biolab.json new file mode 100644 index 000000000..68cea9698 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_biolab.json @@ -0,0 +1,51 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_biolab", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "gtceu:block/machines/brewery/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/brewery/overlay_front_active_emissive", + "overlay_side": "gtceu:block/machines/brewery/overlay_side_active", + "overlay_side_emissive": "gtceu:block/machines/brewery/overlay_side_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_calx_reactor.json new file mode 100644 index 000000000..4f1b41b34 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_calx_reactor.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_calx_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/calx_reactor/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_cosmic_parallel_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_cosmic_parallel_hatch.json new file mode 100644 index 000000000..c4bb06ba3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_cosmic_parallel_hatch.json @@ -0,0 +1,43 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_cosmic_parallel_hatch", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "gtceu:block/machines/parallel_hatch_mk3/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/parallel_hatch_mk3/overlay_front_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "gtceu:block/machines/parallel_hatch_mk3/overlay_front", + "overlay_front_emissive": "gtceu:block/machines/parallel_hatch_mk3/overlay_front_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "gtceu:block/machines/parallel_hatch_mk3/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/parallel_hatch_mk3/overlay_front_active_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "gtceu:block/machines/parallel_hatch_mk3/overlay_front_active", + "overlay_front_emissive": "gtceu:block/machines/parallel_hatch_mk3/overlay_front_active_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_mana_leaching_tub.json new file mode 100644 index 000000000..665ced9b0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_mana_leaching_tub.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_mana_leaching_tub", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/mana_leaching_tub/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_naquahine_mini_reactor.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_naquahine_mini_reactor.json new file mode 100644 index 000000000..87683da50 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_naquahine_mini_reactor.json @@ -0,0 +1,59 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_naquahine_mini_reactor", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back_active", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side_active", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top_active", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/machine/template/generator_machine", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "overlay_back": "gtceu:block/generators/naquahine_mini_reactor/overlay_back_active", + "overlay_side": "gtceu:block/generators/naquahine_mini_reactor/overlay_side_active", + "overlay_top": "gtceu:block/generators/naquahine_mini_reactor/overlay_top_active", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_roaster.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_roaster.json new file mode 100644 index 000000000..94e220a92 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_roaster.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_roaster", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/roaster/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_soul_input_hatch.json new file mode 100644 index 000000000..db60cec24 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_soul_input_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_soul_input_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_soul_output_hatch.json new file mode 100644 index 000000000..15b2cce4e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_soul_output_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_soul_output_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/soul_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_thermia_export_hatch.json new file mode 100644 index 000000000..e9ad74566 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_thermia_export_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_thermia_export_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_output_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_output_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_thermia_import_hatch.json new file mode 100644 index 000000000..1d9d22a6c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_thermia_import_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_thermia_import_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_input_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/thermia_input_hatch", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_thermomagnitizer.json new file mode 100644 index 000000000..2ff810a15 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_thermomagnitizer.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_thermomagnitizer", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/thermomagnitizer/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_vacuum_bubbler.json new file mode 100644 index 000000000..232ac028d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_vacuum_bubbler.json @@ -0,0 +1,39 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_vacuum_bubbler", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/vacuum_bubbler/overlay_front" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_wireless_charger.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_wireless_charger.json new file mode 100644 index 000000000..22aa1c370 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_wireless_charger.json @@ -0,0 +1,43 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_wireless_charger", + "variants": { + "recipe_logic_status=idle": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=suspend": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=waiting": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + }, + "recipe_logic_status=working": { + "model": { + "parent": "gtceu:block/casings/voltage/zpm", + "textures": { + "overlay_front": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front", + "overlay_front_emissive": "cosmiccore:block/overlay/machine/wireless_charger/overlay_front_emissive" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_wireless_energy_dynamo.json new file mode 100644 index 000000000..90039d889 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_wireless_energy_dynamo.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_wireless_energy_dynamo", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_wireless_energy_hatch.json new file mode 100644 index 000000000..3d24ad559 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine/zpm_wireless_energy_hatch.json @@ -0,0 +1,32 @@ +{ + "parent": "minecraft:block/block", + "loader": "gtceu:machine", + "machine": "cosmiccore:zpm_wireless_energy_hatch", + "replaceable_textures": [ + "bottom", + "top", + "side" + ], + "variants": { + "is_formed=false": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + }, + "is_formed=true": { + "model": { + "parent": "cosmiccore:block/machine/part/wireless_energy_1a", + "textures": { + "bottom": "gtceu:block/casings/voltage/zpm/bottom", + "side": "gtceu:block/casings/voltage/zpm/side", + "top": "gtceu:block/casings/voltage/zpm/top" + } + } + } + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine_casing_gearbox_naquadria.json b/src/generated/resources/assets/cosmiccore/models/block/machine_casing_gearbox_naquadria.json new file mode 100644 index 000000000..96b87b45e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine_casing_gearbox_naquadria.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/gearbox/machine_casing_gearbox_naquadria" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/machine_casing_gearbox_pthanterum.json b/src/generated/resources/assets/cosmiccore/models/block/machine_casing_gearbox_pthanterum.json new file mode 100644 index 000000000..5aa351aa0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/machine_casing_gearbox_pthanterum.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/gearbox/machine_casing_gearbox_pthanterum" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/moth_home_t1.json b/src/generated/resources/assets/cosmiccore/models/block/moth_home_t1.json new file mode 100644 index 000000000..92a4868d9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/moth_home_t1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/moth/moth_home_t1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/moth_home_t2.json b/src/generated/resources/assets/cosmiccore/models/block/moth_home_t2.json new file mode 100644 index 000000000..01afea96b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/moth_home_t2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/moth/moth_home_t2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/moth_home_t3.json b/src/generated/resources/assets/cosmiccore/models/block/moth_home_t3.json new file mode 100644 index 000000000..46eb1eb6b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/moth_home_t3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/moth/moth_home_t3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/moth_home_t4.json b/src/generated/resources/assets/cosmiccore/models/block/moth_home_t4.json new file mode 100644 index 000000000..bc6955537 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/moth_home_t4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/moth/moth_home_t4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/moth_station_casing.json b/src/generated/resources/assets/cosmiccore/models/block/moth_station_casing.json new file mode 100644 index 000000000..9be48a673 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/moth_station_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/moth_station_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/multi_purpose_interstellar_grade_casing.json b/src/generated/resources/assets/cosmiccore/models/block/multi_purpose_interstellar_grade_casing.json new file mode 100644 index 000000000..4b34628e7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/multi_purpose_interstellar_grade_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_certified_interstellar_grade_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/naquadah_pressure_resistant_casing.json b/src/generated/resources/assets/cosmiccore/models/block/naquadah_pressure_resistant_casing.json new file mode 100644 index 000000000..568df83f6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/naquadah_pressure_resistant_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/naquadah_pressure_resistant_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/naquadric_superalloy_coil_block.json b/src/generated/resources/assets/cosmiccore/models/block/naquadric_superalloy_coil_block.json new file mode 100644 index 000000000..925b5a8df --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/naquadric_superalloy_coil_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/coils/naquadric_superalloy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/naquadric_superalloy_coil_block_active.json b/src/generated/resources/assets/cosmiccore/models/block/naquadric_superalloy_coil_block_active.json new file mode 100644 index 000000000..dedbceb35 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/naquadric_superalloy_coil_block_active.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/cube_2_layer/all", + "textures": { + "bot_all": "cosmiccore:block/casings/coils/naquadric_superalloy", + "top_all": "cosmiccore:block/casings/coils/naquadric_superalloy_bloom" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/neutronium_buoy.json b/src/generated/resources/assets/cosmiccore/models/block/neutronium_buoy.json new file mode 100644 index 000000000..d7a504c84 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/neutronium_buoy.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/neutronium_buoy" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/oscillating_gilded_pthanterum_casings.json b/src/generated/resources/assets/cosmiccore/models/block/oscillating_gilded_pthanterum_casings.json new file mode 100644 index 000000000..0d022dbcc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/oscillating_gilded_pthanterum_casings.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/plated_aerocloud.json b/src/generated/resources/assets/cosmiccore/models/block/plated_aerocloud.json new file mode 100644 index 000000000..8853d7dfb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/plated_aerocloud.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/plated_aerocloud" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/pressure_containment_casing.json b/src/generated/resources/assets/cosmiccore/models/block/pressure_containment_casing.json new file mode 100644 index 000000000..2c0ddbfd7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/pressure_containment_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/pressure_containment_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/prismatic_tungstensteel_coil_block.json b/src/generated/resources/assets/cosmiccore/models/block/prismatic_tungstensteel_coil_block.json new file mode 100644 index 000000000..351d309b1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/prismatic_tungstensteel_coil_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/coils/prismatic_tungstensteel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/prismatic_tungstensteel_coil_block_active.json b/src/generated/resources/assets/cosmiccore/models/block/prismatic_tungstensteel_coil_block_active.json new file mode 100644 index 000000000..a428f1690 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/prismatic_tungstensteel_coil_block_active.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/cube_2_layer/all", + "textures": { + "bot_all": "cosmiccore:block/casings/coils/prismatic_tungstensteel", + "top_all": "cosmiccore:block/casings/coils/prismatic_tungstensteel_bloom" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/programable_matter_coil_block.json b/src/generated/resources/assets/cosmiccore/models/block/programable_matter_coil_block.json new file mode 100644 index 000000000..f4a50936f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/programable_matter_coil_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/coils/programable_matter" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/programable_matter_coil_block_active.json b/src/generated/resources/assets/cosmiccore/models/block/programable_matter_coil_block_active.json new file mode 100644 index 000000000..10b1106e5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/programable_matter_coil_block_active.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/cube_2_layer/all", + "textures": { + "bot_all": "cosmiccore:block/casings/coils/programable_matter", + "top_all": "cosmiccore:block/casings/coils/programable_matter_bloom" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/psionic_galvorn_coil_block.json b/src/generated/resources/assets/cosmiccore/models/block/psionic_galvorn_coil_block.json new file mode 100644 index 000000000..e00bdee15 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/psionic_galvorn_coil_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/coils/psionic_galvorn" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/psionic_galvorn_coil_block_active.json b/src/generated/resources/assets/cosmiccore/models/block/psionic_galvorn_coil_block_active.json new file mode 100644 index 000000000..6223c3f98 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/psionic_galvorn_coil_block_active.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/cube_2_layer/all", + "textures": { + "bot_all": "cosmiccore:block/casings/coils/psionic_galvorn", + "top_all": "cosmiccore:block/casings/coils/psionic_galvorn_bloom" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/pthanterum_wave_breakers.json b/src/generated/resources/assets/cosmiccore/models/block/pthanterum_wave_breakers.json new file mode 100644 index 000000000..6382c25c5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/pthanterum_wave_breakers.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/pthanterum_wave_breakers" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/reflective_starmetal_casing.json b/src/generated/resources/assets/cosmiccore/models/block/reflective_starmetal_casing.json new file mode 100644 index 000000000..18868db03 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/reflective_starmetal_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/reflective_starmetal_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/reinforced_dawnstone_casing.json b/src/generated/resources/assets/cosmiccore/models/block/reinforced_dawnstone_casing.json new file mode 100644 index 000000000..f308a3c11 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/reinforced_dawnstone_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_dawnstone_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/reinforced_naquadria_casing.json b/src/generated/resources/assets/cosmiccore/models/block/reinforced_naquadria_casing.json new file mode 100644 index 000000000..191b193d1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/reinforced_naquadria_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/reinforced_naquadria_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/reinforced_trinavine_coil_block.json b/src/generated/resources/assets/cosmiccore/models/block/reinforced_trinavine_coil_block.json new file mode 100644 index 000000000..5448dfe39 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/reinforced_trinavine_coil_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/coils/trinavine" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/reinforced_trinavine_coil_block_active.json b/src/generated/resources/assets/cosmiccore/models/block/reinforced_trinavine_coil_block_active.json new file mode 100644 index 000000000..f17c95095 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/reinforced_trinavine_coil_block_active.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/cube_2_layer/all", + "textures": { + "bot_all": "cosmiccore:block/casings/coils/trinavine", + "top_all": "cosmiccore:block/casings/coils/trinavine_bloom" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/resonant_virtue_meld_coil_block.json b/src/generated/resources/assets/cosmiccore/models/block/resonant_virtue_meld_coil_block.json new file mode 100644 index 000000000..b1a410034 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/resonant_virtue_meld_coil_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/coils/resonant_virtue_meld" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/resonant_virtue_meld_coil_block_active.json b/src/generated/resources/assets/cosmiccore/models/block/resonant_virtue_meld_coil_block_active.json new file mode 100644 index 000000000..9967b5994 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/resonant_virtue_meld_coil_block_active.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/cube_2_layer/all", + "textures": { + "bot_all": "cosmiccore:block/casings/coils/resonant_virtue_meld", + "top_all": "cosmiccore:block/casings/coils/resonant_virtue_meld_bloom" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/resonantly_tuned_virtue_meld_casing.json b/src/generated/resources/assets/cosmiccore/models/block/resonantly_tuned_virtue_meld_casing.json new file mode 100644 index 000000000..8a507afa8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/resonantly_tuned_virtue_meld_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/resonantly_tuned_virtue_meld_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/rigid_high_speed_steel_casing.json b/src/generated/resources/assets/cosmiccore/models/block/rigid_high_speed_steel_casing.json new file mode 100644 index 000000000..d95ef8790 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/rigid_high_speed_steel_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/ritual_stone.json b/src/generated/resources/assets/cosmiccore/models/block/ritual_stone.json new file mode 100644 index 000000000..7bf6d2a6e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/ritual_stone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/royal_ichorium_casing.json b/src/generated/resources/assets/cosmiccore/models/block/royal_ichorium_casing.json new file mode 100644 index 000000000..99021b99b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/royal_ichorium_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/royal_ichorium_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/rust_stained_casing.json b/src/generated/resources/assets/cosmiccore/models/block/rust_stained_casing.json new file mode 100644 index 000000000..42e758fb5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/rust_stained_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/rust_stained_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/rust_weave_casing.json b/src/generated/resources/assets/cosmiccore/models/block/rust_weave_casing.json new file mode 100644 index 000000000..4c9a295da --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/rust_weave_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/rust_weave_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/self_healing_pthanterum_casing.json b/src/generated/resources/assets/cosmiccore/models/block/self_healing_pthanterum_casing.json new file mode 100644 index 000000000..a55d473a5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/self_healing_pthanterum_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/self_healing_pthanterum_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/shimmering_neutronium_coil_block.json b/src/generated/resources/assets/cosmiccore/models/block/shimmering_neutronium_coil_block.json new file mode 100644 index 000000000..42c83a1ea --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/shimmering_neutronium_coil_block.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/coils/shimmering_neutronium" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/shimmering_neutronium_coil_block_active.json b/src/generated/resources/assets/cosmiccore/models/block/shimmering_neutronium_coil_block_active.json new file mode 100644 index 000000000..3a02034a1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/shimmering_neutronium_coil_block_active.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/cube_2_layer/all", + "textures": { + "bot_all": "cosmiccore:block/casings/coils/shimmering_neutronium", + "top_all": "cosmiccore:block/casings/coils/shimmering_neutronium_bloom" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/somarust_casing.json b/src/generated/resources/assets/cosmiccore/models/block/somarust_casing.json new file mode 100644 index 000000000..e5b1078fd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/somarust_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/somarust_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/soul_muted_casing.json b/src/generated/resources/assets/cosmiccore/models/block/soul_muted_casing.json new file mode 100644 index 000000000..7bf6d2a6e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/soul_muted_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_muted_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/soul_stained_steel_aluminium_plated_casing.json b/src/generated/resources/assets/cosmiccore/models/block/soul_stained_steel_aluminium_plated_casing.json new file mode 100644 index 000000000..d5149094d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/soul_stained_steel_aluminium_plated_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/steel_plated_bronze_casing.json b/src/generated/resources/assets/cosmiccore/models/block/steel_plated_bronze_casing.json new file mode 100644 index 000000000..a2a688c0a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/steel_plated_bronze_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/steel_plated_bronze_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/steel_rose_lantern.json b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_lantern.json new file mode 100644 index 000000000..f954ea999 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_lantern.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/lantern", + "textures": { + "lantern": "cosmiccore:block/lanterns/steel_rose_lantern", + "particle": "cosmiccore:block/lanterns/steel_rose_lantern" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/steel_rose_lantern_hanging.json b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_lantern_hanging.json new file mode 100644 index 000000000..63b597e21 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_lantern_hanging.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:block/lantern_hanging", + "textures": { + "lantern": "cosmiccore:block/lanterns/steel_rose_lantern_hanging", + "particle": "cosmiccore:block/lanterns/steel_rose_lantern_hanging" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light.json b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light.json new file mode 100644 index 000000000..467b08755 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/cosmetic/steel_rose_light" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_slab.json b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_slab.json new file mode 100644 index 000000000..27227af74 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_slab.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "side": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "top": "cosmiccore:block/casings/cosmetic/steel_rose_light" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_slab_top.json b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_slab_top.json new file mode 100644 index 000000000..834c6c88b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_slab_top.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/slab_top", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "side": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "top": "cosmiccore:block/casings/cosmetic/steel_rose_light" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_stairs.json b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_stairs.json new file mode 100644 index 000000000..f9c50c8f7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_stairs.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/stairs", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "side": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "top": "cosmiccore:block/casings/cosmetic/steel_rose_light" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_stairs_inner.json b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_stairs_inner.json new file mode 100644 index 000000000..c04ae9305 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_stairs_inner.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/inner_stairs", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "side": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "top": "cosmiccore:block/casings/cosmetic/steel_rose_light" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_stairs_outer.json b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_stairs_outer.json new file mode 100644 index 000000000..ae9b13121 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/steel_rose_light_stairs_outer.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:block/outer_stairs", + "textures": { + "bottom": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "side": "cosmiccore:block/casings/cosmetic/steel_rose_light", + "top": "cosmiccore:block/casings/cosmetic/steel_rose_light" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/stellar_neutronium_grade_magnet.json b/src/generated/resources/assets/cosmiccore/models/block/stellar_neutronium_grade_magnet.json new file mode 100644 index 000000000..bc7d2935e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/stellar_neutronium_grade_magnet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/stellar_neutronium_grade_magnet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/stellar_neutronium_grade_magnet_active.json b/src/generated/resources/assets/cosmiccore/models/block/stellar_neutronium_grade_magnet_active.json new file mode 100644 index 000000000..6c72f51ba --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/stellar_neutronium_grade_magnet_active.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/cube_2_layer/all", + "textures": { + "bot_all": "cosmiccore:block/casings/solid/stellar_neutronium_grade_magnet", + "top_all": "cosmiccore:block/casings/solid/stellar_neutronium_grade_magnet_bloom" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/superheavy_steel_casing.json b/src/generated/resources/assets/cosmiccore/models/block/superheavy_steel_casing.json new file mode 100644 index 000000000..f80273b7b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/superheavy_steel_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/superheavy_steel_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/tritanium_lined_heavy_neutronium_casing.json b/src/generated/resources/assets/cosmiccore/models/block/tritanium_lined_heavy_neutronium_casing.json new file mode 100644 index 000000000..eb9e4ca09 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/tritanium_lined_heavy_neutronium_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/ultra_powered_casing.json b/src/generated/resources/assets/cosmiccore/models/block/ultra_powered_casing.json new file mode 100644 index 000000000..01ae90052 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/ultra_powered_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/vomahine_ultra_powered_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/vibrant_rubidium_casing.json b/src/generated/resources/assets/cosmiccore/models/block/vibrant_rubidium_casing.json new file mode 100644 index 000000000..6d7d0229f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/vibrant_rubidium_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/vibrant_rubidium_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/wailing_ichor_casing.json b/src/generated/resources/assets/cosmiccore/models/block/wailing_ichor_casing.json new file mode 100644 index 000000000..7cc9e6089 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/wailing_ichor_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/wailing_ichor_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/wear_resistant_ruridit_casing.json b/src/generated/resources/assets/cosmiccore/models/block/wear_resistant_ruridit_casing.json new file mode 100644 index 000000000..7d17cf56c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/wear_resistant_ruridit_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/solid/ruridit_casing" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/block/zblan_glass.json b/src/generated/resources/assets/cosmiccore/models/block/zblan_glass.json new file mode 100644 index 000000000..11be06809 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/block/zblan_glass.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "cosmiccore:block/casings/glass/zblan_glass" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/aberrant_essence.json b/src/generated/resources/assets/cosmiccore/models/item/aberrant_essence.json new file mode 100644 index 000000000..44197ae64 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/aberrant_essence.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/aberrant_essence" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/abrasive_rosin_millstones.json b/src/generated/resources/assets/cosmiccore/models/item/abrasive_rosin_millstones.json new file mode 100644 index 000000000..72260b9cf --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/abrasive_rosin_millstones.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/abrasive_rosin_millstones" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/advanced_gene_kit.json b/src/generated/resources/assets/cosmiccore/models/item/advanced_gene_kit.json new file mode 100644 index 000000000..52779bef4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/advanced_gene_kit.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/advanced_gene_kit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/akashic_processor.json b/src/generated/resources/assets/cosmiccore/models/item/akashic_processor.json new file mode 100644 index 000000000..4d4b9d32c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/akashic_processor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/akashic_processor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/akashic_processor_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/akashic_processor_assembly.json new file mode 100644 index 000000000..6e2d7c172 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/akashic_processor_assembly.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/akashic_processor_assembly" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/akashic_processor_mainframe.json b/src/generated/resources/assets/cosmiccore/models/item/akashic_processor_mainframe.json new file mode 100644 index 000000000..653291bab --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/akashic_processor_mainframe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/akashic_processor_mainframe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/akashic_processor_supercomputer.json b/src/generated/resources/assets/cosmiccore/models/item/akashic_processor_supercomputer.json new file mode 100644 index 000000000..5e3cb72c3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/akashic_processor_supercomputer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/akashic_processor_supercomputer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/alchemia_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/alchemia_wafer.json new file mode 100644 index 000000000..f37ec0297 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/alchemia_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/alchemia_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/alternator_flux_coiling.json b/src/generated/resources/assets/cosmiccore/models/item/alternator_flux_coiling.json new file mode 100644 index 000000000..bf6f79bab --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/alternator_flux_coiling.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/alternator_flux_coiling" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/alveary_casing.json b/src/generated/resources/assets/cosmiccore/models/item/alveary_casing.json new file mode 100644 index 000000000..78ffe6f73 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/alveary_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/alveary_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ambrion.json b/src/generated/resources/assets/cosmiccore/models/item/ambrion.json new file mode 100644 index 000000000..474339120 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ambrion.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/ambrion" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/aram_chip.json b/src/generated/resources/assets/cosmiccore/models/item/aram_chip.json new file mode 100644 index 000000000..143d6e0b4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/aram_chip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/aram_chip" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/aram_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/aram_wafer.json new file mode 100644 index 000000000..edd411da4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/aram_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/aram_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/arcane_crucible.json b/src/generated/resources/assets/cosmiccore/models/item/arcane_crucible.json new file mode 100644 index 000000000..32d5f89ff --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/arcane_crucible.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/arcane_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/arcane_distillery.json b/src/generated/resources/assets/cosmiccore/models/item/arcane_distillery.json new file mode 100644 index 000000000..8849fbee3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/arcane_distillery.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/arcane_distillery" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_1.json b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_1.json new file mode 100644 index 000000000..f0558867f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/armored_freight_beetle_grade_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_2.json b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_2.json new file mode 100644 index 000000000..2444607f7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/armored_freight_beetle_grade_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_3.json b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_3.json new file mode 100644 index 000000000..b5b3d8e43 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/armored_freight_beetle_grade_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_4.json b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_4.json new file mode 100644 index 000000000..3daf505e1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/armored_freight_beetle_grade_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_5.json b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_5.json new file mode 100644 index 000000000..670ee15eb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/armored_freight_beetle_grade_5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/armored_freight_beetle_grade_5" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/asteroid_targeting_chip.json b/src/generated/resources/assets/cosmiccore/models/item/asteroid_targeting_chip.json new file mode 100644 index 000000000..64ec45792 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/asteroid_targeting_chip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/asteroid_targeting_chip" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/atmo_pump.json b/src/generated/resources/assets/cosmiccore/models/item/atmo_pump.json new file mode 100644 index 000000000..48ac2d030 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/atmo_pump.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/atmo_pump" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/atomic_reconstructor.json b/src/generated/resources/assets/cosmiccore/models/item/atomic_reconstructor.json new file mode 100644 index 000000000..0f965d5b1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/atomic_reconstructor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/atomic_reconstructor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/auric_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/auric_asteroid.json new file mode 100644 index 000000000..424631d43 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/auric_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/auric_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/basic_gene_kit.json b/src/generated/resources/assets/cosmiccore/models/item/basic_gene_kit.json new file mode 100644 index 000000000..c6ff455b6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/basic_gene_kit.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/basic_gene_kit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/bichromal_nevramite_casing.json b/src/generated/resources/assets/cosmiccore/models/item/bichromal_nevramite_casing.json new file mode 100644 index 000000000..ae28badbd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/bichromal_nevramite_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/bichromal_nevramite_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/bifidobacterium_breve.json b/src/generated/resources/assets/cosmiccore/models/item/bifidobacterium_breve.json new file mode 100644 index 000000000..55f8a24b4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/bifidobacterium_breve.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/bifidobacterium_breve" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/bifidobacterium_breve_culture.json b/src/generated/resources/assets/cosmiccore/models/item/bifidobacterium_breve_culture.json new file mode 100644 index 000000000..9f395b549 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/bifidobacterium_breve_culture.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/bifidobacterium_breve_culture" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/biovat.json b/src/generated/resources/assets/cosmiccore/models/item/biovat.json new file mode 100644 index 000000000..0daa6caff --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/biovat.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/biovat" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/bitumen_wax.json b/src/generated/resources/assets/cosmiccore/models/item/bitumen_wax.json new file mode 100644 index 000000000..9af377d95 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/bitumen_wax.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/bitumen_wax" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/blackstone_pustule.json b/src/generated/resources/assets/cosmiccore/models/item/blackstone_pustule.json index ed68de74b..a6c6247e0 100644 --- a/src/generated/resources/assets/cosmiccore/models/item/blackstone_pustule.json +++ b/src/generated/resources/assets/cosmiccore/models/item/blackstone_pustule.json @@ -1,6 +1,6 @@ { - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/blackstone_pustule" - } + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/blackstone_pustule" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/blank_rune.json b/src/generated/resources/assets/cosmiccore/models/item/blank_rune.json new file mode 100644 index 000000000..2b2d7801e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/blank_rune.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/blank_rune" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/blazing_mote.json b/src/generated/resources/assets/cosmiccore/models/item/blazing_mote.json new file mode 100644 index 000000000..c3ccc7650 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/blazing_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/blazing_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/bolted_heavy_frame_casing.json b/src/generated/resources/assets/cosmiccore/models/item/bolted_heavy_frame_casing.json new file mode 100644 index 000000000..15d2b010d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/bolted_heavy_frame_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/bolted_heavy_frame_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/botanical_simulation_complex.json b/src/generated/resources/assets/cosmiccore/models/item/botanical_simulation_complex.json new file mode 100644 index 000000000..bb3e0ff1c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/botanical_simulation_complex.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/botanical_simulation_complex" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/bright_mote.json b/src/generated/resources/assets/cosmiccore/models/item/bright_mote.json new file mode 100644 index 000000000..ebbe0859d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/bright_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/bright_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/brimstone_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/brimstone_asteroid.json new file mode 100644 index 000000000..97677df98 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/brimstone_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/brimstone_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/bronze_supply_tank.json b/src/generated/resources/assets/cosmiccore/models/item/bronze_supply_tank.json new file mode 100644 index 000000000..58e26dbdd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/bronze_supply_tank.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/bronze_supply_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/capacitor_array.json b/src/generated/resources/assets/cosmiccore/models/item/capacitor_array.json new file mode 100644 index 000000000..da90cc108 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/capacitor_array.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/capacitor_array" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/capacity_chip.json b/src/generated/resources/assets/cosmiccore/models/item/capacity_chip.json new file mode 100644 index 000000000..69919d7b8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/capacity_chip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/capacity_chip" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/carbon_asteroid_base.json b/src/generated/resources/assets/cosmiccore/models/item/carbon_asteroid_base.json new file mode 100644 index 000000000..13539e289 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/carbon_asteroid_base.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/carbon_asteroid_base" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/causal_fabric_coil_block.json b/src/generated/resources/assets/cosmiccore/models/item/causal_fabric_coil_block.json new file mode 100644 index 000000000..f8712f689 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/causal_fabric_coil_block.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/causal_fabric_coil_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/chromatic_distillation_plant.json b/src/generated/resources/assets/cosmiccore/models/item/chromatic_distillation_plant.json new file mode 100644 index 000000000..fb468ac37 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/chromatic_distillation_plant.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/chromatic_distillation_plant" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/chromatic_flotation_plant.json b/src/generated/resources/assets/cosmiccore/models/item/chromatic_flotation_plant.json new file mode 100644 index 000000000..d21371300 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/chromatic_flotation_plant.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/chromatic_flotation_plant" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/chronia.json b/src/generated/resources/assets/cosmiccore/models/item/chronia.json new file mode 100644 index 000000000..c5894b903 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/chronia.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/chronia" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/cinder_hearth.json b/src/generated/resources/assets/cosmiccore/models/item/cinder_hearth.json new file mode 100644 index 000000000..843897783 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/cinder_hearth.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/cinder_hearth" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/clear_mote.json b/src/generated/resources/assets/cosmiccore/models/item/clear_mote.json new file mode 100644 index 000000000..91a4829bb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/clear_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/clear_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/cluster_of_perpetuity.json b/src/generated/resources/assets/cosmiccore/models/item/cluster_of_perpetuity.json new file mode 100644 index 000000000..78d02e414 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/cluster_of_perpetuity.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/cluster_of_perpetuity" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/component_assembly_line.json b/src/generated/resources/assets/cosmiccore/models/item/component_assembly_line.json new file mode 100644 index 000000000..d48133737 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/component_assembly_line.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/component_assembly_line" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/computation_support_unit.json b/src/generated/resources/assets/cosmiccore/models/item/computation_support_unit.json new file mode 100644 index 000000000..c9a50560d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/computation_support_unit.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/computation_support_unit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/contaminated_petri_dish.json b/src/generated/resources/assets/cosmiccore/models/item/contaminated_petri_dish.json new file mode 100644 index 000000000..d48c3b50c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/contaminated_petri_dish.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/contaminated_petri_dish" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/cosmic_me_assemblyline_bus.json b/src/generated/resources/assets/cosmiccore/models/item/cosmic_me_assemblyline_bus.json new file mode 100644 index 000000000..e590bbfc7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/cosmic_me_assemblyline_bus.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/cosmic_me_assemblyline_bus" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/cosmic_me_assemblyline_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/cosmic_me_assemblyline_hatch.json new file mode 100644 index 000000000..a5f2b8974 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/cosmic_me_assemblyline_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/cosmic_me_assemblyline_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/cosmic_processor.json b/src/generated/resources/assets/cosmiccore/models/item/cosmic_processor.json deleted file mode 100644 index 0257a976a..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/cosmic_processor.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/cosmic_processor" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/cosmic_processor_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/cosmic_processor_assembly.json deleted file mode 100644 index 163011fb2..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/cosmic_processor_assembly.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/cosmic_processor_assembly" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/cosmic_processor_mainframe.json b/src/generated/resources/assets/cosmiccore/models/item/cosmic_processor_mainframe.json deleted file mode 100644 index 5e516309d..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/cosmic_processor_mainframe.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/cosmic_processor_mainframe" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/cosmic_processor_supercomputer.json b/src/generated/resources/assets/cosmiccore/models/item/cosmic_processor_supercomputer.json deleted file mode 100644 index 56b8e3155..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/cosmic_processor_supercomputer.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/cosmic_processor_supercomputer" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/creative_thermal.json b/src/generated/resources/assets/cosmiccore/models/item/creative_thermal.json new file mode 100644 index 000000000..c18d5494e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/creative_thermal.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/creative_thermal" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crop_holder.json b/src/generated/resources/assets/cosmiccore/models/item/crop_holder.json new file mode 100644 index 000000000..9187f0364 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crop_holder.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/crop_holder" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crucible_mantis_grade_1.json b/src/generated/resources/assets/cosmiccore/models/item/crucible_mantis_grade_1.json new file mode 100644 index 000000000..0a126eb81 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crucible_mantis_grade_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crucible_mantis_grade_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_1.json b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_1.json new file mode 100644 index 000000000..c1a57dcce --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crusher_wasps_grade_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_2.json b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_2.json new file mode 100644 index 000000000..651ab3e53 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crusher_wasps_grade_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_3.json b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_3.json new file mode 100644 index 000000000..4196ab6c3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crusher_wasps_grade_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_4.json b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_4.json new file mode 100644 index 000000000..65a54f6cb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crusher_wasps_grade_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_5.json b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_5.json new file mode 100644 index 000000000..b45dd718c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crusher_wasps_grade_5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crusher_wasps_grade_5" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/cryogenic_casing.json b/src/generated/resources/assets/cosmiccore/models/item/cryogenic_casing.json new file mode 100644 index 000000000..829acc445 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/cryogenic_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/cryogenic_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/cryogenics_chamber.json b/src/generated/resources/assets/cosmiccore/models/item/cryogenics_chamber.json new file mode 100644 index 000000000..ecccf3e65 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/cryogenics_chamber.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/cryogenics_chamber" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crystal_chiplet_base.json b/src/generated/resources/assets/cosmiccore/models/item/crystal_chiplet_base.json new file mode 100644 index 000000000..e210b13ac --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crystal_chiplet_base.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crystal_chiplet_base" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crystal_chiplet_mask.json b/src/generated/resources/assets/cosmiccore/models/item/crystal_chiplet_mask.json new file mode 100644 index 000000000..0db785ba2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crystal_chiplet_mask.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crystal_chiplet_mask" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crystala.json b/src/generated/resources/assets/cosmiccore/models/item/crystala.json new file mode 100644 index 000000000..8ed5525bf --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crystala.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crystala" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crystalline_capacitor.json b/src/generated/resources/assets/cosmiccore/models/item/crystalline_capacitor.json new file mode 100644 index 000000000..75d46f06f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crystalline_capacitor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crystalline_capacitor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crystalline_diode.json b/src/generated/resources/assets/cosmiccore/models/item/crystalline_diode.json new file mode 100644 index 000000000..79b91cb00 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crystalline_diode.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crystalline_diode" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crystalline_inductor.json b/src/generated/resources/assets/cosmiccore/models/item/crystalline_inductor.json new file mode 100644 index 000000000..379caa0d6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crystalline_inductor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crystalline_inductor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crystalline_resistor.json b/src/generated/resources/assets/cosmiccore/models/item/crystalline_resistor.json new file mode 100644 index 000000000..b0d67f5b7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crystalline_resistor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crystalline_resistor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/crystalline_transistor.json b/src/generated/resources/assets/cosmiccore/models/item/crystalline_transistor.json new file mode 100644 index 000000000..866f9d831 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/crystalline_transistor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/crystalline_transistor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/cyclozine_chemically_repelling_casing.json b/src/generated/resources/assets/cosmiccore/models/item/cyclozine_chemically_repelling_casing.json new file mode 100644 index 000000000..20ec8f438 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/cyclozine_chemically_repelling_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/cyclozine_chemically_repelling_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/cyclozine_chemically_repelling_pipe.json b/src/generated/resources/assets/cosmiccore/models/item/cyclozine_chemically_repelling_pipe.json new file mode 100644 index 000000000..a910c2552 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/cyclozine_chemically_repelling_pipe.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/cyclozine_chemically_repelling_pipe" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/cyclozine_high_rigidity_casing.json b/src/generated/resources/assets/cosmiccore/models/item/cyclozine_high_rigidity_casing.json new file mode 100644 index 000000000..a43f89fda --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/cyclozine_high_rigidity_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/cyclozine_high_rigidity_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/dawn_forge.json b/src/generated/resources/assets/cosmiccore/models/item/dawn_forge.json new file mode 100644 index 000000000..b75260bdb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/dawn_forge.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/dawn_forge" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/dawnforge_eclipsed.json b/src/generated/resources/assets/cosmiccore/models/item/dawnforge_eclipsed.json new file mode 100644 index 000000000..a7e84b93c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/dawnforge_eclipsed.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/dawnforge_eclipsed" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/debug_structure_writer.json b/src/generated/resources/assets/cosmiccore/models/item/debug_structure_writer.json new file mode 100644 index 000000000..2f3601c09 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/debug_structure_writer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/debug_structure_writer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/dilumixal_naquadah_doped_silicon_boule.json b/src/generated/resources/assets/cosmiccore/models/item/dilumixal_naquadah_doped_silicon_boule.json new file mode 100644 index 000000000..d2af771b9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/dilumixal_naquadah_doped_silicon_boule.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/dilumixal_naquadah_doped_silicon_boule" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/dilumixal_naquadah_doped_silicon_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/dilumixal_naquadah_doped_silicon_wafer.json new file mode 100644 index 000000000..655fac52d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/dilumixal_naquadah_doped_silicon_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/dilumixal_naquadah_doped_silicon_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/dim_mote.json b/src/generated/resources/assets/cosmiccore/models/item/dim_mote.json new file mode 100644 index 000000000..92cf4bf1f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/dim_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/dim_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/dimensional_energy_capacitor.json b/src/generated/resources/assets/cosmiccore/models/item/dimensional_energy_capacitor.json new file mode 100644 index 000000000..95f83aae3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/dimensional_energy_capacitor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/dimensional_energy_capacitor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/dimensional_energy_interface.json b/src/generated/resources/assets/cosmiccore/models/item/dimensional_energy_interface.json new file mode 100644 index 000000000..c5a54a7e2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/dimensional_energy_interface.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/dimensional_energy_interface" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/diving_bell.json b/src/generated/resources/assets/cosmiccore/models/item/diving_bell.json new file mode 100644 index 000000000..341cf17e2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/diving_bell.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/diving_bell" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/diving_bell_escape_pad.json b/src/generated/resources/assets/cosmiccore/models/item/diving_bell_escape_pad.json new file mode 100644 index 000000000..ebb40fe92 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/diving_bell_escape_pad.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/diving_bell_escape_pad" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/donk.json b/src/generated/resources/assets/cosmiccore/models/item/donk.json index f01a7e435..524e78608 100644 --- a/src/generated/resources/assets/cosmiccore/models/item/donk.json +++ b/src/generated/resources/assets/cosmiccore/models/item/donk.json @@ -1,6 +1,6 @@ { - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/donk" - } + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/donk" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/dreamers_basin.json b/src/generated/resources/assets/cosmiccore/models/item/dreamers_basin.json new file mode 100644 index 000000000..dce0d61de --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/dreamers_basin.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/dreamers_basin" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/drone_frame_1.json b/src/generated/resources/assets/cosmiccore/models/item/drone_frame_1.json new file mode 100644 index 000000000..fafb0eeed --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/drone_frame_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/drone_frame_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/drone_frame_2.json b/src/generated/resources/assets/cosmiccore/models/item/drone_frame_2.json new file mode 100644 index 000000000..8b6a36fc5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/drone_frame_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/drone_frame_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/drone_frame_3.json b/src/generated/resources/assets/cosmiccore/models/item/drone_frame_3.json new file mode 100644 index 000000000..52d93cae7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/drone_frame_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/drone_frame_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/drone_frame_4.json b/src/generated/resources/assets/cosmiccore/models/item/drone_frame_4.json new file mode 100644 index 000000000..313332385 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/drone_frame_4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/drone_frame_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/drone_frame_5.json b/src/generated/resources/assets/cosmiccore/models/item/drone_frame_5.json new file mode 100644 index 000000000..b29dfba86 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/drone_frame_5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/drone_frame_5" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/drone_maintenance_interface.json b/src/generated/resources/assets/cosmiccore/models/item/drone_maintenance_interface.json new file mode 100644 index 000000000..a5eaa4b31 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/drone_maintenance_interface.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/drone_maintenance_interface" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/drone_station.json b/src/generated/resources/assets/cosmiccore/models/item/drone_station.json new file mode 100644 index 000000000..f44aa3cf6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/drone_station.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/drone_station" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/drygmy_grove.json b/src/generated/resources/assets/cosmiccore/models/item/drygmy_grove.json new file mode 100644 index 000000000..d91e12be6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/drygmy_grove.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/drygmy_grove" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/dulia_lily.json b/src/generated/resources/assets/cosmiccore/models/item/dulia_lily.json new file mode 100644 index 000000000..274b51ae2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/dulia_lily.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/dulia_lily" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/dynamia.json b/src/generated/resources/assets/cosmiccore/models/item/dynamia.json new file mode 100644 index 000000000..4738b6ded --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/dynamia.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/dynamia" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/dyson_solar_cell.json b/src/generated/resources/assets/cosmiccore/models/item/dyson_solar_cell.json new file mode 100644 index 000000000..cd835f4bc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/dyson_solar_cell.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/dyson_solar_cell" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/echo_processor.json b/src/generated/resources/assets/cosmiccore/models/item/echo_processor.json deleted file mode 100644 index 593cd79c1..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/echo_processor.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/echo_processor" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/echo_processor_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/echo_processor_assembly.json deleted file mode 100644 index fff3cf154..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/echo_processor_assembly.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/echo_processor_assembly" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/echo_processor_mainframe.json b/src/generated/resources/assets/cosmiccore/models/item/echo_processor_mainframe.json deleted file mode 100644 index fc2849746..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/echo_processor_mainframe.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/echo_processor_mainframe" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/echo_processor_supercomputer.json b/src/generated/resources/assets/cosmiccore/models/item/echo_processor_supercomputer.json deleted file mode 100644 index 43c3936d2..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/echo_processor_supercomputer.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/echo_processor_supercomputer" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/echon.json b/src/generated/resources/assets/cosmiccore/models/item/echon.json new file mode 100644 index 000000000..778548a5b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/echon.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/echon" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/efficacy_chip.json b/src/generated/resources/assets/cosmiccore/models/item/efficacy_chip.json new file mode 100644 index 000000000..5c287f269 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/efficacy_chip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/efficacy_chip" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/empty_fuel_rod.json b/src/generated/resources/assets/cosmiccore/models/item/empty_fuel_rod.json new file mode 100644 index 000000000..e5cb6cd07 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/empty_fuel_rod.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/empty_fuel_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/energized_silk.json b/src/generated/resources/assets/cosmiccore/models/item/energized_silk.json new file mode 100644 index 000000000..4f21d031a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/energized_silk.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/energized_silk" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/engraved_crystal_chiplet.json b/src/generated/resources/assets/cosmiccore/models/item/engraved_crystal_chiplet.json new file mode 100644 index 000000000..41f08219f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/engraved_crystal_chiplet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/engraved_crystal_chiplet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor.json b/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor.json new file mode 100644 index 000000000..7a7a87e7e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/enthelic_processor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor_assembly.json new file mode 100644 index 000000000..d39599b92 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor_assembly.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/enthelic_processor_assembly" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor_mainframe.json b/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor_mainframe.json new file mode 100644 index 000000000..fd6ad7268 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor_mainframe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/enthelic_processor_mainframe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor_supercomputer.json b/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor_supercomputer.json new file mode 100644 index 000000000..fd67e045a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/enthelic_processor_supercomputer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/enthelic_processor_supercomputer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/eschaton_processor.json b/src/generated/resources/assets/cosmiccore/models/item/eschaton_processor.json new file mode 100644 index 000000000..39d410786 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/eschaton_processor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/eschaton_processor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/eschaton_processor_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/eschaton_processor_assembly.json new file mode 100644 index 000000000..3814cadc1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/eschaton_processor_assembly.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/eschaton_processor_assembly" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/eschaton_processor_mainframe.json b/src/generated/resources/assets/cosmiccore/models/item/eschaton_processor_mainframe.json new file mode 100644 index 000000000..fdc96d0dc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/eschaton_processor_mainframe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/eschaton_processor_mainframe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/eschaton_processor_supercomputer.json b/src/generated/resources/assets/cosmiccore/models/item/eschaton_processor_supercomputer.json new file mode 100644 index 000000000..90dd7a454 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/eschaton_processor_supercomputer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/eschaton_processor_supercomputer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/escherichia_coli.json b/src/generated/resources/assets/cosmiccore/models/item/escherichia_coli.json new file mode 100644 index 000000000..66764e979 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/escherichia_coli.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/escherichia_coli" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/escherichia_coli_culture.json b/src/generated/resources/assets/cosmiccore/models/item/escherichia_coli_culture.json new file mode 100644 index 000000000..7391a5cfc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/escherichia_coli_culture.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/escherichia_coli_culture" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/esson.json b/src/generated/resources/assets/cosmiccore/models/item/esson.json new file mode 100644 index 000000000..ca4e6c058 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/esson.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/esson" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/eterna_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/eterna_wafer.json new file mode 100644 index 000000000..295741a65 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/eterna_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/eterna_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ether_wisp.json b/src/generated/resources/assets/cosmiccore/models/item/ether_wisp.json new file mode 100644 index 000000000..eae598ecd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ether_wisp.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/ether_wisp" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ethera.json b/src/generated/resources/assets/cosmiccore/models/item/ethera.json new file mode 100644 index 000000000..0287ee056 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ethera.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/ethera" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ethersteel_plated_ash_tiles.json b/src/generated/resources/assets/cosmiccore/models/item/ethersteel_plated_ash_tiles.json new file mode 100644 index 000000000..c3c6f172e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ethersteel_plated_ash_tiles.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/ethersteel_plated_ash_tiles" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_biolab.json b/src/generated/resources/assets/cosmiccore/models/item/ev_biolab.json new file mode 100644 index 000000000..cf4c38835 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_biolab.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ev_biolab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/ev_calx_reactor.json new file mode 100644 index 000000000..888d2ea34 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ev_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/ev_mana_leaching_tub.json new file mode 100644 index 000000000..359da9773 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ev_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_radio_module.json b/src/generated/resources/assets/cosmiccore/models/item/ev_radio_module.json new file mode 100644 index 000000000..02621e34d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_radio_module.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/ev_radio_module" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/ev_roaster.json new file mode 100644 index 000000000..760b42a7e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ev_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/ev_thermomagnitizer.json new file mode 100644 index 000000000..872aaaddd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ev_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/ev_vacuum_bubbler.json new file mode 100644 index 000000000..4cc3bf27f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ev_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/ev_wildfire_core.json new file mode 100644 index 000000000..f1c23d535 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/ev_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ev_wireless_charger.json b/src/generated/resources/assets/cosmiccore/models/item/ev_wireless_charger.json new file mode 100644 index 000000000..c84ca6b9e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ev_wireless_charger.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ev_wireless_charger" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/extreme_combustion_engine_cc.json b/src/generated/resources/assets/cosmiccore/models/item/extreme_combustion_engine_cc.json new file mode 100644 index 000000000..1f4abc7fe --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/extreme_combustion_engine_cc.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/extreme_combustion_engine_cc" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/faint_mote.json b/src/generated/resources/assets/cosmiccore/models/item/faint_mote.json new file mode 100644 index 000000000..f6b557769 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/faint_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/faint_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/fermium_rad_charges.json b/src/generated/resources/assets/cosmiccore/models/item/fermium_rad_charges.json new file mode 100644 index 000000000..3c1312ffb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/fermium_rad_charges.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/fermium_rad_charges" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ferric_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/ferric_asteroid.json new file mode 100644 index 000000000..365a7aed3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ferric_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/ferric_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/fiber_mesh_ingot_frame.json b/src/generated/resources/assets/cosmiccore/models/item/fiber_mesh_ingot_frame.json new file mode 100644 index 000000000..1df6e7f98 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/fiber_mesh_ingot_frame.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/fiber_mesh_ingot_frame" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/fireclay_ball.json b/src/generated/resources/assets/cosmiccore/models/item/fireclay_ball.json new file mode 100644 index 000000000..992f9050a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/fireclay_ball.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/fireclay_ball" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/flawed_resonant_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/flawed_resonant_wafer.json new file mode 100644 index 000000000..baa547929 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/flawed_resonant_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/flawed_resonant_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/flesh_packed_neptunium_fuel.json b/src/generated/resources/assets/cosmiccore/models/item/flesh_packed_neptunium_fuel.json new file mode 100644 index 000000000..6979b8e00 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/flesh_packed_neptunium_fuel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/flesh_packed_neptunium_fuel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/flesh_packed_plutonium_fuel.json b/src/generated/resources/assets/cosmiccore/models/item/flesh_packed_plutonium_fuel.json new file mode 100644 index 000000000..70ccc8511 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/flesh_packed_plutonium_fuel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/flesh_packed_plutonium_fuel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/flesh_packed_uranium_fuel.json b/src/generated/resources/assets/cosmiccore/models/item/flesh_packed_uranium_fuel.json new file mode 100644 index 000000000..0d27c655d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/flesh_packed_uranium_fuel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/flesh_packed_uranium_fuel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/fleshy_neptunium_waste.json b/src/generated/resources/assets/cosmiccore/models/item/fleshy_neptunium_waste.json new file mode 100644 index 000000000..01cf02f9d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/fleshy_neptunium_waste.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/fleshy_neptunium_waste" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/fleshy_plutonium_waste.json b/src/generated/resources/assets/cosmiccore/models/item/fleshy_plutonium_waste.json new file mode 100644 index 000000000..21fdac13a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/fleshy_plutonium_waste.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/fleshy_plutonium_waste" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/fleshy_uranium_waste.json b/src/generated/resources/assets/cosmiccore/models/item/fleshy_uranium_waste.json new file mode 100644 index 000000000..390b7346f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/fleshy_uranium_waste.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/fleshy_uranium_waste" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_1.json b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_1.json new file mode 100644 index 000000000..89f2ad96f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/freight_beetle_grade_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_2.json b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_2.json new file mode 100644 index 000000000..3ce2c6801 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/freight_beetle_grade_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_3.json b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_3.json new file mode 100644 index 000000000..80649038b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/freight_beetle_grade_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_4.json b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_4.json new file mode 100644 index 000000000..981293e19 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/freight_beetle_grade_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_5.json b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_5.json new file mode 100644 index 000000000..2f8330088 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/freight_beetle_grade_5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/freight_beetle_grade_5" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/fulgorinth_prime_casing.json b/src/generated/resources/assets/cosmiccore/models/item/fulgorinth_prime_casing.json new file mode 100644 index 000000000..20acb3728 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/fulgorinth_prime_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/fulgorinth_prime_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/fused_wafer_of_esoterica.json b/src/generated/resources/assets/cosmiccore/models/item/fused_wafer_of_esoterica.json new file mode 100644 index 000000000..e0b052328 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/fused_wafer_of_esoterica.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/fused_wafer_of_esoterica" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/fused_wafer_of_logos.json b/src/generated/resources/assets/cosmiccore/models/item/fused_wafer_of_logos.json new file mode 100644 index 000000000..0b1544752 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/fused_wafer_of_logos.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/fused_wafer_of_logos" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/fusion_grade_magnet.json b/src/generated/resources/assets/cosmiccore/models/item/fusion_grade_magnet.json new file mode 100644 index 000000000..84ec35431 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/fusion_grade_magnet.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/fusion_grade_magnet" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/gelatin_scaffold.json b/src/generated/resources/assets/cosmiccore/models/item/gelatin_scaffold.json new file mode 100644 index 000000000..f8743a9e8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/gelatin_scaffold.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/gelatin_scaffold" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/gilded_pthanterum_casing.json b/src/generated/resources/assets/cosmiccore/models/item/gilded_pthanterum_casing.json new file mode 100644 index 000000000..b6c0161ce --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/gilded_pthanterum_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/gilded_pthanterum_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hardened_resin.json b/src/generated/resources/assets/cosmiccore/models/item/hardened_resin.json new file mode 100644 index 000000000..a00aecd71 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hardened_resin.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/hardened_resin" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/harmonic_chiplet_oscillating.json b/src/generated/resources/assets/cosmiccore/models/item/harmonic_chiplet_oscillating.json new file mode 100644 index 000000000..f0cdbb2aa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/harmonic_chiplet_oscillating.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/harmonic_chiplet_oscillating" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/harmonic_processor.json b/src/generated/resources/assets/cosmiccore/models/item/harmonic_processor.json new file mode 100644 index 000000000..06c66c8e6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/harmonic_processor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/harmonic_processor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/harmonic_processor_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/harmonic_processor_assembly.json new file mode 100644 index 000000000..e5697c70d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/harmonic_processor_assembly.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/harmonic_processor_assembly" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/harmonic_processor_mainframe.json b/src/generated/resources/assets/cosmiccore/models/item/harmonic_processor_mainframe.json new file mode 100644 index 000000000..e1bc4bda0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/harmonic_processor_mainframe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/harmonic_processor_mainframe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/harmonic_processor_supercomputer.json b/src/generated/resources/assets/cosmiccore/models/item/harmonic_processor_supercomputer.json new file mode 100644 index 000000000..500190fbc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/harmonic_processor_supercomputer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/harmonic_processor_supercomputer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/harmonically_tuned_circuit_board.json b/src/generated/resources/assets/cosmiccore/models/item/harmonically_tuned_circuit_board.json new file mode 100644 index 000000000..1a6ffd2eb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/harmonically_tuned_circuit_board.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/harmonically_tuned_circuit_board" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/harmonically_tuned_printed_circuit_board.json b/src/generated/resources/assets/cosmiccore/models/item/harmonically_tuned_printed_circuit_board.json new file mode 100644 index 000000000..2780f0b8a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/harmonically_tuned_printed_circuit_board.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/harmonically_tuned_printed_circuit_board" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/heat_fan.json b/src/generated/resources/assets/cosmiccore/models/item/heat_fan.json new file mode 100644 index 000000000..044579800 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/heat_fan.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/variant/heat_fan" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/heavy_assembler.json b/src/generated/resources/assets/cosmiccore/models/item/heavy_assembler.json new file mode 100644 index 000000000..7bb213328 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/heavy_assembler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/heavy_assembler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/heavy_frost_proof_casing.json b/src/generated/resources/assets/cosmiccore/models/item/heavy_frost_proof_casing.json new file mode 100644 index 000000000..963ccc3a6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/heavy_frost_proof_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/heavy_frost_proof_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hellfire_foundry.json b/src/generated/resources/assets/cosmiccore/models/item/hellfire_foundry.json new file mode 100644 index 000000000..1fbe6b0cc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hellfire_foundry.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hellfire_foundry" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/heme_ring.json b/src/generated/resources/assets/cosmiccore/models/item/heme_ring.json new file mode 100644 index 000000000..b118d8ad8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/heme_ring.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/heme_ring" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hemophagic_transfuser.json b/src/generated/resources/assets/cosmiccore/models/item/hemophagic_transfuser.json new file mode 100644 index 000000000..e390cb7c8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hemophagic_transfuser.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hemophagic_transfuser" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hex_processor.json b/src/generated/resources/assets/cosmiccore/models/item/hex_processor.json new file mode 100644 index 000000000..9b2d50240 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hex_processor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/hex_processor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hex_processor_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/hex_processor_assembly.json new file mode 100644 index 000000000..ae005c05c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hex_processor_assembly.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/hex_processor_assembly" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hex_processor_mainframe.json b/src/generated/resources/assets/cosmiccore/models/item/hex_processor_mainframe.json new file mode 100644 index 000000000..25e4b83f0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hex_processor_mainframe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/hex_processor_mainframe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hex_processor_supercomputer.json b/src/generated/resources/assets/cosmiccore/models/item/hex_processor_supercomputer.json new file mode 100644 index 000000000..3cdae2969 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hex_processor_supercomputer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/hex_processor_supercomputer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/high_powered_magnet.json b/src/generated/resources/assets/cosmiccore/models/item/high_powered_magnet.json new file mode 100644 index 000000000..689cc7c72 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/high_powered_magnet.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/high_powered_magnet" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/high_pressure_assembler.json b/src/generated/resources/assets/cosmiccore/models/item/high_pressure_assembler.json new file mode 100644 index 000000000..f56818b9d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/high_pressure_assembler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/high_pressure_assembler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/high_temperature_fission_casing.json b/src/generated/resources/assets/cosmiccore/models/item/high_temperature_fission_casing.json new file mode 100644 index 000000000..5df83bb3b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/high_temperature_fission_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/high_temperature_fission_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/high_tolerance_rhenium_casing.json b/src/generated/resources/assets/cosmiccore/models/item/high_tolerance_rhenium_casing.json new file mode 100644 index 000000000..0df152446 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/high_tolerance_rhenium_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/high_tolerance_rhenium_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/highly_conductive_fission_casing.json b/src/generated/resources/assets/cosmiccore/models/item/highly_conductive_fission_casing.json new file mode 100644 index 000000000..c475dabb5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/highly_conductive_fission_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/highly_conductive_fission_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/highly_flexible_reinforced_trinavine_casing.json b/src/generated/resources/assets/cosmiccore/models/item/highly_flexible_reinforced_trinavine_casing.json new file mode 100644 index 000000000..e9ee48979 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/highly_flexible_reinforced_trinavine_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/highly_flexible_reinforced_trinavine_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hp_steam_bender.json b/src/generated/resources/assets/cosmiccore/models/item/hp_steam_bender.json new file mode 100644 index 000000000..73b20fb2c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hp_steam_bender.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hp_steam_bender" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hp_steam_wiremill.json b/src/generated/resources/assets/cosmiccore/models/item/hp_steam_wiremill.json new file mode 100644 index 000000000..fcd013438 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hp_steam_wiremill.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hp_steam_wiremill" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/huge_sterilization_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/huge_sterilization_hatch.json new file mode 100644 index 000000000..382dc0cc5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/huge_sterilization_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/huge_sterilization_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/hv_calx_reactor.json new file mode 100644 index 000000000..14d91f801 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/models/item/hv_energy_output_hatch_16a.json new file mode 100644 index 000000000..042484231 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_energy_output_hatch_16a.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_energy_output_hatch_16a" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/models/item/hv_energy_output_hatch_4a.json new file mode 100644 index 000000000..d07336967 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_energy_output_hatch_4a.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_energy_output_hatch_4a" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_input_hatch_4x.json b/src/generated/resources/assets/cosmiccore/models/item/hv_input_hatch_4x.json new file mode 100644 index 000000000..f313620f0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_input_hatch_4x.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_input_hatch_4x" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/hv_mana_leaching_tub.json new file mode 100644 index 000000000..4200ca160 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_output_hatch_4x.json b/src/generated/resources/assets/cosmiccore/models/item/hv_output_hatch_4x.json new file mode 100644 index 000000000..5053da405 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_output_hatch_4x.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_output_hatch_4x" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_radio_module.json b/src/generated/resources/assets/cosmiccore/models/item/hv_radio_module.json new file mode 100644 index 000000000..aa8303c51 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_radio_module.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/hv_radio_module" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/hv_roaster.json new file mode 100644 index 000000000..6a09161c2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/hv_thermomagnitizer.json new file mode 100644 index 000000000..e34d1f409 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/hv_vacuum_bubbler.json new file mode 100644 index 000000000..b1b32c01c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/hv_wildfire_core.json new file mode 100644 index 000000000..a6ac828d6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/hv_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hv_wireless_charger.json b/src/generated/resources/assets/cosmiccore/models/item/hv_wireless_charger.json new file mode 100644 index 000000000..8148f7409 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hv_wireless_charger.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/hv_wireless_charger" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/hydraulic_boots.json b/src/generated/resources/assets/cosmiccore/models/item/hydraulic_boots.json new file mode 100644 index 000000000..8ee6491d7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/hydraulic_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/hydraulic_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/incandescent_mote.json b/src/generated/resources/assets/cosmiccore/models/item/incandescent_mote.json new file mode 100644 index 000000000..19898bdac --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/incandescent_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/incandescent_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/industrial_chemical_vat.json b/src/generated/resources/assets/cosmiccore/models/item/industrial_chemical_vat.json new file mode 100644 index 000000000..32c846fa9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/industrial_chemical_vat.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/industrial_chemical_vat" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/industrial_drone.json b/src/generated/resources/assets/cosmiccore/models/item/industrial_drone.json new file mode 100644 index 000000000..055ca8bd6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/industrial_drone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/industrial_drone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/industrial_primitive_blast_furnace.json b/src/generated/resources/assets/cosmiccore/models/item/industrial_primitive_blast_furnace.json new file mode 100644 index 000000000..958a26574 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/industrial_primitive_blast_furnace.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/industrial_primitive_blast_furnace" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/inert_fungal_spores.json b/src/generated/resources/assets/cosmiccore/models/item/inert_fungal_spores.json new file mode 100644 index 000000000..aeeb7f0a6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/inert_fungal_spores.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/inert_fungal_spores" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/intermediate_gene_kit.json b/src/generated/resources/assets/cosmiccore/models/item/intermediate_gene_kit.json new file mode 100644 index 000000000..cd7915640 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/intermediate_gene_kit.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/intermediate_gene_kit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iron_plated_deepslate_tile.json b/src/generated/resources/assets/cosmiccore/models/item/iron_plated_deepslate_tile.json new file mode 100644 index 000000000..ae11cafb7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iron_plated_deepslate_tile.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/iron_plated_deepslate_tile" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iron_plated_deepslate_tile_slab.json b/src/generated/resources/assets/cosmiccore/models/item/iron_plated_deepslate_tile_slab.json new file mode 100644 index 000000000..beca3c2ba --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iron_plated_deepslate_tile_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/iron_plated_deepslate_tile_slab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iron_plated_deepslate_tile_stairs.json b/src/generated/resources/assets/cosmiccore/models/item/iron_plated_deepslate_tile_stairs.json new file mode 100644 index 000000000..ac28cdd2d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iron_plated_deepslate_tile_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/iron_plated_deepslate_tile_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/iv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..261fca123 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_16a_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_16a_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/iv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..3db261d34 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_16a_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_16a_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/iv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..2311bb844 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_4a_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_4a_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/iv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..3b23f57fa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_4a_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_4a_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_biolab.json b/src/generated/resources/assets/cosmiccore/models/item/iv_biolab.json new file mode 100644 index 000000000..ef86f557e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_biolab.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_biolab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/iv_calx_reactor.json new file mode 100644 index 000000000..6ca929555 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/iv_mana_leaching_tub.json new file mode 100644 index 000000000..f0395684e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_naquahine_mini_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/iv_naquahine_mini_reactor.json new file mode 100644 index 000000000..68239bd03 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_naquahine_mini_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_naquahine_mini_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_radio_module.json b/src/generated/resources/assets/cosmiccore/models/item/iv_radio_module.json new file mode 100644 index 000000000..fe065e4cb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_radio_module.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/iv_radio_module" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/iv_roaster.json new file mode 100644 index 000000000..3cdfb50da --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/iv_soul_input_hatch.json new file mode 100644 index 000000000..f690ea85d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_soul_input_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_soul_input_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/iv_soul_output_hatch.json new file mode 100644 index 000000000..0c0e0694c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_soul_output_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_soul_output_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/iv_thermia_export_hatch.json new file mode 100644 index 000000000..bf18fa2e7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_thermia_export_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_thermia_export_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/iv_thermia_import_hatch.json new file mode 100644 index 000000000..dc9ce975d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_thermia_import_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_thermia_import_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/iv_thermomagnitizer.json new file mode 100644 index 000000000..0ff023fbc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/iv_vacuum_bubbler.json new file mode 100644 index 000000000..1b942e071 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/iv_wildfire_core.json new file mode 100644 index 000000000..44af67dd4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/iv_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_wireless_charger.json b/src/generated/resources/assets/cosmiccore/models/item/iv_wireless_charger.json new file mode 100644 index 000000000..7a003eb5c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_wireless_charger.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_wireless_charger" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/iv_wireless_energy_dynamo.json new file mode 100644 index 000000000..20073f05c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/iv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/iv_wireless_energy_hatch.json new file mode 100644 index 000000000..fc7f0d926 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/iv_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/iv_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/large_combustion_engine_cc.json b/src/generated/resources/assets/cosmiccore/models/item/large_combustion_engine_cc.json new file mode 100644 index 000000000..b6ec9df1f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/large_combustion_engine_cc.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/large_combustion_engine_cc" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/large_laminator.json b/src/generated/resources/assets/cosmiccore/models/item/large_laminator.json new file mode 100644 index 000000000..ff540ffd2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/large_laminator.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/large_laminator" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/large_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/large_roaster.json new file mode 100644 index 000000000..f96b0bfbd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/large_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/large_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/large_shard_of_perpetuity.json b/src/generated/resources/assets/cosmiccore/models/item/large_shard_of_perpetuity.json new file mode 100644 index 000000000..98f7d8049 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/large_shard_of_perpetuity.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/large_shard_of_perpetuity" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/large_spooling_machine.json b/src/generated/resources/assets/cosmiccore/models/item/large_spooling_machine.json new file mode 100644 index 000000000..66c449469 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/large_spooling_machine.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/large_spooling_machine" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/larva.json b/src/generated/resources/assets/cosmiccore/models/item/larva.json new file mode 100644 index 000000000..8ac6066fd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/larva.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/larva" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/latent_capacity_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/latent_capacity_wafer.json new file mode 100644 index 000000000..1721d3a84 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/latent_capacity_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/latent_capacity_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/latent_efficacy_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/latent_efficacy_wafer.json new file mode 100644 index 000000000..4a82ce9e2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/latent_efficacy_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/latent_efficacy_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/latent_potency_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/latent_potency_wafer.json new file mode 100644 index 000000000..f064996d1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/latent_potency_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/latent_potency_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/latent_verbosity_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/latent_verbosity_wafer.json new file mode 100644 index 000000000..8bd9604b4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/latent_verbosity_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/latent_verbosity_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/light_dawnstone_casing.json b/src/generated/resources/assets/cosmiccore/models/item/light_dawnstone_casing.json new file mode 100644 index 000000000..2c4605980 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/light_dawnstone_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/light_dawnstone_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/light_ritual_stone.json b/src/generated/resources/assets/cosmiccore/models/item/light_ritual_stone.json new file mode 100644 index 000000000..b5d97765a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/light_ritual_stone.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/light_ritual_stone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/link_test_station.json b/src/generated/resources/assets/cosmiccore/models/item/link_test_station.json new file mode 100644 index 000000000..331f5fdb9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/link_test_station.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/link_test_station" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/linked_terminal.json b/src/generated/resources/assets/cosmiccore/models/item/linked_terminal.json new file mode 100644 index 000000000..e69cf6d12 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/linked_terminal.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/terminal/linked_terminal", + "layer1": "cosmiccore:item/terminal/terminal_overlay" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lith_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/lith_asteroid.json new file mode 100644 index 000000000..b2ca2a597 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lith_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/lith_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/living_igniclad_coil_block.json b/src/generated/resources/assets/cosmiccore/models/item/living_igniclad_coil_block.json new file mode 100644 index 000000000..b1ad33c97 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/living_igniclad_coil_block.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/living_igniclad_coil_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/livingrock_aluminate_boule.json b/src/generated/resources/assets/cosmiccore/models/item/livingrock_aluminate_boule.json new file mode 100644 index 000000000..6cfc1b49c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/livingrock_aluminate_boule.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/livingrock_aluminate_boule" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/livingrock_tiles.json b/src/generated/resources/assets/cosmiccore/models/item/livingrock_tiles.json new file mode 100644 index 000000000..8f4abb9a9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/livingrock_tiles.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/livingrock_tiles" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/livirock_aluminite_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/livirock_aluminite_wafer.json new file mode 100644 index 000000000..4aa38c90e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/livirock_aluminite_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/livirock_aluminite_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lp_steam_bender.json b/src/generated/resources/assets/cosmiccore/models/item/lp_steam_bender.json new file mode 100644 index 000000000..ac15b13e2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lp_steam_bender.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lp_steam_bender" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lp_steam_wiremill.json b/src/generated/resources/assets/cosmiccore/models/item/lp_steam_wiremill.json new file mode 100644 index 000000000..b9d2e8b2c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lp_steam_wiremill.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lp_steam_wiremill" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lucid_cpu_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/lucid_cpu_wafer.json new file mode 100644 index 000000000..9e87b2b02 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lucid_cpu_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/lucid_cpu_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor.json b/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor.json new file mode 100644 index 000000000..2048a9189 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/lucidic_processor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor_assembly.json new file mode 100644 index 000000000..d073a4f2b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor_assembly.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/lucidic_processor_assembly" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor_mainframe.json b/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor_mainframe.json new file mode 100644 index 000000000..6722b4ffd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor_mainframe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/lucidic_processor_mainframe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor_supercomputer.json b/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor_supercomputer.json new file mode 100644 index 000000000..0df4600f8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lucidic_processor_supercomputer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/lucidic_processor_supercomputer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lucidity_cpu_mask.json b/src/generated/resources/assets/cosmiccore/models/item/lucidity_cpu_mask.json new file mode 100644 index 000000000..6add7bba0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lucidity_cpu_mask.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/lucidity_cpu_mask" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ludicrious_intake.json b/src/generated/resources/assets/cosmiccore/models/item/ludicrious_intake.json new file mode 100644 index 000000000..99edc33ee --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ludicrious_intake.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/variant/ludicrious_intake" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ludicrous_combustion_engine_cc.json b/src/generated/resources/assets/cosmiccore/models/item/ludicrous_combustion_engine_cc.json new file mode 100644 index 000000000..00c1f1824 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ludicrous_combustion_engine_cc.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ludicrous_combustion_engine_cc" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lunar_sheer_hammer.json b/src/generated/resources/assets/cosmiccore/models/item/lunar_sheer_hammer.json new file mode 100644 index 000000000..118bd8324 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lunar_sheer_hammer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lunar_sheer_hammer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/luv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..a0e757d53 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_16a_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_16a_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/luv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..14e929516 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_16a_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_16a_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/luv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..4664c79f2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_4a_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_4a_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/luv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..04a2543fb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_4a_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_4a_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_biolab.json b/src/generated/resources/assets/cosmiccore/models/item/luv_biolab.json new file mode 100644 index 000000000..b1e5a4284 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_biolab.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_biolab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/luv_calx_reactor.json new file mode 100644 index 000000000..7d1e5d926 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/luv_mana_leaching_tub.json new file mode 100644 index 000000000..49d952830 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_naquahine_mini_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/luv_naquahine_mini_reactor.json new file mode 100644 index 000000000..60bbe576f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_naquahine_mini_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_naquahine_mini_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_radio_module.json b/src/generated/resources/assets/cosmiccore/models/item/luv_radio_module.json new file mode 100644 index 000000000..0dfab3c87 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_radio_module.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/luv_radio_module" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/luv_roaster.json new file mode 100644 index 000000000..ddb3408fc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/luv_soul_input_hatch.json new file mode 100644 index 000000000..9e8da0e00 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_soul_input_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_soul_input_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/luv_soul_output_hatch.json new file mode 100644 index 000000000..26fd7475d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_soul_output_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_soul_output_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/luv_thermia_export_hatch.json new file mode 100644 index 000000000..d5b6f7aed --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_thermia_export_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_thermia_export_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/luv_thermia_import_hatch.json new file mode 100644 index 000000000..c733cf0ef --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_thermia_import_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_thermia_import_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/luv_thermomagnitizer.json new file mode 100644 index 000000000..dea8ead54 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/luv_vacuum_bubbler.json new file mode 100644 index 000000000..2e308d36d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/luv_wildfire_core.json new file mode 100644 index 000000000..ebcccfb34 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/luv_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_wireless_charger.json b/src/generated/resources/assets/cosmiccore/models/item/luv_wireless_charger.json new file mode 100644 index 000000000..09ff64943 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_wireless_charger.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_wireless_charger" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/luv_wireless_energy_dynamo.json new file mode 100644 index 000000000..8746604b3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/luv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/luv_wireless_energy_hatch.json new file mode 100644 index 000000000..5f9bb06d3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/luv_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/luv_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/lv_calx_reactor.json new file mode 100644 index 000000000..a9c72018a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/models/item/lv_energy_output_hatch_16a.json new file mode 100644 index 000000000..b641c4916 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_energy_output_hatch_16a.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lv_energy_output_hatch_16a" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/models/item/lv_energy_output_hatch_4a.json new file mode 100644 index 000000000..e1fb0f771 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_energy_output_hatch_4a.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lv_energy_output_hatch_4a" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/lv_mana_leaching_tub.json new file mode 100644 index 000000000..c46a484e0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/lv_roaster.json new file mode 100644 index 000000000..6e3d67221 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/lv_thermomagnitizer.json new file mode 100644 index 000000000..99f3ef141 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/lv_vacuum_bubbler.json new file mode 100644 index 000000000..a24b96d52 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/lv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/lv_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/lv_wildfire_core.json new file mode 100644 index 000000000..bfe17ad5c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/lv_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/lv_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/machine_casing_gearbox_naquadria.json b/src/generated/resources/assets/cosmiccore/models/item/machine_casing_gearbox_naquadria.json new file mode 100644 index 000000000..923c9c345 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/machine_casing_gearbox_naquadria.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine_casing_gearbox_naquadria" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/machine_casing_gearbox_pthanterum.json b/src/generated/resources/assets/cosmiccore/models/item/machine_casing_gearbox_pthanterum.json new file mode 100644 index 000000000..4923daca6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/machine_casing_gearbox_pthanterum.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine_casing_gearbox_pthanterum" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/macroverse_processor.json b/src/generated/resources/assets/cosmiccore/models/item/macroverse_processor.json deleted file mode 100644 index 29673aad5..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/macroverse_processor.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/macroverse_processor" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/macroverse_processor_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/macroverse_processor_assembly.json deleted file mode 100644 index a24283cb6..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/macroverse_processor_assembly.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/macroverse_processor_assembly" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/macroverse_processor_mainframe.json b/src/generated/resources/assets/cosmiccore/models/item/macroverse_processor_mainframe.json deleted file mode 100644 index d83e4dd1a..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/macroverse_processor_mainframe.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/macroverse_processor_mainframe" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/macroverse_processor_supercomputer.json b/src/generated/resources/assets/cosmiccore/models/item/macroverse_processor_supercomputer.json deleted file mode 100644 index 1baa44bef..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/macroverse_processor_supercomputer.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/macroverse_processor_supercomputer" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mafic_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/mafic_asteroid.json new file mode 100644 index 000000000..05c7b0dd9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mafic_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/mafic_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mana_etching_factory.json b/src/generated/resources/assets/cosmiccore/models/item/mana_etching_factory.json new file mode 100644 index 000000000..d36bc0d8c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mana_etching_factory.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mana_etching_factory" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mantle_bore.json b/src/generated/resources/assets/cosmiccore/models/item/mantle_bore.json new file mode 100644 index 000000000..6fe034bca --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mantle_bore.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mantle_bore" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/masked_crystal_chiplet_package.json b/src/generated/resources/assets/cosmiccore/models/item/masked_crystal_chiplet_package.json new file mode 100644 index 000000000..4697c1eb2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/masked_crystal_chiplet_package.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/masked_crystal_chiplet_package" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mossy_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/mossy_asteroid.json new file mode 100644 index 000000000..49a639aae --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mossy_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/mossy_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/moth_cargo_drop_off.json b/src/generated/resources/assets/cosmiccore/models/item/moth_cargo_drop_off.json new file mode 100644 index 000000000..b00bf6b32 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/moth_cargo_drop_off.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/moth_cargo_drop_off" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/moth_cargo_station.json b/src/generated/resources/assets/cosmiccore/models/item/moth_cargo_station.json new file mode 100644 index 000000000..8898f62bb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/moth_cargo_station.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/moth_cargo_station" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/moth_home_t1.json b/src/generated/resources/assets/cosmiccore/models/item/moth_home_t1.json new file mode 100644 index 000000000..7d259b7b6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/moth_home_t1.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/moth_home_t1" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/moth_home_t2.json b/src/generated/resources/assets/cosmiccore/models/item/moth_home_t2.json new file mode 100644 index 000000000..f2a40f041 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/moth_home_t2.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/moth_home_t2" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/moth_home_t3.json b/src/generated/resources/assets/cosmiccore/models/item/moth_home_t3.json new file mode 100644 index 000000000..7f866dd7e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/moth_home_t3.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/moth_home_t3" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/moth_home_t4.json b/src/generated/resources/assets/cosmiccore/models/item/moth_home_t4.json new file mode 100644 index 000000000..2dca8fc6b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/moth_home_t4.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/moth_home_t4" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/moth_station_casing.json b/src/generated/resources/assets/cosmiccore/models/item/moth_station_casing.json new file mode 100644 index 000000000..2daff7484 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/moth_station_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/moth_station_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/multi_purpose_interstellar_grade_casing.json b/src/generated/resources/assets/cosmiccore/models/item/multi_purpose_interstellar_grade_casing.json new file mode 100644 index 000000000..4dd3d055f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/multi_purpose_interstellar_grade_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/multi_purpose_interstellar_grade_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/multilayered_enthel_circuit_board.json b/src/generated/resources/assets/cosmiccore/models/item/multilayered_enthel_circuit_board.json new file mode 100644 index 000000000..a2b5e01ee --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/multilayered_enthel_circuit_board.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/multilayered_enthel_circuit_board" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/mv_calx_reactor.json new file mode 100644 index 000000000..b3e9c466f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/models/item/mv_energy_output_hatch_16a.json new file mode 100644 index 000000000..0790058a4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_energy_output_hatch_16a.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mv_energy_output_hatch_16a" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/models/item/mv_energy_output_hatch_4a.json new file mode 100644 index 000000000..5e2a335c5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_energy_output_hatch_4a.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mv_energy_output_hatch_4a" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/mv_mana_leaching_tub.json new file mode 100644 index 000000000..7caa0df35 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/mv_roaster.json new file mode 100644 index 000000000..daac709c1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/mv_thermomagnitizer.json new file mode 100644 index 000000000..f17790c3d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/mv_vacuum_bubbler.json new file mode 100644 index 000000000..48a02c2a6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/mv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mv_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/mv_wildfire_core.json new file mode 100644 index 000000000..9aa10ec6d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mv_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/mv_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/mystrix.json b/src/generated/resources/assets/cosmiccore/models/item/mystrix.json new file mode 100644 index 000000000..d91f716de --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/mystrix.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/mystrix" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/nano_boots.json b/src/generated/resources/assets/cosmiccore/models/item/nano_boots.json new file mode 100644 index 000000000..ad324932c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/nano_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/nano_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/naquadah_pressure_resistant_casing.json b/src/generated/resources/assets/cosmiccore/models/item/naquadah_pressure_resistant_casing.json new file mode 100644 index 000000000..d953c62c8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/naquadah_pressure_resistant_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/naquadah_pressure_resistant_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/naquadric_superalloy_coil_block.json b/src/generated/resources/assets/cosmiccore/models/item/naquadric_superalloy_coil_block.json new file mode 100644 index 000000000..7af378db3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/naquadric_superalloy_coil_block.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/naquadric_superalloy_coil_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/naquahine_pressure_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/naquahine_pressure_reactor.json new file mode 100644 index 000000000..ea47abfd3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/naquahine_pressure_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/naquahine_pressure_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/neuro_processing_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/neuro_processing_assembly.json new file mode 100644 index 000000000..d87cdc97c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/neuro_processing_assembly.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/neuro_processing_assembly" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/neutronium_buoy.json b/src/generated/resources/assets/cosmiccore/models/item/neutronium_buoy.json new file mode 100644 index 000000000..d8d9978f8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/neutronium_buoy.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/neutronium_buoy" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/null_refined_resonant_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/null_refined_resonant_wafer.json new file mode 100644 index 000000000..fa8ff3a59 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/null_refined_resonant_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/null_refined_resonant_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/nullified_harmonics_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/nullified_harmonics_wafer.json new file mode 100644 index 000000000..fbfd3196d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/nullified_harmonics_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/nullified_harmonics_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/nyxon.json b/src/generated/resources/assets/cosmiccore/models/item/nyxon.json new file mode 100644 index 000000000..39fa35282 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/nyxon.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/nyxon" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/occult_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/occult_asteroid.json new file mode 100644 index 000000000..0dc7d411c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/occult_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/occult_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_ev.json b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_ev.json new file mode 100644 index 000000000..55eff240d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_ev.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/omnia_circuit_ev" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_hv.json b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_hv.json new file mode 100644 index 000000000..ebfef73b0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_hv.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/omnia_circuit_hv" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_iv.json b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_iv.json new file mode 100644 index 000000000..2e1ae4843 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_iv.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/omnia_circuit_iv" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_luv.json b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_luv.json new file mode 100644 index 000000000..ebd3cd697 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_luv.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/omnia_circuit_luv" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_lv.json b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_lv.json new file mode 100644 index 000000000..8370bcdfa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_lv.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/omnia_circuit_lv" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_mv.json b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_mv.json new file mode 100644 index 000000000..256262137 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_mv.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/omnia_circuit_mv" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_opv.json b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_opv.json new file mode 100644 index 000000000..207717c92 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_opv.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/omnia_circuit_opv" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_uev.json b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_uev.json new file mode 100644 index 000000000..4a19ba605 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_uev.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/omnia_circuit_uev" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_uhv.json b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_uhv.json new file mode 100644 index 000000000..5dfd9ab31 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_uhv.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/omnia_circuit_uhv" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_uiv.json b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_uiv.json new file mode 100644 index 000000000..4355348da --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_uiv.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/omnia_circuit_uiv" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_uv.json b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_uv.json new file mode 100644 index 000000000..f77758c2c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_uv.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/omnia_circuit_uv" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_uxv.json b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_uxv.json new file mode 100644 index 000000000..451b2e026 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_uxv.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/omnia_circuit_uxv" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_zpm.json b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_zpm.json new file mode 100644 index 000000000..b3d282329 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/omnia_circuit_zpm.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/omnia_circuit_zpm" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/oneiric_sieve.json b/src/generated/resources/assets/cosmiccore/models/item/oneiric_sieve.json new file mode 100644 index 000000000..1265d6764 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/oneiric_sieve.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/oneiric_sieve" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/oneiric_signet_t1.json b/src/generated/resources/assets/cosmiccore/models/item/oneiric_signet_t1.json new file mode 100644 index 000000000..7994bee44 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/oneiric_signet_t1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/oneiric_signet_t1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/oneiric_signet_t2.json b/src/generated/resources/assets/cosmiccore/models/item/oneiric_signet_t2.json new file mode 100644 index 000000000..607762132 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/oneiric_signet_t2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/oneiric_signet_t2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/oneiric_signet_t3.json b/src/generated/resources/assets/cosmiccore/models/item/oneiric_signet_t3.json new file mode 100644 index 000000000..b6653003a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/oneiric_signet_t3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/oneiric_signet_t3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/oneiric_signet_t4.json b/src/generated/resources/assets/cosmiccore/models/item/oneiric_signet_t4.json new file mode 100644 index 000000000..fefa73611 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/oneiric_signet_t4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/oneiric_signet_t4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/oneiric_signet_t5.json b/src/generated/resources/assets/cosmiccore/models/item/oneiric_signet_t5.json new file mode 100644 index 000000000..94f06f9f0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/oneiric_signet_t5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/oneiric_signet_t5" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/optical_processing_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/optical_processing_assembly.json new file mode 100644 index 000000000..afb37f78f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/optical_processing_assembly.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/optical_processing_assembly" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/optical_processor.json b/src/generated/resources/assets/cosmiccore/models/item/optical_processor.json index 8878f5006..1a90fbf41 100644 --- a/src/generated/resources/assets/cosmiccore/models/item/optical_processor.json +++ b/src/generated/resources/assets/cosmiccore/models/item/optical_processor.json @@ -1,6 +1,6 @@ { - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/optical_processor" - } + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/optical_processor" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/optical_processor_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/optical_processor_assembly.json index 8f932fe71..719a9d50b 100644 --- a/src/generated/resources/assets/cosmiccore/models/item/optical_processor_assembly.json +++ b/src/generated/resources/assets/cosmiccore/models/item/optical_processor_assembly.json @@ -1,6 +1,6 @@ { - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/optical_processor_assembly" - } + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/optical_processor_assembly" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/optical_processor_mainframe.json b/src/generated/resources/assets/cosmiccore/models/item/optical_processor_mainframe.json index c22cf1132..67f5ab7c1 100644 --- a/src/generated/resources/assets/cosmiccore/models/item/optical_processor_mainframe.json +++ b/src/generated/resources/assets/cosmiccore/models/item/optical_processor_mainframe.json @@ -1,6 +1,6 @@ { - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/optical_processor_mainframe" - } + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/optical_processor_mainframe" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/optical_processor_supercomputer.json b/src/generated/resources/assets/cosmiccore/models/item/optical_processor_supercomputer.json index 21c847a7e..3cbcf5ac6 100644 --- a/src/generated/resources/assets/cosmiccore/models/item/optical_processor_supercomputer.json +++ b/src/generated/resources/assets/cosmiccore/models/item/optical_processor_supercomputer.json @@ -1,6 +1,6 @@ { - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/optical_processor_supercomputer" - } + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/optical_processor_supercomputer" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/optically_refined_circuit_board.json b/src/generated/resources/assets/cosmiccore/models/item/optically_refined_circuit_board.json new file mode 100644 index 000000000..a64e56a77 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/optically_refined_circuit_board.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/optically_refined_circuit_board" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/optically_refined_printed_circuit_board.json b/src/generated/resources/assets/cosmiccore/models/item/optically_refined_printed_circuit_board.json new file mode 100644 index 000000000..1e18a5ef0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/optically_refined_printed_circuit_board.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/optically_refined_printed_circuit_board" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/opv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..e8c7748a0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_16a_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_16a_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/opv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..de481a8b0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_16a_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_16a_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/opv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..b582c35b3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_4a_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_4a_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/opv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..8d9a06c72 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_4a_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_4a_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/opv_calx_reactor.json new file mode 100644 index 000000000..fff6bfae0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_gyroscope.json b/src/generated/resources/assets/cosmiccore/models/item/opv_gyroscope.json new file mode 100644 index 000000000..06b176ced --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_gyroscope.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/opv_gyroscope" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/opv_mana_leaching_tub.json new file mode 100644 index 000000000..28796ed41 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_powercell.json b/src/generated/resources/assets/cosmiccore/models/item/opv_powercell.json new file mode 100644 index 000000000..34597a32c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_powercell.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/opv_powercell" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_radio_module.json b/src/generated/resources/assets/cosmiccore/models/item/opv_radio_module.json new file mode 100644 index 000000000..07d44500a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_radio_module.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/opv_radio_module" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/opv_roaster.json new file mode 100644 index 000000000..ab9892dc9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/opv_soul_input_hatch.json new file mode 100644 index 000000000..e366264cd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_soul_input_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_soul_input_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/opv_soul_output_hatch.json new file mode 100644 index 000000000..cba905fdb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_soul_output_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_soul_output_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/opv_thermia_export_hatch.json new file mode 100644 index 000000000..c80eb7243 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_thermia_export_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_thermia_export_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/opv_thermia_import_hatch.json new file mode 100644 index 000000000..db6a55fe1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_thermia_import_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_thermia_import_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/opv_thermomagnitizer.json new file mode 100644 index 000000000..1dd731f8a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_thruster.json b/src/generated/resources/assets/cosmiccore/models/item/opv_thruster.json new file mode 100644 index 000000000..c2ee1d788 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_thruster.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/opv_thruster" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/opv_vacuum_bubbler.json new file mode 100644 index 000000000..937132295 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/opv_wireless_energy_dynamo.json new file mode 100644 index 000000000..398049ae0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/opv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/opv_wireless_energy_hatch.json new file mode 100644 index 000000000..e6d8221cd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/opv_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/opv_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/orbital_tempering_forge.json b/src/generated/resources/assets/cosmiccore/models/item/orbital_tempering_forge.json new file mode 100644 index 000000000..444bada13 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/orbital_tempering_forge.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/orbital_tempering_forge" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ore_extraction_drill_hv.json b/src/generated/resources/assets/cosmiccore/models/item/ore_extraction_drill_hv.json new file mode 100644 index 000000000..171c47212 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ore_extraction_drill_hv.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ore_extraction_drill_hv" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ore_extraction_drill_iv.json b/src/generated/resources/assets/cosmiccore/models/item/ore_extraction_drill_iv.json new file mode 100644 index 000000000..a407862ab --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ore_extraction_drill_iv.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ore_extraction_drill_iv" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ore_extraction_drill_lv.json b/src/generated/resources/assets/cosmiccore/models/item/ore_extraction_drill_lv.json new file mode 100644 index 000000000..7f032c8d2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ore_extraction_drill_lv.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ore_extraction_drill_lv" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ore_extraction_drill_zpm.json b/src/generated/resources/assets/cosmiccore/models/item/ore_extraction_drill_zpm.json new file mode 100644 index 000000000..e49cdeb88 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ore_extraction_drill_zpm.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ore_extraction_drill_zpm" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/oscillating_gilded_pthanterum_casings.json b/src/generated/resources/assets/cosmiccore/models/item/oscillating_gilded_pthanterum_casings.json new file mode 100644 index 000000000..d0ed502a5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/oscillating_gilded_pthanterum_casings.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/oscillating_gilded_pthanterum_casings" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/overloaded_pearls.json b/src/generated/resources/assets/cosmiccore/models/item/overloaded_pearls.json index f100a8817..75e9547af 100644 --- a/src/generated/resources/assets/cosmiccore/models/item/overloaded_pearls.json +++ b/src/generated/resources/assets/cosmiccore/models/item/overloaded_pearls.json @@ -1,6 +1,6 @@ { - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/overloaded_pearls" - } + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/overloaded_pearls" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/oxide_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/oxide_asteroid.json new file mode 100644 index 000000000..59724ae71 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/oxide_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/oxide_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pale_mote.json b/src/generated/resources/assets/cosmiccore/models/item/pale_mote.json new file mode 100644 index 000000000..56ed69860 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pale_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/pale_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pale_saw.json b/src/generated/resources/assets/cosmiccore/models/item/pale_saw.json new file mode 100644 index 000000000..868f22f0f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pale_saw.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/pale_saw" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pale_scrap.json b/src/generated/resources/assets/cosmiccore/models/item/pale_scrap.json new file mode 100644 index 000000000..4018afc27 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pale_scrap.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/pale_scrap" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/para_mod_1.json b/src/generated/resources/assets/cosmiccore/models/item/para_mod_1.json new file mode 100644 index 000000000..b643853e4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/para_mod_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/para_mod_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/para_mod_2.json b/src/generated/resources/assets/cosmiccore/models/item/para_mod_2.json new file mode 100644 index 000000000..0d094e190 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/para_mod_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/para_mod_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/para_mod_3.json b/src/generated/resources/assets/cosmiccore/models/item/para_mod_3.json new file mode 100644 index 000000000..781b7fbda --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/para_mod_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/para_mod_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/para_mod_4.json b/src/generated/resources/assets/cosmiccore/models/item/para_mod_4.json new file mode 100644 index 000000000..853f07ae8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/para_mod_4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/para_mod_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pcb_foundry.json b/src/generated/resources/assets/cosmiccore/models/item/pcb_foundry.json new file mode 100644 index 000000000..43259035b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pcb_foundry.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/pcb_foundry" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/persona_core_assisted_circuit_board.json b/src/generated/resources/assets/cosmiccore/models/item/persona_core_assisted_circuit_board.json new file mode 100644 index 000000000..8a8d9fe08 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/persona_core_assisted_circuit_board.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/persona_core_assisted_circuit_board" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/persona_core_assisted_printed_circuit_board.json b/src/generated/resources/assets/cosmiccore/models/item/persona_core_assisted_printed_circuit_board.json new file mode 100644 index 000000000..a6f5a12c8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/persona_core_assisted_printed_circuit_board.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/persona_core_assisted_printed_circuit_board" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/phantnon.json b/src/generated/resources/assets/cosmiccore/models/item/phantnon.json new file mode 100644 index 000000000..29751eb02 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/phantnon.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/phantnon" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/plasmatic_drone.json b/src/generated/resources/assets/cosmiccore/models/item/plasmatic_drone.json new file mode 100644 index 000000000..02a48cc47 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/plasmatic_drone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/plasmatic_drone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/plasmite_distillery.json b/src/generated/resources/assets/cosmiccore/models/item/plasmite_distillery.json new file mode 100644 index 000000000..8a39d94d6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/plasmite_distillery.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/plasmite_distillery" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/plastic_circuit_board.json b/src/generated/resources/assets/cosmiccore/models/item/plastic_circuit_board.json new file mode 100644 index 000000000..a44a67947 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/plastic_circuit_board.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/plastic_circuit_board" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/plated_aerocloud.json b/src/generated/resources/assets/cosmiccore/models/item/plated_aerocloud.json new file mode 100644 index 000000000..6fa032c21 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/plated_aerocloud.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/plated_aerocloud" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/polymerizer.json b/src/generated/resources/assets/cosmiccore/models/item/polymerizer.json new file mode 100644 index 000000000..ef00c73ca --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/polymerizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/polymerizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/portable_gravity_core.json b/src/generated/resources/assets/cosmiccore/models/item/portable_gravity_core.json new file mode 100644 index 000000000..38f8d6dc6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/portable_gravity_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/portable_gravity_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/potency_chip.json b/src/generated/resources/assets/cosmiccore/models/item/potency_chip.json new file mode 100644 index 000000000..a75569d8b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/potency_chip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/potency_chip" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/prepared_lucid_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/prepared_lucid_wafer.json new file mode 100644 index 000000000..0da052ffc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/prepared_lucid_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/prepared_lucid_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/prepared_petri_dish.json b/src/generated/resources/assets/cosmiccore/models/item/prepared_petri_dish.json new file mode 100644 index 000000000..971540fb6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/prepared_petri_dish.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/prepared_petri_dish" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pressure_containment_casing.json b/src/generated/resources/assets/cosmiccore/models/item/pressure_containment_casing.json new file mode 100644 index 000000000..2b046c9fa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pressure_containment_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/pressure_containment_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pressurized_rebreather.json b/src/generated/resources/assets/cosmiccore/models/item/pressurized_rebreather.json new file mode 100644 index 000000000..d6322c0b8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pressurized_rebreather.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/pressurized_rebreather" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/prismatic_ore_foundry.json b/src/generated/resources/assets/cosmiccore/models/item/prismatic_ore_foundry.json new file mode 100644 index 000000000..8b837c719 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/prismatic_ore_foundry.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/prismatic_ore_foundry" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/prismatic_tungstensteel_coil_block.json b/src/generated/resources/assets/cosmiccore/models/item/prismatic_tungstensteel_coil_block.json new file mode 100644 index 000000000..d94f28994 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/prismatic_tungstensteel_coil_block.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/prismatic_tungstensteel_coil_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/prod_mod_1.json b/src/generated/resources/assets/cosmiccore/models/item/prod_mod_1.json new file mode 100644 index 000000000..34bb275b7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/prod_mod_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/prod_mod_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/prod_mod_2.json b/src/generated/resources/assets/cosmiccore/models/item/prod_mod_2.json new file mode 100644 index 000000000..f7b64bceb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/prod_mod_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/prod_mod_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/prod_mod_3.json b/src/generated/resources/assets/cosmiccore/models/item/prod_mod_3.json new file mode 100644 index 000000000..08a02eaa0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/prod_mod_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/prod_mod_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/prod_mod_4.json b/src/generated/resources/assets/cosmiccore/models/item/prod_mod_4.json new file mode 100644 index 000000000..09e8a0688 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/prod_mod_4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/prod_mod_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/programable_matter_coil_block.json b/src/generated/resources/assets/cosmiccore/models/item/programable_matter_coil_block.json new file mode 100644 index 000000000..d92ab0a50 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/programable_matter_coil_block.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/programable_matter_coil_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/programmable_mote.json b/src/generated/resources/assets/cosmiccore/models/item/programmable_mote.json new file mode 100644 index 000000000..43381d93f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/programmable_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/programmable_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/protocyte_mod.json b/src/generated/resources/assets/cosmiccore/models/item/protocyte_mod.json new file mode 100644 index 000000000..50803e3d9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/protocyte_mod.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/protocyte_mod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/psionic_galvorn_coil_block.json b/src/generated/resources/assets/cosmiccore/models/item/psionic_galvorn_coil_block.json new file mode 100644 index 000000000..ff7392d7c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/psionic_galvorn_coil_block.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/psionic_galvorn_coil_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/psionic_processor.json b/src/generated/resources/assets/cosmiccore/models/item/psionic_processor.json deleted file mode 100644 index 73747e3c6..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/psionic_processor.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/psionic_processor" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/psionic_processor_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/psionic_processor_assembly.json deleted file mode 100644 index cb69ae524..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/psionic_processor_assembly.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/psionic_processor_assembly" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/psionic_processor_mainframe.json b/src/generated/resources/assets/cosmiccore/models/item/psionic_processor_mainframe.json deleted file mode 100644 index 359926e1a..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/psionic_processor_mainframe.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/psionic_processor_mainframe" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/psionic_processor_supercomputer.json b/src/generated/resources/assets/cosmiccore/models/item/psionic_processor_supercomputer.json deleted file mode 100644 index bab37e9fd..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/psionic_processor_supercomputer.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/psionic_processor_supercomputer" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pthanterum_wave_breakers.json b/src/generated/resources/assets/cosmiccore/models/item/pthanterum_wave_breakers.json new file mode 100644 index 000000000..3b30c7250 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pthanterum_wave_breakers.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/pthanterum_wave_breakers" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_1.json b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_1.json new file mode 100644 index 000000000..341c9ac43 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/pulverizing_beetle_grade_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_2.json b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_2.json new file mode 100644 index 000000000..6ef3d5812 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/pulverizing_beetle_grade_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_3.json b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_3.json new file mode 100644 index 000000000..0fbf5b978 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/pulverizing_beetle_grade_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_4.json b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_4.json new file mode 100644 index 000000000..248848958 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/pulverizing_beetle_grade_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_5.json b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_5.json new file mode 100644 index 000000000..9977fc229 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pulverizing_beetle_grade_5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/pulverizing_beetle_grade_5" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pyretic_ichor.json b/src/generated/resources/assets/cosmiccore/models/item/pyretic_ichor.json new file mode 100644 index 000000000..81ac6126c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pyretic_ichor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/pyretic_ichor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pyrith.json b/src/generated/resources/assets/cosmiccore/models/item/pyrith.json new file mode 100644 index 000000000..93e6e75e3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pyrith.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/pyrith" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/pyrothermic_refinery.json b/src/generated/resources/assets/cosmiccore/models/item/pyrothermic_refinery.json new file mode 100644 index 000000000..0eec8eafa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/pyrothermic_refinery.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/pyrothermic_refinery" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/quark_boots.json b/src/generated/resources/assets/cosmiccore/models/item/quark_boots.json new file mode 100644 index 000000000..0d993f793 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/quark_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/quark_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/radiant_mote.json b/src/generated/resources/assets/cosmiccore/models/item/radiant_mote.json new file mode 100644 index 000000000..eec0a457b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/radiant_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/radiant_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/radioactive_filter_casing.json b/src/generated/resources/assets/cosmiccore/models/item/radioactive_filter_casing.json new file mode 100644 index 000000000..00c40b37e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/radioactive_filter_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/variant/radioactive_filter_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/rare_metals_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/rare_metals_asteroid.json new file mode 100644 index 000000000..e9dcb2317 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/rare_metals_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/rare_metals_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/raymarching_dandilifeon.json b/src/generated/resources/assets/cosmiccore/models/item/raymarching_dandilifeon.json new file mode 100644 index 000000000..b8c0773d8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/raymarching_dandilifeon.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/raymarching_dandilifeon" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_1.json b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_1.json new file mode 100644 index 000000000..9bf5aa454 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/razor_hornet_grade_1" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_2.json b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_2.json new file mode 100644 index 000000000..9d0c46ad6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/razor_hornet_grade_2" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_3.json b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_3.json new file mode 100644 index 000000000..2545d6627 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/razor_hornet_grade_3" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_4.json b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_4.json new file mode 100644 index 000000000..078514dbb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_4.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/razor_hornet_grade_4" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_5.json b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_5.json new file mode 100644 index 000000000..43220eb4b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/razor_hornet_grade_5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/razor_hornet_grade_5" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/record_keeping_processor_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/record_keeping_processor_assembly.json new file mode 100644 index 000000000..d1b30ef1c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/record_keeping_processor_assembly.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/record_keeping_processor_assembly" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/record_kept_circuit_board.json b/src/generated/resources/assets/cosmiccore/models/item/record_kept_circuit_board.json new file mode 100644 index 000000000..df67d16e5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/record_kept_circuit_board.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/record_kept_circuit_board" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/record_kept_printed_circuit_board.json b/src/generated/resources/assets/cosmiccore/models/item/record_kept_printed_circuit_board.json new file mode 100644 index 000000000..eb2f3d861 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/record_kept_printed_circuit_board.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/record_kept_printed_circuit_board" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/refined_harmonics_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/refined_harmonics_wafer.json new file mode 100644 index 000000000..bd06d03e8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/refined_harmonics_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/refined_harmonics_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/refined_resonant_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/refined_resonant_wafer.json new file mode 100644 index 000000000..d0efc715b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/refined_resonant_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/refined_resonant_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/reflection_mirror.json b/src/generated/resources/assets/cosmiccore/models/item/reflection_mirror.json new file mode 100644 index 000000000..69f835e83 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/reflection_mirror.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/reflection_mirror" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/reflective_starmetal_casing.json b/src/generated/resources/assets/cosmiccore/models/item/reflective_starmetal_casing.json new file mode 100644 index 000000000..937163136 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/reflective_starmetal_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/reflective_starmetal_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/reinforced_dawnstone_casing.json b/src/generated/resources/assets/cosmiccore/models/item/reinforced_dawnstone_casing.json new file mode 100644 index 000000000..fcbc53ad7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/reinforced_dawnstone_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/reinforced_dawnstone_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/reinforced_naquadria_casing.json b/src/generated/resources/assets/cosmiccore/models/item/reinforced_naquadria_casing.json new file mode 100644 index 000000000..06ac38e7e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/reinforced_naquadria_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/reinforced_naquadria_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/reinforced_trinavine_coil_block.json b/src/generated/resources/assets/cosmiccore/models/item/reinforced_trinavine_coil_block.json new file mode 100644 index 000000000..93555a631 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/reinforced_trinavine_coil_block.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/reinforced_trinavine_coil_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/resipiratory_sculk_hemocytoblast.json b/src/generated/resources/assets/cosmiccore/models/item/resipiratory_sculk_hemocytoblast.json new file mode 100644 index 000000000..4a84e4a8c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/resipiratory_sculk_hemocytoblast.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/resipiratory_sculk_hemocytoblast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/resonant_mod.json b/src/generated/resources/assets/cosmiccore/models/item/resonant_mod.json new file mode 100644 index 000000000..a0f8ecc5f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/resonant_mod.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/resonant_mod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/resonant_virtue_meld_coil_block.json b/src/generated/resources/assets/cosmiccore/models/item/resonant_virtue_meld_coil_block.json new file mode 100644 index 000000000..cf66667f5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/resonant_virtue_meld_coil_block.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/resonant_virtue_meld_coil_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/resonantly_tuned_virtue_meld_casing.json b/src/generated/resources/assets/cosmiccore/models/item/resonantly_tuned_virtue_meld_casing.json new file mode 100644 index 000000000..d60bea7a0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/resonantly_tuned_virtue_meld_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/resonantly_tuned_virtue_meld_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/rigid_high_speed_steel_casing.json b/src/generated/resources/assets/cosmiccore/models/item/rigid_high_speed_steel_casing.json new file mode 100644 index 000000000..220cd0089 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/rigid_high_speed_steel_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/rigid_high_speed_steel_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ritual_stone.json b/src/generated/resources/assets/cosmiccore/models/item/ritual_stone.json new file mode 100644 index 000000000..6c6ff0fa1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ritual_stone.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/ritual_stone" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/robust_drone.json b/src/generated/resources/assets/cosmiccore/models/item/robust_drone.json new file mode 100644 index 000000000..6c2331a6d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/robust_drone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/robust_drone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/royal_ichorium_casing.json b/src/generated/resources/assets/cosmiccore/models/item/royal_ichorium_casing.json new file mode 100644 index 000000000..c5f8acde2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/royal_ichorium_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/royal_ichorium_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/rune_conjunction_arklythar.json b/src/generated/resources/assets/cosmiccore/models/item/rune_conjunction_arklythar.json new file mode 100644 index 000000000..912b84052 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/rune_conjunction_arklythar.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/rune_conjunction_arklythar" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/rune_conjunction_kholys.json b/src/generated/resources/assets/cosmiccore/models/item/rune_conjunction_kholys.json new file mode 100644 index 000000000..09d1d90fa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/rune_conjunction_kholys.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/rune_conjunction_kholys" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/rune_conjunction_valkruth.json b/src/generated/resources/assets/cosmiccore/models/item/rune_conjunction_valkruth.json new file mode 100644 index 000000000..adbf56d2e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/rune_conjunction_valkruth.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/rune_conjunction_valkruth" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/rune_slate_arklys.json b/src/generated/resources/assets/cosmiccore/models/item/rune_slate_arklys.json new file mode 100644 index 000000000..131407e9b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/rune_slate_arklys.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/rune_slate_arklys" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/rune_slate_khoruth.json b/src/generated/resources/assets/cosmiccore/models/item/rune_slate_khoruth.json new file mode 100644 index 000000000..4baa38d16 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/rune_slate_khoruth.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/rune_slate_khoruth" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/rune_slate_tenura.json b/src/generated/resources/assets/cosmiccore/models/item/rune_slate_tenura.json new file mode 100644 index 000000000..2bb6e4d97 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/rune_slate_tenura.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/rune_slate_tenura" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/rune_slate_tylomir.json b/src/generated/resources/assets/cosmiccore/models/item/rune_slate_tylomir.json new file mode 100644 index 000000000..a7912f74e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/rune_slate_tylomir.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/rune_slate_tylomir" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/rune_slate_valdris.json b/src/generated/resources/assets/cosmiccore/models/item/rune_slate_valdris.json new file mode 100644 index 000000000..7fd9add8c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/rune_slate_valdris.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/rune_slate_valdris" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/rune_slate_zelothar.json b/src/generated/resources/assets/cosmiccore/models/item/rune_slate_zelothar.json new file mode 100644 index 000000000..24888b7b5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/rune_slate_zelothar.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/rune_slate_zelothar" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/runewoven_plastic_circuit_board.json b/src/generated/resources/assets/cosmiccore/models/item/runewoven_plastic_circuit_board.json new file mode 100644 index 000000000..a36af905f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/runewoven_plastic_circuit_board.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/runewoven_plastic_circuit_board" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/runic_hex_cpu.json b/src/generated/resources/assets/cosmiccore/models/item/runic_hex_cpu.json new file mode 100644 index 000000000..be0735d2c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/runic_hex_cpu.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/runic_hex_cpu" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/runic_hex_cpu_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/runic_hex_cpu_wafer.json new file mode 100644 index 000000000..53eb97fb7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/runic_hex_cpu_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/runic_hex_cpu_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/rust_stained_casing.json b/src/generated/resources/assets/cosmiccore/models/item/rust_stained_casing.json new file mode 100644 index 000000000..69b5e13ed --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/rust_stained_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/rust_stained_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/rust_weave_casing.json b/src/generated/resources/assets/cosmiccore/models/item/rust_weave_casing.json new file mode 100644 index 000000000..2cc3e8f4d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/rust_weave_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/rust_weave_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/rusty_drone.json b/src/generated/resources/assets/cosmiccore/models/item/rusty_drone.json new file mode 100644 index 000000000..3dc1f3ca7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/rusty_drone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/rusty_drone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/sanguine_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/sanguine_asteroid.json new file mode 100644 index 000000000..032818efc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/sanguine_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/sanguine_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/sanguine_boots.json b/src/generated/resources/assets/cosmiccore/models/item/sanguine_boots.json new file mode 100644 index 000000000..43138832e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/sanguine_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/sanguine_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/sanguine_drone.json b/src/generated/resources/assets/cosmiccore/models/item/sanguine_drone.json new file mode 100644 index 000000000..43338bdeb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/sanguine_drone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/sanguine_drone" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/sanguine_warptech_boots.json b/src/generated/resources/assets/cosmiccore/models/item/sanguine_warptech_boots.json new file mode 100644 index 000000000..7a84fce86 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/sanguine_warptech_boots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/sanguine_warptech_boots" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/sanguine_warptech_chestplate.json b/src/generated/resources/assets/cosmiccore/models/item/sanguine_warptech_chestplate.json new file mode 100644 index 000000000..3e29531e2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/sanguine_warptech_chestplate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/sanguine_warptech_chestplate" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/sanguine_warptech_helmet.json b/src/generated/resources/assets/cosmiccore/models/item/sanguine_warptech_helmet.json new file mode 100644 index 000000000..a2f1d018a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/sanguine_warptech_helmet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/sanguine_warptech_helmet" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/sanguine_warptech_leggings.json b/src/generated/resources/assets/cosmiccore/models/item/sanguine_warptech_leggings.json new file mode 100644 index 000000000..a3e504032 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/sanguine_warptech_leggings.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/sanguine_warptech_leggings" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/saturated_sculk_hemocytoblast.json b/src/generated/resources/assets/cosmiccore/models/item/saturated_sculk_hemocytoblast.json new file mode 100644 index 000000000..a5e6c2b03 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/saturated_sculk_hemocytoblast.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/saturated_sculk_hemocytoblast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/sculk_fibroblast.json b/src/generated/resources/assets/cosmiccore/models/item/sculk_fibroblast.json new file mode 100644 index 000000000..c03a46b2c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/sculk_fibroblast.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/sculk_fibroblast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/sculk_myofibroblast.json b/src/generated/resources/assets/cosmiccore/models/item/sculk_myofibroblast.json new file mode 100644 index 000000000..e4b458ac6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/sculk_myofibroblast.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/sculk_myofibroblast" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/self_aware_processing_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/self_aware_processing_assembly.json new file mode 100644 index 000000000..f1dffffaf --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/self_aware_processing_assembly.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/self_aware_processing_assembly" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/self_healing_pthanterum_casing.json b/src/generated/resources/assets/cosmiccore/models/item/self_healing_pthanterum_casing.json new file mode 100644 index 000000000..5fc095427 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/self_healing_pthanterum_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/self_healing_pthanterum_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/sensor_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/sensor_hatch.json new file mode 100644 index 000000000..89bb0607d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/sensor_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/sensor_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/seraphon.json b/src/generated/resources/assets/cosmiccore/models/item/seraphon.json new file mode 100644 index 000000000..93a580dfd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/seraphon.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/seraphon" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/shard_of_perpetuity.json b/src/generated/resources/assets/cosmiccore/models/item/shard_of_perpetuity.json new file mode 100644 index 000000000..520123dab --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/shard_of_perpetuity.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/shard_of_perpetuity" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/shimmering_neutronium_coil_block.json b/src/generated/resources/assets/cosmiccore/models/item/shimmering_neutronium_coil_block.json new file mode 100644 index 000000000..354428edd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/shimmering_neutronium_coil_block.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/shimmering_neutronium_coil_block" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/simple_rebreather.json b/src/generated/resources/assets/cosmiccore/models/item/simple_rebreather.json new file mode 100644 index 000000000..1d048cef3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/simple_rebreather.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/simple_rebreather" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/somarust_casing.json b/src/generated/resources/assets/cosmiccore/models/item/somarust_casing.json new file mode 100644 index 000000000..b7ccfcec5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/somarust_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/somarust_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/somatic_processing_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/somatic_processing_assembly.json new file mode 100644 index 000000000..a5ed7796a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/somatic_processing_assembly.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/somatic_processing_assembly" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/somnolent_dew.json b/src/generated/resources/assets/cosmiccore/models/item/somnolent_dew.json new file mode 100644 index 000000000..6b157f612 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/somnolent_dew.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/somnolent_dew" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/soul_cut_lucid_cpu_chip.json b/src/generated/resources/assets/cosmiccore/models/item/soul_cut_lucid_cpu_chip.json new file mode 100644 index 000000000..8ea0335f9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/soul_cut_lucid_cpu_chip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/soul_cut_lucid_cpu_chip" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/soul_muted_casing.json b/src/generated/resources/assets/cosmiccore/models/item/soul_muted_casing.json new file mode 100644 index 000000000..ada4bcdad --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/soul_muted_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/soul_muted_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/soul_mutilator.json b/src/generated/resources/assets/cosmiccore/models/item/soul_mutilator.json new file mode 100644 index 000000000..5a5c57403 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/soul_mutilator.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/soul_mutilator" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/soul_reader.json b/src/generated/resources/assets/cosmiccore/models/item/soul_reader.json new file mode 100644 index 000000000..1da6522a0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/soul_reader.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/soul_reader" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/soul_stained_steel_aluminium_plated_casing.json b/src/generated/resources/assets/cosmiccore/models/item/soul_stained_steel_aluminium_plated_casing.json new file mode 100644 index 000000000..5977bf249 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/soul_stained_steel_aluminium_plated_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/soul_stained_steel_aluminium_plated_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/soul_tester.json b/src/generated/resources/assets/cosmiccore/models/item/soul_tester.json new file mode 100644 index 000000000..987852f75 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/soul_tester.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/soul_tester" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/space_advanced_nanomuscle_chestplate.json b/src/generated/resources/assets/cosmiccore/models/item/space_advanced_nanomuscle_chestplate.json deleted file mode 100644 index 6ca659c0d..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/space_advanced_nanomuscle_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/space_advanced_nanomuscle_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/space_advanced_quarktech_chestplate.json b/src/generated/resources/assets/cosmiccore/models/item/space_advanced_quarktech_chestplate.json deleted file mode 100644 index feefb391d..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/space_advanced_quarktech_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/space_advanced_quarktech_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/space_nanomuscle_chestplate.json b/src/generated/resources/assets/cosmiccore/models/item/space_nanomuscle_chestplate.json deleted file mode 100644 index 8af76139a..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/space_nanomuscle_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/space_nanomuscle_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/space_quarktech_chestplate.json b/src/generated/resources/assets/cosmiccore/models/item/space_quarktech_chestplate.json deleted file mode 100644 index 5dacd4f46..000000000 --- a/src/generated/resources/assets/cosmiccore/models/item/space_quarktech_chestplate.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/space_quarktech_chestplate" - } -} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/space_radio.json b/src/generated/resources/assets/cosmiccore/models/item/space_radio.json new file mode 100644 index 000000000..1a4fd8ca5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/space_radio.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/space_radio" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/spectil.json b/src/generated/resources/assets/cosmiccore/models/item/spectil.json new file mode 100644 index 000000000..79d367446 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/spectil.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/spectil" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/spent_flesh_packed_neptunium_fuel.json b/src/generated/resources/assets/cosmiccore/models/item/spent_flesh_packed_neptunium_fuel.json new file mode 100644 index 000000000..04296b434 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/spent_flesh_packed_neptunium_fuel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/spent_flesh_packed_neptunium_fuel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/spent_flesh_packed_plutonium_fuel.json b/src/generated/resources/assets/cosmiccore/models/item/spent_flesh_packed_plutonium_fuel.json new file mode 100644 index 000000000..ad007132f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/spent_flesh_packed_plutonium_fuel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/spent_flesh_packed_plutonium_fuel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/spent_flesh_packed_uranium_fuel.json b/src/generated/resources/assets/cosmiccore/models/item/spent_flesh_packed_uranium_fuel.json new file mode 100644 index 000000000..1b1ece0de --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/spent_flesh_packed_uranium_fuel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/spent_flesh_packed_uranium_fuel" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/spirit_crucible.json b/src/generated/resources/assets/cosmiccore/models/item/spirit_crucible.json new file mode 100644 index 000000000..1bf8e5451 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/spirit_crucible.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/spirit_crucible" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/spirit_engraved_enthel_circuit_board.json b/src/generated/resources/assets/cosmiccore/models/item/spirit_engraved_enthel_circuit_board.json new file mode 100644 index 000000000..d966fb95d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/spirit_engraved_enthel_circuit_board.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/spirit_engraved_enthel_circuit_board" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/spirit_runed_enthel_cpu.json b/src/generated/resources/assets/cosmiccore/models/item/spirit_runed_enthel_cpu.json new file mode 100644 index 000000000..9e80b23ce --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/spirit_runed_enthel_cpu.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/spirit_runed_enthel_cpu" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/spirit_runed_enthel_cpu_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/spirit_runed_enthel_cpu_wafer.json new file mode 100644 index 000000000..77d10d905 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/spirit_runed_enthel_cpu_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/spirit_runed_enthel_cpu_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/star_ladder.json b/src/generated/resources/assets/cosmiccore/models/item/star_ladder.json new file mode 100644 index 000000000..afc50dced --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/star_ladder.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/star_ladder" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/star_ladder_research_hub.json b/src/generated/resources/assets/cosmiccore/models/item/star_ladder_research_hub.json new file mode 100644 index 000000000..bad219112 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/star_ladder_research_hub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/star_ladder_research_hub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/stasis_brine.json b/src/generated/resources/assets/cosmiccore/models/item/stasis_brine.json new file mode 100644 index 000000000..3f44928d2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/stasis_brine.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/stasis_brine" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/steam_caster.json b/src/generated/resources/assets/cosmiccore/models/item/steam_caster.json new file mode 100644 index 000000000..5e93841cb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/steam_caster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/steam_caster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/steam_fluid_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/steam_fluid_input_hatch.json new file mode 100644 index 000000000..7a5089762 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/steam_fluid_input_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/steam_fluid_input_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/steam_fluid_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/steam_fluid_output_hatch.json new file mode 100644 index 000000000..2ad76c413 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/steam_fluid_output_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/steam_fluid_output_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/steam_large_turbine.json b/src/generated/resources/assets/cosmiccore/models/item/steam_large_turbine.json new file mode 100644 index 000000000..ba5933501 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/steam_large_turbine.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/steam_large_turbine" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/steam_mixing_vessel.json b/src/generated/resources/assets/cosmiccore/models/item/steam_mixing_vessel.json new file mode 100644 index 000000000..cb7ff661b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/steam_mixing_vessel.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/steam_mixing_vessel" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/steel_plated_bronze_casing.json b/src/generated/resources/assets/cosmiccore/models/item/steel_plated_bronze_casing.json new file mode 100644 index 000000000..3aaa1056f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/steel_plated_bronze_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/steel_plated_bronze_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/steel_rose_lantern.json b/src/generated/resources/assets/cosmiccore/models/item/steel_rose_lantern.json new file mode 100644 index 000000000..7805aa83e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/steel_rose_lantern.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/steel_rose_lantern" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/steel_rose_light.json b/src/generated/resources/assets/cosmiccore/models/item/steel_rose_light.json new file mode 100644 index 000000000..01efea0ae --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/steel_rose_light.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/steel_rose_light" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/steel_rose_light_slab.json b/src/generated/resources/assets/cosmiccore/models/item/steel_rose_light_slab.json new file mode 100644 index 000000000..9c1ab5487 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/steel_rose_light_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/steel_rose_light_slab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/steel_rose_light_stairs.json b/src/generated/resources/assets/cosmiccore/models/item/steel_rose_light_stairs.json new file mode 100644 index 000000000..6e6a53d7c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/steel_rose_light_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/steel_rose_light_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/steel_supply_tank.json b/src/generated/resources/assets/cosmiccore/models/item/steel_supply_tank.json new file mode 100644 index 000000000..b80518e7b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/steel_supply_tank.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/steel_supply_tank" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/stellar_iris.json b/src/generated/resources/assets/cosmiccore/models/item/stellar_iris.json new file mode 100644 index 000000000..558bb96a6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/stellar_iris.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/stellar_iris" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/stellar_neutronium_grade_magnet.json b/src/generated/resources/assets/cosmiccore/models/item/stellar_neutronium_grade_magnet.json new file mode 100644 index 000000000..9ed017848 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/stellar_neutronium_grade_magnet.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/stellar_neutronium_grade_magnet" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/stellar_smelting_module.json b/src/generated/resources/assets/cosmiccore/models/item/stellar_smelting_module.json new file mode 100644 index 000000000..e6c7befc6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/stellar_smelting_module.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/stellar_smelting_module" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/sterilization_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/sterilization_hatch.json new file mode 100644 index 000000000..eeece1ed9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/sterilization_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/sterilization_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/streptococcus_pyogenes.json b/src/generated/resources/assets/cosmiccore/models/item/streptococcus_pyogenes.json new file mode 100644 index 000000000..c4bc6db44 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/streptococcus_pyogenes.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/streptococcus_pyogenes" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/streptococcus_pyogenes_culture.json b/src/generated/resources/assets/cosmiccore/models/item/streptococcus_pyogenes_culture.json new file mode 100644 index 000000000..7a8e5930c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/streptococcus_pyogenes_culture.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/streptococcus_pyogenes_culture" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/submerged_welder.json b/src/generated/resources/assets/cosmiccore/models/item/submerged_welder.json new file mode 100644 index 000000000..61e921629 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/submerged_welder.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/submerged_welder" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/suelescent_processor.json b/src/generated/resources/assets/cosmiccore/models/item/suelescent_processor.json new file mode 100644 index 000000000..8cb6c1ec8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/suelescent_processor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/suelescent_processor" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/suelescent_processor_assembly.json b/src/generated/resources/assets/cosmiccore/models/item/suelescent_processor_assembly.json new file mode 100644 index 000000000..821822d4f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/suelescent_processor_assembly.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/suelescent_processor_assembly" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/suelescent_processor_mainframe.json b/src/generated/resources/assets/cosmiccore/models/item/suelescent_processor_mainframe.json new file mode 100644 index 000000000..f59b69c70 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/suelescent_processor_mainframe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/suelescent_processor_mainframe" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/suelescent_processor_supercomputer.json b/src/generated/resources/assets/cosmiccore/models/item/suelescent_processor_supercomputer.json new file mode 100644 index 000000000..82bad6b7e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/suelescent_processor_supercomputer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/suelescent_processor_supercomputer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/suffering_chamber.json b/src/generated/resources/assets/cosmiccore/models/item/suffering_chamber.json new file mode 100644 index 000000000..e89a49581 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/suffering_chamber.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/suffering_chamber" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/superheated_fuel_rod.json b/src/generated/resources/assets/cosmiccore/models/item/superheated_fuel_rod.json new file mode 100644 index 000000000..5f807fe3f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/superheated_fuel_rod.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/superheated_fuel_rod" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/superheavy_steel_casing.json b/src/generated/resources/assets/cosmiccore/models/item/superheavy_steel_casing.json new file mode 100644 index 000000000..aed407f1f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/superheavy_steel_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/superheavy_steel_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/tau_fruit.json b/src/generated/resources/assets/cosmiccore/models/item/tau_fruit.json new file mode 100644 index 000000000..c9064a0b3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/tau_fruit.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/tau_fruit" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/tau_oil.json b/src/generated/resources/assets/cosmiccore/models/item/tau_oil.json new file mode 100644 index 000000000..a520f89f9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/tau_oil.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/tau_oil" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/temporal_reinforced_lucid_circuit_board.json b/src/generated/resources/assets/cosmiccore/models/item/temporal_reinforced_lucid_circuit_board.json new file mode 100644 index 000000000..0f904bdb5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/temporal_reinforced_lucid_circuit_board.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/temporal_reinforced_lucid_circuit_board" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/temporal_reinforced_lucid_printed_circuit_board.json b/src/generated/resources/assets/cosmiccore/models/item/temporal_reinforced_lucid_printed_circuit_board.json new file mode 100644 index 000000000..06893076a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/temporal_reinforced_lucid_printed_circuit_board.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/temporal_reinforced_lucid_printed_circuit_board" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/temporal_stable_thundering_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/temporal_stable_thundering_wafer.json new file mode 100644 index 000000000..d9648ed3d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/temporal_stable_thundering_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/temporal_stable_thundering_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/tenaebrum.json b/src/generated/resources/assets/cosmiccore/models/item/tenaebrum.json new file mode 100644 index 000000000..a22a0f3bc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/tenaebrum.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/tenaebrum" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/tessaron.json b/src/generated/resources/assets/cosmiccore/models/item/tessaron.json new file mode 100644 index 000000000..3663bca70 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/tessaron.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/tessaron" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/tethering_resin.json b/src/generated/resources/assets/cosmiccore/models/item/tethering_resin.json new file mode 100644 index 000000000..67d35bc87 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/tethering_resin.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/tethering_resin" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/thaumica_wafer.json b/src/generated/resources/assets/cosmiccore/models/item/thaumica_wafer.json new file mode 100644 index 000000000..f39f7c3fa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/thaumica_wafer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/thaumica_wafer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/the_one_ring.json b/src/generated/resources/assets/cosmiccore/models/item/the_one_ring.json new file mode 100644 index 000000000..6e717ea3c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/the_one_ring.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/the_one_ring" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/thermal_chain_agent.json b/src/generated/resources/assets/cosmiccore/models/item/thermal_chain_agent.json new file mode 100644 index 000000000..b6de11191 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/thermal_chain_agent.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/thermal_chain_agent" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/titan_fusion_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/titan_fusion_reactor.json new file mode 100644 index 000000000..3f6f85d37 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/titan_fusion_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/titan_fusion_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/transcendent_mote.json b/src/generated/resources/assets/cosmiccore/models/item/transcendent_mote.json new file mode 100644 index 000000000..5e0967460 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/transcendent_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/transcendent_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/trinavine_nanolattice_spool.json b/src/generated/resources/assets/cosmiccore/models/item/trinavine_nanolattice_spool.json new file mode 100644 index 000000000..5cb328a1a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/trinavine_nanolattice_spool.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/trinavine_nanolattice_spool" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/tritanium_lined_heavy_neutronium_casing.json b/src/generated/resources/assets/cosmiccore/models/item/tritanium_lined_heavy_neutronium_casing.json new file mode 100644 index 000000000..d996aba9d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/tritanium_lined_heavy_neutronium_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/tritanium_lined_heavy_neutronium_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/tungstensteel_nanolattice_spool.json b/src/generated/resources/assets/cosmiccore/models/item/tungstensteel_nanolattice_spool.json new file mode 100644 index 000000000..1cbeb157b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/tungstensteel_nanolattice_spool.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/tungstensteel_nanolattice_spool" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/uev_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..e48af9c4b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_16a_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_16a_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uev_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..959a0927a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_16a_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_16a_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/uev_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..fa5be1b26 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_4a_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_4a_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uev_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..f6fb65191 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_4a_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_4a_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/uev_calx_reactor.json new file mode 100644 index 000000000..f76c62ebd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_cosmic_parallel_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uev_cosmic_parallel_hatch.json new file mode 100644 index 000000000..d7228d472 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_cosmic_parallel_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_cosmic_parallel_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_gyroscope.json b/src/generated/resources/assets/cosmiccore/models/item/uev_gyroscope.json new file mode 100644 index 000000000..43e7d9b99 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_gyroscope.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uev_gyroscope" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/uev_mana_leaching_tub.json new file mode 100644 index 000000000..587c0c9c9 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_module_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uev_module_hatch.json new file mode 100644 index 000000000..ec6f65c7b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_module_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_module_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_powercell.json b/src/generated/resources/assets/cosmiccore/models/item/uev_powercell.json new file mode 100644 index 000000000..0e1da4dd6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_powercell.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uev_powercell" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_radio_module.json b/src/generated/resources/assets/cosmiccore/models/item/uev_radio_module.json new file mode 100644 index 000000000..70d1eac5b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_radio_module.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uev_radio_module" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/uev_roaster.json new file mode 100644 index 000000000..06d1e7815 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uev_soul_input_hatch.json new file mode 100644 index 000000000..10a7139dd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_soul_input_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_soul_input_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uev_soul_output_hatch.json new file mode 100644 index 000000000..674d9e693 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_soul_output_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_soul_output_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uev_thermia_export_hatch.json new file mode 100644 index 000000000..e6ddcb829 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_thermia_export_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_thermia_export_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uev_thermia_import_hatch.json new file mode 100644 index 000000000..944f2fd5e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_thermia_import_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_thermia_import_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/uev_thermomagnitizer.json new file mode 100644 index 000000000..a5de5dac0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_thruster.json b/src/generated/resources/assets/cosmiccore/models/item/uev_thruster.json new file mode 100644 index 000000000..65bd4b875 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_thruster.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uev_thruster" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/uev_vacuum_bubbler.json new file mode 100644 index 000000000..91870d67e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_wireless_charger.json b/src/generated/resources/assets/cosmiccore/models/item/uev_wireless_charger.json new file mode 100644 index 000000000..5d9607d25 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_wireless_charger.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_wireless_charger" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/uev_wireless_energy_dynamo.json new file mode 100644 index 000000000..5d5d9fe9b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uev_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uev_wireless_energy_hatch.json new file mode 100644 index 000000000..483ba1897 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uev_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uev_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..7fcd280c5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_16a_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_16a_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..0beeb7b1d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_16a_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_16a_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..e47374337 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_4a_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_4a_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..bbd1da731 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_4a_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_4a_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_calx_reactor.json new file mode 100644 index 000000000..4390f0304 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_cosmic_parallel_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_cosmic_parallel_hatch.json new file mode 100644 index 000000000..88fe129df --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_cosmic_parallel_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_cosmic_parallel_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_gyroscope.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_gyroscope.json new file mode 100644 index 000000000..85889aa53 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_gyroscope.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uhv_gyroscope" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_mana_leaching_tub.json new file mode 100644 index 000000000..b9c04ebc6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_module_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_module_hatch.json new file mode 100644 index 000000000..d1da5d4cd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_module_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_module_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_naquahine_mini_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_naquahine_mini_reactor.json new file mode 100644 index 000000000..c41c836a3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_naquahine_mini_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_naquahine_mini_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_powercell.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_powercell.json new file mode 100644 index 000000000..f36410dcb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_powercell.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uhv_powercell" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_radio_module.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_radio_module.json new file mode 100644 index 000000000..06d30383b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_radio_module.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uhv_radio_module" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_roaster.json new file mode 100644 index 000000000..5692114c7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_soul_input_hatch.json new file mode 100644 index 000000000..d5eac48c2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_soul_input_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_soul_input_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_soul_output_hatch.json new file mode 100644 index 000000000..ebe7ad1aa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_soul_output_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_soul_output_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_thermia_export_hatch.json new file mode 100644 index 000000000..498071ff6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_thermia_export_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_thermia_export_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_thermia_import_hatch.json new file mode 100644 index 000000000..2d3a71b05 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_thermia_import_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_thermia_import_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_thermomagnitizer.json new file mode 100644 index 000000000..73a78ba46 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_thruster.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_thruster.json new file mode 100644 index 000000000..0b1a651ac --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_thruster.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uhv_thruster" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_vacuum_bubbler.json new file mode 100644 index 000000000..4c9a0f992 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_wireless_charger.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_wireless_charger.json new file mode 100644 index 000000000..8201540ff --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_wireless_charger.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_wireless_charger" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_wireless_energy_dynamo.json new file mode 100644 index 000000000..0a634dca2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uhv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uhv_wireless_energy_hatch.json new file mode 100644 index 000000000..c5c147634 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uhv_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uhv_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..85d436b7d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_16a_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_16a_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..47d6a59b5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_16a_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_16a_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..2d44044e3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_4a_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_4a_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..2d9010314 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_4a_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_4a_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_calx_reactor.json new file mode 100644 index 000000000..5ecc8bcc2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_cosmic_parallel_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_cosmic_parallel_hatch.json new file mode 100644 index 000000000..d9cbe865f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_cosmic_parallel_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_cosmic_parallel_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_gyroscope.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_gyroscope.json new file mode 100644 index 000000000..613e369c0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_gyroscope.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uiv_gyroscope" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_mana_leaching_tub.json new file mode 100644 index 000000000..6d8698307 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_powercell.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_powercell.json new file mode 100644 index 000000000..17b6948db --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_powercell.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uiv_powercell" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_radio_module.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_radio_module.json new file mode 100644 index 000000000..17915e761 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_radio_module.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uiv_radio_module" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_roaster.json new file mode 100644 index 000000000..eb9cd2d8a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_soul_input_hatch.json new file mode 100644 index 000000000..fe594e541 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_soul_input_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_soul_input_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_soul_output_hatch.json new file mode 100644 index 000000000..e175cdc06 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_soul_output_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_soul_output_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_thermia_export_hatch.json new file mode 100644 index 000000000..4173155c4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_thermia_export_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_thermia_export_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_thermia_import_hatch.json new file mode 100644 index 000000000..cd9816152 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_thermia_import_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_thermia_import_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_thermomagnitizer.json new file mode 100644 index 000000000..831d29341 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_thruster.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_thruster.json new file mode 100644 index 000000000..5772db401 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_thruster.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uiv_thruster" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_vacuum_bubbler.json new file mode 100644 index 000000000..3ec12e6f7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_wireless_charger.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_wireless_charger.json new file mode 100644 index 000000000..9e6487eb2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_wireless_charger.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_wireless_charger" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_wireless_energy_dynamo.json new file mode 100644 index 000000000..6036242c6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uiv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uiv_wireless_energy_hatch.json new file mode 100644 index 000000000..dd231bea7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uiv_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uiv_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ultimate_combustion_engine_cc.json b/src/generated/resources/assets/cosmiccore/models/item/ultimate_combustion_engine_cc.json new file mode 100644 index 000000000..28d0decd5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ultimate_combustion_engine_cc.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ultimate_combustion_engine_cc" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ultimate_intake.json b/src/generated/resources/assets/cosmiccore/models/item/ultimate_intake.json new file mode 100644 index 000000000..d110973f2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ultimate_intake.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/variant/ultimate_intake" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ultra_powered_casing.json b/src/generated/resources/assets/cosmiccore/models/item/ultra_powered_casing.json new file mode 100644 index 000000000..4211e99aa --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ultra_powered_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/ultra_powered_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ultrasonic_homogenizer.json b/src/generated/resources/assets/cosmiccore/models/item/ultrasonic_homogenizer.json new file mode 100644 index 000000000..e91d6248c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ultrasonic_homogenizer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/ultrasonic_homogenizer" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ulv_energy_output_hatch_16a.json b/src/generated/resources/assets/cosmiccore/models/item/ulv_energy_output_hatch_16a.json new file mode 100644 index 000000000..c36898e1d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ulv_energy_output_hatch_16a.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ulv_energy_output_hatch_16a" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/ulv_energy_output_hatch_4a.json b/src/generated/resources/assets/cosmiccore/models/item/ulv_energy_output_hatch_4a.json new file mode 100644 index 000000000..5cb72033c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/ulv_energy_output_hatch_4a.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/ulv_energy_output_hatch_4a" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/unsealed_crystal_cpu.json b/src/generated/resources/assets/cosmiccore/models/item/unsealed_crystal_cpu.json new file mode 100644 index 000000000..cfc46ea9d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/unsealed_crystal_cpu.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/unsealed_crystal_cpu" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/uv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..53fbfb1e3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_16a_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_16a_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..f35740768 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_16a_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_16a_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/uv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..c3992fca4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_4a_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_4a_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..af4f65aa8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_4a_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_4a_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_biolab.json b/src/generated/resources/assets/cosmiccore/models/item/uv_biolab.json new file mode 100644 index 000000000..453f82530 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_biolab.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_biolab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/uv_calx_reactor.json new file mode 100644 index 000000000..6ed263a2a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_cosmic_parallel_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uv_cosmic_parallel_hatch.json new file mode 100644 index 000000000..e3e662ec1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_cosmic_parallel_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_cosmic_parallel_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_gyroscope.json b/src/generated/resources/assets/cosmiccore/models/item/uv_gyroscope.json new file mode 100644 index 000000000..ea339470e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_gyroscope.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uv_gyroscope" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/uv_mana_leaching_tub.json new file mode 100644 index 000000000..d9b4d2af8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_module_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uv_module_hatch.json new file mode 100644 index 000000000..20a29ce72 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_module_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_module_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_naquahine_mini_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/uv_naquahine_mini_reactor.json new file mode 100644 index 000000000..ad6048d7d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_naquahine_mini_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_naquahine_mini_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_powercell.json b/src/generated/resources/assets/cosmiccore/models/item/uv_powercell.json new file mode 100644 index 000000000..9c220bc6b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_powercell.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uv_powercell" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_radio_module.json b/src/generated/resources/assets/cosmiccore/models/item/uv_radio_module.json new file mode 100644 index 000000000..8d15f5a58 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_radio_module.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uv_radio_module" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/uv_roaster.json new file mode 100644 index 000000000..8648ba9fd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uv_soul_input_hatch.json new file mode 100644 index 000000000..620d56a87 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_soul_input_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_soul_input_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uv_soul_output_hatch.json new file mode 100644 index 000000000..a7e6447f3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_soul_output_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_soul_output_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uv_thermia_export_hatch.json new file mode 100644 index 000000000..fdfa0c772 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_thermia_export_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_thermia_export_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uv_thermia_import_hatch.json new file mode 100644 index 000000000..8d12d8708 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_thermia_import_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_thermia_import_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/uv_thermomagnitizer.json new file mode 100644 index 000000000..f40bac5cd --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_thruster.json b/src/generated/resources/assets/cosmiccore/models/item/uv_thruster.json new file mode 100644 index 000000000..af931c206 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_thruster.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uv_thruster" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/uv_vacuum_bubbler.json new file mode 100644 index 000000000..499535dc0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_wireless_charger.json b/src/generated/resources/assets/cosmiccore/models/item/uv_wireless_charger.json new file mode 100644 index 000000000..358aa18d8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_wireless_charger.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_wireless_charger" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/uv_wireless_energy_dynamo.json new file mode 100644 index 000000000..f4d45a55b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uv_wireless_energy_hatch.json new file mode 100644 index 000000000..f25747f98 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uv_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uv_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..6771788c7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_16a_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_16a_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..e8d7814ae --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_16a_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_16a_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..6e425e7e0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_4a_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_4a_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..e5e049028 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_4a_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_4a_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_calx_reactor.json new file mode 100644 index 000000000..9414dc3ee --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_gyroscope.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_gyroscope.json new file mode 100644 index 000000000..ba8ae466c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_gyroscope.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uxv_gyroscope" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_mana_leaching_tub.json new file mode 100644 index 000000000..7b8fe80b7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_powercell.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_powercell.json new file mode 100644 index 000000000..2402bfdf5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_powercell.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uxv_powercell" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_radio_module.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_radio_module.json new file mode 100644 index 000000000..816f9ab8c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_radio_module.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uxv_radio_module" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_roaster.json new file mode 100644 index 000000000..e0093d7b5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_soul_input_hatch.json new file mode 100644 index 000000000..45a688491 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_soul_input_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_soul_input_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_soul_output_hatch.json new file mode 100644 index 000000000..aebd235e5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_soul_output_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_soul_output_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_thermia_export_hatch.json new file mode 100644 index 000000000..c374eb02e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_thermia_export_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_thermia_export_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_thermia_import_hatch.json new file mode 100644 index 000000000..b47411973 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_thermia_import_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_thermia_import_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_thermomagnitizer.json new file mode 100644 index 000000000..0960e6d0d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_thruster.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_thruster.json new file mode 100644 index 000000000..b55d2d780 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_thruster.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/uxv_thruster" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_vacuum_bubbler.json new file mode 100644 index 000000000..4a3871bc5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_wireless_energy_dynamo.json new file mode 100644 index 000000000..12d7f6198 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/uxv_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/uxv_wireless_energy_hatch.json new file mode 100644 index 000000000..2735c52d5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/uxv_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/uxv_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/vein_survey_scanner_hv.json b/src/generated/resources/assets/cosmiccore/models/item/vein_survey_scanner_hv.json new file mode 100644 index 000000000..b2ad98a2d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/vein_survey_scanner_hv.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/vein_survey_scanner_hv" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/vein_survey_scanner_lv.json b/src/generated/resources/assets/cosmiccore/models/item/vein_survey_scanner_lv.json new file mode 100644 index 000000000..430cf8b43 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/vein_survey_scanner_lv.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/vein_survey_scanner_lv" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/vein_survey_scanner_mv.json b/src/generated/resources/assets/cosmiccore/models/item/vein_survey_scanner_mv.json new file mode 100644 index 000000000..835f1d49f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/vein_survey_scanner_mv.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/vein_survey_scanner_mv" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/verbosity_chip.json b/src/generated/resources/assets/cosmiccore/models/item/verbosity_chip.json new file mode 100644 index 000000000..2a1eddbfc --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/verbosity_chip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/verbosity_chip" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/verdant_anima.json b/src/generated/resources/assets/cosmiccore/models/item/verdant_anima.json new file mode 100644 index 000000000..51b571806 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/verdant_anima.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/verdant_anima" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/vexiun.json b/src/generated/resources/assets/cosmiccore/models/item/vexiun.json new file mode 100644 index 000000000..de5b2653c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/vexiun.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/vexiun" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/vibrant_rubidium_casing.json b/src/generated/resources/assets/cosmiccore/models/item/vibrant_rubidium_casing.json new file mode 100644 index 000000000..fa752832a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/vibrant_rubidium_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/vibrant_rubidium_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/vile_fission.json b/src/generated/resources/assets/cosmiccore/models/item/vile_fission.json new file mode 100644 index 000000000..bfbf6ddb1 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/vile_fission.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/vile_fission" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/vivid_mote.json b/src/generated/resources/assets/cosmiccore/models/item/vivid_mote.json new file mode 100644 index 000000000..5f8f1d17e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/vivid_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/vivid_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/void_fluid_rig.json b/src/generated/resources/assets/cosmiccore/models/item/void_fluid_rig.json new file mode 100644 index 000000000..fa567f246 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/void_fluid_rig.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/void_fluid_rig" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/void_miner.json b/src/generated/resources/assets/cosmiccore/models/item/void_miner.json new file mode 100644 index 000000000..6d5bacc0d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/void_miner.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/void_miner" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/void_salt_fissiom.json b/src/generated/resources/assets/cosmiccore/models/item/void_salt_fissiom.json new file mode 100644 index 000000000..e0ae11622 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/void_salt_fissiom.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/void_salt_fissiom" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/vomahine_celestial_laser_bore.json b/src/generated/resources/assets/cosmiccore/models/item/vomahine_celestial_laser_bore.json new file mode 100644 index 000000000..a1517c167 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/vomahine_celestial_laser_bore.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/vomahine_celestial_laser_bore" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/vorax_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/vorax_reactor.json new file mode 100644 index 000000000..803fcc591 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/vorax_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/vorax_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wafer_pragmiso.json b/src/generated/resources/assets/cosmiccore/models/item/wafer_pragmiso.json new file mode 100644 index 000000000..fb7f731bf --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wafer_pragmiso.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wafer_pragmiso" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wailing_ichor_casing.json b/src/generated/resources/assets/cosmiccore/models/item/wailing_ichor_casing.json new file mode 100644 index 000000000..ca5f6189f --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wailing_ichor_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/wailing_ichor_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wasp.json b/src/generated/resources/assets/cosmiccore/models/item/wasp.json new file mode 100644 index 000000000..ca483fbc8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wasp.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/wasp" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wasteland_asteroid.json b/src/generated/resources/assets/cosmiccore/models/item/wasteland_asteroid.json new file mode 100644 index 000000000..ebf63ffc6 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wasteland_asteroid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wasteland_asteroid" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/waxed_leather.json b/src/generated/resources/assets/cosmiccore/models/item/waxed_leather.json index e2e68ba0e..daf4914e5 100644 --- a/src/generated/resources/assets/cosmiccore/models/item/waxed_leather.json +++ b/src/generated/resources/assets/cosmiccore/models/item/waxed_leather.json @@ -1,6 +1,6 @@ { - "parent": "minecraft:item/generated", - "textures": { - "layer0": "cosmiccore:item/waxed_leather" - } + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/waxed_leather" + } } \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wear_resistant_ruridit_casing.json b/src/generated/resources/assets/cosmiccore/models/item/wear_resistant_ruridit_casing.json new file mode 100644 index 000000000..e4574aa3c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wear_resistant_ruridit_casing.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/wear_resistant_ruridit_casing" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wicked_essence.json b/src/generated/resources/assets/cosmiccore/models/item/wicked_essence.json new file mode 100644 index 000000000..2c9c56067 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wicked_essence.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wicked_essence" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wired_petri_dish.json b/src/generated/resources/assets/cosmiccore/models/item/wired_petri_dish.json new file mode 100644 index 000000000..5c00838d2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wired_petri_dish.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wired_petri_dish" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wireless_data_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/wireless_data_hatch.json new file mode 100644 index 000000000..07897b928 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wireless_data_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/wireless_data_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wireless_data_transmitter.json b/src/generated/resources/assets/cosmiccore/models/item/wireless_data_transmitter.json new file mode 100644 index 000000000..de6beb5b7 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wireless_data_transmitter.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/wireless_data_transmitter" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wireless_pda.json b/src/generated/resources/assets/cosmiccore/models/item/wireless_pda.json new file mode 100644 index 000000000..90785fd9c --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wireless_pda.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wireless_pda" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wrapped_blazing_mote.json b/src/generated/resources/assets/cosmiccore/models/item/wrapped_blazing_mote.json new file mode 100644 index 000000000..960f10183 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wrapped_blazing_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wrapped_blazing_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wrapped_bright_mote.json b/src/generated/resources/assets/cosmiccore/models/item/wrapped_bright_mote.json new file mode 100644 index 000000000..fe06a0b12 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wrapped_bright_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wrapped_bright_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wrapped_clear_mote.json b/src/generated/resources/assets/cosmiccore/models/item/wrapped_clear_mote.json new file mode 100644 index 000000000..28d36afce --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wrapped_clear_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wrapped_clear_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wrapped_dim_mote.json b/src/generated/resources/assets/cosmiccore/models/item/wrapped_dim_mote.json new file mode 100644 index 000000000..1ded63c1d --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wrapped_dim_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wrapped_dim_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wrapped_faint_mote.json b/src/generated/resources/assets/cosmiccore/models/item/wrapped_faint_mote.json new file mode 100644 index 000000000..bef4135c3 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wrapped_faint_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wrapped_faint_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wrapped_incandescent_mote.json b/src/generated/resources/assets/cosmiccore/models/item/wrapped_incandescent_mote.json new file mode 100644 index 000000000..d16c28760 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wrapped_incandescent_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wrapped_incandescent_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wrapped_pale_mote.json b/src/generated/resources/assets/cosmiccore/models/item/wrapped_pale_mote.json new file mode 100644 index 000000000..231cb22de --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wrapped_pale_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wrapped_pale_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wrapped_radiant_mote.json b/src/generated/resources/assets/cosmiccore/models/item/wrapped_radiant_mote.json new file mode 100644 index 000000000..742e1ba58 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wrapped_radiant_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wrapped_radiant_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wrapped_transcendent_mote.json b/src/generated/resources/assets/cosmiccore/models/item/wrapped_transcendent_mote.json new file mode 100644 index 000000000..fc64570ab --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wrapped_transcendent_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wrapped_transcendent_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/wrapped_vivid_mote.json b/src/generated/resources/assets/cosmiccore/models/item/wrapped_vivid_mote.json new file mode 100644 index 000000000..1aaf71ced --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/wrapped_vivid_mote.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wrapped_vivid_mote" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zblan_glass.json b/src/generated/resources/assets/cosmiccore/models/item/zblan_glass.json new file mode 100644 index 000000000..bfea8fa08 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zblan_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/zblan_glass" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_16a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_16a_wireless_energy_dynamo.json new file mode 100644 index 000000000..45cb00c23 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_16a_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_16a_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_16a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_16a_wireless_energy_hatch.json new file mode 100644 index 000000000..b96d64cee --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_16a_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_16a_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_4a_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_4a_wireless_energy_dynamo.json new file mode 100644 index 000000000..c119d1090 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_4a_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_4a_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_4a_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_4a_wireless_energy_hatch.json new file mode 100644 index 000000000..79f4d4505 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_4a_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_4a_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_biolab.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_biolab.json new file mode 100644 index 000000000..526aa76e4 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_biolab.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_biolab" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_calx_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_calx_reactor.json new file mode 100644 index 000000000..b1de4efa5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_calx_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_calx_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_cosmic_parallel_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_cosmic_parallel_hatch.json new file mode 100644 index 000000000..26ca4ca4a --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_cosmic_parallel_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_cosmic_parallel_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_mana_leaching_tub.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_mana_leaching_tub.json new file mode 100644 index 000000000..3d75759eb --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_mana_leaching_tub.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_mana_leaching_tub" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_naquahine_mini_reactor.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_naquahine_mini_reactor.json new file mode 100644 index 000000000..8a1eaf4ad --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_naquahine_mini_reactor.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_naquahine_mini_reactor" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_radio_module.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_radio_module.json new file mode 100644 index 000000000..372882d0b --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_radio_module.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/zpm_radio_module" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_roaster.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_roaster.json new file mode 100644 index 000000000..a6fcbcdb0 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_roaster.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_roaster" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_soul_input_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_soul_input_hatch.json new file mode 100644 index 000000000..006c35056 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_soul_input_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_soul_input_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_soul_output_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_soul_output_hatch.json new file mode 100644 index 000000000..2bcb2c026 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_soul_output_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_soul_output_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_thermia_export_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_thermia_export_hatch.json new file mode 100644 index 000000000..77e909c53 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_thermia_export_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_thermia_export_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_thermia_import_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_thermia_import_hatch.json new file mode 100644 index 000000000..b9a484ca8 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_thermia_import_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_thermia_import_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_thermomagnitizer.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_thermomagnitizer.json new file mode 100644 index 000000000..762fa6240 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_thermomagnitizer.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_thermomagnitizer" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_vacuum_bubbler.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_vacuum_bubbler.json new file mode 100644 index 000000000..f89f7d03e --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_vacuum_bubbler.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_vacuum_bubbler" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_wildfire_core.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_wildfire_core.json new file mode 100644 index 000000000..d3d17b674 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_wildfire_core.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/zpm_wildfire_core" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_wireless_charger.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_wireless_charger.json new file mode 100644 index 000000000..0909fb766 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_wireless_charger.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_wireless_charger" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_wireless_energy_dynamo.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_wireless_energy_dynamo.json new file mode 100644 index 000000000..1e0feacb5 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_wireless_energy_dynamo.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_wireless_energy_dynamo" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/models/item/zpm_wireless_energy_hatch.json b/src/generated/resources/assets/cosmiccore/models/item/zpm_wireless_energy_hatch.json new file mode 100644 index 000000000..71a5a4d20 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/models/item/zpm_wireless_energy_hatch.json @@ -0,0 +1,3 @@ +{ + "parent": "cosmiccore:block/machine/zpm_wireless_energy_hatch" +} \ No newline at end of file diff --git a/src/generated/resources/assets/cosmiccore/sounds.json b/src/generated/resources/assets/cosmiccore/sounds.json new file mode 100644 index 000000000..17b071df2 --- /dev/null +++ b/src/generated/resources/assets/cosmiccore/sounds.json @@ -0,0 +1,119 @@ +{ + "ambient_drone": { + "sounds": [ + { + "type": "file", + "name": "cosmiccore:ambient_drone" + } + ], + "subtitle": "cosmiccore.subtitle.ambient_drone" + }, + "arcane_distil": { + "sounds": [ + { + "type": "file", + "name": "cosmiccore:arcane_distil" + } + ], + "subtitle": "cosmiccore.subtitle.arcane_distil" + }, + "dawnforge": { + "sounds": [ + { + "type": "file", + "name": "cosmiccore:dawnforge" + } + ], + "subtitle": "cosmiccore.subtitle.dawnforge" + }, + "dying_star": { + "sounds": [ + { + "type": "file", + "name": "cosmiccore:dying_star" + } + ], + "subtitle": "cosmiccore.subtitle.dying_star" + }, + "fluidizer": { + "sounds": [ + { + "type": "file", + "name": "cosmiccore:fluidizer" + } + ], + "subtitle": "cosmiccore.subtitle.fluidizer" + }, + "gas_succ": { + "sounds": [ + { + "type": "file", + "name": "cosmiccore:gas_succ" + } + ], + "subtitle": "cosmiccore.subtitle.gas_succ" + }, + "heavy_assembler": { + "sounds": [ + { + "type": "file", + "name": "cosmiccore:heavy_assembler" + } + ], + "subtitle": "cosmiccore.subtitle.heavy_assembler" + }, + "icv": { + "sounds": [ + { + "type": "file", + "name": "cosmiccore:icv" + } + ], + "subtitle": "cosmiccore.subtitle.icv" + }, + "laminator": { + "sounds": [ + { + "type": "file", + "name": "cosmiccore:laminator" + } + ], + "subtitle": "cosmiccore.subtitle.laminator" + }, + "mining_machine": { + "sounds": [ + { + "type": "file", + "name": "cosmiccore:mining_machine" + } + ], + "subtitle": "cosmiccore.subtitle.mining_machine" + }, + "orbital_forge": { + "sounds": [ + { + "type": "file", + "name": "cosmiccore:orbital_forge" + } + ], + "subtitle": "cosmiccore.subtitle.orbital_forge" + }, + "shake": { + "sounds": [ + { + "type": "file", + "name": "cosmiccore:shake" + } + ], + "subtitle": "cosmiccore.subtitle.shake" + }, + "vorax": { + "sounds": [ + { + "type": "file", + "name": "cosmiccore:vorax" + } + ], + "subtitle": "cosmiccore.subtitle.vorax" + } +} \ No newline at end of file diff --git a/src/generated/resources/data/ad_astra/tags/items/freeze_resistant_armor.json b/src/generated/resources/data/ad_astra/tags/items/freeze_resistant_armor.json deleted file mode 100644 index 4a2d7e141..000000000 --- a/src/generated/resources/data/ad_astra/tags/items/freeze_resistant_armor.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "values": [ - "cosmiccore:space_nanomuscle_chestplate", - "cosmiccore:space_advanced_nanomuscle_chestplate", - "cosmiccore:space_quarktech_chestplate", - "cosmiccore:space_advanced_quarktech_chestplate", - "gtceu:nanomuscle_helmet", - "gtceu:nanomuscle_leggings", - "gtceu:nanomuscle_boots", - "gtceu:quarktech_helmet", - "gtceu:quarktech_leggings", - "gtceu:quarktech_boots" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/ad_astra/tags/items/heat_resistant_armor.json b/src/generated/resources/data/ad_astra/tags/items/heat_resistant_armor.json deleted file mode 100644 index 4a2d7e141..000000000 --- a/src/generated/resources/data/ad_astra/tags/items/heat_resistant_armor.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "values": [ - "cosmiccore:space_nanomuscle_chestplate", - "cosmiccore:space_advanced_nanomuscle_chestplate", - "cosmiccore:space_quarktech_chestplate", - "cosmiccore:space_advanced_quarktech_chestplate", - "gtceu:nanomuscle_helmet", - "gtceu:nanomuscle_leggings", - "gtceu:nanomuscle_boots", - "gtceu:quarktech_helmet", - "gtceu:quarktech_leggings", - "gtceu:quarktech_boots" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/ad_astra/tags/items/space_suit_items.json b/src/generated/resources/data/ad_astra/tags/items/space_suit_items.json deleted file mode 100644 index 4a2d7e141..000000000 --- a/src/generated/resources/data/ad_astra/tags/items/space_suit_items.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "values": [ - "cosmiccore:space_nanomuscle_chestplate", - "cosmiccore:space_advanced_nanomuscle_chestplate", - "cosmiccore:space_quarktech_chestplate", - "cosmiccore:space_advanced_quarktech_chestplate", - "gtceu:nanomuscle_helmet", - "gtceu:nanomuscle_leggings", - "gtceu:nanomuscle_boots", - "gtceu:quarktech_helmet", - "gtceu:quarktech_leggings", - "gtceu:quarktech_boots" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/alternator_flux_coiling.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/alternator_flux_coiling.json new file mode 100644 index 000000000..9c7aabf6e --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/alternator_flux_coiling.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:alternator_flux_coiling" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/alternator_flux_coiling" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/alveary_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/alveary_casing.json new file mode 100644 index 000000000..dad52fcc6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/alveary_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:alveary_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/alveary_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/bichromal_nevramite_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/bichromal_nevramite_casing.json new file mode 100644 index 000000000..0cb54472f --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/bichromal_nevramite_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:bichromal_nevramite_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/bichromal_nevramite_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/blank_rune.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/blank_rune.json new file mode 100644 index 000000000..d99d43862 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/blank_rune.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:blank_rune" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/blank_rune" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/bolted_heavy_frame_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/bolted_heavy_frame_casing.json new file mode 100644 index 000000000..71237d7ba --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/bolted_heavy_frame_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:bolted_heavy_frame_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/bolted_heavy_frame_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/causal_fabric_coil_block.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/causal_fabric_coil_block.json new file mode 100644 index 000000000..53a134b05 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/causal_fabric_coil_block.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:causal_fabric_coil_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/causal_fabric_coil_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/cryogenic_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/cryogenic_casing.json new file mode 100644 index 000000000..f08680335 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/cryogenic_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:cryogenic_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/cryogenic_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/cyclozine_chemically_repelling_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/cyclozine_chemically_repelling_casing.json new file mode 100644 index 000000000..ed6a0e3ad --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/cyclozine_chemically_repelling_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:cyclozine_chemically_repelling_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/cyclozine_chemically_repelling_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/cyclozine_chemically_repelling_pipe.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/cyclozine_chemically_repelling_pipe.json new file mode 100644 index 000000000..43b3de901 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/cyclozine_chemically_repelling_pipe.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:cyclozine_chemically_repelling_pipe" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/cyclozine_chemically_repelling_pipe" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/cyclozine_high_rigidity_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/cyclozine_high_rigidity_casing.json new file mode 100644 index 000000000..f4f5b94be --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/cyclozine_high_rigidity_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:cyclozine_high_rigidity_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/cyclozine_high_rigidity_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/diving_bell_escape_pad.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/diving_bell_escape_pad.json new file mode 100644 index 000000000..a7d675569 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/diving_bell_escape_pad.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:diving_bell_escape_pad" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/diving_bell_escape_pad" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/dyson_solar_cell.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/dyson_solar_cell.json new file mode 100644 index 000000000..a510e6011 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/dyson_solar_cell.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:dyson_solar_cell" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/dyson_solar_cell" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/ethersteel_plated_ash_tiles.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/ethersteel_plated_ash_tiles.json new file mode 100644 index 000000000..8ef59e697 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/ethersteel_plated_ash_tiles.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:ethersteel_plated_ash_tiles" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/ethersteel_plated_ash_tiles" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/fulgorinth_prime_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/fulgorinth_prime_casing.json new file mode 100644 index 000000000..26d7cff65 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/fulgorinth_prime_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:fulgorinth_prime_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/fulgorinth_prime_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/fusion_grade_magnet.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/fusion_grade_magnet.json new file mode 100644 index 000000000..a09e8a8e4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/fusion_grade_magnet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:fusion_grade_magnet" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/fusion_grade_magnet" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/gilded_pthanterum_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/gilded_pthanterum_casing.json new file mode 100644 index 000000000..556e24c48 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/gilded_pthanterum_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:gilded_pthanterum_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/gilded_pthanterum_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/heat_fan.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/heat_fan.json new file mode 100644 index 000000000..19eb4ca06 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/heat_fan.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:heat_fan" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/heat_fan" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/heavy_frost_proof_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/heavy_frost_proof_casing.json new file mode 100644 index 000000000..7d9d26b8d --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/heavy_frost_proof_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:heavy_frost_proof_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/heavy_frost_proof_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/high_powered_magnet.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/high_powered_magnet.json new file mode 100644 index 000000000..6c0d27888 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/high_powered_magnet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:high_powered_magnet" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/high_powered_magnet" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/high_temperature_fission_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/high_temperature_fission_casing.json new file mode 100644 index 000000000..232b33348 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/high_temperature_fission_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:high_temperature_fission_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/high_temperature_fission_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/high_tolerance_rhenium_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/high_tolerance_rhenium_casing.json new file mode 100644 index 000000000..67ab78771 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/high_tolerance_rhenium_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:high_tolerance_rhenium_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/high_tolerance_rhenium_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/highly_conductive_fission_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/highly_conductive_fission_casing.json new file mode 100644 index 000000000..dff96de0a --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/highly_conductive_fission_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:highly_conductive_fission_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/highly_conductive_fission_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/highly_flexible_reinforced_trinavine_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/highly_flexible_reinforced_trinavine_casing.json new file mode 100644 index 000000000..fd8b512e2 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/highly_flexible_reinforced_trinavine_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:highly_flexible_reinforced_trinavine_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/highly_flexible_reinforced_trinavine_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/iron_plated_deepslate_tile.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/iron_plated_deepslate_tile.json new file mode 100644 index 000000000..e262beb6d --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/iron_plated_deepslate_tile.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:iron_plated_deepslate_tile" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/iron_plated_deepslate_tile" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/iron_plated_deepslate_tile_slab.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/iron_plated_deepslate_tile_slab.json new file mode 100644 index 000000000..7ad7763e2 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/iron_plated_deepslate_tile_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:iron_plated_deepslate_tile_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/iron_plated_deepslate_tile_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/iron_plated_deepslate_tile_stairs.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/iron_plated_deepslate_tile_stairs.json new file mode 100644 index 000000000..ac3bfbcc9 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/iron_plated_deepslate_tile_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:iron_plated_deepslate_tile_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/iron_plated_deepslate_tile_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/light_dawnstone_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/light_dawnstone_casing.json new file mode 100644 index 000000000..487e98590 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/light_dawnstone_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:light_dawnstone_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/light_dawnstone_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/light_ritual_stone.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/light_ritual_stone.json new file mode 100644 index 000000000..0baf0ea84 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/light_ritual_stone.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:light_ritual_stone" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/light_ritual_stone" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/living_igniclad_coil_block.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/living_igniclad_coil_block.json new file mode 100644 index 000000000..0c0d3d16c --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/living_igniclad_coil_block.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:living_igniclad_coil_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/living_igniclad_coil_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/livingrock_tiles.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/livingrock_tiles.json new file mode 100644 index 000000000..aef6b876d --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/livingrock_tiles.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:livingrock_tiles" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/livingrock_tiles" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/ludicrious_intake.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/ludicrious_intake.json new file mode 100644 index 000000000..664422b30 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/ludicrious_intake.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:ludicrious_intake" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/ludicrious_intake" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/machine_casing_gearbox_naquadria.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/machine_casing_gearbox_naquadria.json new file mode 100644 index 000000000..e367acbe0 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/machine_casing_gearbox_naquadria.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:machine_casing_gearbox_naquadria" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/machine_casing_gearbox_naquadria" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/machine_casing_gearbox_pthanterum.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/machine_casing_gearbox_pthanterum.json new file mode 100644 index 000000000..df9967535 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/machine_casing_gearbox_pthanterum.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:machine_casing_gearbox_pthanterum" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/machine_casing_gearbox_pthanterum" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/moth_home_t1.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/moth_home_t1.json new file mode 100644 index 000000000..2273e18f0 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/moth_home_t1.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:moth_home_t1" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/moth_home_t1" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/moth_home_t2.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/moth_home_t2.json new file mode 100644 index 000000000..36736498a --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/moth_home_t2.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:moth_home_t2" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/moth_home_t2" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/moth_home_t3.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/moth_home_t3.json new file mode 100644 index 000000000..fc5f2fbcc --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/moth_home_t3.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:moth_home_t3" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/moth_home_t3" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/moth_home_t4.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/moth_home_t4.json new file mode 100644 index 000000000..26c231ca5 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/moth_home_t4.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:moth_home_t4" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/moth_home_t4" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/moth_station_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/moth_station_casing.json new file mode 100644 index 000000000..8f3bac48e --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/moth_station_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:moth_station_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/moth_station_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/multi_purpose_interstellar_grade_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/multi_purpose_interstellar_grade_casing.json new file mode 100644 index 000000000..67370dd38 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/multi_purpose_interstellar_grade_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:multi_purpose_interstellar_grade_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/multi_purpose_interstellar_grade_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/naquadah_pressure_resistant_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/naquadah_pressure_resistant_casing.json new file mode 100644 index 000000000..d416636b6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/naquadah_pressure_resistant_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:naquadah_pressure_resistant_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/naquadah_pressure_resistant_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/naquadric_superalloy_coil_block.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/naquadric_superalloy_coil_block.json new file mode 100644 index 000000000..1196ac22a --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/naquadric_superalloy_coil_block.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:naquadric_superalloy_coil_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/naquadric_superalloy_coil_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/neutronium_buoy.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/neutronium_buoy.json new file mode 100644 index 000000000..992bff9fc --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/neutronium_buoy.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:neutronium_buoy" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/neutronium_buoy" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/oscillating_gilded_pthanterum_casings.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/oscillating_gilded_pthanterum_casings.json new file mode 100644 index 000000000..6fd08a1e5 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/oscillating_gilded_pthanterum_casings.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:oscillating_gilded_pthanterum_casings" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/oscillating_gilded_pthanterum_casings" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/plated_aerocloud.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/plated_aerocloud.json new file mode 100644 index 000000000..fd9c511e3 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/plated_aerocloud.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:plated_aerocloud" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/plated_aerocloud" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/pressure_containment_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/pressure_containment_casing.json new file mode 100644 index 000000000..7ac6fed95 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/pressure_containment_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:pressure_containment_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/pressure_containment_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/prismatic_tungstensteel_coil_block.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/prismatic_tungstensteel_coil_block.json new file mode 100644 index 000000000..d154fcbd4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/prismatic_tungstensteel_coil_block.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:prismatic_tungstensteel_coil_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/prismatic_tungstensteel_coil_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/programable_matter_coil_block.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/programable_matter_coil_block.json new file mode 100644 index 000000000..c9eda3b1f --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/programable_matter_coil_block.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:programable_matter_coil_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/programable_matter_coil_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/psionic_galvorn_coil_block.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/psionic_galvorn_coil_block.json new file mode 100644 index 000000000..364e299d5 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/psionic_galvorn_coil_block.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:psionic_galvorn_coil_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/psionic_galvorn_coil_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/pthanterum_wave_breakers.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/pthanterum_wave_breakers.json new file mode 100644 index 000000000..d692df6c3 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/pthanterum_wave_breakers.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:pthanterum_wave_breakers" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/pthanterum_wave_breakers" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/radioactive_filter_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/radioactive_filter_casing.json new file mode 100644 index 000000000..72911f872 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/radioactive_filter_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:radioactive_filter_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/radioactive_filter_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/reflective_starmetal_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/reflective_starmetal_casing.json new file mode 100644 index 000000000..fcef0904c --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/reflective_starmetal_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:reflective_starmetal_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/reflective_starmetal_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/reinforced_dawnstone_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/reinforced_dawnstone_casing.json new file mode 100644 index 000000000..142ba641b --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/reinforced_dawnstone_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:reinforced_dawnstone_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/reinforced_dawnstone_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/reinforced_naquadria_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/reinforced_naquadria_casing.json new file mode 100644 index 000000000..8cff8b7fe --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/reinforced_naquadria_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:reinforced_naquadria_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/reinforced_naquadria_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/reinforced_trinavine_coil_block.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/reinforced_trinavine_coil_block.json new file mode 100644 index 000000000..4af847ed5 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/reinforced_trinavine_coil_block.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:reinforced_trinavine_coil_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/reinforced_trinavine_coil_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/resonant_virtue_meld_coil_block.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/resonant_virtue_meld_coil_block.json new file mode 100644 index 000000000..b4df435b6 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/resonant_virtue_meld_coil_block.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:resonant_virtue_meld_coil_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/resonant_virtue_meld_coil_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/resonantly_tuned_virtue_meld_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/resonantly_tuned_virtue_meld_casing.json new file mode 100644 index 000000000..d74bfe152 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/resonantly_tuned_virtue_meld_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:resonantly_tuned_virtue_meld_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/resonantly_tuned_virtue_meld_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/rigid_high_speed_steel_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/rigid_high_speed_steel_casing.json new file mode 100644 index 000000000..0b7eb523d --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/rigid_high_speed_steel_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:rigid_high_speed_steel_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/rigid_high_speed_steel_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/ritual_stone.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/ritual_stone.json new file mode 100644 index 000000000..dde2f42b9 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/ritual_stone.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:ritual_stone" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/ritual_stone" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/royal_ichorium_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/royal_ichorium_casing.json new file mode 100644 index 000000000..f9ad623fc --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/royal_ichorium_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:royal_ichorium_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/royal_ichorium_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/rust_stained_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/rust_stained_casing.json new file mode 100644 index 000000000..3507d30e7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/rust_stained_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:rust_stained_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/rust_stained_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/rust_weave_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/rust_weave_casing.json new file mode 100644 index 000000000..6b114d954 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/rust_weave_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:rust_weave_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/rust_weave_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/self_healing_pthanterum_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/self_healing_pthanterum_casing.json new file mode 100644 index 000000000..c56fcfde3 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/self_healing_pthanterum_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:self_healing_pthanterum_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/self_healing_pthanterum_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/shimmering_neutronium_coil_block.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/shimmering_neutronium_coil_block.json new file mode 100644 index 000000000..f2957e2db --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/shimmering_neutronium_coil_block.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:shimmering_neutronium_coil_block" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/shimmering_neutronium_coil_block" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/somarust_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/somarust_casing.json new file mode 100644 index 000000000..14f54a687 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/somarust_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:somarust_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/somarust_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/soul_muted_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/soul_muted_casing.json new file mode 100644 index 000000000..48cfb82b2 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/soul_muted_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:soul_muted_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/soul_muted_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/soul_stained_steel_aluminium_plated_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/soul_stained_steel_aluminium_plated_casing.json new file mode 100644 index 000000000..b7a23fb68 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/soul_stained_steel_aluminium_plated_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:soul_stained_steel_aluminium_plated_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/soul_stained_steel_aluminium_plated_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/steel_plated_bronze_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/steel_plated_bronze_casing.json new file mode 100644 index 000000000..3db86a606 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/steel_plated_bronze_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:steel_plated_bronze_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/steel_plated_bronze_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/steel_rose_lantern.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/steel_rose_lantern.json new file mode 100644 index 000000000..8c1bb4557 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/steel_rose_lantern.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:steel_rose_lantern" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/steel_rose_lantern" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/steel_rose_light.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/steel_rose_light.json new file mode 100644 index 000000000..1df8bb12f --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/steel_rose_light.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:steel_rose_light" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/steel_rose_light" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/steel_rose_light_slab.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/steel_rose_light_slab.json new file mode 100644 index 000000000..63f693f12 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/steel_rose_light_slab.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:steel_rose_light_slab" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/steel_rose_light_slab" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/steel_rose_light_stairs.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/steel_rose_light_stairs.json new file mode 100644 index 000000000..0591c76cd --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/steel_rose_light_stairs.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:steel_rose_light_stairs" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/steel_rose_light_stairs" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/stellar_neutronium_grade_magnet.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/stellar_neutronium_grade_magnet.json new file mode 100644 index 000000000..d9b6bb027 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/stellar_neutronium_grade_magnet.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:stellar_neutronium_grade_magnet" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/stellar_neutronium_grade_magnet" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/superheavy_steel_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/superheavy_steel_casing.json new file mode 100644 index 000000000..03bbe01a4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/superheavy_steel_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:superheavy_steel_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/superheavy_steel_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/tritanium_lined_heavy_neutronium_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/tritanium_lined_heavy_neutronium_casing.json new file mode 100644 index 000000000..e8dde3b3c --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/tritanium_lined_heavy_neutronium_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:tritanium_lined_heavy_neutronium_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/tritanium_lined_heavy_neutronium_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/ultimate_intake.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/ultimate_intake.json new file mode 100644 index 000000000..3bacaab5d --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/ultimate_intake.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:ultimate_intake" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/ultimate_intake" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/ultra_powered_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/ultra_powered_casing.json new file mode 100644 index 000000000..353ba1be5 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/ultra_powered_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:ultra_powered_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/ultra_powered_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/vibrant_rubidium_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/vibrant_rubidium_casing.json new file mode 100644 index 000000000..706f6b3c4 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/vibrant_rubidium_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:vibrant_rubidium_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/vibrant_rubidium_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/wailing_ichor_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/wailing_ichor_casing.json new file mode 100644 index 000000000..21af77a99 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/wailing_ichor_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:wailing_ichor_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/wailing_ichor_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/wear_resistant_ruridit_casing.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/wear_resistant_ruridit_casing.json new file mode 100644 index 000000000..f25ba7ac5 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/wear_resistant_ruridit_casing.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:wear_resistant_ruridit_casing" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/wear_resistant_ruridit_casing" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_table/blocks/zblan_glass.json b/src/generated/resources/data/cosmiccore/loot_table/blocks/zblan_glass.json new file mode 100644 index 000000000..be2791975 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/loot_table/blocks/zblan_glass.json @@ -0,0 +1,21 @@ +{ + "type": "minecraft:block", + "pools": [ + { + "bonus_rolls": 0.0, + "conditions": [ + { + "condition": "minecraft:survives_explosion" + } + ], + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:zblan_glass" + } + ], + "rolls": 1.0 + } + ], + "random_sequence": "cosmiccore:blocks/zblan_glass" +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/alternator_flux_coiling.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/alternator_flux_coiling.json deleted file mode 100644 index 8665261d3..000000000 --- a/src/generated/resources/data/cosmiccore/loot_tables/blocks/alternator_flux_coiling.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "cosmiccore:alternator_flux_coiling" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "cosmiccore:blocks/alternator_flux_coiling" -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/causal_fabric_coil_block.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/causal_fabric_coil_block.json deleted file mode 100644 index 86e626a9d..000000000 --- a/src/generated/resources/data/cosmiccore/loot_tables/blocks/causal_fabric_coil_block.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "cosmiccore:causal_fabric_coil_block" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "cosmiccore:blocks/causal_fabric_coil_block" -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/dyson_solar_cell.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/dyson_solar_cell.json deleted file mode 100644 index 2316d6450..000000000 --- a/src/generated/resources/data/cosmiccore/loot_tables/blocks/dyson_solar_cell.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "cosmiccore:dyson_solar_cell" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "cosmiccore:blocks/dyson_solar_cell" -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/fusion_grade_magnet.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/fusion_grade_magnet.json deleted file mode 100644 index f30e0f4ac..000000000 --- a/src/generated/resources/data/cosmiccore/loot_tables/blocks/fusion_grade_magnet.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "cosmiccore:fusion_grade_magnet" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "cosmiccore:blocks/fusion_grade_magnet" -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/high_powered_magnet.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/high_powered_magnet.json deleted file mode 100644 index fa324e609..000000000 --- a/src/generated/resources/data/cosmiccore/loot_tables/blocks/high_powered_magnet.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "cosmiccore:high_powered_magnet" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "cosmiccore:blocks/high_powered_magnet" -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/high_temperature_fission_casing.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/high_temperature_fission_casing.json deleted file mode 100644 index 20db4498c..000000000 --- a/src/generated/resources/data/cosmiccore/loot_tables/blocks/high_temperature_fission_casing.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "cosmiccore:high_temperature_fission_casing" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "cosmiccore:blocks/high_temperature_fission_casing" -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/highly_conductive_fission_casing.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/highly_conductive_fission_casing.json deleted file mode 100644 index 2567583cd..000000000 --- a/src/generated/resources/data/cosmiccore/loot_tables/blocks/highly_conductive_fission_casing.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "cosmiccore:highly_conductive_fission_casing" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "cosmiccore:blocks/highly_conductive_fission_casing" -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/living_igniclad_coil_block.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/living_igniclad_coil_block.json deleted file mode 100644 index e96f7296b..000000000 --- a/src/generated/resources/data/cosmiccore/loot_tables/blocks/living_igniclad_coil_block.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "cosmiccore:living_igniclad_coil_block" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "cosmiccore:blocks/living_igniclad_coil_block" -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/naquadah_pressure_resistant_casing.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/naquadah_pressure_resistant_casing.json deleted file mode 100644 index 31905aafa..000000000 --- a/src/generated/resources/data/cosmiccore/loot_tables/blocks/naquadah_pressure_resistant_casing.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "cosmiccore:naquadah_pressure_resistant_casing" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "cosmiccore:blocks/naquadah_pressure_resistant_casing" -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/naquadric_superalloy_coil_block.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/naquadric_superalloy_coil_block.json deleted file mode 100644 index 393ae3281..000000000 --- a/src/generated/resources/data/cosmiccore/loot_tables/blocks/naquadric_superalloy_coil_block.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "cosmiccore:naquadric_superalloy_coil_block" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "cosmiccore:blocks/naquadric_superalloy_coil_block" -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/plated_aerocloud.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/plated_aerocloud.json deleted file mode 100644 index 6373c8cb2..000000000 --- a/src/generated/resources/data/cosmiccore/loot_tables/blocks/plated_aerocloud.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "cosmiccore:plated_aerocloud" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "cosmiccore:blocks/plated_aerocloud" -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/prismatic_tungstensteel_coil_block.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/prismatic_tungstensteel_coil_block.json deleted file mode 100644 index c661c7a90..000000000 --- a/src/generated/resources/data/cosmiccore/loot_tables/blocks/prismatic_tungstensteel_coil_block.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "cosmiccore:prismatic_tungstensteel_coil_block" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "cosmiccore:blocks/prismatic_tungstensteel_coil_block" -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/programable_matter_coil_block.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/programable_matter_coil_block.json deleted file mode 100644 index beeca94cf..000000000 --- a/src/generated/resources/data/cosmiccore/loot_tables/blocks/programable_matter_coil_block.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "cosmiccore:programable_matter_coil_block" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "cosmiccore:blocks/programable_matter_coil_block" -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/psionic_galvorn_coil_block.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/psionic_galvorn_coil_block.json deleted file mode 100644 index 91d3aa891..000000000 --- a/src/generated/resources/data/cosmiccore/loot_tables/blocks/psionic_galvorn_coil_block.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "cosmiccore:psionic_galvorn_coil_block" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "cosmiccore:blocks/psionic_galvorn_coil_block" -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/resonant_virtue_meld_coil_block.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/resonant_virtue_meld_coil_block.json deleted file mode 100644 index bf4a6e43e..000000000 --- a/src/generated/resources/data/cosmiccore/loot_tables/blocks/resonant_virtue_meld_coil_block.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "cosmiccore:resonant_virtue_meld_coil_block" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "cosmiccore:blocks/resonant_virtue_meld_coil_block" -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/resonantly_tuned_virtue_meld_casing.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/resonantly_tuned_virtue_meld_casing.json deleted file mode 100644 index 9ff5d89d3..000000000 --- a/src/generated/resources/data/cosmiccore/loot_tables/blocks/resonantly_tuned_virtue_meld_casing.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "cosmiccore:resonantly_tuned_virtue_meld_casing" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "cosmiccore:blocks/resonantly_tuned_virtue_meld_casing" -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/shimmering_neutronium_coil_block.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/shimmering_neutronium_coil_block.json deleted file mode 100644 index befd404f7..000000000 --- a/src/generated/resources/data/cosmiccore/loot_tables/blocks/shimmering_neutronium_coil_block.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "cosmiccore:shimmering_neutronium_coil_block" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "cosmiccore:blocks/shimmering_neutronium_coil_block" -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/loot_tables/blocks/trinavine_coil_block.json b/src/generated/resources/data/cosmiccore/loot_tables/blocks/trinavine_coil_block.json deleted file mode 100644 index b869cf653..000000000 --- a/src/generated/resources/data/cosmiccore/loot_tables/blocks/trinavine_coil_block.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:block", - "pools": [ - { - "bonus_rolls": 0.0, - "conditions": [ - { - "condition": "minecraft:survives_explosion" - } - ], - "entries": [ - { - "type": "minecraft:item", - "name": "cosmiccore:trinavine_coil_block" - } - ], - "rolls": 1.0 - } - ], - "random_sequence": "cosmiccore:blocks/trinavine_coil_block" -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tags/block/overworld_ore_replaceables.json b/src/generated/resources/data/cosmiccore/tags/block/overworld_ore_replaceables.json new file mode 100644 index 000000000..97ea501b0 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tags/block/overworld_ore_replaceables.json @@ -0,0 +1,34 @@ +{ + "values": [ + "#minecraft:stone_ore_replaceables", + "#minecraft:deepslate_ore_replaceables", + { + "id": "create:scoria", + "required": false + }, + { + "id": "create:scorchia", + "required": false + }, + { + "id": "create:crimsite", + "required": false + }, + { + "id": "create:limestone", + "required": false + }, + { + "id": "create:asurine", + "required": false + }, + { + "id": "create:ochrum", + "required": false + }, + { + "id": "create:veridium", + "required": false + } + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tags/item/nano_space_suite.json b/src/generated/resources/data/cosmiccore/tags/item/nano_space_suite.json new file mode 100644 index 000000000..6b95b9abf --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tags/item/nano_space_suite.json @@ -0,0 +1,7 @@ +{ + "values": [ + "gtceu:nanomuscle_helmet", + "gtceu:nanomuscle_leggings", + "gtceu:nanomuscle_boots" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tags/item/quantum_space_suite.json b/src/generated/resources/data/cosmiccore/tags/item/quantum_space_suite.json new file mode 100644 index 000000000..67b18dcd7 --- /dev/null +++ b/src/generated/resources/data/cosmiccore/tags/item/quantum_space_suite.json @@ -0,0 +1,8 @@ +{ + "values": [ + "cosmiccore:sanguine_warptech_chestplate", + "gtceu:quarktech_helmet", + "gtceu:quarktech_leggings", + "gtceu:quarktech_boots" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tags/items/nano_space_suite.json b/src/generated/resources/data/cosmiccore/tags/items/nano_space_suite.json deleted file mode 100644 index a29c6a4b0..000000000 --- a/src/generated/resources/data/cosmiccore/tags/items/nano_space_suite.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "values": [ - "cosmiccore:space_nanomuscle_chestplate", - "cosmiccore:space_advanced_nanomuscle_chestplate", - "gtceu:nanomuscle_helmet", - "gtceu:nanomuscle_leggings", - "gtceu:nanomuscle_boots" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/cosmiccore/tags/items/quantum_space_suite.json b/src/generated/resources/data/cosmiccore/tags/items/quantum_space_suite.json deleted file mode 100644 index 59648f6db..000000000 --- a/src/generated/resources/data/cosmiccore/tags/items/quantum_space_suite.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "values": [ - "cosmiccore:space_quarktech_chestplate", - "cosmiccore:space_advanced_quarktech_chestplate", - "gtceu:quarktech_helmet", - "gtceu:quarktech_leggings", - "gtceu:quarktech_boots" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/forge/tags/blocks/mineable/wrench.json b/src/generated/resources/data/forge/tags/blocks/mineable/wrench.json deleted file mode 100644 index 5a3fe6ee0..000000000 --- a/src/generated/resources/data/forge/tags/blocks/mineable/wrench.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "values": [ - "cosmiccore:prismatic_tungstensteel_coil_block", - "cosmiccore:resonant_virtue_meld_coil_block", - "cosmiccore:naquadric_superalloy_coil_block", - "cosmiccore:trinavine_coil_block", - "cosmiccore:psionic_galvorn_coil_block", - "cosmiccore:living_igniclad_coil_block", - "cosmiccore:programable_matter_coil_block", - "cosmiccore:shimmering_neutronium_coil_block", - "cosmiccore:causal_fabric_coil_block", - "cosmiccore:dyson_solar_cell", - "cosmiccore:naquadah_pressure_resistant_casing", - "cosmiccore:resonantly_tuned_virtue_meld_casing", - "cosmiccore:alternator_flux_coiling", - "cosmiccore:plated_aerocloud", - "cosmiccore:high_powered_magnet", - "cosmiccore:fusion_grade_magnet", - "cosmiccore:high_temperature_fission_casing", - "cosmiccore:highly_conductive_fission_casing" - ] -} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/block/mineable/pickaxe_or_wrench.json b/src/generated/resources/data/gtceu/tags/block/mineable/pickaxe_or_wrench.json new file mode 100644 index 000000000..8ae4d5be7 --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/block/mineable/pickaxe_or_wrench.json @@ -0,0 +1,71 @@ +{ + "values": [ + "cosmiccore:prismatic_tungstensteel_coil_block", + "cosmiccore:resonant_virtue_meld_coil_block", + "cosmiccore:naquadric_superalloy_coil_block", + "cosmiccore:reinforced_trinavine_coil_block", + "cosmiccore:psionic_galvorn_coil_block", + "cosmiccore:living_igniclad_coil_block", + "cosmiccore:programable_matter_coil_block", + "cosmiccore:shimmering_neutronium_coil_block", + "cosmiccore:causal_fabric_coil_block", + "cosmiccore:reflective_starmetal_casing", + "cosmiccore:tritanium_lined_heavy_neutronium_casing", + "cosmiccore:high_tolerance_rhenium_casing", + "cosmiccore:highly_flexible_reinforced_trinavine_casing", + "cosmiccore:dyson_solar_cell", + "cosmiccore:naquadah_pressure_resistant_casing", + "cosmiccore:resonantly_tuned_virtue_meld_casing", + "cosmiccore:steel_plated_bronze_casing", + "cosmiccore:alternator_flux_coiling", + "cosmiccore:plated_aerocloud", + "cosmiccore:self_healing_pthanterum_casing", + "cosmiccore:cryogenic_casing", + "cosmiccore:heavy_frost_proof_casing", + "cosmiccore:soul_stained_steel_aluminium_plated_casing", + "cosmiccore:livingrock_tiles", + "cosmiccore:neutronium_buoy", + "cosmiccore:pthanterum_wave_breakers", + "cosmiccore:cyclozine_high_rigidity_casing", + "cosmiccore:light_dawnstone_casing", + "cosmiccore:reinforced_dawnstone_casing", + "cosmiccore:alveary_casing", + "cosmiccore:bichromal_nevramite_casing", + "cosmiccore:fulgorinth_prime_casing", + "cosmiccore:oscillating_gilded_pthanterum_casings", + "cosmiccore:pressure_containment_casing", + "cosmiccore:royal_ichorium_casing", + "cosmiccore:vibrant_rubidium_casing", + "cosmiccore:wailing_ichor_casing", + "cosmiccore:high_powered_magnet", + "cosmiccore:fusion_grade_magnet", + "cosmiccore:stellar_neutronium_grade_magnet", + "cosmiccore:gilded_pthanterum_casing", + "cosmiccore:wear_resistant_ruridit_casing", + "cosmiccore:reinforced_naquadria_casing", + "cosmiccore:high_temperature_fission_casing", + "cosmiccore:cyclozine_chemically_repelling_casing", + "cosmiccore:cyclozine_chemically_repelling_pipe", + "cosmiccore:multi_purpose_interstellar_grade_casing", + "cosmiccore:ultra_powered_casing", + "cosmiccore:highly_conductive_fission_casing", + "cosmiccore:machine_casing_gearbox_pthanterum", + "cosmiccore:machine_casing_gearbox_naquadria", + "cosmiccore:rust_weave_casing", + "cosmiccore:rust_stained_casing", + "cosmiccore:somarust_casing", + "cosmiccore:soul_muted_casing", + "cosmiccore:blank_rune", + "cosmiccore:ritual_stone", + "cosmiccore:light_ritual_stone", + "cosmiccore:superheavy_steel_casing", + "cosmiccore:rigid_high_speed_steel_casing", + "cosmiccore:bolted_heavy_frame_casing", + "cosmiccore:heat_fan", + "cosmiccore:ludicrious_intake", + "cosmiccore:ultimate_intake", + "cosmiccore:radioactive_filter_casing", + "cosmiccore:zblan_glass", + "cosmiccore:moth_station_casing" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/item/circuits/ev.json b/src/generated/resources/data/gtceu/tags/item/circuits/ev.json new file mode 100644 index 000000000..aa2ee88fc --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/item/circuits/ev.json @@ -0,0 +1,8 @@ +{ + "values": [ + "cosmiccore:hex_processor_supercomputer", + "cosmiccore:enthelic_processor_assembly", + "cosmiccore:lucidic_processor", + "cosmiccore:omnia_circuit_ev" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/item/circuits/hv.json b/src/generated/resources/data/gtceu/tags/item/circuits/hv.json new file mode 100644 index 000000000..721c753f9 --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/item/circuits/hv.json @@ -0,0 +1,7 @@ +{ + "values": [ + "cosmiccore:hex_processor_assembly", + "cosmiccore:enthelic_processor", + "cosmiccore:omnia_circuit_hv" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/item/circuits/iv.json b/src/generated/resources/data/gtceu/tags/item/circuits/iv.json new file mode 100644 index 000000000..3a5cf3926 --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/item/circuits/iv.json @@ -0,0 +1,8 @@ +{ + "values": [ + "cosmiccore:hex_processor_mainframe", + "cosmiccore:enthelic_processor_supercomputer", + "cosmiccore:lucidic_processor_assembly", + "cosmiccore:omnia_circuit_iv" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/item/circuits/luv.json b/src/generated/resources/data/gtceu/tags/item/circuits/luv.json new file mode 100644 index 000000000..641a19cd4 --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/item/circuits/luv.json @@ -0,0 +1,7 @@ +{ + "values": [ + "cosmiccore:enthelic_processor_mainframe", + "cosmiccore:lucidic_processor_supercomputer", + "cosmiccore:omnia_circuit_luv" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/item/circuits/lv.json b/src/generated/resources/data/gtceu/tags/item/circuits/lv.json new file mode 100644 index 000000000..ddda21be2 --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/item/circuits/lv.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:omnia_circuit_lv" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/item/circuits/mv.json b/src/generated/resources/data/gtceu/tags/item/circuits/mv.json new file mode 100644 index 000000000..777be82c8 --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/item/circuits/mv.json @@ -0,0 +1,6 @@ +{ + "values": [ + "cosmiccore:hex_processor", + "cosmiccore:omnia_circuit_mv" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/item/circuits/opv.json b/src/generated/resources/data/gtceu/tags/item/circuits/opv.json new file mode 100644 index 000000000..1b4e0677e --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/item/circuits/opv.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:omnia_circuit_opv" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/item/circuits/uev.json b/src/generated/resources/data/gtceu/tags/item/circuits/uev.json new file mode 100644 index 000000000..370322d21 --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/item/circuits/uev.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:omnia_circuit_uev" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/item/circuits/uhv.json b/src/generated/resources/data/gtceu/tags/item/circuits/uhv.json new file mode 100644 index 000000000..ac1cda9a2 --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/item/circuits/uhv.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:omnia_circuit_uhv" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/item/circuits/uiv.json b/src/generated/resources/data/gtceu/tags/item/circuits/uiv.json new file mode 100644 index 000000000..0d0023716 --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/item/circuits/uiv.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:omnia_circuit_uiv" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/item/circuits/uv.json b/src/generated/resources/data/gtceu/tags/item/circuits/uv.json new file mode 100644 index 000000000..d09af7a5a --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/item/circuits/uv.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:omnia_circuit_uv" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/item/circuits/uxv.json b/src/generated/resources/data/gtceu/tags/item/circuits/uxv.json new file mode 100644 index 000000000..56270fbd8 --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/item/circuits/uxv.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:omnia_circuit_uxv" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/item/circuits/zpm.json b/src/generated/resources/data/gtceu/tags/item/circuits/zpm.json new file mode 100644 index 000000000..b25ff16ae --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/item/circuits/zpm.json @@ -0,0 +1,6 @@ +{ + "values": [ + "cosmiccore:lucidic_processor_mainframe", + "cosmiccore:omnia_circuit_zpm" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/gtceu/tags/item/ppe_armor.json b/src/generated/resources/data/gtceu/tags/item/ppe_armor.json new file mode 100644 index 000000000..adbd96d09 --- /dev/null +++ b/src/generated/resources/data/gtceu/tags/item/ppe_armor.json @@ -0,0 +1,11 @@ +{ + "values": [ + "cosmiccore:sanguine_warptech_helmet", + "cosmiccore:sanguine_warptech_leggings", + "cosmiccore:sanguine_warptech_boots", + "cosmiccore:hydraulic_boots", + "cosmiccore:nano_boots", + "cosmiccore:quark_boots", + "cosmiccore:sanguine_boots" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json new file mode 100644 index 000000000..f64f625cf --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/block/mineable/pickaxe.json @@ -0,0 +1,11 @@ +{ + "values": [ + "cosmiccore:ethersteel_plated_ash_tiles", + "cosmiccore:steel_rose_light", + "cosmiccore:steel_rose_light_stairs", + "cosmiccore:steel_rose_light_slab", + "cosmiccore:iron_plated_deepslate_tile", + "cosmiccore:iron_plated_deepslate_tile_stairs", + "cosmiccore:iron_plated_deepslate_tile_slab" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/block/mineable/shovel.json b/src/generated/resources/data/minecraft/tags/block/mineable/shovel.json new file mode 100644 index 000000000..850b4ee0a --- /dev/null +++ b/src/generated/resources/data/minecraft/tags/block/mineable/shovel.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:steel_rose_lantern" + ] +} \ No newline at end of file diff --git a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json b/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json deleted file mode 100644 index a57c9155f..000000000 --- a/src/generated/resources/data/minecraft/tags/blocks/mineable/pickaxe.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "values": [ - "cosmiccore:prismatic_tungstensteel_coil_block", - "cosmiccore:resonant_virtue_meld_coil_block", - "cosmiccore:naquadric_superalloy_coil_block", - "cosmiccore:trinavine_coil_block", - "cosmiccore:psionic_galvorn_coil_block", - "cosmiccore:living_igniclad_coil_block", - "cosmiccore:programable_matter_coil_block", - "cosmiccore:shimmering_neutronium_coil_block", - "cosmiccore:causal_fabric_coil_block", - "cosmiccore:dyson_solar_cell", - "cosmiccore:naquadah_pressure_resistant_casing", - "cosmiccore:resonantly_tuned_virtue_meld_casing", - "cosmiccore:alternator_flux_coiling", - "cosmiccore:plated_aerocloud", - "cosmiccore:high_powered_magnet", - "cosmiccore:fusion_grade_magnet" - ] -} \ No newline at end of file diff --git a/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java b/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java index 8656d2624..c76c1943f 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java +++ b/src/main/java/com/ghostipedia/cosmiccore/CosmicCore.java @@ -1,71 +1,121 @@ package com.ghostipedia.cosmiccore; +import com.ghostipedia.cosmiccore.api.capability.recipe.CosmicRecipeCapabilities; import com.ghostipedia.cosmiccore.api.data.CosmicCoreMaterialIconType; -import com.ghostipedia.cosmiccore.api.data.CosmicCoreTagPrefix; +import com.ghostipedia.cosmiccore.api.data.CosmicTagPrefix; +import com.ghostipedia.cosmiccore.api.item.LinkedTerminalBehavior; import com.ghostipedia.cosmiccore.api.pattern.CosmicPredicates; +import com.ghostipedia.cosmiccore.api.recipe.ingredient.SoulIngredient; +import com.ghostipedia.cosmiccore.api.recipe.lookup.MapSoulIngredient; import com.ghostipedia.cosmiccore.api.registries.CosmicRegistration; -import com.ghostipedia.cosmiccore.api.capability.CosmicCapabilities; +import com.ghostipedia.cosmiccore.client.CosmicCoreClient; +import com.ghostipedia.cosmiccore.common.airControl.OxygenItemCap; +import com.ghostipedia.cosmiccore.common.airControl.OxygenRules; +import com.ghostipedia.cosmiccore.common.commands.argument.SoulTypeArgument; import com.ghostipedia.cosmiccore.common.data.*; +import com.ghostipedia.cosmiccore.common.data.materials.CosmicElements; +import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterialSet; import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.modular.MultiblockInit; +import com.ghostipedia.cosmiccore.common.mob.DimensionMobScaling; +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.recipe.condition.CosmicConditions; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.bargain.CosmicBargains; import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + import com.gregtechceu.gtceu.api.GTCEuAPI; -import com.gregtechceu.gtceu.api.data.chemical.material.event.MaterialEvent; -import com.gregtechceu.gtceu.api.data.chemical.material.event.MaterialRegistryEvent; -import com.gregtechceu.gtceu.api.data.chemical.material.registry.MaterialRegistry; -import com.gregtechceu.gtceu.api.machine.MachineDefinition; -import com.gregtechceu.gtceu.api.recipe.GTRecipeType; +import com.gregtechceu.gtceu.api.data.chemical.material.event.PostMaterialEvent; +import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.MapIngredientTypeManager; import com.gregtechceu.gtceu.common.block.CoilBlock; import com.gregtechceu.gtceu.config.ConfigHolder; -import net.minecraft.resources.ResourceLocation; -import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import com.lowdragmc.lowdraglib.Platform; +import net.minecraft.commands.synchronization.ArgumentTypeInfos; +import net.minecraft.commands.synchronization.SingletonArgumentInfo; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; +import net.neoforged.fml.event.lifecycle.FMLLoadCompleteEvent; +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; +import net.neoforged.neoforge.registries.RegisterEvent; +import appeng.api.features.GridLinkables; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; @Mod(CosmicCore.MOD_ID) public class CosmicCore { + public static final String MOD_ID = "cosmiccore", NAME = "CosmicCore"; public static final Logger LOGGER = LoggerFactory.getLogger(NAME); - public static MaterialRegistry MATERIAL_REGISTRY; - //Init Everything - public CosmicCore() { - CosmicCore.init(); - var bus = FMLJavaModLoadingContext.get().getModEventBus(); - bus.register(this); - bus.addGenericListener(GTRecipeType.class, this::registerRecipeTypes); - // bus.addGenericListener(Class.class, this::registerRecipeConditions); - // bus.addGenericListener(MachineDefinition.class, this::registerMachines); - bus.addGenericListener(MachineDefinition.class, this::registerMachines); + + // GTCEu 8.0 registers all content during a single RegisterEvent; guard so it only runs once. + private static boolean didRunRegistration = false; + + public CosmicCore(IEventBus modBus) { + modBus.register(this); + CosmicRegistration.REGISTRATE.registerEventListeners(modBus); + CosmicAttachmentTypes.ATTACHMENT_TYPES.register(modBus); + CosmicLootModifiers.register(modBus); + CosmicBargains.init(); + + if (Platform.isClient()) { + CosmicCoreClient.init(modBus); + } + } + + public static ResourceLocation id(String path) { + return ResourceLocation.fromNamespaceAndPath(MOD_ID, path); } - public static void init() { + // Content registration — mirrors GTCEu's CommonProxy#onRegister ordering (elements -> materials -> tag prefixes + // -> recipe caps/conditions/types -> blocks -> items -> machines -> sounds). + @SubscribeEvent + public void onRegister(RegisterEvent event) { + if (didRunRegistration) return; + didRunRegistration = true; + ConfigHolder.init(); CosmicCreativeModeTabs.init(); + CosmicElements.init(); + CosmicMaterials.register(); + CosmicCoreMaterialIconType.init(); + CosmicTagPrefix.initTagPrefixes(); + CosmicMaterialSet.init(); + CosmicRecipeCapabilities.init(); + CosmicConditions.register(); + CosmicRecipeTypes.init(); CosmicBlocks.init(); + CosmicBlockEntities.init(); CosmicItems.init(); - CosmicRegistration.REGISTRATE.registerRegistrate(); - CosmicCoreDatagen.init(); + CosmicBotanyItemRegistration.init(); CosmicPredicates.init(); - - } - - public static ResourceLocation id(String path) { - return new ResourceLocation(MOD_ID, path); + MultiblockInit.init(); + CosmicMachines.init(); + CosmicSounds.init(); + CosmicCoreDatagen.init(); } @SubscribeEvent - public void registerMaterialRegistry(MaterialRegistryEvent event) { - MATERIAL_REGISTRY = GTCEuAPI.materialManager.createRegistry(CosmicCore.MOD_ID); + public void modifyExistingMaterials(PostMaterialEvent event) { + CosmicMaterials.modifyMaterials(); } + @SubscribeEvent - public void registerMaterials(MaterialEvent event) { - CosmicMaterials.register(); + public void commonSetup(FMLCommonSetupEvent event) { + event.enqueueWork(() -> { + MapIngredientTypeManager.registerMapIngredient(SoulIngredient.class, MapSoulIngredient::from); + GridLinkables.register(CosmicItems.LINKED_TERMINAL, LinkedTerminalBehavior.handler); + OxygenRules.registerAirRanges(); + DimensionMobScaling.registerScaling(); + ArgumentTypeInfos.registerByClass(SoulTypeArgument.class, + SingletonArgumentInfo.contextFree(SoulTypeArgument::soulType)); + }); } @SubscribeEvent @@ -75,19 +125,11 @@ public void onLoadComplete(FMLLoadCompleteEvent event) { GTCEuAPI.HEATING_COILS.remove(CoilBlock.CoilType.NAQUADAH); GTCEuAPI.HEATING_COILS.remove(CoilBlock.CoilType.TRINIUM); GTCEuAPI.HEATING_COILS.remove(CoilBlock.CoilType.TRITANIUM); - - } - - public void registerRecipeTypes(GTCEuAPI.RegisterEvent event) { - CosmicRecipeTypes.init(); - } - - public void registerMachines(GTCEuAPI.RegisterEvent event) { - CosmicMachines.init(); } @SubscribeEvent - public void registerCapabilities(RegisterCapabilitiesEvent event) { - CosmicCapabilities.register(event); + public void registerPayloads(RegisterPayloadHandlersEvent event) { + CCoreNetwork.registerPayloads(event); } -} \ No newline at end of file + +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/CosmicCoreGTAddon.java b/src/main/java/com/ghostipedia/cosmiccore/CosmicCoreGTAddon.java index ed9f7ac3b..51375d9dc 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/CosmicCoreGTAddon.java +++ b/src/main/java/com/ghostipedia/cosmiccore/CosmicCoreGTAddon.java @@ -1,27 +1,18 @@ package com.ghostipedia.cosmiccore; - import com.ghostipedia.cosmiccore.api.capability.recipe.CosmicRecipeCapabilities; -import com.ghostipedia.cosmiccore.api.data.CosmicCoreMaterialIconType; -import com.ghostipedia.cosmiccore.api.data.CosmicCoreTagPrefix; import com.ghostipedia.cosmiccore.api.registries.CosmicRegistration; -import com.ghostipedia.cosmiccore.common.data.materials.CosmicElements; -import com.ghostipedia.cosmiccore.common.data.recipe.CosmicCoreOreRecipeHandler; -import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; -import com.ghostipedia.cosmiccore.gtbridge.CosmicCoreRecipes; +import com.ghostipedia.cosmiccore.common.data.worldgen.CosmicWorldGenLayers; +import com.ghostipedia.cosmiccore.common.data.worldgen.generator.CosmicVeinGenerators; + import com.gregtechceu.gtceu.api.addon.GTAddon; import com.gregtechceu.gtceu.api.addon.IGTAddon; import com.gregtechceu.gtceu.api.addon.events.KJSRecipeKeyEvent; import com.gregtechceu.gtceu.api.registry.registrate.GTRegistrate; -import com.mojang.datafixers.util.Pair; -import net.minecraft.data.recipes.FinishedRecipe; - -import java.util.function.Consumer; -import static com.ghostipedia.cosmiccore.integration.kjs.recipe.components.CosmicRecipeComponent.SOUL_IN; -import static com.ghostipedia.cosmiccore.integration.kjs.recipe.components.CosmicRecipeComponent.SOUL_OUT; +import net.minecraft.data.recipes.RecipeOutput; -@GTAddon +@GTAddon(CosmicCore.MOD_ID) public class CosmicCoreGTAddon implements IGTAddon { @Override @@ -30,41 +21,37 @@ public GTRegistrate getRegistrate() { } @Override - public void registerTagPrefixes() { - CosmicCoreMaterialIconType.init(); - CosmicCoreTagPrefix.initTagPrefixes(); - } - - @Override - public void initializeAddon() { + public void gtInitComplete() { CosmicCore.LOGGER.info("CosmicCoreGTAddon has loaded!"); } @Override - public void registerElements() { - IGTAddon.super.registerElements(); - CosmicElements.init(); + public void addRecipes(RecipeOutput provider) { + // TODO(recipe-gen / bead 42.9): migrate CosmicCoreRecipes + CosmicCoreOreRecipeHandler + + // CosmicMaterialRecipeHandlers from Consumer to 1.21 RecipeOutput, then re-enable: + // CosmicCoreRecipes.init(provider); + // for (var material : GTCEuAPI.materialManager.getRegisteredMaterials()) { + // CosmicCoreOreRecipeHandler.init(provider, material); + // CosmicMaterialRecipeHandlers.init(provider, material); + // } } @Override - public String addonModId() { - return CosmicCore.MOD_ID; - } - - @Override - public void addRecipes(Consumer provider) { - CosmicRecipeTypes.init(); - CosmicCoreRecipes.init(provider); - CosmicCoreOreRecipeHandler.init(provider); + public void registerRecipeKeys(KJSRecipeKeyEvent event) { + // TODO(cosmiccore-42.14): re-register the SOUL recipe key once the KubeJS integration + // (integration.kjs.recipe.components.CosmicRecipeComponent) is ported to the 1.21 KJS API. } @Override - public void registerRecipeCapabilities() { - CosmicRecipeCapabilities.init(); + public void registerWorldgenLayers() { + // Register the layer here (registration-time hook). The ore-vein reassignment that depends on the + // gtceu:ore_vein datapack registry runs later, in CosmicWorldGenLayers#onAddReloadListeners, once + // that registry is populated. + CosmicWorldGenLayers.init(); } @Override - public void registerRecipeKeys(KJSRecipeKeyEvent event) { - event.registerKey(CosmicRecipeCapabilities.SOUL, Pair.of(SOUL_IN, SOUL_OUT)); + public void registerVeinGenerators() { + CosmicVeinGenerators.init(); } -} \ No newline at end of file +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/CosmicUtils.java b/src/main/java/com/ghostipedia/cosmiccore/CosmicUtils.java new file mode 100644 index 000000000..a3ff1c908 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/CosmicUtils.java @@ -0,0 +1,62 @@ +package com.ghostipedia.cosmiccore; + +import com.ghostipedia.cosmiccore.common.data.CosmicItems; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.item.ComponentItem; +import com.gregtechceu.gtceu.api.item.component.ICustomRenderer; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +import com.tterrag.registrate.util.nullness.NonNullConsumer; +import org.jetbrains.annotations.Nullable; +import top.theillusivec4.curios.api.CuriosApi; +import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; +import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler; +import top.theillusivec4.curios.api.type.inventory.IDynamicStackHandler; + +import java.util.Optional; + +public class CosmicUtils { + + public static boolean hasTheOneRing(@Nullable Entity entity) { + return hasCurio(entity, "ring", CosmicItems.THE_ONE_RING.asItem()); + } + + public static NonNullConsumer attachRenderer(ICustomRenderer customRenderer) { + return !GTCEu.isClientSide() ? NonNullConsumer.noop() : (item) -> item.attachComponents(customRenderer); + } + + /** + * Check if an entity has a specific item in a curio slot + * + * @param entity Entity to check + * @param curioSlot Curio slot to check for item + * @param item Item to check for in curio slot + * @return True if item was found + */ + public static boolean hasCurio(@Nullable Entity entity, String curioSlot, Item item) { + if (!(entity instanceof LivingEntity living)) { + return false; + } + + Optional cap = CuriosApi.getCuriosInventory(living); + if (cap.isPresent()) { + ICuriosItemHandler curioHandler = cap.get(); + Optional handler = curioHandler.getStacksHandler(curioSlot); + if (handler.isPresent()) { + IDynamicStackHandler stackHandler = handler.get().getStacks(); + for (int i = 0; i < stackHandler.getSlots(); i++) { + ItemStack stack = stackHandler.getStackInSlot(i); + if (stack.is(item)) { + return true; + } + } + } + } + return false; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/CosmicCoreAPI.java b/src/main/java/com/ghostipedia/cosmiccore/api/CosmicCoreAPI.java index 463e43894..624fc4ed6 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/CosmicCoreAPI.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/CosmicCoreAPI.java @@ -1,14 +1,18 @@ package com.ghostipedia.cosmiccore.api; import com.ghostipedia.cosmiccore.api.block.IMagnetType; +import com.ghostipedia.cosmiccore.api.block.IMultiblockProvider; import com.ghostipedia.cosmiccore.common.block.MagnetBlock; -import com.gregtechceu.gtceu.api.block.ICoilType; -import com.gregtechceu.gtceu.common.block.CoilBlock; + +import net.minecraft.world.level.block.Block; import java.util.HashMap; import java.util.Map; import java.util.function.Supplier; public class CosmicCoreAPI { + public static final Map> MAGNET_COILS = new HashMap<>(); + public static final Map> STARLADDER_CASINGS = new HashMap<>(); + public static final Map> STARLADDER_MODULES = new HashMap<>(); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/CosmicGuiTextures.java b/src/main/java/com/ghostipedia/cosmiccore/api/CosmicGuiTextures.java new file mode 100644 index 000000000..a274d622a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/CosmicGuiTextures.java @@ -0,0 +1,22 @@ +package com.ghostipedia.cosmiccore.api; + +import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; + +public class CosmicGuiTextures { + + public static final ResourceTexture PLANT_OVERLAY = new ResourceTexture( + "cosmiccore:textures/gui/overlay/crop_overlay.png"); + public static final ResourceTexture BEE_OVERLAY = new ResourceTexture( + "cosmiccore:textures/gui/overlay/bee_overlay.png"); + public static final ResourceTexture BEE_HOLDER_OVERLAY = new ResourceTexture( + "cosmiccore:textures/gui/overlay/overlay_bee_holder.png"); + + public static final ResourceTexture SIGILI_PROGRESS_BAR = new ResourceTexture( + "cosmiccore:textures/gui/overlay/sigil_overlay.png"); + public static final ResourceTexture PROGRESS_BAR_HEAVY = new ResourceTexture( + "cosmiccore:textures/gui/overlay/progress_bar_heavy_assembler.png"); + public static final ResourceTexture DAWN_FORGE = new ResourceTexture( + "cosmiccore:textures/gui/overlay/explosive_overlay.png"); + public static final ResourceTexture DAWN_FORGE_SLOT = new ResourceTexture( + "cosmiccore:textures/gui/overlay/dawnforge_slot.png"); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/block/IBlockPattern.java b/src/main/java/com/ghostipedia/cosmiccore/api/block/IBlockPattern.java new file mode 100644 index 000000000..434f609e6 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/block/IBlockPattern.java @@ -0,0 +1,12 @@ +package com.ghostipedia.cosmiccore.api.block; + +import com.gregtechceu.gtceu.api.pattern.MultiblockState; + +import net.minecraft.world.entity.player.Player; + +import appeng.api.networking.IGrid; + +public interface IBlockPattern { + + void cosmiccore$autoBuild(Player player, MultiblockState worldState, IGrid grid); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/block/IMagnetType.java b/src/main/java/com/ghostipedia/cosmiccore/api/block/IMagnetType.java index 877d74afb..d952c5b8d 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/block/IMagnetType.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/block/IMagnetType.java @@ -1,7 +1,9 @@ package com.ghostipedia.cosmiccore.api.block; import com.ghostipedia.cosmiccore.api.CosmicCoreAPI; + import net.minecraft.resources.ResourceLocation; + import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -39,6 +41,7 @@ public interface IMagnetType { * @return the {@link ResourceLocation} defining the base texture of the magnet */ ResourceLocation getTexture(); + IMagnetType[] ALL_MAGNETS_CAPACITY_SORTED = CosmicCoreAPI.MAGNET_COILS.keySet().stream() .sorted(Comparator.comparing(IMagnetType::getMagnetFieldCapacity)) .toArray(IMagnetType[]::new); diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/block/IMultiblockProvider.java b/src/main/java/com/ghostipedia/cosmiccore/api/block/IMultiblockProvider.java new file mode 100644 index 000000000..fc1b2ba4a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/block/IMultiblockProvider.java @@ -0,0 +1,12 @@ +package com.ghostipedia.cosmiccore.api.block; + +import com.gregtechceu.gtceu.api.capability.IEnergyContainer; + +public interface IMultiblockProvider { + + int getModulatorTier(); + + IEnergyContainer getEnergyContainersForModules(); + + boolean amIAModule(IMultiblockProvider receiver); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/block/IMultiblockReciever.java b/src/main/java/com/ghostipedia/cosmiccore/api/block/IMultiblockReciever.java new file mode 100644 index 000000000..d99ba3fb3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/block/IMultiblockReciever.java @@ -0,0 +1,17 @@ +package com.ghostipedia.cosmiccore.api.block; + +import javax.annotation.Nullable; + +public interface IMultiblockReciever { + + @Nullable + IMultiblockProvider getModularMultiBlock(); + + void setModularMultiBlock(IMultiblockProvider provider); + + void sendWorkingDisabled(); + + void sendWorkingEnabled(); + + String getNameForDisplays(); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/capability/CosmicCapabilities.java b/src/main/java/com/ghostipedia/cosmiccore/api/capability/CosmicCapabilities.java deleted file mode 100644 index 1d7b0edba..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/api/capability/CosmicCapabilities.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.ghostipedia.cosmiccore.api.capability; - -import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.common.capabilities.CapabilityManager; -import net.minecraftforge.common.capabilities.CapabilityToken; -import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; - -public class CosmicCapabilities { - - public static Capability CAPABILITY_SOUL_CONTAINER = CapabilityManager.get(new CapabilityToken<>() {}); - - public static void register(RegisterCapabilitiesEvent event) { - event.register(ISoulContainer.class); - } -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/capability/HeatCapability.java b/src/main/java/com/ghostipedia/cosmiccore/api/capability/HeatCapability.java new file mode 100644 index 000000000..d4d358eb8 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/capability/HeatCapability.java @@ -0,0 +1,20 @@ +package com.ghostipedia.cosmiccore.api.capability; + +public class HeatCapability { + + public static float adjustTempTowards(float temp, float target, float delta) { + return adjustTempTowards(temp, target, delta, delta); + } + + public static float adjustTempTowards(float temp, float target, float deltaPositive, float deltaNegative) { + // Get the Delta of the particular dimension, not sure how I want to do this yet, so let's just leave it as 1 + final float delta = 1; + if (temp < target) { + return Math.min(temp + delta * deltaPositive, target); + } else if (temp > target) { + return Math.max(temp - delta * deltaNegative, target); + } else { + return target; + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/capability/IHeatBlock.java b/src/main/java/com/ghostipedia/cosmiccore/api/capability/IHeatBlock.java new file mode 100644 index 000000000..bf648de08 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/capability/IHeatBlock.java @@ -0,0 +1,8 @@ +package com.ghostipedia.cosmiccore.api.capability; + +public interface IHeatBlock { + + float getTemperature(); + + void setTemperature(float temperature); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/capability/IHeatInfoProvider.java b/src/main/java/com/ghostipedia/cosmiccore/api/capability/IHeatInfoProvider.java new file mode 100644 index 000000000..2fa71f2f1 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/capability/IHeatInfoProvider.java @@ -0,0 +1,11 @@ +package com.ghostipedia.cosmiccore.api.capability; + +public interface IHeatInfoProvider { + + record HeatInfo(Long capacity, Long stored, boolean overload) {} + + // I need some way to store all dimensions temps, idk do it in the next interface. + HeatInfo getHeatInfo(); + + boolean supportsImpossibleHeatValues(); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/capability/ILinkedMultiblock.java b/src/main/java/com/ghostipedia/cosmiccore/api/capability/ILinkedMultiblock.java new file mode 100644 index 000000000..6b534d57b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/capability/ILinkedMultiblock.java @@ -0,0 +1,107 @@ +package com.ghostipedia.cosmiccore.api.capability; + +import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; + +import net.minecraft.core.GlobalPos; + +import org.jetbrains.annotations.Nullable; + +import java.util.Set; +import java.util.UUID; + +/** + * Interface for multiblocks that support cross-dimensional linking. + * Extends GTCEu's IDataStickInteractable for datastick-based linking. + *

+ * SECURITY: Link validation MUST load and verify the partner machine. + * Never trust datastick NBT for ownership or compatibility checks. + */ +public interface ILinkedMultiblock extends IDataStickInteractable { + + /** + * Role this machine prefers in links it creates. + * Actual role is determined by negotiation with partner. + */ + enum LinkRole { + /** Bidirectional - both machines can query each other */ + PEER, + /** This machine controls partners - can query them, they cannot query us */ + CONTROLLER, + /** This machine is controlled by partners - they can query us, we cannot query them */ + REMOTE + } + + // ==================== Configuration ==================== + + /** + * Check if this machine can link to the given partner. + * Called AFTER partner machine is loaded and ownership is verified. + * Called AFTER role negotiation succeeds. + *

+ * Use for type compatibility, distance limits, dimension restrictions, etc. + * Ownership and role checks are handled by the linking system. + * + * @param partner The partner's position + * @param partnerMachine The actual loaded partner machine + */ + boolean canLinkTo(GlobalPos partner, ILinkedMultiblock partnerMachine); + + /** + * Get the role this machine prefers when linking. + * Actual effective role is determined by negotiation. + * + * @see com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper#negotiateRoles + */ + LinkRole getLinkRole(); + + /** + * Maximum number of partners this machine can link to. + * Default: 4 + */ + default int getMaxPartners() { + return 4; + } + + // ==================== Lifecycle ==================== + + /** + * Called when a link is successfully established. + * May be called immediately (if partner loaded) or deferred (on this machine's load). + * + * @param partner The linked partner's position + */ + void onLinkEstablished(GlobalPos partner); + + /** + * Called when a link is broken. + * Reasons: partner destroyed, manual unlink, ownership change, etc. + * + * @param partner The unlinked partner's position + */ + void onLinkBroken(GlobalPos partner); + + /** + * Called during machine load to process deferred link notifications. + * Implementation should compare SavedData links vs known partners. + */ + void processLinkNotifications(); + + // ==================== Query ==================== + + /** + * Get all currently linked partners from SavedData. + */ + Set getLinkedPartners(); + + /** + * Get this machine's GlobalPos for link registration. + */ + GlobalPos getGlobalPos(); + + /** + * Get the owner UUID (team or player) for access control. + * Should use FTB Teams integration via existing getTeamUUID() pattern. + */ + @Nullable + UUID getTeamUUID(); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/capability/ISoulContainer.java b/src/main/java/com/ghostipedia/cosmiccore/api/capability/ISoulContainer.java index 472f01c68..5c058b663 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/capability/ISoulContainer.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/capability/ISoulContainer.java @@ -1,21 +1,9 @@ package com.ghostipedia.cosmiccore.api.capability; -import wayoftime.bloodmagic.core.data.SoulNetwork; - -import java.util.UUID; +import com.ghostipedia.cosmiccore.api.data.souls.SoulNetwork; public interface ISoulContainer { - /** - * @return the UUID of the player associated to the container's network - */ - UUID getOwner(); - - /** - * @param playerUUID: the player to whom we attach the container - */ - void setOwner(UUID playerUUID); - /** * @return the soul network attached to the container */ diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/capability/ITeleportOrigin.java b/src/main/java/com/ghostipedia/cosmiccore/api/capability/ITeleportOrigin.java new file mode 100644 index 000000000..fb30e2e44 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/capability/ITeleportOrigin.java @@ -0,0 +1,27 @@ +package com.ghostipedia.cosmiccore.api.capability; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +// Capability for storing teleportation origin of a player. +public interface ITeleportOrigin { + + void setOriginDimension(ResourceKey dimension); // Set the origin dimension the player teleported from. + + ResourceKey getOriginDimension(); // Get the origin dimension, or null if not set. + + void setOriginPosition(Vec3 position); // Set the origin position the player teleported from. + + Vec3 getOriginPosition(); // Get the origin position, or null if not set. + + void setOriginRotation(float yaw, float pitch); // Set the player's rotation when they teleported. + + float getOriginYaw(); // Get the origin yaw rotation. + + float getOriginPitch(); // Get the origin pitch rotation. + + boolean hasValidOrigin(); // Check if this player has valid origin data. + + void clearOriginData(); // Clear all origin data. +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/CosmicRecipeCapabilities.java b/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/CosmicRecipeCapabilities.java index b184a7ba6..d131e1b15 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/CosmicRecipeCapabilities.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/CosmicRecipeCapabilities.java @@ -1,12 +1,22 @@ package com.ghostipedia.cosmiccore.api.capability.recipe; +import com.ghostipedia.cosmiccore.CosmicCore; + import com.gregtechceu.gtceu.api.registry.GTRegistries; +import static com.gregtechceu.gtceu.integration.kjs.recipe.components.GTRecipeComponents.FLUID; +import static com.gregtechceu.gtceu.integration.kjs.recipe.components.GTRecipeComponents.VALID_CAPS; + public class CosmicRecipeCapabilities { public static final SoulRecipeCapability SOUL = SoulRecipeCapability.CAP; + public static final SterileRecipeCapability STERILE = SterileRecipeCapability.CAP; + // TODO(embers): EMBER recipe capability shelved with Embers (bead cosmiccore-42.14) public static void init() { - GTRegistries.RECIPE_CAPABILITIES.register(SOUL.name, SOUL); + GTRegistries.register(GTRegistries.RECIPE_CAPABILITIES, CosmicCore.id(SOUL.name), SOUL); + GTRegistries.register(GTRegistries.RECIPE_CAPABILITIES, CosmicCore.id(STERILE.name), STERILE); + + VALID_CAPS.put(STERILE, FLUID); } -} \ No newline at end of file +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/HeatRecipeCapability.java b/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/HeatRecipeCapability.java new file mode 100644 index 000000000..1e6b4a913 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/HeatRecipeCapability.java @@ -0,0 +1,63 @@ +package com.ghostipedia.cosmiccore.api.capability.recipe; + +import com.ghostipedia.cosmiccore.api.recipe.lookup.MapHeatIngredient; + +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.content.Content; +import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; +import com.gregtechceu.gtceu.api.recipe.content.SerializerLong; +import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.AbstractMapIngredient; + +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.utils.LocalizationUtils; + +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import org.apache.commons.lang3.mutable.MutableInt; + +import java.util.List; + +public class HeatRecipeCapability extends RecipeCapability { + + public final static HeatRecipeCapability CAP = new HeatRecipeCapability(); + + protected HeatRecipeCapability() { + super("thermia", 0x5E2129FF, true, 11, SerializerLong.INSTANCE); + } + + @Override + public Long copyInner(Long content) { + return content; + } + + @Override + public Long copyWithModifier(Long content, ContentModifier modifier) { + return modifier.apply(content); + } + + // @Override + public List convertToMapIngredient(Object ingredient) { + List ingredients = new ObjectArrayList<>(1); + if (ingredient instanceof Long thermia) ingredients.add(new MapHeatIngredient(thermia)); + return ingredients; + } + + @Override + public boolean isRecipeSearchFilter() { + return true; + } + + @Override + public void addXEIInfo(WidgetGroup group, int xOffset, GTRecipe recipe, List contents, boolean perTick, + boolean isInput, MutableInt yOffset) { + long thermia = contents.stream().map(Content::getContent).mapToLong(HeatRecipeCapability.CAP::of).sum(); + if (isInput) { + group.addWidget(new LabelWidget(3 - xOffset, yOffset.addAndGet(10), + LocalizationUtils.format("cosmiccore.recipe.thermiaIn", thermia))); + } else { + group.addWidget(new LabelWidget(3 - xOffset, yOffset.addAndGet(10), + LocalizationUtils.format("cosmiccore.recipe.thermiaOut", thermia))); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/IHeatContainer.java b/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/IHeatContainer.java new file mode 100644 index 000000000..da4b422f9 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/IHeatContainer.java @@ -0,0 +1,123 @@ +package com.ghostipedia.cosmiccore.api.capability.recipe; + +import com.ghostipedia.cosmiccore.api.capability.IHeatInfoProvider; + +import net.minecraft.core.Direction; + +public interface IHeatContainer extends IHeatInfoProvider { + + /* + * Basically just changeHeat(long) but should also handle overloads and capacity. + * This is what I probably want to use between blocks... + * fuck if I know + */ + long acceptHeatFromNetwork(Direction side); + + // Returns: if this container can accept heat from this side. + boolean inputsHeat(Direction side); + + // Returns: if this container can eject heat from this side. + default boolean outputsHeat(Direction side) { + return false; + }; + + /* + * The Magic Sauce. + * for handling logic within machine running behaviors, DO NOT. Use this for the eventual pipenet + * update this desc to properly reflect interface methods once they are adapted. + */ + long changeHeat(long heatDifference); + + /* + * Adds a set amount of heat to this heat container + * Params : heatToAdd - amount of heat to add. + * Returns : amount of heat added. + */ + default long addHeat(long heatToAdd) { + return changeHeat(heatToAdd); + } + + /* + * Removes a set amount of heat to this heat container + * Params : heatToRemove - amount of heat to remove. + * Returns : amount of heat removed. + */ + default long removeHeat(long heatToRemove) { + return -changeHeat(-heatToRemove); + } + + // Heat Containers Do not have an insertion limit. Thus we melt the block if they overload. + // TODO : The Math that actually makes this behave less psychotic. And actually function. + default boolean getHeatCanBeOverloaded() { + if (getOverloadLimit() > getHeatStorage()) { + return getHeatInfo().overload(); + } + return false; + } + + // Reports the Current Thermal Maximum a container can withstand + long getOverloadLimit(); + + // Reports the Current Temperature. + long getHeatStorage(); + + @Override + default HeatInfo getHeatInfo() { + return new HeatInfo(getHeatStorage(), getHeatStorage(), getHeatCanBeOverloaded()); + }; + + // Params needs to build the container. + // This Abomination - Allows Going below Absolute Zero + @Override + default boolean supportsImpossibleHeatValues() { + return false; + }; + + // Max amount of heat that can be output per tick + default long getEjectLimit() { + return 0L; + }; + + // Max amount of heat that can be accepted per tick + default long getAcceptLimit() { + return 0L; + } + + // Input per second + default long getHeatInputPerSec() { + return 0L; + } + + // Output per second + default long getHeatOutputPerSec() { + return 0L; + } + + IHeatContainer DEFAULT = new IHeatContainer() { + + @Override + public long acceptHeatFromNetwork(Direction side) { + return 0; + } + + @Override + public boolean inputsHeat(Direction side) { + return false; + } + + @Override + public long changeHeat(long heatDifference) { + return 0; + } + + @Override + public long getOverloadLimit() { + return 0; + } + + @Override + public long getHeatStorage() { + return 0; + } + }; +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/SoulRecipeCapability.java b/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/SoulRecipeCapability.java index 73d84c73b..47b3534e7 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/SoulRecipeCapability.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/SoulRecipeCapability.java @@ -1,63 +1,173 @@ package com.ghostipedia.cosmiccore.api.capability.recipe; -import com.ghostipedia.cosmiccore.api.recipe.lookup.MapSoulIngredient; -import com.gregtechceu.gtceu.api.capability.recipe.CWURecipeCapability; +import com.ghostipedia.cosmiccore.api.capability.souls.SoulType; +import com.ghostipedia.cosmiccore.api.machine.trait.NotifiableSoulContainer; +import com.ghostipedia.cosmiccore.api.recipe.ingredient.SoulIngredient; +import com.ghostipedia.cosmiccore.api.recipe.ingredient.SoulStack; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.IRecipeCapabilityHolder; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; -import com.gregtechceu.gtceu.api.recipe.content.SerializerInteger; -import com.gregtechceu.gtceu.api.recipe.lookup.AbstractMapIngredient; +import com.gregtechceu.gtceu.api.recipe.content.IContentSerializer; + import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import com.lowdragmc.lowdraglib.utils.LocalizationUtils; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; + +import com.mojang.serialization.Codec; import org.apache.commons.lang3.mutable.MutableInt; -import java.util.Collection; -import java.util.List; +import java.util.*; +import java.util.stream.Collectors; + +public class SoulRecipeCapability extends RecipeCapability { -public class SoulRecipeCapability extends RecipeCapability { public final static SoulRecipeCapability CAP = new SoulRecipeCapability(); protected SoulRecipeCapability() { - super("soul", 0x5E2129FF, true, 10, SerializerInteger.INSTANCE); + super("soul", 0x5E2129FF, true, 10, SerializerSoulIngredient.INSTANCE); } @Override - public Integer copyInner(Integer content) { - return content; + public boolean isRecipeSearchFilter() { + return true; } + // TODO: try to remove @Override - public Integer copyWithModifier(Integer content, ContentModifier modifier) { - return modifier.apply(content).intValue(); + public SoulIngredient copyInner(SoulIngredient content) { + return super.copyInner(content); } @Override - public List convertToMapIngredient(Object ingredient) { - List ingredients = new ObjectArrayList<>(1); - if (ingredient instanceof Integer essence) ingredients.add(new MapSoulIngredient(essence)); - return ingredients; + public SoulIngredient copyWithModifier(SoulIngredient content, ContentModifier modifier) { + var modifiedStack = content.stack().withAmount(modifier.apply(content.stack().amount())); + return SoulIngredient.of(modifiedStack); } @Override public List compressIngredients(Collection ingredients) { - //TODO: Figure out what it needs to do - return super.compressIngredients(ingredients); + List list = new ArrayList<>(ingredients.size()); + for (Object item : ingredients) { + if (item instanceof SoulIngredient soul) { + var isEqual = false; + for (Object obj : list) { + if (obj instanceof SoulIngredient soulIngredient && + soul.stack().type().equals(soulIngredient.stack().type())) { + isEqual = true; + break; + } + } + if (isEqual) continue; + list.add(item); + } + } + return list; + } + + /// Get the total available input of each soul type. + /// The value is the sum of the available amount in each hatch. + /// The available amount is the minimum between the contained souls and the available throughput. + private static Map getInputContents(IRecipeCapabilityHolder holder) { + var handlerLists = holder.getCapabilitiesForIO(IO.IN); + if (handlerLists.isEmpty()) return new HashMap<>(); + + var totalThroughput = 0; + var totalSouls = new HashMap(); + + for (var handlerList : handlerLists) { + if (!handlerList.hasCapability(SoulRecipeCapability.CAP)) continue; + var soulHandlers = handlerList.getCapability(SoulRecipeCapability.CAP); + for (var handler : soulHandlers) { + var soulHandler = (NotifiableSoulContainer) handler; + totalThroughput += soulHandler.getThroughput(); + for (var content : soulHandler.getContents()) { + if (content instanceof SoulIngredient soulIngredient) { + totalSouls.put(soulIngredient.stack().type(), soulIngredient.stack().amount()); + } else throw new IllegalArgumentException("Invalid content type"); + } + } + } + + final int finalTotalThroughput = totalThroughput; + return totalSouls.entrySet().stream() + .collect(Collectors.toMap( + Map.Entry::getKey, + entry -> Math.min(entry.getValue(), finalTotalThroughput))); } @Override - public boolean isRecipeSearchFilter() { - return true; + public int getMaxParallelByInput(IRecipeCapabilityHolder holder, GTRecipe recipe, int limit, boolean tick) { + if (!holder.hasCapabilityProxies()) return 0; + + var inputs = (tick ? recipe.tickInputs : recipe.inputs).get(this); + if (inputs == null || inputs.isEmpty()) return 0; + + var totalInputs = getInputContents(holder); + + var parallelMap = inputs.stream() + .map(content -> (SoulIngredient) content.getContent()) + .collect(Collectors.toMap( + ingredient -> ingredient.stack().type(), + ingredient -> { + int available = totalInputs.getOrDefault(ingredient.stack().type(), 0); + int required = ingredient.stack().amount(); + return required == 0 ? Integer.MAX_VALUE : available / required; + }, + Math::min)); + + int maxParallel = parallelMap.values().stream() + .mapToInt(Integer::intValue) + .min() + .orElse(0); + + return Math.min(limit, maxParallel); } @Override - public void addXEIInfo(WidgetGroup group, int xOffset, List contents, boolean perTick, boolean isInput, MutableInt yOffset) { - int soul = contents.stream().map(Content::getContent).mapToInt(SoulRecipeCapability.CAP::of).sum(); + public void addXEIInfo(WidgetGroup group, int xOffset, GTRecipe recipe, List contents, boolean perTick, + boolean isInput, MutableInt yOffset) { + String type = contents.stream().map(Content::getContent).map(SoulRecipeCapability.CAP::of) + .map(SoulIngredient::stack).map(SoulStack::type).map(SoulType::getSerializedName).findFirst() + .orElse(""); + long soul = contents.stream().map(Content::getContent).map(SoulRecipeCapability.CAP::of) + .map(SoulIngredient::stack).mapToLong(SoulStack::amount).sum(); if (isInput) { - group.addWidget(new LabelWidget(3 - xOffset, yOffset.addAndGet(10), LocalizationUtils.format("cosmiccore.recipe.soulIn", soul))); + group.addWidget(new LabelWidget(3 - xOffset, yOffset.addAndGet(10), + LocalizationUtils.format("recipe.cosmiccore." + type + "_soul_in", soul))); } else { - group.addWidget(new LabelWidget(3 - xOffset, yOffset.addAndGet(10), LocalizationUtils.format("cosmiccore.recipe.soulOut", soul))); + group.addWidget(new LabelWidget(3 - xOffset, yOffset.addAndGet(10), + LocalizationUtils.format("recipe.cosmiccore." + type + "_soul_out", soul))); + } + } + + private static class SerializerSoulIngredient implements IContentSerializer { + + public static SerializerSoulIngredient INSTANCE = new SerializerSoulIngredient(); + + @Override + public SoulIngredient of(Object o) { + if (o instanceof SoulStack stack) return SoulIngredient.of(stack); + else if (o instanceof SoulIngredient ingredient) return ingredient; + return SoulIngredient.of(new SoulStack(SoulType.Raw, 0)); + } + + @Override + public SoulIngredient defaultValue() { + return SoulIngredient.of(new SoulStack(SoulType.Raw, 0)); + } + + @Override + public Class contentClass() { + return SoulIngredient.class; + } + + @Override + public Codec codec() { + return SoulIngredient.CODEC; } } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/SterileRecipeCapability.java b/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/SterileRecipeCapability.java new file mode 100644 index 000000000..899f63f49 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/capability/recipe/SterileRecipeCapability.java @@ -0,0 +1,83 @@ +package com.ghostipedia.cosmiccore.api.capability.recipe; + +import com.ghostipedia.cosmiccore.api.recipe.lookup.MapSterileIngredient; + +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.content.Content; +import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; +import com.gregtechceu.gtceu.api.recipe.content.SerializerFluidIngredient; +import com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredientExtensions; +import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.AbstractMapIngredient; + +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.utils.LocalizationUtils; + +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.crafting.SizedFluidIngredient; + +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import org.apache.commons.lang3.mutable.MutableInt; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.List; + +public class SterileRecipeCapability extends RecipeCapability { + + public final static SterileRecipeCapability CAP = new SterileRecipeCapability(); + + protected SterileRecipeCapability() { + super("sterile", 0x5E2129FF, true, 10, SerializerFluidIngredient.INSTANCE); + } + + @Override + public SizedFluidIngredient copyInner(SizedFluidIngredient content) { + return SizedIngredientExtensions.copy(content); + } + + @Override + public SizedFluidIngredient copyWithModifier(SizedFluidIngredient content, ContentModifier modifier) { + return FluidRecipeCapability.CAP.copyWithModifier(content, modifier); + } + + @Override + public @Nullable List getDefaultMapIngredient(Object ingredient) { + List ingredients = new ObjectArrayList<>(1); + if (ingredient instanceof FluidStack fluid) ingredients.add(new MapSterileIngredient(fluid)); + return ingredients; + } + + @Override + public List compressIngredients(Collection ingredients) { + // TODO: Figure out what it needs to do + return super.compressIngredients(ingredients); + } + + @Override + public boolean isRecipeSearchFilter() { + return true; + } + + @Override + public void addXEIInfo(WidgetGroup group, int xOffset, GTRecipe recipe, List contents, boolean perTick, + boolean isInput, MutableInt yOffset) { + for (var stack : contents) { + var sterileIngredient = SterileRecipeCapability.CAP.of(stack.getContent()); + if (isInput) { + group.addWidget(new LabelWidget(3 - xOffset, yOffset.addAndGet(10), + LocalizationUtils.format("cosmiccore.recipe.sterile_in", + sterileIngredient.getFluids()[0].getHoverName().getString(), + sterileIngredient.getFluids()[0].getAmount() + (perTick ? "/t" : "")))); + } else { + group.addWidget(new LabelWidget(3 - xOffset, yOffset.addAndGet(10), + LocalizationUtils.format("cosmiccore.recipe.sterile_out", + sterileIngredient.getFluids()[0].getHoverName().getString(), + sterileIngredient.getFluids()[0].getAmount() + (perTick ? "/t" : "")))); + } + + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/capability/souls/SoulType.java b/src/main/java/com/ghostipedia/cosmiccore/api/capability/souls/SoulType.java new file mode 100644 index 000000000..8e9e4a4a9 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/capability/souls/SoulType.java @@ -0,0 +1,66 @@ +package com.ghostipedia.cosmiccore.api.capability.souls; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.util.StringRepresentable; + +import com.mojang.serialization.Codec; +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +public enum SoulType implements StringRepresentable { + + Raw("raw", ChatFormatting.DARK_RED), + Refined("refined", ChatFormatting.GRAY), + Proud("proud", ChatFormatting.DARK_PURPLE), + Greedy("greedy", ChatFormatting.YELLOW), + Lustful("lustful", ChatFormatting.LIGHT_PURPLE), + Envious("envious", ChatFormatting.GREEN), + Gluttonous("gluttonous", ChatFormatting.GOLD), + Wrathful("wrathful", ChatFormatting.RED), + Slothful("slothful", ChatFormatting.AQUA), + Temporal("temporal", ChatFormatting.DARK_AQUA); + + private final String name; + private final ChatFormatting color; + + SoulType(String name, ChatFormatting color) { + this.name = name; + this.color = color; + } + + @Override + public @NotNull String getSerializedName() { + return this.name; + } + + public static final Codec CODEC = StringRepresentable.fromEnum(SoulType::values); + + private static final Map BY_NAME = Arrays.stream(values()) + .collect(Collectors.toMap(SoulType::getSerializedName, Function.identity())); + + public static SoulType byName(String name) { + return BY_NAME.get(name); + } + + public Component toComponent(int amount) { + return toComponent(amount, true); + } + + public Component toComponent(int amount, boolean formatted) { + MutableComponent nameComp = Component.translatable("gui.cosmiccore.soul." + name + ".name"); + MutableComponent amountComp = Component.literal(" : " + amount).withStyle(Style.EMPTY); + if (formatted) { + nameComp = nameComp.withStyle(ChatFormatting.BOLD, this.color); + amountComp = amountComp.withStyle(ChatFormatting.RESET); + } + + return nameComp.append(amountComp); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/codec/CosmicCodecUtils.java b/src/main/java/com/ghostipedia/cosmiccore/api/codec/CosmicCodecUtils.java new file mode 100644 index 000000000..fa965ca71 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/codec/CosmicCodecUtils.java @@ -0,0 +1,3 @@ +package com.ghostipedia.cosmiccore.api.codec; + +public class CosmicCodecUtils {} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/data/CosmicCoreMaterialIconType.java b/src/main/java/com/ghostipedia/cosmiccore/api/data/CosmicCoreMaterialIconType.java index 5a16723f9..9bcb6cfbd 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/data/CosmicCoreMaterialIconType.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/data/CosmicCoreMaterialIconType.java @@ -3,8 +3,17 @@ import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconType; public class CosmicCoreMaterialIconType { + + public static final MaterialIconType rawOreCubic = new MaterialIconType("rawOreCubic"); public static final MaterialIconType crushedLeached = new MaterialIconType("crushedLeached"); public static final MaterialIconType prismaFrothed = new MaterialIconType("prismaFrothed"); - public static void init() { - } + public static final MaterialIconType ultraDense = new MaterialIconType("ultraDense"); + public static final MaterialIconType heavyBeam = new MaterialIconType("heavyBeam"); + public static final MaterialIconType modularShelling = new MaterialIconType("modularShelling"); + public static final MaterialIconType plasmites = new MaterialIconType("plasmites"); + public static final MaterialIconType wireSpool = new MaterialIconType("wireSpool"); + public static final MaterialIconType alveFoil = new MaterialIconType("alveFoilInsulator"); + public static final MaterialIconType memoryFoil = new MaterialIconType("shapeMemoryFoil"); + + public static void init() {} } diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/data/CosmicCoreTagPrefix.java b/src/main/java/com/ghostipedia/cosmiccore/api/data/CosmicCoreTagPrefix.java deleted file mode 100644 index 793b56ff4..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/api/data/CosmicCoreTagPrefix.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.ghostipedia.cosmiccore.api.data; - -import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconType; -import com.gregtechceu.gtceu.api.data.tag.TagPrefix; -import com.gregtechceu.gtceu.api.registry.GTRegistries; - -import static com.gregtechceu.gtceu.api.data.tag.TagPrefix.Conditions.hasOreProperty; - -public class CosmicCoreTagPrefix { - public static TagPrefix crushedLeached; - public static TagPrefix prismaFrothed; - public static void initTagPrefixes() { - crushedLeached = new TagPrefix("leachedOre") - .idPattern("leached_%s_ore") - .defaultTagPath("leached_ores/%s") - .defaultTagPath("leached_ores") - .materialIconType(CosmicCoreMaterialIconType.crushedLeached) - .unificationEnabled(true) - .generateItem(true) - .generationCondition(hasOreProperty); - prismaFrothed = new TagPrefix("prismaFrothedOre") - .idPattern("prisma_frothed_%s_ore") - .defaultTagPath("prisma_frothed_ores/%s") - .defaultTagPath("prisma_frothed_ores") - .materialIconType(CosmicCoreMaterialIconType.prismaFrothed) - .unificationEnabled(true) - .generateItem(true) - .generationCondition(hasOreProperty); - } -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/data/CosmicTagPrefix.java b/src/main/java/com/ghostipedia/cosmiccore/api/data/CosmicTagPrefix.java new file mode 100644 index 000000000..b291c6892 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/data/CosmicTagPrefix.java @@ -0,0 +1,140 @@ +package com.ghostipedia.cosmiccore.api.data; + +import com.ghostipedia.cosmiccore.common.data.tag.TagUtil; + +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialFlags; +import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; + +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; + +import java.util.function.Predicate; + +import static com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialFlags.GENERATE_ROD; +import static com.gregtechceu.gtceu.api.data.tag.TagPrefix.Conditions.hasIngotProperty; +import static com.gregtechceu.gtceu.api.data.tag.TagPrefix.Conditions.hasOreProperty; + +public class CosmicTagPrefix { + + public static TagPrefix crushedLeached; + public static TagPrefix prismaFrothed; + public static TagPrefix ultraDense; + public static TagPrefix heavyBeam; + public static TagPrefix modularShelling; + public static TagPrefix plasmites; + public static TagPrefix largeWireSpool; + public static TagPrefix alveFoilInsulator; + public static TagPrefix shapeMemoryFoil; + public static TagPrefix rawOreCubic; + public static final TagKey STAR_LADDER_BLOCKS = TagUtil.createBlockTag("starladder_blocks"); + public static final TagKey STAR_LADDER_ITEMS = TagUtil.createItemTag("starladder_items"); + + public static final Predicate hasWireProp = material -> material.hasProperty(PropertyKey.WIRE); + public static final Predicate hasPlateProp = material -> material.hasFlag(MaterialFlags.GENERATE_PLATE); + public static final Predicate hasRodProp = material -> material.hasFlag(GENERATE_ROD); + public static final Predicate hasFrameProp = material -> material.hasFlag(MaterialFlags.GENERATE_FRAME); + public static final Predicate hasBoltProp = material -> material + .hasFlag(MaterialFlags.GENERATE_BOLT_SCREW); + public static final Predicate hasFineWireProp = material -> material + .hasFlag(MaterialFlags.GENERATE_FINE_WIRE); + + public static void initTagPrefixes() { + rawOreCubic = new TagPrefix("rawOreCubic") + .idPattern("raw_%s_cubic_ore") + .defaultTagPath("cubic_ores/%s") + .defaultTagPath("cubic_ores") + .materialIconType(CosmicCoreMaterialIconType.rawOreCubic) + .unificationEnabled(true) + .generateItem(true) + .generationCondition(hasOreProperty); + + crushedLeached = new TagPrefix("leachedOre") + .idPattern("leached_%s_ore") + .defaultTagPath("leached_ores/%s") + .defaultTagPath("leached_ores") + .materialIconType(CosmicCoreMaterialIconType.crushedLeached) + .unificationEnabled(true) + .generateItem(true) + .generationCondition(hasOreProperty); + prismaFrothed = new TagPrefix("prismaFrothedOre") + .idPattern("prisma_frothed_%s_ore") + .defaultTagPath("prisma_frothed_ores/%s") + .defaultTagPath("prisma_frothed_ores") + .materialIconType(CosmicCoreMaterialIconType.prismaFrothed) + .unificationEnabled(true) + .generateItem(true) + .generationCondition(hasOreProperty); + + ultraDense = new TagPrefix("ultradensePlate") + .idPattern("ultradense_%s_plate") + .defaultTagPath("ultra_dense_plates/%s") + .defaultTagPath("ultra_dense_plates") + .materialIconType(CosmicCoreMaterialIconType.ultraDense) + .unificationEnabled(true) + .generateItem(true) + .maxStackSize(1) + .generationCondition(hasPlateProp); + + heavyBeam = new TagPrefix("heavyBeam") + .idPattern("heavy_%s_beam") + .defaultTagPath("heavy_beams/%s") + .defaultTagPath("heavy_beams") + .materialIconType(CosmicCoreMaterialIconType.heavyBeam) + .unificationEnabled(true) + .generateItem(true) + .maxStackSize(16) + .generationCondition( + hasPlateProp + .and(hasRodProp)); + modularShelling = new TagPrefix("modular_shelling") + .idPattern("%s_modular_shelling") + .defaultTagPath("modular_shellings/%s") + .defaultTagPath("modular_shellings") + .materialIconType(CosmicCoreMaterialIconType.modularShelling) + .unificationEnabled(true) + .generateItem(true) + .maxStackSize(16) + .generationCondition(hasPlateProp.and(hasFrameProp).and(hasBoltProp)); + plasmites = new TagPrefix("plasmites") + .idPattern("%s_plasmites") + .defaultTagPath("plasmites/%s") + .defaultTagPath("plasmites") + .materialIconType(CosmicCoreMaterialIconType.plasmites) + .unificationEnabled(true) + .generateItem(true) + .generationCondition(hasIngotProperty); + + largeWireSpool = new TagPrefix("large_wire_spool") + .idPattern("%s_wire_spool") + .defaultTagPath("wire_spools/%s") + .defaultTagPath("wire_spools") + .materialIconType(CosmicCoreMaterialIconType.wireSpool) + .unificationEnabled(true) + .generateItem(true) + .maxStackSize(4) + .generationCondition(hasWireProp.or(hasFineWireProp)); + + alveFoilInsulator = new TagPrefix("alveFoilInsulator") + .idPattern("%s_alve_foil_insulator") + .defaultTagPath("alve_foil_insulators/%s") + .defaultTagPath("alve_foil_insulators") + .materialIconType(CosmicCoreMaterialIconType.alveFoil) + .unificationEnabled(true) + .generateItem(true) + .maxStackSize(64) + .generationCondition(hasPlateProp.and(hasFineWireProp)); + + shapeMemoryFoil = new TagPrefix("shapeMemoryFoil") + .idPattern("%s_shape_memory_foil") + .defaultTagPath("shape_memory_foils/%s") + .defaultTagPath("shape_memory_foils") + .materialIconType(CosmicCoreMaterialIconType.memoryFoil) + .unificationEnabled(true) + .generateItem(true) + .maxStackSize(64) + .generationCondition(hasPlateProp.and(hasBoltProp)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/data/DebugBlockPattern.java b/src/main/java/com/ghostipedia/cosmiccore/api/data/DebugBlockPattern.java new file mode 100644 index 000000000..0879b81eb --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/data/DebugBlockPattern.java @@ -0,0 +1,222 @@ +package com.ghostipedia.cosmiccore.api.data; + +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.core.registries.BuiltInRegistries; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; + +public class DebugBlockPattern { + + public RelativeDirection[] structureDir; + public String[][] pattern; + public int[][] aisleRepetitions; + public Map> symbolMap; + public Map charToBlockMap; + + public DebugBlockPattern() { + symbolMap = new HashMap<>(); + charToBlockMap = new LinkedHashMap<>(); + structureDir = new RelativeDirection[] { + RelativeDirection.LEFT, RelativeDirection.UP, RelativeDirection.FRONT + }; + } + + public DebugBlockPattern( + Level world, int minX, int minY, int minZ, int maxX, int maxY, int maxZ) { + this(); + pattern = new String[1 + maxX - minX][1 + maxY - minY]; + aisleRepetitions = new int[pattern.length][2]; + for (int[] aisleRepetition : aisleRepetitions) { + aisleRepetition[0] = 1; + aisleRepetition[1] = 1; + } + + Map map = new HashMap<>(); + map.put(Blocks.AIR.defaultBlockState(), ' '); + charToBlockMap.put(' ', BuiltInRegistries.BLOCK.getKey(Blocks.AIR)); + + char c = 'A'; // auto + + for (int x = minX; x <= maxX; x++) { + for (int y = minY; y <= maxY; y++) { + StringBuilder builder = new StringBuilder(); + for (int z = minZ; z <= maxZ; z++) { + BlockPos pos = new BlockPos(x, y, z); + BlockState state = world.getBlockState(pos); + if (!map.containsKey(state)) { + map.put(state, c); + String name = String.valueOf(c); + symbolMap.computeIfAbsent(c, key -> new HashSet<>()).add(name); // any + ResourceLocation blockKey = BuiltInRegistries.BLOCK.getKey(state.getBlock()); + charToBlockMap.put(c, blockKey); + c++; + } + builder.append(map.get(state)); + } + pattern[x - minX][y - minY] = builder.toString(); + } + } + var dirs = getDir(Direction.NORTH); + changeDir(dirs[0], dirs[1], dirs[2]); + } + + public static RelativeDirection[] getDir(Direction facing) { + if (facing == Direction.WEST) { + return new RelativeDirection[] { + RelativeDirection.LEFT, RelativeDirection.UP, RelativeDirection.BACK + }; + } else if (facing == Direction.EAST) { + return new RelativeDirection[] { + RelativeDirection.RIGHT, RelativeDirection.UP, RelativeDirection.FRONT + }; + } else if (facing == Direction.NORTH) { + return new RelativeDirection[] { + RelativeDirection.BACK, RelativeDirection.UP, RelativeDirection.RIGHT + }; + } else if (facing == Direction.SOUTH) { + return new RelativeDirection[] { + RelativeDirection.FRONT, RelativeDirection.UP, RelativeDirection.LEFT + }; + } else if (facing == Direction.DOWN) { + return new RelativeDirection[] { + RelativeDirection.RIGHT, RelativeDirection.BACK, RelativeDirection.UP + }; + } else { + return new RelativeDirection[] { + RelativeDirection.LEFT, RelativeDirection.FRONT, RelativeDirection.UP + }; + } + } + + public void changeDir( + RelativeDirection charDir, RelativeDirection stringDir, RelativeDirection aisleDir) { + if (charDir.isSameAxis(stringDir) || stringDir.isSameAxis(aisleDir) || aisleDir.isSameAxis(charDir)) return; + char[][][] newPattern = new char[structureDir[0].isSameAxis(aisleDir) ? pattern[0][0].length() : + structureDir[1].isSameAxis(aisleDir) ? pattern[0].length : pattern.length][structureDir[0] + .isSameAxis(stringDir) ? + pattern[0][0].length() : + structureDir[1].isSameAxis(stringDir) ? pattern[0].length : + pattern.length][structureDir[0].isSameAxis(charDir) ? pattern[0][0].length() : + structureDir[1].isSameAxis(charDir) ? pattern[0].length : + pattern.length]; + for (int i = 0; i < pattern.length; i++) { + for (int j = 0; j < pattern[0].length; j++) { + for (int k = 0; k < pattern[0][0].length(); k++) { + char c = pattern[i][j].charAt(k); + int x = 0, y = 0, z = 0; + if (structureDir[2].isSameAxis(aisleDir)) { + if (structureDir[2] == aisleDir) { + x = i; + } else { + x = pattern.length - i - 1; + } + } else if (structureDir[2].isSameAxis(stringDir)) { + if (structureDir[2] == stringDir) { + y = i; + } else { + y = pattern.length - i - 1; + } + } else if (structureDir[2].isSameAxis(charDir)) { + if (structureDir[2] == charDir) { + z = i; + } else { + z = pattern.length - i - 1; + } + } + + if (structureDir[1].isSameAxis(aisleDir)) { + if (structureDir[1] == aisleDir) { + x = j; + } else { + x = pattern[0].length - j - 1; + } + } else if (structureDir[1].isSameAxis(stringDir)) { + if (structureDir[1] == stringDir) { + y = j; + } else { + y = pattern[0].length - j - 1; + } + } else if (structureDir[1].isSameAxis(charDir)) { + if (structureDir[1] == charDir) { + z = j; + } else { + z = pattern[0].length - j - 1; + } + } + + if (structureDir[0].isSameAxis(aisleDir)) { + if (structureDir[0] == aisleDir) { + x = k; + } else { + x = pattern[0][0].length() - k - 1; + } + } else if (structureDir[0].isSameAxis(stringDir)) { + if (structureDir[0] == stringDir) { + y = k; + } else { + y = pattern[0][0].length() - k - 1; + } + } else if (structureDir[0].isSameAxis(charDir)) { + if (structureDir[0] == charDir) { + z = k; + } else { + z = pattern[0][0].length() - k - 1; + } + } + newPattern[x][y][z] = c; + } + } + } + + pattern = new String[newPattern.length][newPattern[0].length]; + for (int i = 0; i < pattern.length; i++) { + for (int j = 0; j < pattern[0].length; j++) { + StringBuilder builder = new StringBuilder(); + for (char c : newPattern[i][j]) { + builder.append(c); + } + pattern[i][j] = builder.toString(); + } + } + + aisleRepetitions = new int[pattern.length][2]; + for (int[] aisleRepetition : aisleRepetitions) { + aisleRepetition[0] = 1; + aisleRepetition[1] = 1; + } + + structureDir = new RelativeDirection[] { charDir, stringDir, aisleDir }; + } + + public DebugBlockPattern copy() { + DebugBlockPattern newPattern = new DebugBlockPattern(); + System.arraycopy(this.structureDir, 0, newPattern.structureDir, 0, this.structureDir.length); + + newPattern.pattern = new String[pattern.length][pattern[0].length]; + for (int i = 0; i < pattern.length; i++) { + System.arraycopy(pattern[i], 0, newPattern.pattern[i], 0, pattern[i].length); + } + + newPattern.aisleRepetitions = new int[aisleRepetitions.length][2]; + for (int i = 0; i < aisleRepetitions.length; i++) { + System.arraycopy( + aisleRepetitions[i], 0, newPattern.aisleRepetitions[i], 0, aisleRepetitions[i].length); + } + + symbolMap.forEach((k, v) -> newPattern.symbolMap.put(k, new HashSet<>(v))); + newPattern.charToBlockMap.putAll(this.charToBlockMap); + + return newPattern; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/data/material/property/CCoreMaterialIconSet.java b/src/main/java/com/ghostipedia/cosmiccore/api/data/material/property/CCoreMaterialIconSet.java new file mode 100644 index 000000000..64dabd837 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/data/material/property/CCoreMaterialIconSet.java @@ -0,0 +1,82 @@ +package com.ghostipedia.cosmiccore.api.data.material.property; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.client.renderer.item.HaloItemRenderer; +import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterialSet; +import com.ghostipedia.cosmiccore.utils.ColorUtil; + +import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconSet; +import com.gregtechceu.gtceu.api.item.component.ICustomRenderer; + +import com.lowdragmc.lowdraglib.client.renderer.IRenderer; + +import net.minecraft.resources.ResourceLocation; + +import lombok.Getter; + +import java.util.function.Supplier; + +@Getter +public class CCoreMaterialIconSet extends MaterialIconSet implements IRenderer { + + private final ICustomRenderer customRender; + + public CCoreMaterialIconSet(String name, MaterialIconSet parentIconset, boolean root, IRenderer renderer) { + this(name, parentIconset, root, renderer == null ? null : () -> renderer); + } + + public CCoreMaterialIconSet(String name, MaterialIconSet parentIconset, boolean root, ICustomRenderer renderer) { + super(name, parentIconset, root); + this.customRender = renderer; + } + + static final Supplier prismaticColor = () -> { + float v = (float) ((System.currentTimeMillis() / 500) % 10) / 10; + if (v > 0.5f) + v = 1 - v; + return (0xff << 24) | ColorUtil.lerpColorRGB(0xffc0cb, 0x000080, v * 2); + }; + + public static final CCoreMaterialIconSet VIBRANIUM = new CCoreMaterialIconSet("vibranium", + CosmicMaterialSet.NEUTRONITE, false, + HaloItemRenderer.create(4, 0xFF489BC3, ResourceLocation.fromNamespaceAndPath(CosmicCore.MOD_ID, "block/iris/rnd/halo"), true, + false)); + public static final CCoreMaterialIconSet VIBRANIUM_NEUTRONIUM = new CCoreMaterialIconSet("vibranium_neutronium", + CosmicMaterialSet.NEUTRONIUM_CCORE, false, + HaloItemRenderer.create(3, 0xFFFFFFFF, ResourceLocation.fromNamespaceAndPath(CosmicCore.MOD_ID, + "block/iris/rnd/compression_halo_neutronium_faded"), true, + false)); + + // public static final CCoreMaterialIconSet VIBRANIUM_NEUTRONIUM = new CCoreMaterialIconSet("vibranium_neutronium", + // CosmicMaterialSet.NEUTRONIUM_CCORE, false, LensRender::new); + + public static final CCoreMaterialIconSet PRISMATIC = new CCoreMaterialIconSet("prismatic", SHINY, false, + HaloItemRenderer.create(8, 0xFF1c1926, ResourceLocation.fromNamespaceAndPath(CosmicCore.MOD_ID, "block/iris/rnd/storm_halo"), + true, + false)); + + public static final CCoreMaterialIconSet CHRONIC = new CCoreMaterialIconSet("chronic", CosmicMaterialSet.CHRONON, + false, + HaloItemRenderer.create(8, 0xFF1c1926, ResourceLocation.fromNamespaceAndPath(CosmicCore.MOD_ID, "block/iris/rnd/time_halo"), + true, + false)); + + public static final CCoreMaterialIconSet VOIDSPARKICO = new CCoreMaterialIconSet("voidspark_special", + CosmicMaterialSet.VOIDSPARK, false, + HaloItemRenderer.create(4, 0xFFFFFFFF, + ResourceLocation.fromNamespaceAndPath(CosmicCore.MOD_ID, "block/iris/rnd/tentacle_halo"), true, + false)); + + public static final CCoreMaterialIconSet STARMETALICO = new CCoreMaterialIconSet("starmetal_special", + CosmicMaterialSet.STARMETAL, false, + HaloItemRenderer.create(2, 0xFFFFFFFF, + ResourceLocation.fromNamespaceAndPath(CosmicCore.MOD_ID, "block/iris/rnd/tentacle_halo_glass"), true, + true)); + + public static final CCoreMaterialIconSet SOL_STEEL = new CCoreMaterialIconSet("sol_steel", CosmicMaterialSet.SOL, + false, + HaloItemRenderer.create(4, 0xFFFFFFFF, + ResourceLocation.fromNamespaceAndPath(CosmicCore.MOD_ID, "block/iris/rnd/compression_halo_sol"), + true, + false)); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/LinkEntry.java b/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/LinkEntry.java new file mode 100644 index 000000000..742522fc7 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/LinkEntry.java @@ -0,0 +1,79 @@ +package com.ghostipedia.cosmiccore.api.data.savedData; + +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock.LinkRole; + +import net.minecraft.core.GlobalPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; + +import java.util.Objects; + +/** + * Represents one end of a link from this machine's perspective. + * Stores the target position and this machine's EFFECTIVE role + * (after negotiation, not declared role). + */ +public final class LinkEntry { + + private static final String TAG_TARGET = "Target"; + private static final String TAG_ROLE = "Role"; + + private final GlobalPos target; + private final LinkRole effectiveRole; + + public LinkEntry(GlobalPos target, LinkRole effectiveRole) { + this.target = target; + this.effectiveRole = effectiveRole; + } + + public GlobalPos target() { + return target; + } + + public LinkRole effectiveRole() { + return effectiveRole; + } + + public CompoundTag save() { + CompoundTag tag = new CompoundTag(); + GlobalPos.CODEC.encodeStart(NbtOps.INSTANCE, target) + .result() + .ifPresent(encoded -> tag.put(TAG_TARGET, encoded)); + tag.putString(TAG_ROLE, effectiveRole.name()); + return tag; + } + + public static LinkEntry load(CompoundTag tag) { + GlobalPos target = GlobalPos.CODEC + .decode(NbtOps.INSTANCE, tag.get(TAG_TARGET)) + .result() + .map(pair -> pair.getFirst()) + .orElseThrow(() -> new IllegalStateException("Invalid LinkEntry: missing target")); + + LinkRole role = LinkRole.valueOf(tag.getString(TAG_ROLE)); + return new LinkEntry(target, role); + } + + /** + * Equality is based ONLY on target, not role. + * This ensures only one link per target in a Set, and re-linking + * with a different role will replace the existing entry. + */ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LinkEntry linkEntry = (LinkEntry) o; + return Objects.equals(target, linkEntry.target); + } + + @Override + public int hashCode() { + return Objects.hash(target); + } + + @Override + public String toString() { + return "LinkEntry{target=" + target + ", role=" + effectiveRole + "}"; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/LinkedMultiblockSavedData.java b/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/LinkedMultiblockSavedData.java new file mode 100644 index 000000000..a3e86600e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/LinkedMultiblockSavedData.java @@ -0,0 +1,301 @@ +package com.ghostipedia.cosmiccore.api.data.savedData; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock.LinkRole; + +import net.minecraft.core.GlobalPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.saveddata.SavedData; + +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +/** + * Persists multiblock link relationships across server restarts. + * Links are keyed by team UUID for access control. + *

+ * Each machine stores its own perspective with EFFECTIVE role + * (result of negotiation, not declared role). + */ +public class LinkedMultiblockSavedData extends SavedData { + + private static final String DATA_NAME = "cosmiccore_linked_multiblocks"; + + // Owner UUID -> (Machine GlobalPos -> Set of LinkEntry) + private final Map>> links = new HashMap<>(); + + public LinkedMultiblockSavedData() {} + + public LinkedMultiblockSavedData(CompoundTag tag) { + load(tag); + } + + public static LinkedMultiblockSavedData load(CompoundTag tag, HolderLookup.Provider provider) { + return new LinkedMultiblockSavedData(tag); + } + + // ==================== Access ==================== + + /** + * Get or create the SavedData instance. + * Stored in overworld to ensure single source of truth. + */ + public static LinkedMultiblockSavedData getOrCreate(MinecraftServer server) { + ServerLevel overworld = server.overworld(); + return overworld.getDataStorage().computeIfAbsent( + new SavedData.Factory<>(LinkedMultiblockSavedData::new, LinkedMultiblockSavedData::load), + DATA_NAME); + } + + public static LinkedMultiblockSavedData getOrCreate(ServerLevel level) { + return getOrCreate(level.getServer()); + } + + // ==================== Link Management ==================== + + /** + * Establish a link between two machines with pre-negotiated roles. + *

+ * If a link already exists between these machines, it will be replaced + * with the new roles. + *

+ * IMPORTANT: Roles should be the result of negotiateRoles(), not raw declared roles. + * + * @param owner Team/player UUID (must match for both machines) + * @param a First machine's position + * @param b Second machine's position + * @param aEffectiveRole A's effective role after negotiation + * @param bEffectiveRole B's effective role after negotiation + */ + public void link(UUID owner, GlobalPos a, GlobalPos b, + LinkRole aEffectiveRole, LinkRole bEffectiveRole) { + // A's perspective - remove existing then add (to handle role changes) + Set aLinks = links.computeIfAbsent(owner, k -> new HashMap<>()) + .computeIfAbsent(a, k -> new HashSet<>()); + aLinks.remove(new LinkEntry(b, null)); // equals only checks target + aLinks.add(new LinkEntry(b, aEffectiveRole)); + + // B's perspective + Set bLinks = links.get(owner) + .computeIfAbsent(b, k -> new HashSet<>()); + bLinks.remove(new LinkEntry(a, null)); // equals only checks target + bLinks.add(new LinkEntry(a, bEffectiveRole)); + + setDirty(); + } + + /** + * Remove a specific link between two machines. + * Removes both perspectives. + */ + public void unlink(UUID owner, GlobalPos a, GlobalPos b) { + Map> ownerLinks = links.get(owner); + if (ownerLinks == null) return; + + // Remove A -> B + Set aLinks = ownerLinks.get(a); + if (aLinks != null) { + aLinks.removeIf(entry -> entry.target().equals(b)); + if (aLinks.isEmpty()) { + ownerLinks.remove(a); + } + } + + // Remove B -> A + Set bLinks = ownerLinks.get(b); + if (bLinks != null) { + bLinks.removeIf(entry -> entry.target().equals(a)); + if (bLinks.isEmpty()) { + ownerLinks.remove(b); + } + } + + // Cleanup empty owner entry + if (ownerLinks.isEmpty()) { + links.remove(owner); + } + + setDirty(); + } + + /** + * Remove all links for a machine (called when multiblock is destroyed). + * Also removes reverse links from all partners. + */ + public void removeAllLinks(UUID owner, GlobalPos pos) { + Map> ownerLinks = links.get(owner); + if (ownerLinks == null) return; + + // Get partners before removal + Set myLinks = ownerLinks.remove(pos); + + // Remove reverse links from partners + if (myLinks != null) { + for (LinkEntry entry : myLinks) { + Set partnerLinks = ownerLinks.get(entry.target()); + if (partnerLinks != null) { + partnerLinks.removeIf(e -> e.target().equals(pos)); + if (partnerLinks.isEmpty()) { + ownerLinks.remove(entry.target()); + } + } + } + } + + if (ownerLinks.isEmpty()) { + links.remove(owner); + } + + setDirty(); + } + + // ==================== Queries ==================== + + /** + * Get all links for a machine. + * Returns an unmodifiable copy to prevent external mutation. + */ + public Set getLinks(UUID owner, GlobalPos pos) { + Set result = links.getOrDefault(owner, Collections.emptyMap()) + .getOrDefault(pos, Collections.emptySet()); + return Collections.unmodifiableSet(new HashSet<>(result)); + } + + /** + * Get just the partner positions (without role info). + */ + public Set getPartnerPositions(UUID owner, GlobalPos pos) { + Set result = new HashSet<>(); + for (LinkEntry entry : getLinks(owner, pos)) { + result.add(entry.target()); + } + return result; + } + + /** + * Get the specific link to a partner, if it exists. + */ + @Nullable + public LinkEntry getLinkTo(UUID owner, GlobalPos self, GlobalPos partner) { + for (LinkEntry entry : getLinks(owner, self)) { + if (entry.target().equals(partner)) { + return entry; + } + } + return null; + } + + /** + * Check if this machine can query the partner (based on effective role). + * PEER and CONTROLLER can query; REMOTE cannot. + */ + public boolean canQuery(UUID owner, GlobalPos self, GlobalPos partner) { + LinkEntry link = getLinkTo(owner, self, partner); + if (link == null) return false; + + return link.effectiveRole() == LinkRole.PEER || link.effectiveRole() == LinkRole.CONTROLLER; + } + + /** + * Check if this machine can be queried by the partner (based on effective role). + * PEER and REMOTE can be queried; CONTROLLER cannot. + */ + public boolean canBeQueriedBy(UUID owner, GlobalPos self, GlobalPos partner) { + LinkEntry link = getLinkTo(owner, self, partner); + if (link == null) return false; + + return link.effectiveRole() == LinkRole.PEER || link.effectiveRole() == LinkRole.REMOTE; + } + + /** + * Check if two machines are linked (regardless of role). + */ + public boolean isLinked(UUID owner, GlobalPos a, GlobalPos b) { + return getLinkTo(owner, a, b) != null; + } + + // ==================== Serialization ==================== + + @Override + public CompoundTag save(CompoundTag root, HolderLookup.Provider provider) { + ListTag ownersList = new ListTag(); + + for (Map.Entry>> ownerEntry : links.entrySet()) { + CompoundTag ownerTag = new CompoundTag(); + ownerTag.putUUID("Owner", ownerEntry.getKey()); + + ListTag machinesList = new ListTag(); + for (Map.Entry> machineEntry : ownerEntry.getValue().entrySet()) { + CompoundTag machineTag = new CompoundTag(); + + GlobalPos.CODEC.encodeStart(NbtOps.INSTANCE, machineEntry.getKey()) + .result() + .ifPresent(encoded -> machineTag.put("Pos", encoded)); + + ListTag linksList = new ListTag(); + for (LinkEntry link : machineEntry.getValue()) { + linksList.add(link.save()); + } + machineTag.put("Links", linksList); + + machinesList.add(machineTag); + } + ownerTag.put("Machines", machinesList); + + ownersList.add(ownerTag); + } + + root.put("Owners", ownersList); + return root; + } + + private void load(CompoundTag root) { + links.clear(); + + ListTag ownersList = root.getList("Owners", Tag.TAG_COMPOUND); + for (int i = 0; i < ownersList.size(); i++) { + CompoundTag ownerTag = ownersList.getCompound(i); + UUID owner = ownerTag.getUUID("Owner"); + + Map> ownerLinks = new HashMap<>(); + + ListTag machinesList = ownerTag.getList("Machines", Tag.TAG_COMPOUND); + for (int j = 0; j < machinesList.size(); j++) { + CompoundTag machineTag = machinesList.getCompound(j); + + GlobalPos pos = GlobalPos.CODEC + .decode(NbtOps.INSTANCE, machineTag.get("Pos")) + .result() + .map(pair -> pair.getFirst()) + .orElse(null); + + if (pos == null) continue; + + Set machineLinks = new HashSet<>(); + ListTag linksList = machineTag.getList("Links", Tag.TAG_COMPOUND); + for (int k = 0; k < linksList.size(); k++) { + try { + machineLinks.add(LinkEntry.load(linksList.getCompound(k))); + } catch (Exception e) { + CosmicCore.LOGGER.warn("Failed to load link entry: {}", e.getMessage()); + } + } + + if (!machineLinks.isEmpty()) { + ownerLinks.put(pos, machineLinks); + } + } + + if (!ownerLinks.isEmpty()) { + links.put(owner, ownerLinks); + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/StarLadderSavedData.java b/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/StarLadderSavedData.java new file mode 100644 index 000000000..291e2705b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/StarLadderSavedData.java @@ -0,0 +1,82 @@ +package com.ghostipedia.cosmiccore.api.data.savedData; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.saveddata.SavedData; + +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +public class StarLadderSavedData extends SavedData { + + private static final String DATA_NAME = CosmicCore.MOD_ID + "_star_ladder_data"; + private static final String ESTABLISHED_KEY = "established_teams"; + private static final String UUID_KEY = "uuid"; + + private final Set establishedTeams = new HashSet<>(); + + public StarLadderSavedData() {} + + public StarLadderSavedData(CompoundTag tag) { + var list = tag.getList(ESTABLISHED_KEY, Tag.TAG_COMPOUND); + for (Tag entry : list) { + if (entry instanceof CompoundTag compound) { + establishedTeams.add(UUID.fromString(compound.getString(UUID_KEY))); + } + } + } + + public static StarLadderSavedData load(CompoundTag tag, HolderLookup.Provider provider) { + return new StarLadderSavedData(tag); + } + + public static StarLadderSavedData getOrCreate(MinecraftServer server) { + ServerLevel overworld = server.overworld(); + return overworld.getDataStorage().computeIfAbsent( + new SavedData.Factory<>(StarLadderSavedData::new, StarLadderSavedData::load), + DATA_NAME); + } + + public static StarLadderSavedData getOrCreate(ServerLevel level) { + return getOrCreate(level.getServer()); + } + + public boolean isEstablished(UUID teamId) { + return establishedTeams.contains(teamId); + } + + public void setEstablished(UUID teamId) { + if (establishedTeams.add(teamId)) { + setDirty(); + } + } + + public boolean resetEstablished(UUID teamId) { + if (establishedTeams.remove(teamId)) { + setDirty(); + return true; + } + return false; + } + + @Override + public @NotNull CompoundTag save(@NotNull CompoundTag tag, @NotNull HolderLookup.Provider provider) { + var list = new ListTag(); + for (UUID uuid : establishedTeams) { + var entry = new CompoundTag(); + entry.putString(UUID_KEY, uuid.toString()); + list.add(entry); + } + tag.put(ESTABLISHED_KEY, list); + return tag; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/UniqueMultiblockData.java b/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/UniqueMultiblockData.java new file mode 100644 index 000000000..1316deac0 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/UniqueMultiblockData.java @@ -0,0 +1,104 @@ +package com.ghostipedia.cosmiccore.api.data.savedData; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; + +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class UniqueMultiblockData { + + public static class UniqueMultiblockId { + + private final String multiblockType; + private final String multiblockDimension; + + protected UniqueMultiblockId(String multiblockType, String multiblockDimension) { + this.multiblockType = multiblockType; + this.multiblockDimension = multiblockDimension; + } + + public String getMultiblockType() { + return multiblockType; + } + + public String getMultiblockDimension() { + return multiblockDimension; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + UniqueMultiblockId that = (UniqueMultiblockId) o; + return Objects.equals(multiblockType, that.multiblockType) && + Objects.equals(multiblockDimension, that.multiblockDimension); + } + + @Override + public int hashCode() { + int result = 17; // Some arbitrary prime number + result = 31 * result + multiblockType.hashCode(); + result = 31 * result + multiblockDimension.hashCode(); + return result; + } + } + + private static final String MULTIBLOCK_TYPE = "multiblockType"; + private static final String MULTIBLOCK_DIMENSION = "multiblockDimension"; + private static final String MULTIBLOCK_POS = "multiblockPos"; + + // Map a tuple of "Multiblock Type" and "Dimension Name" to a "BlockPos" + public Map data; + + public UniqueMultiblockData() { + this.data = new HashMap<>(); + } + + public static UniqueMultiblockData fromTag(ListTag tag) { + var result = new UniqueMultiblockData(); + for (int i = 0; i < tag.size(); ++i) { + CompoundTag entry = tag.getCompound(i); + var type = entry.getString(MULTIBLOCK_TYPE); + var dimension = entry.getString(MULTIBLOCK_DIMENSION); + var pos = BlockPos.of(entry.getLong(MULTIBLOCK_POS)); + result.data.put(new UniqueMultiblockId(type, dimension), pos); + } + return result; + } + + public ListTag toTag() { + var uniqueMultiblockData = new ListTag(); + for (var entry : data.entrySet()) { + if (entry.getKey() == null || entry.getValue() == null) continue; + var entryTag = new CompoundTag(); + entryTag.putString(MULTIBLOCK_TYPE, entry.getKey().getMultiblockType()); + entryTag.putString(MULTIBLOCK_DIMENSION, entry.getKey().getMultiblockDimension()); + entryTag.putLong(MULTIBLOCK_POS, entry.getValue().asLong()); + uniqueMultiblockData.add(entryTag); + } + return uniqueMultiblockData; + } + + public boolean hasData(String multiblockType, String dimension) { + return data.containsKey(new UniqueMultiblockId(multiblockType, dimension)); + } + + public boolean isUnique(String multiblockType, String dimension, BlockPos pos) { + var key = new UniqueMultiblockId(multiblockType, dimension); + if (!data.containsKey(key)) return true; + else return data.get(key).equals(pos); + } + + public void addMultiblock(String multiblockType, String dimension, BlockPos pos) { + data.put(new UniqueMultiblockId(multiblockType, dimension), pos); + } + + public void removeMultiblock(String multiblockType, String dimension, BlockPos pos) { + var key = new UniqueMultiblockId(multiblockType, dimension); + if (!hasData(multiblockType, dimension)) return; + if (data.get(key).equals(pos)) data.remove(key); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/UniqueMultiblockSavedData.java b/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/UniqueMultiblockSavedData.java new file mode 100644 index 000000000..22549266c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/data/savedData/UniqueMultiblockSavedData.java @@ -0,0 +1,84 @@ +package com.ghostipedia.cosmiccore.api.data.savedData; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.saveddata.SavedData; + +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.UUID; + +public class UniqueMultiblockSavedData extends SavedData { + + private static final String DATA_NAME = "cosmiccore_unique_multiblock_data"; + private static final String UNIQUE_MULTI_MAPPING = "uniqueMultiMapping"; + private static final String UNIQUE_MULTI_UUID = "uniqueMultiUuid"; + private static final String UNIQUE_MULTI_DATA = "uniqueMultiData"; + + public static final HashMap UniqueMultiblockMapping = new HashMap<>(20, 0.9f); + + private final ServerLevel serverLevel; + + public static UniqueMultiblockSavedData getOrCreate(ServerLevel serverLevel) { + return serverLevel.getDataStorage().computeIfAbsent( + new SavedData.Factory<>(() -> new UniqueMultiblockSavedData(serverLevel), + (tag, provider) -> new UniqueMultiblockSavedData(serverLevel, tag)), + DATA_NAME); + } + + private UniqueMultiblockSavedData(ServerLevel serverLevel) { + this.serverLevel = serverLevel; + } + + private UniqueMultiblockSavedData(ServerLevel serverLevel, CompoundTag nbt) { + this(serverLevel); + var list = nbt.getList(UNIQUE_MULTI_MAPPING, CompoundTag.TAG_COMPOUND); + for (Tag tag : list) { + if (tag instanceof CompoundTag compoundTag) { + var uuid = UUID.fromString(compoundTag.getString(UNIQUE_MULTI_UUID)); + var data = compoundTag.getList(UNIQUE_MULTI_DATA, Tag.TAG_COMPOUND); + UniqueMultiblockMapping.put(uuid, UniqueMultiblockData.fromTag(data)); + } + } + } + + @Override + public @NotNull CompoundTag save(@NotNull CompoundTag compoundTag, @NotNull HolderLookup.Provider provider) { + var uniqueMultiDataList = new ListTag(); + for (var entry : UniqueMultiblockMapping.entrySet()) { + var tag = new CompoundTag(); + tag.putString(UNIQUE_MULTI_UUID, entry.getKey().toString()); + tag.put(UNIQUE_MULTI_DATA, entry.getValue().toTag()); + uniqueMultiDataList.add(tag); + } + compoundTag.put(UNIQUE_MULTI_MAPPING, uniqueMultiDataList); + return compoundTag; + } + + public boolean hasData(UUID owner, String multiblockType, String dimension) { + var data = UniqueMultiblockMapping.computeIfAbsent(owner, uuid -> new UniqueMultiblockData()); + return data.hasData(multiblockType, dimension); + } + + public boolean isUnique(UUID owner, String multiblockType, String dimension, BlockPos pos) { + var data = UniqueMultiblockMapping.computeIfAbsent(owner, uuid -> new UniqueMultiblockData()); + return data.isUnique(multiblockType, dimension, pos); + } + + public void addMultiblock(UUID owner, String multiblockType, String dimension, BlockPos pos) { + var data = UniqueMultiblockMapping.computeIfAbsent(owner, uuid -> new UniqueMultiblockData()); + data.addMultiblock(multiblockType, dimension, pos); + setDirty(); + } + + public void removeMultiblock(UUID owner, String multiblockType, String dimension, BlockPos pos) { + var data = UniqueMultiblockMapping.computeIfAbsent(owner, uuid -> new UniqueMultiblockData()); + data.removeMultiblock(multiblockType, dimension, pos); + setDirty(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/data/souls/SoulNetwork.java b/src/main/java/com/ghostipedia/cosmiccore/api/data/souls/SoulNetwork.java new file mode 100644 index 000000000..f6f4b712b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/data/souls/SoulNetwork.java @@ -0,0 +1,93 @@ +package com.ghostipedia.cosmiccore.api.data.souls; + +import com.ghostipedia.cosmiccore.api.capability.souls.SoulType; +import com.ghostipedia.cosmiccore.api.recipe.ingredient.SoulStack; + +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.neoforged.neoforge.common.util.INBTSerializable; + +import lombok.Setter; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class SoulNetwork implements INBTSerializable { + + @Setter + private Runnable dirtyCallback; + + private final Map contents = new ConcurrentHashMap<>(); + + public SoulNetwork() {} + + public SoulStack add(SoulStack stack, int throughput, int capacity, boolean simulate) { + int currentAmount = this.contents.getOrDefault(stack.type(), 0); + + int amountToAdd = Math.min(stack.amount(), throughput); // Respect throughput + amountToAdd = Math.min(amountToAdd, capacity - currentAmount); // Respect network capacity + amountToAdd = Math.max(0, amountToAdd); // Ensure we don't add a negative amount + + if (!simulate && amountToAdd > 0) { + this.contents.put(stack.type(), currentAmount + amountToAdd); + if (dirtyCallback != null) dirtyCallback.run(); + } + + return stack.withAmount(amountToAdd); + } + + public SoulStack syphon(SoulStack stack, boolean simulate) { + var currentSoulContent = this.contents.getOrDefault(stack.type(), 0); + int amountToSyphon = Math.min(stack.amount(), currentSoulContent); + + if (!simulate && amountToSyphon > 0) { + this.contents.put(stack.type(), currentSoulContent - amountToSyphon); + if (dirtyCallback != null) dirtyCallback.run(); + } + + return stack.withAmount(amountToSyphon); + } + + public void reset() { + this.contents.clear(); + if (dirtyCallback != null) dirtyCallback.run(); + } + + public List getContents() { + return contents.entrySet().stream() + .map(kvp -> new SoulStack(kvp.getKey(), kvp.getValue())) + .toList(); + } + + @Override + public String toString() { + return "SoulNetwork{contents=" + contents + '}'; + } + + @Override + public CompoundTag serializeNBT(HolderLookup.Provider provider) { + var tag = new CompoundTag(); + var listTag = new ListTag(); + this.contents.forEach((soulType, amount) -> { + var contentTag = new CompoundTag(); + contentTag.putString("type", soulType.getSerializedName()); + contentTag.putInt("amount", amount); + listTag.add(contentTag); + }); + tag.put("contents", listTag); + return tag; + } + + @Override + public void deserializeNBT(HolderLookup.Provider provider, CompoundTag compoundTag) { + this.contents.clear(); + ListTag listTag = compoundTag.getList("contents", Tag.TAG_COMPOUND); + for (Tag t : listTag) { + var contentTag = (CompoundTag) t; + this.contents.put(SoulType.byName(contentTag.getString("type")), contentTag.getInt("amount")); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/data/souls/SoulNetworkSavedData.java b/src/main/java/com/ghostipedia/cosmiccore/api/data/souls/SoulNetworkSavedData.java new file mode 100644 index 000000000..e08791e8d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/data/souls/SoulNetworkSavedData.java @@ -0,0 +1,75 @@ +package com.ghostipedia.cosmiccore.api.data.souls; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.saveddata.SavedData; + +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.UUID; + +public class SoulNetworkSavedData extends SavedData { + + private static final String DATA_NAME = CosmicCore.MOD_ID + "_soul_network_data"; + private static final String SOUL_NETWORK_MAPPING = "soul_network_mapping"; + private static final String SOUL_NETWORK_UUID = "soul_network_uuid"; + private static final String SOUL_NETWORK_DATA = "soul_network_data"; + + private final HashMap soulNetworkMapping = new HashMap<>(20, 0.9f); + + public static SoulNetworkSavedData getOrCreate(ServerLevel serverLevel) { + return serverLevel.getDataStorage().computeIfAbsent( + new SavedData.Factory<>(SoulNetworkSavedData::new, SoulNetworkSavedData::load), + DATA_NAME); + } + + public static SoulNetwork getSoulNetwork(ServerLevel level, UUID owner) { + SoulNetworkSavedData savedData = getOrCreate(level); + return savedData.getNetwork(owner); + } + + public SoulNetwork getNetwork(UUID owner) { + return soulNetworkMapping.computeIfAbsent(owner, id -> { + SoulNetwork network = new SoulNetwork(); + network.setDirtyCallback(this::setDirty); + setDirty(); + return network; + }); + } + + public SoulNetworkSavedData() {} + + public static SoulNetworkSavedData load(CompoundTag nbt, HolderLookup.Provider provider) { + SoulNetworkSavedData savedData = new SoulNetworkSavedData(); + var list = nbt.getList(SOUL_NETWORK_MAPPING, CompoundTag.TAG_COMPOUND); + for (Tag tag : list) { + if (tag instanceof CompoundTag compoundTag) { + var uuid = UUID.fromString(compoundTag.getString(SOUL_NETWORK_UUID)); + var data = new SoulNetwork(); + data.deserializeNBT(provider, compoundTag.getCompound(SOUL_NETWORK_DATA)); + data.setDirtyCallback(savedData::setDirty); + savedData.soulNetworkMapping.put(uuid, data); + } + } + return savedData; + } + + @Override + public @NotNull CompoundTag save(@NotNull CompoundTag compoundTag, @NotNull HolderLookup.Provider provider) { + var soulNetworkDataList = new ListTag(); + for (var entry : soulNetworkMapping.entrySet()) { + var tag = new CompoundTag(); + tag.putString(SOUL_NETWORK_UUID, entry.getKey().toString()); + tag.put(SOUL_NETWORK_DATA, entry.getValue().serializeNBT(provider)); + soulNetworkDataList.add(tag); + } + compoundTag.put(SOUL_NETWORK_MAPPING, soulNetworkDataList); + return compoundTag; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/data/wireless/WirelessEnergySavedData.java b/src/main/java/com/ghostipedia/cosmiccore/api/data/wireless/WirelessEnergySavedData.java new file mode 100644 index 000000000..68c05596d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/data/wireless/WirelessEnergySavedData.java @@ -0,0 +1,301 @@ +package com.ghostipedia.cosmiccore.api.data.wireless; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Tuple; +import net.minecraft.world.level.saveddata.SavedData; + +import org.jetbrains.annotations.NotNull; + +import java.math.BigInteger; +import java.util.*; + +public class WirelessEnergySavedData extends SavedData { + + public static class WirelessEnergyData { + + public BigInteger energyStored; + public BigInteger energyCapacity; + public boolean isActive; + public Map energyInput; + public Map energyOutput; + public Map energyBuffered; + public Map passiveDrain; + + public WirelessEnergyData() { + this(BigInteger.ZERO, BigInteger.valueOf(-1), false); + } + + public WirelessEnergyData(BigInteger energyStored, BigInteger energyCapacity) { + this(energyStored, energyCapacity, false); + } + + public WirelessEnergyData(BigInteger energyStored, BigInteger energyCapacity, boolean isActive) { + this.energyStored = energyStored; + this.energyCapacity = energyCapacity; + this.isActive = isActive; + this.energyInput = new HashMap<>(); + this.energyOutput = new HashMap<>(); + this.energyBuffered = new HashMap<>(); + this.passiveDrain = new HashMap<>(); + } + + public static WirelessEnergyData fromNBT(CompoundTag nbt) { + var stored = new BigInteger(nbt.getByteArray("energyStored")); + var capacity = new BigInteger(nbt.getByteArray("energyCapacity")); + var active = nbt.getBoolean("isActive"); + return new WirelessEnergyData(stored, capacity, active); + } + + public CompoundTag toNBT() { + var tag = new CompoundTag(); + tag.putByteArray("energyStored", energyStored.toByteArray()); + tag.putByteArray("energyCapacity", energyCapacity.toByteArray()); + tag.putBoolean("isActive", isActive); + return tag; + } + }; + + // FIXME why is this attributed to GT? + private static final String DATA_NAME = "gtceu_wireless_energy"; + // FIXME this key is kind of weird. Search & replace mistake? + private static final String GlobalEnergyNBTTag = "gtceu_wireless_energy_MapNBTTag"; + public static final HashMap GlobalWirelessEnergy = new HashMap<>(20, 0.9f); + + public static WirelessEnergySavedData getOrCreate(ServerLevel serverLevel) { + return serverLevel.getDataStorage() + .computeIfAbsent( + new SavedData.Factory<>(WirelessEnergySavedData::new, WirelessEnergySavedData::load), + DATA_NAME); + } + + private WirelessEnergySavedData() {} + + private WirelessEnergySavedData(CompoundTag nbt) { + var list = nbt.getList(GlobalEnergyNBTTag, Tag.TAG_COMPOUND); + for (int i = 0; i < list.size(); i++) { + CompoundTag tag = list.getCompound(i); + var uuid = UUID.fromString(tag.getString("uuid")); + var data = tag.getCompound("energyData"); + GlobalWirelessEnergy.put(uuid, WirelessEnergyData.fromNBT(data)); + } + } + + private static WirelessEnergySavedData load(CompoundTag nbt, HolderLookup.Provider provider) { + return new WirelessEnergySavedData(nbt); + } + + @NotNull + @Override + public CompoundTag save(@NotNull CompoundTag nbt, @NotNull HolderLookup.Provider provider) { + var wirelessEnergyList = new ListTag(); + for (var entry : GlobalWirelessEnergy.entrySet()) { + if (entry.getKey() == null) continue; + var tag = new CompoundTag(); + tag.putString("uuid", entry.getKey().toString()); + tag.put("energyData", entry.getValue().toNBT()); + wirelessEnergyList.add(tag); + } + nbt.put(GlobalEnergyNBTTag, wirelessEnergyList); + return nbt; + } + + public BigInteger getEnergyStored(UUID uuid) { + var data = GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + return data.energyStored; + } + + public BigInteger getTotalNetworkEnergyStored(UUID uuid) { + return this.getEnergyStored(uuid).add(this.getEnergyBuffered(uuid)); + } + + public BigInteger getTotalNetworkEnergyStoredExceptLocalBuffer(UUID uuid, BlockPos localBufferPos) { + return this.getEnergyStored(uuid).add(this.getEnergyBufferedExceptLocal(uuid, localBufferPos)); + } + + public BigInteger getEnergyCapacity(UUID uuid) { + var data = GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + return data.energyCapacity; + } + + public boolean isActive(UUID uuid) { + var data = GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + return data.isActive; + } + + public long getEnergyInput(UUID uuid) { + var data = GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + return data.energyInput.values().stream().mapToLong(Long::longValue).sum(); + } + + public void setEnergyInput(UUID uuid, BlockPos blockPos, long input) { + var data = GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + data.energyInput.put(blockPos, input); + setDirty(); + } + + public void removeEnergyInput(UUID uuid, BlockPos blockPos) { + var data = GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + data.energyInput.remove(blockPos); + setDirty(); + } + + public long getEnergyOutput(UUID uuid) { + var data = GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + return data.energyOutput.values().stream().mapToLong(Long::longValue).sum(); + } + + public void setEnergyOutput(UUID uuid, BlockPos blockPos, long input) { + var data = GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + data.energyOutput.put(blockPos, input); + setDirty(); + } + + public void removeEnergyOutput(UUID uuid, BlockPos blockPos) { + var data = GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + data.energyOutput.remove(blockPos); + setDirty(); + } + + public BigInteger getEnergyBuffered(UUID uuid) { + var data = GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + var sum = BigInteger.ZERO; + for (var value : data.energyBuffered.values()) sum = sum.add(BigInteger.valueOf(value)); + return sum; + } + + public BigInteger getEnergyBufferedExceptLocal(UUID uuid, BlockPos localBufferPos) { + var data = GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + var sum = BigInteger.ZERO; + for (var entry : data.energyBuffered.entrySet()) { + if (!entry.getKey().equals(localBufferPos)) + sum = sum.add(BigInteger.valueOf(entry.getValue())); + } ; + return sum; + } + + public void setEnergyBuffered(UUID uuid, BlockPos blockPos, long input) { + var data = GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + data.energyBuffered.put(blockPos, input); + setDirty(); + } + + public void removeEnergyBuffered(UUID uuid, BlockPos blockPos) { + var data = GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + data.energyBuffered.remove(blockPos); + setDirty(); + } + + public long getPassiveDrain(UUID uuid) { + var data = GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + return data.passiveDrain.values().stream().mapToLong(Long::longValue).sum(); + } + + public void setPassiveDrain(UUID uuid, BlockPos blockPos, long input) { + var data = GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + data.passiveDrain.put(blockPos, input); + setDirty(); + } + + public void removePassiveDrain(UUID uuid, BlockPos blockPos) { + var data = GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + data.passiveDrain.remove(blockPos); + setDirty(); + } + + private boolean compareLocations(Tuple location1, Tuple location2) { + if (location1 == null || location2 == null) return false; + if (!location1.getA().equals(location2.getA())) return false; + if (!location1.getB().equals(location2.getB())) return false; + return true; + } + + /** + * Add EU to the users global energy. You can enter a negative number to subtract it. + * If the value goes below 0, it will return the EU amount and no operation will be performed. + * If the value goes above the {@link WirelessEnergyData} capacity, it will return the energy that was not added to + * the network. + * If the operation is successful, return value will be 0. + * BigIntegers have a much slower operation than long/int. You should call these methods as infrequently as possible + * and bulk store values to add to the global map + * + * @param uuid UUID of the owner of the network + * @param EU The energy to add to the network of the owner + * @return The amount of EU left after the operation + */ + public BigInteger addEUToGlobalWirelessEnergy(UUID uuid, BigInteger EU) { + var data = GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + var totalEU = data.energyStored.add(EU); + if (totalEU.signum() >= 0) { + if (totalEU.compareTo(data.energyCapacity) > 0) { + var leftover = totalEU.subtract(data.energyCapacity); + data.energyStored = data.energyCapacity; + GlobalWirelessEnergy.put(uuid, data); + setDirty(); + return leftover; + } + data.energyStored = totalEU; + GlobalWirelessEnergy.put(uuid, data); + setDirty(); + return BigInteger.ZERO; + } + return EU; + } + + public int addEUToGlobalWirelessEnergy(UUID uuid, int energy) { + return addEUToGlobalWirelessEnergy(uuid, BigInteger.valueOf(energy)).intValue(); + } + + public long addEUToGlobalWirelessEnergy(UUID uuid, long energy) { + return addEUToGlobalWirelessEnergy(uuid, BigInteger.valueOf(energy)).longValue(); + } + + public void setEnergy(UUID uuid, BigInteger energy) { + var data = GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + data.energyStored = energy; + setDirty(); + } + + public void setEnergy(UUID uuid, long energy) { + setEnergy(uuid, BigInteger.valueOf(energy)); + } + + public void setEnergy(UUID uuid, int energy) { + setEnergy(uuid, BigInteger.valueOf(energy)); + } + + public void setCapacity(UUID uuid, BigInteger capacity) { + var data = GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + data.energyCapacity = capacity; + var isOvercharged = capacity.compareTo(data.energyStored) < 0; + if (isOvercharged) data.energyStored = capacity; + setDirty(); + } + + public void setCapacity(UUID uuid, long capacity) { + setCapacity(uuid, BigInteger.valueOf(capacity)); + } + + public void setCapacity(UUID uuid, int capacity) { + setCapacity(uuid, BigInteger.valueOf(capacity)); + } + + public void clearWirelessEnergy(UUID uuid) { + GlobalWirelessEnergy.put(uuid, new WirelessEnergyData()); + } + + public void clearGlobalWirelessEnergy() { + GlobalWirelessEnergy.clear(); + } + + public void setActive(UUID uuid, boolean isActive) { + GlobalWirelessEnergy.computeIfAbsent(uuid, k -> new WirelessEnergyData()); + var data = GlobalWirelessEnergy.get(uuid); + data.isActive = isActive; + setDirty(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/item/LinkedTerminalBehavior.java b/src/main/java/com/ghostipedia/cosmiccore/api/item/LinkedTerminalBehavior.java new file mode 100644 index 000000000..25fc669e2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/item/LinkedTerminalBehavior.java @@ -0,0 +1,153 @@ +package com.ghostipedia.cosmiccore.api.item; + +import com.ghostipedia.cosmiccore.api.block.IBlockPattern; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; +import com.ghostipedia.cosmiccore.utils.ItemData; + +import com.gregtechceu.gtceu.api.item.component.IAddInformation; +import com.gregtechceu.gtceu.api.item.component.IInteractionItem; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; + +import net.minecraft.ChatFormatting; +import net.minecraft.Util; +import net.minecraft.core.GlobalPos; +import net.minecraft.nbt.NbtOps; +import net.minecraft.nbt.Tag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; + +import appeng.api.features.IGridLinkableHandler; +import appeng.api.implementations.blockentities.IWirelessAccessPoint; +import appeng.api.networking.IGrid; +import appeng.core.localization.GuiText; +import appeng.core.localization.PlayerMessages; +import appeng.core.localization.Tooltips; +import appeng.util.Platform; +import com.mojang.datafixers.util.Pair; +import org.jetbrains.annotations.Nullable; +import org.jline.utils.Log; + +import java.util.List; + +public class LinkedTerminalBehavior implements IInteractionItem, IAddInformation { + + public static IGridLinkableHandler handler = new LinkedTerminalHandler(); + private static final String TAG_ACCESS_POINT_POS = "accessPoint"; + + @Override + public InteractionResult useOn(UseOnContext context) { + var player = context.getPlayer(); + if (player == null || !player.isShiftKeyDown()) return InteractionResult.PASS; + var level = context.getLevel(); + var pos = context.getClickedPos(); + var stack = context.getItemInHand(); + if (!(MetaMachine.getMachine(level, pos) instanceof MultiblockControllerMachine controller)) return InteractionResult.PASS; + if (controller.isFormed() || level.isClientSide) return InteractionResult.PASS; + var grid = getLinkedGrid(stack, level, player); + if (grid == null) return InteractionResult.PASS; + ((IBlockPattern) controller.getPattern()).cosmiccore$autoBuild(player, + controller.getMultiblockState(), grid); + player.getCooldowns().addCooldown(CosmicItems.LINKED_TERMINAL.asItem(), 100); + return InteractionResult.sidedSuccess(false); + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List lines, TooltipFlag isAdvanced) { + var position = linkedPosition(stack); + if (position == null) { + lines.add(Tooltips.of(GuiText.Unlinked, Tooltips.RED)); + } else { + lines.add(Tooltips.of(GuiText.Linked, Tooltips.GREEN)); + lines.add(Component.translatable("cosmiccore.item.linked_terminal.boundTo", + position.dimension().location().getPath() + "[" + position.pos().toShortString() + "]") + .withStyle(ChatFormatting.GOLD)); + } + } + + @Override + public InteractionResultHolder use(ItemStack item, Level level, Player player, InteractionHand usedHand) { + var stack = player.getItemInHand(usedHand); + return InteractionResultHolder.pass(stack); + } + + private GlobalPos linkedPosition(ItemStack item) { + var tag = ItemData.readTag(item); + if (tag.contains(TAG_ACCESS_POINT_POS, Tag.TAG_COMPOUND)) { + return GlobalPos.CODEC.decode(NbtOps.INSTANCE, tag.get(TAG_ACCESS_POINT_POS)) + .resultOrPartial(Util.prefix("Linked position", Log::error)) + .map(Pair::getFirst) + .orElse(null); + } else { + return null; + } + } + + @Nullable + public IGrid getLinkedGrid(ItemStack item, Level level, @Nullable Player sendMessagesTo) { + if (!(level instanceof ServerLevel serverLevel)) { + return null; + } + + var linkedPos = linkedPosition(item); + if (linkedPos == null) { + if (sendMessagesTo != null) { + sendMessagesTo.displayClientMessage(PlayerMessages.DeviceNotLinked.text(), true); + } + return null; + } + + var linkedLevel = serverLevel.getServer().getLevel(linkedPos.dimension()); + if (linkedLevel == null) { + if (sendMessagesTo != null) { + sendMessagesTo.displayClientMessage(PlayerMessages.LinkedNetworkNotFound.text(), true); + } + return null; + } + + var be = Platform.getTickingBlockEntity(linkedLevel, linkedPos.pos()); + if (!(be instanceof IWirelessAccessPoint accessPoint)) { + if (sendMessagesTo != null) { + sendMessagesTo.displayClientMessage(PlayerMessages.LinkedNetworkNotFound.text(), true); + } + return null; + } + + var grid = accessPoint.getGrid(); + if (grid == null) { + if (sendMessagesTo != null) { + sendMessagesTo.displayClientMessage(PlayerMessages.LinkedNetworkNotFound.text(), true); + } + } + return grid; + } + + static class LinkedTerminalHandler implements IGridLinkableHandler { + + @Override + public boolean canLink(ItemStack stack) { + return true; + } + + @Override + public void link(ItemStack itemStack, GlobalPos pos) { + GlobalPos.CODEC.encodeStart(NbtOps.INSTANCE, pos) + .result() + .ifPresent(tag -> ItemData.mutateTag(itemStack, root -> root.put(TAG_ACCESS_POINT_POS, tag))); + } + + @Override + public void unlink(ItemStack itemStack) { + ItemData.mutateTag(itemStack, root -> root.remove(TAG_ACCESS_POINT_POS)); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/item/MeldingOmniTool.java b/src/main/java/com/ghostipedia/cosmiccore/api/item/MeldingOmniTool.java new file mode 100644 index 000000000..5acf2ff5d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/item/MeldingOmniTool.java @@ -0,0 +1,33 @@ +package com.ghostipedia.cosmiccore.api.item; + +import com.gregtechceu.gtceu.api.item.tool.GTToolType; +import com.gregtechceu.gtceu.common.item.tool.behavior.DisableShieldBehavior; +import com.gregtechceu.gtceu.common.item.tool.behavior.ToolModeSwitchBehavior; +import com.gregtechceu.gtceu.data.recipe.CustomTags; + +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.ItemTags; +import net.neoforged.neoforge.common.Tags; + +public final class MeldingOmniTool { + + public static final GTToolType MELD_TOOL_LUV = GTToolType.builder("luv_meld_tool") + .idFormat("%s_meld_tool") + .toolTag(Tags.Items.TOOLS_WRENCH) + .toolTag(CustomTags.TOOLS_WIRE_CUTTER) + .toolTag(ItemTags.PICKAXES) + .toolTag(ItemTags.SHOVELS) + .toolTag(ItemTags.HOES) + .toolTag(ItemTags.AXES) + .harvestTag(BlockTags.MINEABLE_WITH_AXE) + .harvestTag(BlockTags.MINEABLE_WITH_HOE) + .harvestTag(BlockTags.MINEABLE_WITH_PICKAXE) + .harvestTag(BlockTags.MINEABLE_WITH_SHOVEL) + .harvestTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WIRE_CUTTER) + .harvestTag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) + .definition(s -> s.crafting().blockBreaking().sneakBypassUse().attacking().attackSpeed(3.5F) + .behaviors(DisableShieldBehavior.INSTANCE, ToolModeSwitchBehavior.INSTANCE)) + .toolClasses(GTToolType.WRENCH, GTToolType.WIRE_CUTTER, GTToolType.PICKAXE, GTToolType.SHEARS, + GTToolType.AXE) + .build(); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/ISpaceSuite.java b/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/ISpaceSuite.java deleted file mode 100644 index 11170007d..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/api/item/armor/ISpaceSuite.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.ghostipedia.cosmiccore.api.item.armor; - -import com.ghostipedia.cosmiccore.common.data.tag.item.CosmicItemTags; -import earth.terrarium.adastra.api.systems.OxygenApi; -import earth.terrarium.adastra.common.constants.ConstantComponents; -import earth.terrarium.adastra.common.registry.ModFluids; -import earth.terrarium.adastra.common.utils.FluidUtils; -import earth.terrarium.adastra.common.utils.TooltipUtils; -import earth.terrarium.botarium.common.fluid.FluidConstants; -import net.minecraft.network.chat.Component; -import net.minecraft.tags.FluidTags; -import net.minecraft.tags.TagKey; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ArmorItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; - -import java.util.List; -import java.util.stream.StreamSupport; - -public interface ISpaceSuite { - - default void tickOxygen(Level Level, Player player, ItemStack itemStack) { - if (Level.isClientSide) return; - if (player.isCreative() || player.isSpectator()) return; - if (!(itemStack.getItem() instanceof SpaceArmorComponentItem suit)) return; - player.setTicksFrozen(0); - if (player.tickCount % 12 == 0 && suit.hasOxygen(player)) { - if (!OxygenApi.API.hasOxygen(player)) suit.consumeOxygen(itemStack, 1); - if (player.isEyeInFluid(FluidTags.WATER)) { - suit.consumeOxygen(itemStack, 1); - player.setAirSupply(Math.min(player.getMaxAirSupply(), player.getAirSupply() + 4 * 10)); - } - } - } - - static boolean hasFullNanoSet(LivingEntity entity) { - return hasFullSet(entity, CosmicItemTags.NANOMUSCLE_SPACE_SUITE); - } - - static boolean hasFullQuantumSet(LivingEntity entity) { - return hasFullSet(entity, CosmicItemTags.QUARKTECH_SPACE_SUITE); - } - - static boolean hasFullSet(LivingEntity entity, TagKey tagKey) { - return StreamSupport.stream(entity.getArmorSlots().spliterator(), false) - .allMatch(itemStack -> itemStack.is(tagKey)); - } - - - default void onArmorTick(Level Level, Player player, ItemStack itemStack, ArmorItem.Type type) { - if (type == ArmorItem.Type.CHESTPLATE) this.tickOxygen(Level, player, itemStack); - } - - default void addInfo(ItemStack itemStack, List lines, ArmorItem.Type type) { - if (type == ArmorItem.Type.CHESTPLATE && itemStack.getItem() instanceof SpaceArmorComponentItem suit) { - lines.add(TooltipUtils.getFluidComponent( - FluidUtils.getTank(itemStack), - FluidConstants.fromMillibuckets(suit.getFluidContainer(itemStack).getTankCapacity(0)), - ModFluids.OXYGEN.get())); - TooltipUtils.addDescriptionComponent(lines, ConstantComponents.SPACE_SUIT_INFO); - } - } - -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/item/component/FluidStats.java b/src/main/java/com/ghostipedia/cosmiccore/api/item/component/FluidStats.java deleted file mode 100644 index 7251a0934..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/api/item/component/FluidStats.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.ghostipedia.cosmiccore.api.item.component; - -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; - -public class FluidStats { - public FluidStats() { - - } -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/feature/IStellarIrisProvider.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/feature/IStellarIrisProvider.java new file mode 100644 index 000000000..6ec49974a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/feature/IStellarIrisProvider.java @@ -0,0 +1,54 @@ +package com.ghostipedia.cosmiccore.api.machine.feature; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; + +import com.gregtechceu.gtceu.api.machine.feature.IMachineFeature; + +/** + * Interface for the Stellar Iris controller. + * Modules query this to get processing parameters and stage information. + */ +public interface IStellarIrisProvider extends IMachineFeature { + + /** + * @return the current stage of the stellar iris + */ + IrisMultiblockMachine.Stage getStage(); + + /** + * @return whether the iris multiblock is formed + */ + boolean isFormed(); + + /** + * @return maximum heat provided to modules (affects recipe availability) + */ + int getMaxHeat(); + + /** + * @return speed bonus multiplier for module recipes + */ + double getSpeedBonus(); + + /** + * @return energy discount multiplier for module recipes (1.0 = no discount) + */ + double getEnergyDiscount(); + + /** + * @return maximum parallel recipes for modules + */ + int getParallelLimit(); + + /** + * Check if the stage allows processing + * + * @return true if the current stage can run module recipes + */ + default boolean canProcess() { + IrisMultiblockMachine.Stage stage = getStage(); + return stage == IrisMultiblockMachine.Stage.STAR || + stage == IrisMultiblockMachine.Stage.SUPERSTAR || + stage == IrisMultiblockMachine.Stage.BLACK_HOLE; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/feature/IStellarModuleReceiver.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/feature/IStellarModuleReceiver.java new file mode 100644 index 000000000..ccfba4072 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/feature/IStellarModuleReceiver.java @@ -0,0 +1,32 @@ +package com.ghostipedia.cosmiccore.api.machine.feature; + +import org.jetbrains.annotations.Nullable; + +/** + * Interface for Stellar Iris modules. + * Modules receive connection from the Iris controller and processing parameters. + */ +public interface IStellarModuleReceiver { + + /** + * @return the stellar iris this module is connected to, or null if not connected + */ + @Nullable + IStellarIrisProvider getStellarIris(); + + /** + * Sets the stellar iris connection for this module. + * Called by the Iris controller when structure forms/invalidates. + * + * @param provider the iris provider to connect to, or null to disconnect + */ + void setStellarIris(@Nullable IStellarIrisProvider provider); + + /** + * @return true if this module is connected to a valid, formed Iris + */ + default boolean isConnectedToIris() { + IStellarIrisProvider iris = getStellarIris(); + return iris != null && iris.isFormed(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/BloodAltarMultiMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/BloodAltarMultiMachine.java new file mode 100644 index 000000000..f1175ca7b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/BloodAltarMultiMachine.java @@ -0,0 +1,3 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +public class BloodAltarMultiMachine {} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/DimensionalEnergyCapacitor.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/DimensionalEnergyCapacitor.java new file mode 100644 index 000000000..77b6b7f68 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/DimensionalEnergyCapacitor.java @@ -0,0 +1,177 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.data.savedData.UniqueMultiblockSavedData; +import com.ghostipedia.cosmiccore.api.data.wireless.WirelessEnergySavedData; + +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.fancy.IFancyTooltip; +import com.gregtechceu.gtceu.api.gui.fancy.TooltipsPanel; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.multiblock.IBatteryData; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.PowerSubstationMachine; +import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; + +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.utils.DummyWorld; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.server.level.ServerLevel; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +public class DimensionalEnergyCapacitor extends DimensionalEnergyInterface { + + + public static final int MAX_BATTERY_LAYER = 18; + public static final int MIN_CASINGS = 14; + + // Passive Drain Constants + // 1% capacity per 24 hours + public static final long PASSIVE_DRAIN_DIVISOR = 20 * 60 * 60 * 24 * 100; + // no more than 100kEU/t per storage block + public static final long PASSIVE_DRAIN_MAX_PER_STORAGE = 100_000L; + + // Used to make sure you cannot have more than one of this multiblock per player / team + @Persisted + public boolean isDuplicate = false; + + @Persisted + private long[] capacities; + + public DimensionalEnergyCapacitor(BlockEntityCreationInfo holder) { + super(holder); + this.localDisplay = false; + } + + @Override + public void onStructureFormed() { + if (getLevel() instanceof DummyWorld) super.onStructureFormed(); + + if (getLevel() instanceof ServerLevel serverLevel) { + var owner = getTeamUUID(); + if (owner == MachineOwner.EMPTY) { + CosmicCore.LOGGER.warn("DimensionalEnergyCapcitor tried to form with null team."); + return; + } + var multiblockId = getDefinition().getId().toString(); + var wirelessData = WirelessEnergySavedData.getOrCreate(serverLevel); + var uniqueMultiblockMapping = UniqueMultiblockSavedData.getOrCreate(serverLevel); + + if (uniqueMultiblockMapping.hasData(owner, multiblockId, getDimension())) { + this.isDuplicate = !uniqueMultiblockMapping.isUnique(owner, multiblockId, getDimension(), getBlockPos()); + if (isDuplicate) { + recipeLogic.setStatus(RecipeLogic.Status.SUSPEND); + return; + } + } else uniqueMultiblockMapping.addMultiblock(owner, getDefinition().getId().toString(), getDimension(), + getBlockPos()); + + List batteries = new ArrayList<>(); + for (Map.Entry battery : getMultiblockState().getMatchContext().entrySet()) { + if (battery.getKey().startsWith(PowerSubstationMachine.PMC_BATTERY_HEADER) && + battery.getValue() instanceof PowerSubstationMachine.BatteryMatchWrapper wrapper) { + for (int i = 0; i < wrapper.getAmount(); i++) { + batteries.add(wrapper.getPartType()); + } + } + } + + this.capacities = batteries.stream().mapToLong(IBatteryData::getCapacity).toArray(); + + if (batteries.isEmpty()) { + onStructureInvalid(); + return; + } + + super.onStructureFormed(); // This order is important do not move + + var capacity = batteries.stream().mapToLong(IBatteryData::getCapacity) + .mapToObj(BigInteger::valueOf).reduce(BigInteger.ZERO, BigInteger::add); + + wirelessData.setCapacity(owner, capacity); + wirelessData.setActive(owner, true); + } + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + if (getLevel() instanceof ServerLevel serverLevel) { + var owner = getTeamUUID(); + if (owner != MachineOwner.EMPTY) { + var wirelessData = WirelessEnergySavedData.getOrCreate(serverLevel); + var uniqueMultiblockMapping = UniqueMultiblockSavedData.getOrCreate(serverLevel); + wirelessData.setActive(owner, false); + uniqueMultiblockMapping.removeMultiblock(owner, getDefinition().getId().toString(), getDimension(), + getBlockPos()); + } + } + this.capacities = null; + } + + @Override + public boolean isActive() { + if (isDuplicate) return false; + return super.isActive(); + } + + @Override + public long getPassiveDrainPerTick() { + long[] drains = Arrays.stream(capacities) + .map(cap -> Math.min(PASSIVE_DRAIN_MAX_PER_STORAGE, cap / PASSIVE_DRAIN_DIVISOR)).toArray(); + return Arrays.stream(drains).sum(); + } + + @Override + public void addDisplayText(List textList) { + if (this.isDuplicate) { + textList.add(Component.translatable("cosmic.multiblock.capacitor.duplicate.multiblock.1") + .setStyle(Style.EMPTY.withColor(ChatFormatting.DARK_RED))); + textList.add(Component.translatable("cosmic.multiblock.capacitor.duplicate.multiblock.2") + .setStyle(Style.EMPTY.withColor(ChatFormatting.DARK_RED))); + } else super.addDisplayText(textList); + } + + @Override + public void setWorkingEnabled(boolean isWorkingAllowed) { + super.setWorkingEnabled(isWorkingAllowed); + if (getLevel() instanceof ServerLevel serverLevel) { + var owner = getTeamUUID(); + if (owner != MachineOwner.EMPTY) { + var wirelessData = WirelessEnergySavedData.getOrCreate(serverLevel); + wirelessData.setActive(owner, isWorkingAllowed); + } + } + } + + private boolean hasOwner() { + var owner = getTeamUUID(); + return owner != MachineOwner.EMPTY; + } + + @Override + public void attachTooltips(TooltipsPanel tooltipsPanel) { + super.attachTooltips(tooltipsPanel); + tooltipsPanel.attachTooltips(new IFancyTooltip.Basic( + () -> GuiTextures.INDICATOR_NO_ENERGY, + () -> List.of(Component.translatable("cosmic.multiblock.capacitor.owner.null") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))), + () -> (!this.hasOwner()), + () -> null)); + } + + private String getDimension() { + if (getLevel() instanceof ServerLevel serverLevel) { + return serverLevel.dimension().location().toString(); + } + return null; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/DimensionalEnergyInterface.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/DimensionalEnergyInterface.java new file mode 100644 index 000000000..7bd4e37fc --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/DimensionalEnergyInterface.java @@ -0,0 +1,436 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.ghostipedia.cosmiccore.api.data.wireless.WirelessEnergySavedData; +import com.ghostipedia.cosmiccore.utils.CosmicFormattingUtil; + +import com.gregtechceu.gtceu.api.capability.IEnergyContainer; +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; +import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.misc.EnergyContainerList; +import com.gregtechceu.gtceu.common.machine.owner.FTBOwner; +import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.util.ClickData; +import com.lowdragmc.lowdraglib.gui.widget.*; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.utils.DummyWorld; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.player.Player; + +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; + +import java.math.BigInteger; +import java.time.Duration; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +import static com.ghostipedia.cosmiccore.utils.CosmicFormattingUtil.combineWithConstantWidth; +import static com.ghostipedia.cosmiccore.utils.CosmicFormattingUtil.formatWithConstantWidth; + +public class DimensionalEnergyInterface extends WorkableMultiblockMachine + implements IFancyUIMachine, IDisplayUIMachine { + + protected static final long ticks_between_save_data_operations = 5L * 20L; // Once per 5s + private static final int uiWidth = 182; + + + private static final BigInteger BIG_INTEGER_MAX_LONG = BigInteger.valueOf(Long.MAX_VALUE); + + protected IMaintenanceMachine maintenance; + protected EnergyContainerList inputHatches; + protected EnergyContainerList outputHatches; + protected long passiveDrain; + + @Persisted + protected IEnergyContainer energyBuffer; + + // Stats tracked for UI display + private long netInLastSec; + private long netOutLastSec; + private long averageInLastSec; + private long averageOutLastSec; + protected boolean localDisplay; + + protected ConditionalSubscriptionHandler tickSubscription; + + public DimensionalEnergyInterface(BlockEntityCreationInfo holder) { + super(holder); + this.tickSubscription = new ConditionalSubscriptionHandler(this, this::transferEnergyTick, this::isActive); + this.localDisplay = true; + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + if (getLevel() instanceof DummyWorld) return; + + initializeAbilities(); + setEnergyBuffer(); + + tickSubscription.updateSubscription(); + } + + private void initializeAbilities() { + List inputs = new ArrayList<>(); + List outputs = new ArrayList<>(); + + Map ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", Long2ObjectMaps::emptyMap); + for (IMultiPart part : getParts()) { + IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.BOTH); + if (io == IO.NONE) continue; + + var handlerLists = part.getRecipeHandlers(); + for (var handlerList : handlerLists) { + if (!handlerList.isValid(io)) continue; + if (handlerList.getHandlerIO() == IO.IN) { + handlerList.getCapability(EURecipeCapability.CAP).stream() + .filter(IEnergyContainer.class::isInstance) + .map(IEnergyContainer.class::cast) + .forEach(inputs::add); + } else if (handlerList.getHandlerIO() == IO.OUT) { + handlerList.getCapability(EURecipeCapability.CAP).stream() + .filter(IEnergyContainer.class::isInstance) + .map(IEnergyContainer.class::cast) + .forEach(outputs::add); + } + } + } + + this.inputHatches = new EnergyContainerList(inputs); + this.outputHatches = new EnergyContainerList(outputs); + } + + protected UUID getTeamUUID() { + // CosmicCore.LOGGER.warn("getting team UUID"); + var owner = getOwner(); + var ownerUUID = getOwnerUUID(); + // Faultcheck the Owner and OwnerUUID + if (owner == null) return MachineOwner.EMPTY; + if (ownerUUID == null) return MachineOwner.EMPTY; + + // CosmicCore.LOGGER.warn("Owner UUID: " + ownerUUID.toString()); + var team = owner instanceof FTBOwner ftbOwner ? ftbOwner.getPlayerTeam(ownerUUID) : null; + if (team == null) return ownerUUID; + + // CosmicCore.LOGGER.warn("Team UUID: " + team); + // CosmicCore.LOGGER.warn("Team UUID: " + team.getTeamId()); + return team.getTeamId(); + } + + @Override + public void onStructureInvalid() { + if (getLevel() instanceof ServerLevel serverLevel) { // Transfer buffer content to avoid losses + var data = WirelessEnergySavedData.getOrCreate(serverLevel); + var owner = getTeamUUID(); + if (owner != MachineOwner.EMPTY) { + if (energyBuffer != null) { + data.addEUToGlobalWirelessEnergy(owner, energyBuffer.getEnergyStored()); + energyBuffer.removeEnergy(energyBuffer.getEnergyStored()); + } + data.removeEnergyBuffered(owner, getBlockPos()); + data.removeEnergyInput(owner, getBlockPos()); + data.removeEnergyOutput(owner, getBlockPos()); + data.removePassiveDrain(owner, getBlockPos()); + } + this.inputHatches = null; + this.outputHatches = null; + this.energyBuffer = null; + this.passiveDrain = 0; + this.netInLastSec = 0; + this.averageInLastSec = 0; + this.netOutLastSec = 0; + this.averageOutLastSec = 0; + } + + tickSubscription.unsubscribe(); + super.onStructureInvalid(); + } + + public boolean isActive() { + return isFormed(); + } + + private void setEnergyBuffer() { + long totalIOPerTick = (inputHatches.getInputVoltage() + outputHatches.getOutputVoltage()); + // Size is the totalIOPerTick over the duration between operations doubled + long bufferSize = totalIOPerTick * + (ticks_between_save_data_operations + (ticks_between_save_data_operations / 2L)) * 2L; + bufferSize += (getPassiveDrainPerTick() * 8 * 2) * ticks_between_save_data_operations; + if (bufferSize < 0L) + throw new RuntimeException("DimensionalEnergyCapacitor: Calculated buffer size is too big."); + this.energyBuffer = new NotifiableEnergyContainer(this, bufferSize, Long.MAX_VALUE, Long.MAX_VALUE, + Long.MAX_VALUE, Long.MAX_VALUE); + } + + public long getPassiveDrainPerTick() { + return 20_000L; // 0 in the interfaces, Overridden in the Capacitor + } + + public long getPassiveDrain() { + if (ConfigHolder.INSTANCE.machines.enableMaintenance) { + if (maintenance == null) { + for (IMultiPart part : getParts()) { + if (part instanceof IMaintenanceMachine maintenanceMachine) { + this.maintenance = maintenanceMachine; + break; + } + } + } + if (maintenance == null) return getPassiveDrainPerTick(); + int multiplier = 1 + maintenance.getNumMaintenanceProblems(); + double modifier = maintenance.getDurationMultiplier(); + return (long) (getPassiveDrainPerTick() * multiplier * modifier); + } + return getPassiveDrainPerTick(); + } + + private static MutableComponent getTimeToFillDrainText(BigInteger timeToFillSeconds) { + if (timeToFillSeconds.compareTo(BIG_INTEGER_MAX_LONG) > 0) { + // too large to represent in a java Duration + timeToFillSeconds = BIG_INTEGER_MAX_LONG; + } + + Duration duration = Duration.ofSeconds(timeToFillSeconds.longValue()); + String key; + long fillTime; + if (duration.getSeconds() <= 180) { + fillTime = duration.getSeconds(); + key = "gtceu.multiblock.power_substation.time_seconds"; + } else if (duration.toMinutes() <= 180) { + fillTime = duration.toMinutes(); + key = "gtceu.multiblock.power_substation.time_minutes"; + } else if (duration.toHours() <= 72) { + fillTime = duration.toHours(); + key = "gtceu.multiblock.power_substation.time_hours"; + } else if (duration.toDays() <= 730) { // 2 years + fillTime = duration.toDays(); + key = "gtceu.multiblock.power_substation.time_days"; + } else if (duration.toDays() / 365 < 1_000_000) { + fillTime = duration.toDays() / 365; + key = "gtceu.multiblock.power_substation.time_years"; + } else { + return Component.translatable("gtceu.multiblock.power_substation.time_forever"); + } + + return Component.translatable(key, FormattingUtil.formatNumbers(fillTime)); + } + + protected void transferEnergyTick() { + if (getLevel() instanceof ServerLevel serverLevel) { + var data = WirelessEnergySavedData.getOrCreate(serverLevel); + var owner = getTeamUUID(); + + if (isWorkingEnabled() && isFormed() && owner != MachineOwner.EMPTY) { + if (getOffsetTimer() % 20 == 0) { + getRecipeLogic().setStatus((energyBuffer != null && energyBuffer.getEnergyStored() > 0) ? + RecipeLogic.Status.WORKING : RecipeLogic.Status.IDLE); + + averageInLastSec = netInLastSec / 20; + averageOutLastSec = netOutLastSec / 20; + netInLastSec = 0; + netOutLastSec = 0; + + // Send IO values to global Storage to display in the Dimensional Storage. + data.setEnergyInput(owner, getBlockPos(), averageInLastSec); + data.setEnergyOutput(owner, getBlockPos(), averageOutLastSec); + data.setEnergyBuffered(owner, getBlockPos(), energyBuffer.getEnergyStored()); + } + + // Handle inputs + long energyBuffered = energyBuffer.addEnergy(inputHatches.getEnergyStored()); + inputHatches.changeEnergy(-energyBuffered); + netInLastSec += energyBuffered; + + // Passive Drain + long energyPassiveDrained = energyBuffer.removeEnergy(getPassiveDrain()); + netOutLastSec += energyPassiveDrained; + + // Handle outputs + long energyNeed = outputHatches.getEnergyCapacity() - outputHatches.getEnergyStored(); + long energyDeBuffered = energyBuffer.removeEnergy(energyNeed); + outputHatches.changeEnergy(energyDeBuffered); + netOutLastSec += energyDeBuffered; + + // Handle buffer transfer to WirelessEnergySavedData + if (getOffsetTimer() % ticks_between_save_data_operations == 0) { + if (data.isActive(owner)) { + // After operation buffer should aim to be 50% full + var euToTransfer = energyBuffer.getEnergyStored() - (energyBuffer.getEnergyCapacity() / 2); + var euTransferred = data.addEUToGlobalWirelessEnergy(owner, euToTransfer); + energyBuffer.changeEnergy(-(euToTransfer - euTransferred)); + data.setEnergyBuffered(owner, getBlockPos(), energyBuffer.getEnergyStored()); + data.setPassiveDrain(owner, getBlockPos(), getPassiveDrain()); + } + } + } else { + data.removeEnergyBuffered(owner, getBlockPos()); + data.removeEnergyInput(owner, getBlockPos()); + data.removeEnergyOutput(owner, getBlockPos()); + data.removePassiveDrain(owner, getBlockPos()); + } + } + } + + @Override + public void addDisplayText(List textList) { + IDisplayUIMachine.super.addDisplayText(textList); + if (this.isFormed()) { + // Multiblock status + if (!isWorkingEnabled()) textList.add(Component.translatable("gtceu.multiblock.work_paused")); + else if (isActive()) textList.add(Component.translatable("gtceu.multiblock.running")); + else textList.add(Component.translatable("gtceu.multiblock.idling")); + + if (recipeLogic.isWaiting()) { + textList.add(Component.translatable("gtceu.multiblock.waiting") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + } + + var owner = getTeamUUID(); + if (energyBuffer != null && owner != MachineOwner.EMPTY) { + if (getLevel() instanceof ServerLevel serverLevel) { + var data = WirelessEnergySavedData.getOrCreate(serverLevel); + + var STYLE_GOLD = Style.EMPTY.withColor(ChatFormatting.GOLD); + var STYLE_DARK_RED = Style.EMPTY.withColor(ChatFormatting.DARK_RED); + var STYLE_GREEN = Style.EMPTY.withColor(ChatFormatting.GREEN); + var STYLE_RED = Style.EMPTY.withColor(ChatFormatting.RED); + + // Tittle + var buttonComponent = ComponentPanelWidget.withButton(Component.literal("[").append(localDisplay ? + Component.translatable("cosmic.multiblock.capacitor.info.global") : + Component.translatable("cosmic.multiblock.capacitor.info.local")) + .append(Component.literal("]")), "local_display"); + + var labelComponent = localDisplay ? + Component.translatable("cosmic.multiblock.capacitor.info.tittle.local") : + Component.translatable("cosmic.multiblock.capacitor.info.tittle.global"); + + textList.add(localDisplay ? combineWithConstantWidth(labelComponent, buttonComponent, uiWidth - 4) : + combineWithConstantWidth(buttonComponent, labelComponent, uiWidth - 4)); + + BigInteger energyCapacity = data.getEnergyCapacity(owner);; + BigInteger energyStored = data.getEnergyStored(owner); + energyStored = energyStored.add(BigInteger.valueOf(energyBuffer.getEnergyStored())); + BigInteger energyBuffered; + long passiveDrain; + long avgIn; + long avgOut; + + if (localDisplay) { + energyBuffered = BigInteger.valueOf(energyBuffer.getEnergyStored()); + avgIn = averageInLastSec; + avgOut = averageOutLastSec; + passiveDrain = getPassiveDrain(); + } else { + energyBuffered = data.getEnergyBufferedExceptLocal(owner, getBlockPos()); + energyBuffered = energyBuffered.add(BigInteger.valueOf(energyBuffer.getEnergyStored())); + avgIn = data.getEnergyInput(owner); + avgOut = data.getEnergyOutput(owner); + passiveDrain = data.getPassiveDrain(owner); + } + + var storedComponent = Component + .literal(CosmicFormattingUtil.formatNumberWithCharacterLimit(energyStored, 12)); + textList.add(formatWithConstantWidth("gtceu.multiblock.power_substation.stored", + storedComponent.setStyle(STYLE_GOLD), uiWidth - 4)); + + var capacityComponent = Component + .literal(CosmicFormattingUtil.formatNumberWithCharacterLimit(energyCapacity, 12)); + textList.add(formatWithConstantWidth("gtceu.multiblock.power_substation.capacity", + capacityComponent.setStyle(STYLE_GOLD), uiWidth - 4)); + + var bufferedComponent = Component + .literal(CosmicFormattingUtil.formatNumberWithCharacterLimit(energyBuffered, 12)); + textList.add(formatWithConstantWidth("cosmic.multiblock.capacitor.buffered", + bufferedComponent.setStyle(STYLE_GOLD), uiWidth - 4)); + + var passiveDrainComponent = Component.literal( + CosmicFormattingUtil.formatNumberWithCharacterLimit(BigInteger.valueOf(passiveDrain), 9)); + textList.add(formatWithConstantWidth("gtceu.multiblock.power_substation.passive_drain", + passiveDrainComponent.setStyle(STYLE_DARK_RED), uiWidth - 4)); + + var avgInComponent = Component.literal( + CosmicFormattingUtil.formatNumberWithCharacterLimit(BigInteger.valueOf(avgIn), 10)); + textList.add(formatWithConstantWidth("gtceu.multiblock.power_substation.average_in", + avgInComponent.setStyle(STYLE_GREEN), uiWidth - 4) + .withStyle(Style.EMPTY.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, + Component.translatable("gtceu.multiblock.power_substation.average_in_hover"))))); + + var avgOutComponent = Component.literal(CosmicFormattingUtil + .formatNumberWithCharacterLimit(BigInteger.valueOf(Math.abs(avgOut)), 10)); + textList.add(formatWithConstantWidth("gtceu.multiblock.power_substation.average_out", + avgOutComponent.setStyle(STYLE_RED), uiWidth - 4) + .withStyle(Style.EMPTY.withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, + Component.translatable("gtceu.multiblock.power_substation.average_out_hover"))))); + + if (!localDisplay) { + var avgInput = data.getEnergyInput(owner); + var avgOutput = data.getEnergyOutput(owner); + if (avgInput > avgOutput) { + BigInteger timeToFillSeconds = data.getEnergyCapacity(owner) + .subtract(data.getEnergyStored(owner)) + .divide(BigInteger.valueOf((avgInput - avgOutput) * 20)); + textList.add(formatWithConstantWidth("gtceu.multiblock.power_substation.time_to_fill", + getTimeToFillDrainText(timeToFillSeconds).setStyle(STYLE_GREEN), uiWidth - 4)); + } else if (avgInput < avgOutput) { + BigInteger timeToDrainSeconds = energyStored + .divide(BigInteger.valueOf((avgOutput - avgInput) * 20)); + textList.add(formatWithConstantWidth("gtceu.multiblock.power_substation.time_to_drain", + getTimeToFillDrainText(timeToDrainSeconds).setStyle(STYLE_RED), uiWidth - 4)); + } + } + } + } + } + + getDefinition().getAdditionalDisplay().accept(this, textList); + } + + @Override + public void handleDisplayClick(String componentData, ClickData clickData) { + if (!clickData.isRemote) { + if (componentData.equals("local_display")) { + localDisplay = !localDisplay; + } + } + } + + @Override + public Widget createUIWidget() { + var group = new WidgetGroup(0, 0, uiWidth + 8, 117 + 8); + group.addWidget(new DraggableScrollableWidgetGroup(4, 4, uiWidth, 117).setBackground(getScreenTexture()) + .addWidget(new LabelWidget(4, 5, self().getBlockState().getBlock().getDescriptionId())) + .addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText).setMaxWidthLimit(uiWidth - 4) + .clickHandler(this::handleDisplayClick))); + group.setBackground(GuiTextures.BACKGROUND_INVERSE); + return group; + } + + @Override + public ModularUI createUI(Player entityPlayer) { + return new ModularUI(uiWidth + 8, 208, this, entityPlayer) + .widget(new FancyMachineUIWidget(this, uiWidth + 8, 208)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/DreamersBasinMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/DreamersBasinMachine.java new file mode 100644 index 000000000..b440d89b9 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/DreamersBasinMachine.java @@ -0,0 +1,376 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.MultithreadedMachine; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.MultithreadedRecipeLogic; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.content.Content; +import com.gregtechceu.gtceu.utils.FormattingUtil; +import com.gregtechceu.gtceu.utils.GTUtil; + +import com.lowdragmc.lowdraglib.gui.widget.*; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.common.crafting.SizedIngredient; +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.crafting.SizedFluidIngredient; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * The Dreamer's Basin Machine - A multithreaded processing machine with custom UI. + *

+ * This machine extends MultithreadedMachine and provides a rich UI that displays: + * - Thread status with color-coded indicators + * - Per-thread recipe progress bars + * - Current recipe information for each thread + * - Energy consumption breakdown + * - Overclock levels per thread + */ +public class DreamersBasinMachine extends MultithreadedMachine implements IDisplayUIMachine { + + + public DreamersBasinMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + + // ===== Custom UI Implementation ===== + + @Override + public Widget createUIWidget() { + var group = new WidgetGroup(0, 0, 256, 200); + + // Main scrollable area + var scrollable = new DraggableScrollableWidgetGroup(4, 4, 248, 192) + .setBackground(getScreenTexture()); + + // Title + scrollable.addWidget(new LabelWidget(4, 5, self().getBlockState().getBlock().getDescriptionId())); + + // Component panel for dynamic text (status, energy, etc.) + scrollable.addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) + .textSupplier(this.getLevel().isClientSide ? null : this::addDisplayText) + .setMaxWidthLimit(240) + .clickHandler(this::handleDisplayClick)); + + group.addWidget(scrollable); + group.setBackground(GuiTextures.BACKGROUND_INVERSE); + + return group; + } + + @Override + public void addDisplayText(List textList) { + // Use MultiblockDisplayText builder for consistent formatting + var builder = MultiblockDisplayText.builder(textList, isFormed()) + .setWorkingStatus(isWorkingEnabled(), getRunningThreadCount() > 0); + + if (isFormed()) { + // Energy info first + builder.addEnergyUsageLine(energyContainer); + builder.addEnergyTierLine(tier); + + // Separator + builder.addCustom(tl -> tl.add(Component.empty())); + + // Thread Status Header + builder.addCustom(tl -> { + tl.add(Component.translatable("cosmiccore.machine.dreamers_basin.thread_header") + .withStyle(ChatFormatting.AQUA, ChatFormatting.BOLD)); + + // Summary line + int running = getRunningThreadCount(); + int total = getThreadLogics().size(); + int max = getMaxThreads(); + + MutableComponent summary = Component.literal(" ") + .append(Component.translatable("cosmiccore.machine.dreamers_basin.threads_summary", + running, total, max)); + + if (running == total && total > 0) { + summary = summary.withStyle(ChatFormatting.GREEN); + } else if (running > 0) { + summary = summary.withStyle(ChatFormatting.YELLOW); + } else { + summary = summary.withStyle(ChatFormatting.GRAY); + } + tl.add(summary); + }); + + // Per-thread detailed status + builder.addCustom(tl -> { + tl.add(Component.empty()); + + for (MultithreadedRecipeLogic logic : getThreadLogics().values()) { + addThreadStatusLine(tl, logic); + } + }); + + // EU Budget info + builder.addCustom(tl -> { + tl.add(Component.empty()); + tl.add(Component.translatable("cosmiccore.machine.dreamers_basin.eu_budget_header") + .withStyle(ChatFormatting.GOLD)); + + if (!getThreadLogics().isEmpty()) { + MultithreadedRecipeLogic firstThread = getThreadLogics().values().iterator().next(); + long euPerThread = firstThread.getMaxEUtPerThread(); + int voltageTier = GTUtil.getFloorTierByVoltage(euPerThread); + String tierName = GTValues.VNF[voltageTier]; + + tl.add(Component.literal(" ") + .append(Component.translatable("cosmiccore.machine.dreamers_basin.eu_per_thread", + FormattingUtil.formatNumbers(euPerThread), tierName)) + .withStyle(ChatFormatting.GRAY)); + } + }); + } + + // Additional display from definition + getDefinition().getAdditionalDisplay().accept(this, textList); + } + + /** + * Add a detailed status line for a single thread. + */ + private void addThreadStatusLine(List textList, MultithreadedRecipeLogic logic) { + int color = logic.getThreadColor(); + String colorName = getColorDisplayName(color); + ChatFormatting colorFormat = getColorChatFormatting(color); + + // Build the thread status line + MutableComponent line = Component.literal(" "); + + // Color indicator [COLOR] + line.append(Component.literal("[" + colorName + "] ").withStyle(colorFormat)); + + if (logic.isWorking()) { + // Thread is actively processing + GTRecipe recipe = logic.getCurrentRecipe(); + int progress = logic.getProgress(); + int duration = logic.getDuration(); + int percent = duration > 0 ? (progress * 100 / duration) : 0; + + // Progress bar visualization + String progressBar = createProgressBar(percent); + + // Build hover tooltip with recipe details + Component hoverTooltip = buildRecipeTooltip(recipe, duration); + + // Create the progress portion with hover event + MutableComponent progressComponent = Component.literal(progressBar + " ") + .withStyle(Style.EMPTY + .withColor(ChatFormatting.GREEN) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, hoverTooltip))); + + line.append(progressComponent); + line.append(Component.literal(percent + "%").withStyle(ChatFormatting.WHITE)); + + // Recipe EU/t info + if (recipe != null) { + long recipeEUt = recipe.getInputEUt().getTotalEU(); + if (recipeEUt > 0) { + line.append(Component.literal(" (") + .append(Component.literal(FormattingUtil.formatNumbers(recipeEUt) + " EU/t") + .withStyle(ChatFormatting.YELLOW)) + .append(Component.literal(")"))); + } + } + + textList.add(line); + + // Add time remaining on next line (also with hover) + if (duration > 0) { + int ticksRemaining = duration - progress; + float secondsRemaining = ticksRemaining / 20.0f; + MutableComponent timeLine = Component.literal(" ") + .append(Component.translatable("cosmiccore.machine.dreamers_basin.time_remaining", + String.format("%.1fs", secondsRemaining)) + .withStyle(Style.EMPTY + .withColor(ChatFormatting.DARK_GRAY) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, hoverTooltip)))); + textList.add(timeLine); + } + + } else if (logic.isIdle()) { + line.append(Component.translatable("cosmiccore.machine.dreamers_basin.status_idle") + .withStyle(ChatFormatting.GRAY)); + textList.add(line); + + } else if (logic.isWaiting()) { + line.append(Component.translatable("cosmiccore.machine.dreamers_basin.status_waiting") + .withStyle(ChatFormatting.YELLOW)); + textList.add(line); + + } else if (logic.isSuspend()) { + line.append(Component.translatable("cosmiccore.machine.dreamers_basin.status_suspended") + .withStyle(ChatFormatting.RED)); + textList.add(line); + + } else { + line.append(Component.translatable("cosmiccore.machine.dreamers_basin.status_unknown") + .withStyle(ChatFormatting.DARK_GRAY)); + textList.add(line); + } + } + + /** + * Build a hover tooltip showing the first recipe output and production rate. + * Due to Minecraft hover event limitations, this is kept to a single line. + */ + private Component buildRecipeTooltip(GTRecipe recipe, int duration) { + if (recipe == null) { + return Component.translatable("cosmiccore.machine.dreamers_basin.tooltip.no_recipe"); + } + + // Calculate rate (items per second) + float recipesPerSecond = duration > 0 ? 20.0f / duration : 0; + + MutableComponent tooltip = Component.translatable("cosmiccore.machine.dreamers_basin.tooltip.crafting") + .withStyle(ChatFormatting.GOLD) + .append(Component.literal(" ").withStyle(ChatFormatting.RESET)); + + // Try to find first item output + // Note: Content stores SizedIngredient, not raw ItemStack + List itemOutputs = recipe.getOutputContents(ItemRecipeCapability.CAP); + if (itemOutputs != null && !itemOutputs.isEmpty()) { + for (Content content : itemOutputs) { + Object contentObj = content.getContent(); + if (contentObj instanceof SizedIngredient ingredient) { + ItemStack[] items = ingredient.getItems(); + if (items.length > 0 && !items[0].isEmpty()) { + ItemStack stack = items[0]; + int count = stack.getCount(); + float perSecond = count * recipesPerSecond; + + tooltip.append(stack.getHoverName().copy().withStyle(ChatFormatting.WHITE)) + .append(Component.literal(" x" + count).withStyle(ChatFormatting.GRAY)); + + if (perSecond >= 0.1f) { + tooltip.append(Component.literal(String.format(" (%.1f/s)", perSecond)) + .withStyle(ChatFormatting.AQUA)); + } + return tooltip; + } + } + } + } + + // Try fluid outputs if no items + // Note: Content stores SizedFluidIngredient, not raw FluidStack + List fluidOutputs = recipe.getOutputContents(FluidRecipeCapability.CAP); + if (fluidOutputs != null && !fluidOutputs.isEmpty()) { + for (Content content : fluidOutputs) { + Object contentObj = content.getContent(); + if (contentObj instanceof SizedFluidIngredient ingredient) { + FluidStack[] fluids = ingredient.getFluids(); + if (fluids.length > 0 && !fluids[0].isEmpty()) { + int amount = ingredient.amount(); + float perSecond = amount * recipesPerSecond; + + tooltip.append(fluids[0].getHoverName().copy().withStyle(ChatFormatting.BLUE)) + .append(Component.literal(" " + FormattingUtil.formatNumbers(amount) + "mB") + .withStyle(ChatFormatting.GRAY)); + + if (perSecond >= 1f) { + tooltip.append(Component.literal(String.format(" (%.0f mB/s)", perSecond)) + .withStyle(ChatFormatting.AQUA)); + } + return tooltip; + } + } + } + } + + // Generic fallback + return tooltip.append(Component.translatable("cosmiccore.machine.dreamers_basin.tooltip.processing") + .withStyle(ChatFormatting.GRAY)); + } + + /** + * Create a simple text-based progress bar. + */ + private String createProgressBar(int percent) { + int filled = percent / 10; + int empty = 10 - filled; + return "[" + "=".repeat(filled) + "-".repeat(empty) + "]"; + } + + /** + * Get a display-friendly color name. + * GTCEu stores painting color as dye.getMapColor().col + */ + private String getColorDisplayName(int color) { + if (color == -1) return "Default"; + + for (DyeColor dye : DyeColor.values()) { + // GTCEu uses getMapColor().col for painted colors + if (dye.getMapColor().col == color) { + // Capitalize first letter of each word + String name = dye.getName().replace("_", " "); + StringBuilder result = new StringBuilder(); + for (String word : name.split(" ")) { + if (!result.isEmpty()) result.append(" "); + result.append(word.substring(0, 1).toUpperCase()).append(word.substring(1)); + } + return result.toString(); + } + } + return "Custom"; + } + + /** + * Get the ChatFormatting color that best matches the thread color. + * GTCEu stores painting color as dye.getMapColor().col + */ + private ChatFormatting getColorChatFormatting(int color) { + if (color == -1) return ChatFormatting.WHITE; + + for (DyeColor dye : DyeColor.values()) { + // GTCEu uses getMapColor().col for painted colors + if (dye.getMapColor().col == color) { + return switch (dye) { + case WHITE -> ChatFormatting.WHITE; + case ORANGE -> ChatFormatting.GOLD; + case MAGENTA -> ChatFormatting.LIGHT_PURPLE; + case LIGHT_BLUE -> ChatFormatting.AQUA; + case YELLOW -> ChatFormatting.YELLOW; + case LIME -> ChatFormatting.GREEN; + case PINK -> ChatFormatting.LIGHT_PURPLE; + case GRAY -> ChatFormatting.DARK_GRAY; + case LIGHT_GRAY -> ChatFormatting.GRAY; + case CYAN -> ChatFormatting.DARK_AQUA; + case PURPLE -> ChatFormatting.DARK_PURPLE; + case BLUE -> ChatFormatting.BLUE; + case BROWN -> ChatFormatting.GOLD; + case GREEN -> ChatFormatting.DARK_GREEN; + case RED -> ChatFormatting.RED; + case BLACK -> ChatFormatting.DARK_GRAY; + }; + } + } + return ChatFormatting.WHITE; + } + + /** + * Get all thread logics for iteration. + */ + public Iterable getThreadLogicsIterable() { + return getThreadLogics().values(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/DroneStationMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/DroneStationMachine.java new file mode 100644 index 000000000..9a0f4abf5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/DroneStationMachine.java @@ -0,0 +1,357 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.ghostipedia.cosmiccore.api.machine.part.DroneMaintenanceInterfacePartMachine; +import com.ghostipedia.cosmiccore.api.misc.DroneStationConnection; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.IControllable; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; +import com.lowdragmc.lowdraglib.gui.texture.TextTexture; +import com.lowdragmc.lowdraglib.gui.widget.*; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +import com.google.common.collect.HashMultimap; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class DroneStationMachine extends WorkableElectricMultiblockMachine { + + // A MultiMap from Dimension -> DroneStation, such that all Drone Maintenance Interfaces can + // find their closest DroneStation in their world + public static final HashMultimap droneStations = HashMultimap.create(); + + private TickableSubscription tickSubscription; + + public final List connections = new ArrayList<>(); + + public DroneTier currentTier = null; + + public enum DroneTier { + // In this specific order so values are highest first + // for the case of having multiple drones in a hatch + + // spotless:off + PLASMATIC( 4096, GTValues.V[GTValues.UV], 0f, CosmicItems.PLASMATIC_DRONE.asStack(1)), + SANGUINE( 2048, GTValues.V[GTValues.ZPM], 0.25f, CosmicItems.SANGUINE_DRONE.asStack(1)), + INDUSTRIAL( 1024, GTValues.V[GTValues.LuV], 0.5f, CosmicItems.INDUSTRIAL_DRONE.asStack(1)), + ROBUST( 512, GTValues.V[GTValues.IV], 0.75f, CosmicItems.ROBUST_DRONE.asStack(1)), + RUSTY( 256, GTValues.V[GTValues.EV], 1, CosmicItems.RUSTY_DRONE.asStack(1)), + // spotless:on + ; + + public final long range; + public final long EUt; + public final float consumptionChance; + public final ItemStack item; + + DroneTier(long range, long EUt, float consumptionChance, ItemStack item) { + this.range = range; + this.EUt = EUt; + this.consumptionChance = consumptionChance; + this.item = item; + } + } + + static List droneTierRecipes = new ArrayList<>(); + static final String TIER_KEY = "drone_tier"; + static { + for (DroneTier tier : DroneTier.values()) { + + droneTierRecipes.add(GTRecipeBuilder.ofRaw() + .notConsumable(tier.item) // we need this so it doesn't match empty stuff + .chancedInput(tier.item, (int) (tier.consumptionChance * 10000), 0) + .addData(TIER_KEY, tier.ordinal()) + .build()); + } + } + + public DroneStationMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + if (!isRemote()) { + droneStations.put(this.getLevel().dimension().location(), this); + tickSubscription = this.subscribeServerTick(this::updateDroneHatches); + } + } + + @Override + public void onStructureInvalid() { + setWorkingEnabled(false); + super.onStructureInvalid(); + if (!isRemote()) { + droneStations.remove(this.getLevel().dimension().location(), this); + tickSubscription.unsubscribe(); + tickSubscription = null; + } + } + + // This method is called every tick + public void updateDroneHatches() { + if (energyContainer != null) { + if (!drainEnergy(false)) { + this.currentTier = null; + } + } + if (getOffsetTimer() % 20 == 0) { + connections.removeIf(connection -> !connection.isValid()); + updateDroneTier(); + } + } + + // Update the multi's currentTier + private void updateDroneTier() { + // Find current highest drone in bus + Optional maybeDroneRecipe = droneTierRecipes.stream().filter( + dr -> RecipeHelper.matchRecipe(this, dr).isSuccess()).findFirst(); + if (maybeDroneRecipe.isEmpty()) return; + GTRecipe droneRecipe = maybeDroneRecipe.get(); + currentTier = DroneTier.values()[droneRecipe.data.getInt(TIER_KEY)]; + // var itemHandlers = getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP); + // boolean found = false; + // for (DroneTier tier : DroneTier.values()) { + // for (var handler : itemHandlers) { + // if (!(handler instanceof NotifiableItemStackHandler itemHandler)) continue; + // for (var content : itemHandler.getContents()) { + // if (tier.item.equals(((ItemStack) content).getItem())) { + // this.currentTier = tier; + // found = true; + // break; + // } + // } + // } + // if (found) break; + // } + } + + public long getBlockLimit() { + if (currentTier == null) return 0; + return currentTier.range; + } + + public boolean drainEnergy(boolean simulate) { + if (currentTier == null) return false; + long powerCost = currentTier.EUt; + long resultEnergy = energyContainer.getEnergyStored() - powerCost; + if (resultEnergy >= 0L && resultEnergy <= energyContainer.getEnergyCapacity()) { + if (!simulate) + energyContainer.removeEnergy(powerCost); + setWorkingEnabled(true); + getRecipeLogic().setStatus(RecipeLogic.Status.WORKING); + return true; + } + return false; + } + + /** + * Attempt to fix a maintenance issue, potentially consuming the current max tier drone in the process + * + * @return whether the issue should be fixed + */ + public boolean fixMaintenanceIssue() { + // Note that this tries to consume a drone of the currentTier, which is only updated once per second. + if (currentTier == null) return false; + return RecipeHelper.handleRecipeIO(this, droneTierRecipes.get(currentTier.ordinal()), IO.IN, + getRecipeLogic().getChanceCaches()).isSuccess(); + // var itemHandlers = getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP); + // for (var handler : itemHandlers) { + // if (!(handler instanceof NotifiableItemStackHandler itemHandler)) continue; + // for (int i = 0; i < itemHandler.getSlots(); i++) { + // ItemStack stack = itemHandler.getStackInSlot(i); + // if (stack.getItem().equals(currentTier.item)) { + // // We have found the stack with the drone, try consuming and return true + // if (currentTier.consumptionChance == 0) return true; + // float randomValue = GTValues.RNG.nextFloat(); + // if (randomValue < currentTier.consumptionChance) { + // var stackTaken = itemHandler.extractItemInternal(i, 1, false); + // if (!stackTaken.getItem().equals(currentTier.item) || stackTaken.getCount() != 1) { + // CosmicCore.LOGGER.error("Something went wrong when extracting done for Drone Multi: " + + // stackTaken.getDisplayName()); + // return false; + // } + // } + // return true; + // } + // } + // + // } + // return false; + } + + @Override + public void setWorkingEnabled(boolean isWorkingAllowed) { + super.setWorkingEnabled(isWorkingAllowed); + } + + @Override + public void addDisplayText(List textList) { + super.addDisplayText(textList); + if (!this.connections.isEmpty()) { + textList.add(Component + .translatable("cosmiccore.multiblock.drone_station_machine.drone_amount", this.connections.size()) + .setStyle(Style.EMPTY.withColor(ChatFormatting.GREEN))); + } else { + textList.add(Component + .translatable("cosmiccore.multiblock.drone_station_machine.no_drones") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + + } + } + + // EXAMPLE CODE, REMOVE LATER MAYBE? + // Or keep in, in which case, this should be a feature and remove this comment :eugeneThumbsUpCool: + @Override + protected InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { + int i = 0; + System.out.println("Toggling all multis"); + for (var con : connections) { + toggleMultiblock(i); + i++; + } + return InteractionResult.SUCCESS; + } + + /** + * Force turns all connected machines in range on + */ + public void turnAllMachinesOn() { + System.out.println("Toggling all multis"); + for (int i = 0; i < connections.size(); i++) { + forceTurnOnMultiblock(i); + i++; + } + } + + /** + * Force turns all connected machines in range on + */ + public void turnAllMachinesOff() { + System.out.println("Toggling all multis"); + for (int i = 0; i < connections.size(); i++) { + forceTurnOffMultiblock(i); + i++; + } + } + + /** + * Disables a connected multi. + * + * @param index the index in the connections list + */ + public boolean toggleMultiblock(int index) { + if (isRemote()) return false; + if (index > connections.size()) return false; + DroneStationConnection connection = connections.get(index); + if (!connection.isValid()) return false; + if (connection.machine == null) return false; + if (!(connection.machine instanceof DroneMaintenanceInterfacePartMachine droneInterface)) return false; + MultiblockControllerMachine controller = droneInterface.getControllers().first(); + if (!(controller instanceof IControllable controllable)) return false; + controllable.setWorkingEnabled(!controllable.isWorkingEnabled()); + return true; + } + + /** + * Force turns all connected machines in range on + * + * @param index the index in the connections list + */ + public boolean forceTurnOnMultiblock(int index) { + if (isRemote()) return false; + if (index > connections.size()) return false; + DroneStationConnection connection = connections.get(index); + if (!connection.isValid()) return false; + if (connection.machine == null) return false; + if (!(connection.machine instanceof DroneMaintenanceInterfacePartMachine droneInterface)) return false; + MultiblockControllerMachine controller = droneInterface.getControllers().first(); + if (!(controller instanceof IControllable controllable)) return false; + if (controllable.isWorkingEnabled()) return false; + controllable.setWorkingEnabled(true); + return true; + } + + /** + * Force turns all connected machines in range off + * + * @param index the index in the connections list + */ + public boolean forceTurnOffMultiblock(int index) { + if (isRemote()) return false; + if (index > connections.size()) return false; + DroneStationConnection connection = connections.get(index); + if (!connection.isValid()) return false; + if (connection.machine == null) return false; + if (!(connection.machine instanceof DroneMaintenanceInterfacePartMachine droneInterface)) return false; + MultiblockControllerMachine controller = droneInterface.getControllers().first(); + if (!(controller instanceof IControllable controllable)) return false; + if (!controllable.isWorkingEnabled()) return false; + controllable.setSuspendAfterFinish(true); + return true; + } + + // TODO: Add functions for UI to disable/enable/read status/etc machines remotely + + @Override + public @NotNull Widget createUIWidget() { + var group = new WidgetGroup(0, 0, 182 + 8, 117 + 8); + group.addWidget(new DraggableScrollableWidgetGroup(4, 4, 182, 117).setBackground(getScreenTexture()) + .addWidget(new LabelWidget(4, 5, self().getBlockState().getBlock().getDescriptionId())) + .addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) + .textSupplier(this.getLevel().isClientSide ? null : this::addDisplayText) + .setMaxWidthLimit(150) + .clickHandler(this::handleDisplayClick))); + group.setBackground(GuiTextures.BACKGROUND_INVERSE); + group.addWidget(new ButtonWidget( + 6, + 80, + 178, + 20, + new GuiTextureGroup( + GuiTextures.BUTTON, + new TextTexture("cosmiccore.multiblock.reboot_powergrid")), + clickData -> turnAllMachinesOn())); + group.addWidget(new ButtonWidget( + 6, + 100, + 178, + 20, + new GuiTextureGroup( + GuiTextures.BUTTON, + new TextTexture("cosmiccore.multiblock.sleep_powergrid")), + clickData -> turnAllMachinesOff())); + return group; + } + + @Override + public ModularUI createUI(Player entityPlayer) { + return new ModularUI(198, 208, this, entityPlayer).widget(new FancyMachineUIWidget(this, 198, 208)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/HeatWorkableElectricMultiblockMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/HeatWorkableElectricMultiblockMachine.java new file mode 100644 index 000000000..1813d4bf7 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/HeatWorkableElectricMultiblockMachine.java @@ -0,0 +1,38 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.ghostipedia.cosmiccore.api.capability.recipe.IHeatContainer; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; + +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; +import lombok.Getter; + +import java.util.Map; + +@Getter +public class HeatWorkableElectricMultiblockMachine extends WorkableElectricMultiblockMachine { + + @Getter + private IHeatContainer heatContainer = null; + + public HeatWorkableElectricMultiblockMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + Map ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", Long2ObjectMaps::emptyMap); + for (IMultiPart part : getParts()) { + IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.BOTH); + if (part instanceof IHeatContainer container) { + this.heatContainer = container; + } + } + } + + ; +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/IMultithreadedMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/IMultithreadedMachine.java new file mode 100644 index 000000000..b84c5ead6 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/IMultithreadedMachine.java @@ -0,0 +1,33 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.MultithreadedRecipeLogic; + +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; + +/** + * Interface for machines that can run multiple independent recipe threads. + */ +public interface IMultithreadedMachine { + + /** + * Get the map of thread color to recipe logic. + */ + Int2ObjectMap getThreadLogicsMap(); + + /** + * Get the maximum number of threads this machine can support. + * Determined by energy hatch amperage. + */ + int getMaxThreadCount(); + + /** + * Get the current number of configured threads. + * Limited by available color-coded input buses. + */ + int getCurrentThreadCount(); + + /** + * Get the number of threads currently running recipes. + */ + int getRunningThreadCount(); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/IPBFMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/IPBFMachine.java new file mode 100644 index 000000000..5432e079b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/IPBFMachine.java @@ -0,0 +1,239 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.UITemplate; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IFluidRenderMulti; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.steam.SteamEnergyRecipeHandler; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; +import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; +import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.GTUtil; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; +import com.lowdragmc.lowdraglib.gui.widget.ComponentPanelWidget; +import com.lowdragmc.lowdraglib.gui.widget.DraggableScrollableWidgetGroup; +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.RequireRerender; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import org.jetbrains.annotations.NotNull; + +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class IPBFMachine extends WorkableMultiblockMachine implements IDisplayUIMachine, IFluidRenderMulti { + + public static final int MAX_PARALLELS = 8; + + private TickableSubscription hurtSubscription; + + @DescSynced + @RequireRerender + private @NotNull Set fluidBlockOffsets = new HashSet<>(); + + public IPBFMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + @Override + public @NotNull Set getFluidBlockOffsets() { + return fluidBlockOffsets; + } + + @Override + public void setFluidBlockOffsets(@NotNull Set fluidBlockOffsets) { + this.fluidBlockOffsets = fluidBlockOffsets; + } + + @Override + public void onUnload() { + super.onUnload(); + unsubscribe(hurtSubscription); + hurtSubscription = null; + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + IFluidRenderMulti.super.onStructureFormed(); + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + IFluidRenderMulti.super.onStructureInvalid(); + } + + @Override + public void addDisplayText(List textList) { + IDisplayUIMachine.super.addDisplayText(textList); + if (isFormed()) { + var handlers = getCapabilitiesFlat(IO.IN, EURecipeCapability.CAP); + if (!handlers.isEmpty() && handlers.get(0) instanceof SteamEnergyRecipeHandler steamHandler) { + if (steamHandler.getCapacity() > 0) { + long steamStored = steamHandler.getStored(); + textList.add(Component.translatable("gtceu.multiblock.steam.steam_stored", steamStored, + steamHandler.getCapacity())); + } + } + + if (!isWorkingEnabled()) { + textList.add(Component.translatable("gtceu.multiblock.work_paused")); + + } else if (isActive()) { + textList.add(Component.translatable("gtceu.multiblock.running")); + double currentInSec = (float) recipeLogic.getProgress() / 20.0f; + double maxInSec = (float) recipeLogic.getDuration() / 20.0f; + int currentProgress = (int) (recipeLogic.getProgressPercent() * 100); + textList.add(Component.translatable("gtceu.multiblock.parallel", MAX_PARALLELS)); + textList.add( + Component.translatable( + "gtceu.multiblock.progress", + String.format("%.2f", (float) currentInSec), + String.format("%.2f", (float) maxInSec), + currentProgress)); + } else { + textList.add(Component.translatable("gtceu.multiblock.idling")); + } + + if (recipeLogic.isWaiting()) { + textList.add(Component.translatable("gtceu.multiblock.steam.low_steam") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + } + } + } + + @Override + public ModularUI createUI(Player entityPlayer) { + var screen = new DraggableScrollableWidgetGroup(7, 4, 182, 121).setBackground(getScreenTexture()); + screen.addWidget(new LabelWidget(4, 5, self().getBlockState().getBlock().getDescriptionId())); + screen.addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) + .setMaxWidthLimit(150) + .clickHandler(this::handleDisplayClick)); + return new ModularUI(196, 216, this, entityPlayer) + .background(GuiTextures.BACKGROUND_STEAM.get(true)) + .widget(screen) + .widget(UITemplate.bindPlayerInventory(entityPlayer.getInventory(), + GuiTextures.SLOT_STEAM.get(true), 7, 134, + true)); + } + + @Override + public void notifyStatusChanged(RecipeLogic.Status oldStatus, RecipeLogic.Status newStatus) { + super.notifyStatusChanged(oldStatus, newStatus); + if (newStatus == RecipeLogic.Status.WORKING) { + this.hurtSubscription = subscribeServerTick(this.hurtSubscription, this::hurtEntitiesAndBreakSnow); + } else if (oldStatus == RecipeLogic.Status.WORKING && hurtSubscription != null) { + unsubscribe(hurtSubscription); + hurtSubscription = null; + } + } + + // Smoke VFX + @Override + @OnlyIn(Dist.CLIENT) + public void clientTick() { + super.clientTick(); + if (recipeLogic.isWorking()) { + var pos = this.getBlockPos(); + var facing = this.getFrontFacing().getOpposite(); + float xPos = facing.getStepX() * 0.76F + pos.getX() + 0.5F; + float yPos = facing.getStepY() * 0.76F + pos.getY() + 0.25F; + float zPos = facing.getStepZ() * 0.76F + pos.getZ() + 0.5F; + + float ySpd = facing.getStepY() * 0.1F + 0.2F + 0.1F * GTValues.RNG.nextFloat(); + getLevel().addParticle(ParticleTypes.LARGE_SMOKE, xPos, yPos, zPos, 0, ySpd, 0); + } + } + + public static ModifierFunction recipeModifier(@NotNull MetaMachine machine, @NotNull GTRecipe recipe) { + if (RecipeHelper.getRecipeEUtTier(recipe) > GTValues.LV) return ModifierFunction.NULL; + long euTick = RecipeHelper.getRecipeEUtTier(recipe); + int parallel = ParallelLogic.getParallelAmount(machine, recipe, 8); + return ModifierFunction.builder() + .inputModifier(ContentModifier.multiplier(parallel)) + .outputModifier(ContentModifier.multiplier(parallel)) + .durationMultiplier(parallel * 0.75) + .parallels(parallel) + .build(); + } + + @Override + public IGuiTexture getScreenTexture() { + return GuiTextures.DISPLAY_STEAM.get(true); + } + + @Override + public void animateTick(RandomSource random) { + if (this.isActive()) { + final BlockPos pos = getBlockPos(); + float x = pos.getX() + 0.5F; + float z = pos.getZ() + 0.5F; + + final var facing = getFrontFacing(); + final float horizontalOffset = GTValues.RNG.nextFloat() * 0.6F - 0.3F; + final float y = pos.getY() + GTValues.RNG.nextFloat() * 0.375F + 0.3F; + + if (facing.getAxis() == Direction.Axis.X) { + if (facing.getAxisDirection() == Direction.AxisDirection.POSITIVE) x += 0.52F; + else x -= 0.52F; + z += horizontalOffset; + } else if (facing.getAxis() == Direction.Axis.Z) { + if (facing.getAxisDirection() == Direction.AxisDirection.POSITIVE) z += 0.52F; + else z -= 0.52F; + x += horizontalOffset; + } + if (ConfigHolder.INSTANCE.machines.machineSounds && GTValues.RNG.nextDouble() < 0.1) { + getLevel().playLocalSound(x, y, z, SoundEvents.FURNACE_FIRE_CRACKLE, SoundSource.BLOCKS, 1.0F, 1.0F, + false); + } + getLevel().addParticle(ParticleTypes.LARGE_SMOKE, x, y, z, 0, 0, 0); + getLevel().addParticle(ParticleTypes.FLAME, x, y, z, 0, 0, 0); + } + } + + private void hurtEntitiesAndBreakSnow() { + BlockPos middlePos = self().getBlockPos().offset(getFrontFacing().getOpposite().getNormal()); + getLevel().getEntities(null, new AABB(middlePos)).forEach(e -> e.hurt(e.damageSources().lava(), 3.0f)); + + if (getOffsetTimer() % 10 == 0) { + BlockState state = getLevel().getBlockState(middlePos); + GTUtil.tryBreakSnow(getLevel(), middlePos, state, true); + } + } + + @Override + public @NotNull Set saveOffsets() { + return Collections.singleton(new BlockPos(getFrontFacing().getOpposite().getNormal())); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/IrisMultiblockMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/IrisMultiblockMachine.java new file mode 100644 index 000000000..efe7c9a4a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/IrisMultiblockMachine.java @@ -0,0 +1,689 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarIrisProvider; +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarModuleReceiver; +import com.ghostipedia.cosmiccore.client.gui.widget.stellar.StellarFancyUIWidget; +import com.ghostipedia.cosmiccore.client.gui.widget.stellar.StellarIrisWidget; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; +import com.ghostipedia.cosmiccore.common.data.CosmicSounds; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.sound.AutoReleasedSound; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.annotation.UpdateListener; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.EnumSet; +import java.util.List; +import java.util.Set; + +import static com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage.BLACK_HOLE; +import static com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage.DEATH; + +public class IrisMultiblockMachine extends WorkableElectricMultiblockMachine implements IStellarIrisProvider { + + + @Persisted + private final NotifiableItemStackHandler inventory; + + protected boolean ignite; + protected boolean isFuelable; + protected Object workingSound; + + @Persisted + @DescSynced + @UpdateListener(methodName = "onStageSynced") + private Stage stage = Stage.EMPTY; + + /** + * Called when the stage field is synced from server to client. + * Parameters must match the field type (Stage). + */ + @OnlyIn(Dist.CLIENT) + @SuppressWarnings("unused") + protected void onStageSynced(Stage newValue, Stage oldValue) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn( + "[IrisMultiblockMachine] CLIENT onStageSynced: {} -> {}", oldValue, newValue); + this.scheduleRenderUpdate(); + soundTick(); + } + + /** + * Custom setter with debug logging to track stage changes. + */ + public void setStage(Stage newStage) { + Stage oldStage = this.stage; + this.stage = newStage; + // Debug: log all stage changes with stack trace for unusual transitions + if (oldStage != newStage) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn( + "[IrisMultiblockMachine] setStage: {} -> {}", oldStage, newStage); + // If transitioning TO DEATH from EMPTY, log stack trace to find the culprit + if (oldStage == Stage.EMPTY && newStage == Stage.DEATH) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn( + "[IrisMultiblockMachine] SUSPICIOUS: EMPTY->DEATH transition! Stack trace:", + new Exception("Stack trace")); + } + } + } + + @Override + public Stage getStage() { + return stage; + } + + public NotifiableItemStackHandler getInventory() { + return inventory; + } + + public boolean isIgnite() { + return ignite; + } + + public boolean isFuelable() { + return isFuelable; + } + + /** + * Custom star color (RGB, no alpha). -1 means use default stage-based color. + * Persisted and synced to client for rendering. + */ + @Persisted + @DescSynced + private int customStarColor = -1; + + public int getCustomStarColor() { + return customStarColor; + } + + public void setCustomStarColor(int customStarColor) { + this.customStarColor = customStarColor; + } + + @Persisted + @DescSynced + private int lifetimePrestigePoints = 0; + + @Persisted + @DescSynced + private int spendablePoints = 0; + + @Persisted + @DescSynced + private int prestigeTier = 0; + + @Persisted + @DescSynced + private int ascensionLevel = 0; + + @Persisted + @DescSynced + private Set unlockedUpgrades = EnumSet.noneOf(StellarIrisUpgrade.class); + + @Persisted + @DescSynced + private int[] repeatableUpgradeLevels = new int[StellarIrisUpgrade.values().length]; + + @Persisted + @DescSynced + private int consecutivePrestiges = 0; + + @DescSynced + private boolean prestigeAnimationActive = false; + + @DescSynced + private int lastPrestigePointsEarned = 0; + + private List connectedModules = new ArrayList<>(); + private List moduleSlotPositions = new ArrayList<>(); + + public enum Stage { + EMPTY, + GROWING, + STAR, + SUPERSTAR, + BLACK_HOLE, + DEATH, + DEATH_GRACEFUL; + } + + public IrisMultiblockMachine(BlockEntityCreationInfo holder) { + super(holder); + this.inventory = new NotifiableItemStackHandler(this, 1, IO.NONE, IO.BOTH); + // Debug: log initial stage + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn( + "[IrisMultiblockMachine] Constructor: initial stage={}", stage); + } + + @OnlyIn(Dist.CLIENT) + @SuppressWarnings("unused") + protected void onStatusSynced(RecipeLogic.Status newValue, RecipeLogic.Status oldValue) { + this.scheduleRenderUpdate(); + soundTick(); + } + + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + + // Clear old module connections + if (connectedModules != null) { + connectedModules.forEach(m -> m.setStellarIris(null)); + } + + // Get modules found during structure check (from moduleSlotPredicate) + Set modules = getMultiblockState().getMatchContext() + .getOrDefault("stellarModules", Collections.emptySet()); + + this.connectedModules = new ArrayList<>(modules); + + // Establish connections - tell each module about this Iris + for (IStellarModuleReceiver module : connectedModules) { + module.setStellarIris(this); + } + } + + /** + * Registers a module with this Iris. Called by modules when they form or detect a nearby Iris. + * + * @param module The module to register + * @return true if registration was successful + */ + public boolean registerModule(IStellarModuleReceiver module) { + if (!isFormed() || module == null) return false; + + if (!connectedModules.contains(module)) { + connectedModules.add(module); + module.setStellarIris(this); + + // Store position for tracking + if (module instanceof MetaMachine metaMachine) { + moduleSlotPositions.add(metaMachine.getBlockPos().immutable()); + // Debug logging + if (getLevel() != null && !getLevel().isClientSide) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIris] Module registered: {} at {}. Total modules: {}", + metaMachine.getBlockState().getBlock().getDescriptionId(), + metaMachine.getBlockPos(), + connectedModules.size()); + } + } + return true; + } + return false; + } + + /** + * Unregisters a module from this Iris. Called when a module is broken or invalidated. + * + * @param module The module to unregister + */ + public void unregisterModule(IStellarModuleReceiver module) { + if (module == null) return; + + if (connectedModules.remove(module)) { + module.setStellarIris(null); + + // Remove position tracking + if (module instanceof MetaMachine metaMachine) { + moduleSlotPositions.remove(metaMachine.getBlockPos()); + } + } + } + + /** + * Rescans for modules by triggering a structure recheck. + * This is a heavier operation but ensures consistency. + */ + public void rescanModules() { + if (!isFormed()) return; + + // Trigger structure recheck which will re-run the predicates + getMultiblockState().setError(null); + checkPatternWithLock(); + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + + // Sever all module connections + if (connectedModules != null) { + connectedModules.forEach(m -> m.setStellarIris(null)); + connectedModules.clear(); + } + } + + // -------- IStellarIrisProvider Implementation -------- + + @Override + public int getMaxHeat() { + // Base heat increases with stage + return switch (stage) { + case STAR -> 3600; + case SUPERSTAR -> 7200; + case BLACK_HOLE -> 12000; + default -> 0; + }; + } + + @Override + public double getSpeedBonus() { + // Base speed multiplier from stage + double base = switch (stage) { + case STAR -> 1.0; + case SUPERSTAR -> 1.5; + case BLACK_HOLE -> 2.0; + default -> 0.0; + }; + + // Apply upgrade bonuses + if (hasUpgrade(StellarIrisUpgrade.TEMPORAL_ACCELERATION)) base += 0.15; + if (hasUpgrade(StellarIrisUpgrade.STELLAR_COMPRESSION) && + (stage == Stage.SUPERSTAR || stage == Stage.BLACK_HOLE)) + base += 0.25; + if (hasUpgrade(StellarIrisUpgrade.VOID_WHISPERS) && stage == Stage.BLACK_HOLE) base += 0.5; + + // Singularity Engine capstone doubles speed bonuses + if (hasUpgrade(StellarIrisUpgrade.SINGULARITY_ENGINE)) base *= 2.0; + + return base; + } + + @Override + public double getEnergyDiscount() { + // Base energy discount from stage (1.0 = no discount, lower = cheaper) + double discount = switch (stage) { + case STAR -> 1.0; + case SUPERSTAR -> 0.8; + case BLACK_HOLE -> 0.6; + default -> 1.0; + }; + + // Apply upgrade bonuses + if (hasUpgrade(StellarIrisUpgrade.SUPERCONDUCTING_GRID)) discount -= 0.10; + if (hasUpgrade(StellarIrisUpgrade.MASS_EFFICIENCY)) discount -= 0.15; + + // Singularity Engine capstone + if (hasUpgrade(StellarIrisUpgrade.SINGULARITY_ENGINE)) discount -= 0.40; + + return Math.max(0.1, discount); + } + + @Override + public int getParallelLimit() { + // Base parallel limit from stage + int base = switch (stage) { + case STAR -> 4; + case SUPERSTAR -> 8; + case BLACK_HOLE -> 16; + default -> 0; + }; + + // Graviton Lens: +1 parallel per stage + if (hasUpgrade(StellarIrisUpgrade.GRAVITON_LENS)) { + base += switch (stage) { + case STAR -> 1; + case SUPERSTAR -> 2; + case BLACK_HOLE -> 3; + default -> 0; + }; + } + + // Parallel Manifold: +2 base + if (hasUpgrade(StellarIrisUpgrade.PARALLEL_MANIFOLD)) base += 2; + + // Singularity Engine capstone doubles parallel + if (hasUpgrade(StellarIrisUpgrade.SINGULARITY_ENGINE)) base *= 2; + + return base; + } + + /** + * @return list of currently connected modules (read-only view) + */ + public List getConnectedModules() { + return Collections.unmodifiableList(connectedModules); + } + + /** + * @return number of connected modules + */ + public int getConnectedModuleCount() { + return connectedModules.size(); + } + + public void setStarStage() { + Stage[] values = Stage.values(); + int nextVal = (getStage().ordinal() + 1) % values.length; + setStage(values[nextVal]); + } + + // -------- Prestige System Methods -------- + + /** + * Checks if the item in the star seed slot is a prestige item (Programmable Mote). + * + * @return true if a prestige item is in the slot + */ + public boolean hasPrestigeItem() { + ItemStack stack = inventory.getStackInSlot(0); + return !stack.isEmpty() && stack.is(CosmicItems.PROGRAMMABLE_MOTE.asItem()); + } + + /** + * Checks if the iris has an active star (not EMPTY or DEATH states). + * Required for prestige to be triggered. + * + * @return true if there's an active star to consume + */ + public boolean hasActiveStar() { + return stage != Stage.EMPTY && stage != Stage.DEATH && stage != Stage.DEATH_GRACEFUL; + } + + /** + * Called when the prestige button is broken (after 3 cracks). + * Starts the prestige animation sequence - star consumption happens over time. + * The actual point award and stage reset happen when animation completes. + */ + public void triggerPrestige() { + if (!hasPrestigeItem() || !hasActiveStar()) { + return; + } + + // Consume the prestige item immediately + inventory.getStackInSlot(0).shrink(1); + + // Calculate points to award (50 per star for now) + lastPrestigePointsEarned = calculatePrestigePoints(); + + // Log the prestige event + if (getLevel() != null && !getLevel().isClientSide) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIris] PRESTIGE TRIGGERED at {} - Stage: {}, Points: {}", + getBlockPos(), stage, lastPrestigePointsEarned); + } + + // Start the animation - UI will handle the visual sequence + // Animation duration: 5s shrink + 3s fade = 8s total (160 ticks) + prestigeAnimationActive = true; + + // Note: Stage reset and point award happen when completePrestige() is called + // This is triggered by the UI after animation completes + } + + /** + * Called when the prestige animation completes (after ~8 seconds). + * Awards points and resets the star. + */ + public void completePrestige() { + if (!prestigeAnimationActive) return; + + // Award the points (both lifetime and spendable) + lifetimePrestigePoints += lastPrestigePointsEarned; + spendablePoints += lastPrestigePointsEarned; + + // Track consecutive prestiges for momentum bonus + consecutivePrestiges++; + + // Check for tier advancement + int newTier = calculatePrestigeTier(lifetimePrestigePoints); + if (newTier > prestigeTier) { + prestigeTier = newTier; + if (getLevel() != null && !getLevel().isClientSide) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIris] PRESTIGE TIER UP! Now tier {} with {} total points", + prestigeTier, lifetimePrestigePoints); + } + } + + // Reset the star + setStage(Stage.EMPTY); + + // End animation state + prestigeAnimationActive = false; + + if (getLevel() != null && !getLevel().isClientSide) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIris] Prestige complete. Lifetime: {}, Spendable: {}, Tier: {}", + lifetimePrestigePoints, spendablePoints, prestigeTier); + } + } + + /** + * Calculates prestige points for consuming the current star. + * Base points vary by stage, then multiplied by upgrades. + */ + private int calculatePrestigePoints() { + // Base points by stage + int base = switch (stage) { + case STAR -> 50; + case SUPERSTAR -> 100; + case BLACK_HOLE -> 200; + default -> 25; + }; + + // Resonant Sacrifice: SUPERSTAR gives BLACK_HOLE rewards + if (hasUpgrade(StellarIrisUpgrade.RESONANT_SACRIFICE) && stage == Stage.SUPERSTAR) { + base = 200; + } + + // Void Harvester: BLACK_HOLE gives 3x + if (hasUpgrade(StellarIrisUpgrade.VOID_HARVESTER) && stage == Stage.BLACK_HOLE) { + base *= 3; + } + + // Apply percentage bonuses + double multiplier = 1.0; + + // Shard Collector: +20% + if (hasUpgrade(StellarIrisUpgrade.SHARD_COLLECTOR)) multiplier += 0.20; + + // Point Amplifier: +30% + if (hasUpgrade(StellarIrisUpgrade.POINT_AMPLIFIER)) multiplier += 0.30; + + // Infinite Recursion capstone: 2x + if (hasUpgrade(StellarIrisUpgrade.INFINITE_RECURSION)) multiplier *= 2.0; + + // Prestige Momentum: +10% per consecutive prestige (max 50%) + if (hasUpgrade(StellarIrisUpgrade.PRESTIGE_MOMENTUM)) { + multiplier += Math.min(consecutivePrestiges * 0.10, 0.50); + } + + return (int) (base * multiplier); + } + + /** + * Determines prestige tier based on total accumulated points. + * Tiers unlock upgrade rows. + */ + private int calculatePrestigeTier(int totalPoints) { + if (totalPoints >= 1200) return 5; + if (totalPoints >= 600) return 4; + if (totalPoints >= 300) return 3; + if (totalPoints >= 150) return 2; + if (totalPoints >= 50) return 1; + return 0; + } + + // -------- Upgrade System Methods -------- + + /** + * Check if a non-repeatable upgrade is owned. + */ + public boolean hasUpgrade(StellarIrisUpgrade upgrade) { + if (upgrade.isRepeatable()) { + return getUpgradeLevel(upgrade) > 0; + } + return unlockedUpgrades.contains(upgrade); + } + + public int getUpgradeLevel(StellarIrisUpgrade upgrade) { + if (upgrade.isRepeatable()) { + int ordinal = upgrade.ordinal(); + return (ordinal >= 0 && ordinal < repeatableUpgradeLevels.length) ? repeatableUpgradeLevels[ordinal] : 0; + } + return unlockedUpgrades.contains(upgrade) ? 1 : 0; + } + + public Set getUnlockedUpgrades() { + return Collections.unmodifiableSet(unlockedUpgrades); + } + + public int[] getRepeatableUpgradeLevels() { + return repeatableUpgradeLevels.clone(); + } + + public boolean canUnlockUpgrade(StellarIrisUpgrade upgrade) { + if (upgrade.isRepeatable()) { + return getUpgradeLevel(upgrade) < upgrade.getMaxLevel(); + } + return upgrade.canUnlock(unlockedUpgrades, prestigeTier); + } + + public boolean tryUnlockUpgrade(StellarIrisUpgrade upgrade) { + if (upgrade.isRepeatable()) return tryLevelUpRepeatable(upgrade); + if (!canUnlockUpgrade(upgrade)) return false; + if (spendablePoints < upgrade.getCost()) return false; + + spendablePoints -= upgrade.getCost(); + unlockedUpgrades.add(upgrade); + return true; + } + + private boolean tryLevelUpRepeatable(StellarIrisUpgrade upgrade) { + if (!upgrade.isRepeatable()) return false; + + int currentLevel = getUpgradeLevel(upgrade); + if (currentLevel >= upgrade.getMaxLevel()) return false; + + int cost = upgrade.getCostForLevel(currentLevel + 1); + if (spendablePoints < cost) return false; + + spendablePoints -= cost; + int ordinal = upgrade.ordinal(); + if (ordinal >= 0 && ordinal < repeatableUpgradeLevels.length) { + repeatableUpgradeLevels[ordinal] = currentLevel + 1; + } + return true; + } + + public int getAscensionLevel() { + return ascensionLevel; + } + + public int getLifetimePrestigePoints() { + return lifetimePrestigePoints; + } + + public int getSpendablePoints() { + return spendablePoints; + } + + /** + * @return current prestige tier + */ + public int getPrestigeTier() { + return prestigeTier; + } + + /** + * @return true if prestige animation is currently playing + */ + public boolean isPrestigeAnimationActive() { + return prestigeAnimationActive; + } + + /** + * @return points earned in most recent prestige (for animation display) + */ + public int getLastPrestigePointsEarned() { + return lastPrestigePointsEarned; + } + + /** + * Manually set prestige animation state (for client sync). + */ + public void setPrestigeAnimationActive(boolean active) { + this.prestigeAnimationActive = active; + } + + @Override + public void clientTick() { + super.clientTick(); + this.soundTick(); + } + + @OnlyIn(Dist.CLIENT) + public void soundTick() { + if (isFormed) { + var sound = CosmicSounds.CHEMVAT; + if (stage == DEATH) { + sound = CosmicSounds.STELLAR_BODY_DYING; + } + if (stage == BLACK_HOLE) { + sound = CosmicSounds.BLACK_HOLE_CRY; + } + + if (workingSound instanceof AutoReleasedSound soundEntry) { + if (soundEntry.soundEntry == sound && !soundEntry.isStopped()) { + return; + } + soundEntry.release(); + workingSound = null; + } + if (sound != null) { + workingSound = sound.playAutoReleasedSound( + () -> this.shouldWorkingPlaySound() && !this.isRemoved() && + this.getLevel().isLoaded(this.getBlockPos()) && + MetaMachine.getMachine(this.getLevel(), this.getBlockPos()) == this, + RelativeDirection.offsetPos(this.getBlockPos(), getFrontFacing(), getUpwardsFacing(), isFlipped, 0, + 0, -47), + true, 0, 1, 1); + } + + } else if (workingSound instanceof AutoReleasedSound soundEntry) { + soundEntry.release(); + workingSound = null; + } + } + + @Override + public Widget createUIWidget() { + return new StellarIrisWidget(() -> this); + } + + @Override + public void addDisplayText(List textList) { + if (isFormed()) { + textList.add(Component.translatable(stage.toString())); + textList.add(Component.translatable("cosmiccore.multiblock.iris.star_stage_sustain")); + } + } + + @Override + public ModularUI createUI(Player entityPlayer) { + return new ModularUI(176, 166, this, entityPlayer) + .widget(new StellarFancyUIWidget(this, 176, 166, this::getStage)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/LinkedWorkableElectricMultiblockMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/LinkedWorkableElectricMultiblockMachine.java new file mode 100644 index 000000000..e2c86d111 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/LinkedWorkableElectricMultiblockMachine.java @@ -0,0 +1,609 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock; +import com.ghostipedia.cosmiccore.api.data.savedData.LinkEntry; +import com.ghostipedia.cosmiccore.api.data.savedData.LinkedMultiblockSavedData; +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper; +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper.RolePair; +import com.ghostipedia.cosmiccore.utils.ItemData; + +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.common.machine.owner.FTBOwner; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.GlobalPos; +import net.minecraft.core.component.DataComponents; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.network.chat.Component; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.fluids.FluidStack; + +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.function.Predicate; + +/** + * Base class for multiblocks that support cross-dimensional linking. + *

+ * Subclasses should override: + *

    + *
  • {@link #canLinkTo(GlobalPos, ILinkedMultiblock)} - Type compatibility checks
  • + *
  • {@link #getLinkRole()} - Define role preference (PEER, CONTROLLER, REMOTE)
  • + *
  • {@link #getMaxPartners()} - Override if more/fewer than 4 partners needed
  • + *
  • {@link #onLinkEstablished(GlobalPos)} - React to new links
  • + *
  • {@link #onLinkBroken(GlobalPos)} - Cleanup when links break
  • + *
+ */ +public abstract class LinkedWorkableElectricMultiblockMachine extends WorkableElectricMultiblockMachine + implements ILinkedMultiblock { + + + private static final String DATASTICK_TAG_KEY = "cosmiccore:link_data"; + private static final String TAG_POS = "Pos"; + private static final String TAG_OWNER = "Owner"; + + /** + * Local cache of known partners, rebuilt from SavedData on structure form. + * Used to detect changes for lifecycle callbacks. + * NOT persisted - rebuilt from SavedData which is the source of truth. + */ + protected Set knownPartners = new HashSet<>(); + + public LinkedWorkableElectricMultiblockMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + + // ==================== ILinkedMultiblock Implementation ==================== + + @Override + public GlobalPos getGlobalPos() { + if (getLevel() instanceof ServerLevel serverLevel) { + return GlobalPos.of(serverLevel.dimension(), getBlockPos()); + } + return null; + } + + @Override + @Nullable + public UUID getTeamUUID() { + var team = getOwner() instanceof FTBOwner ftbOwner ? ftbOwner.getPlayerTeam(getOwnerUUID()) : null; + return team != null ? team.getTeamId() : getOwnerUUID(); + } + + @Override + public Set getLinkedPartners() { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return Collections.emptySet(); + } + + UUID owner = getTeamUUID(); + if (owner == null) return Collections.emptySet(); + + LinkedMultiblockSavedData savedData = LinkedMultiblockSavedData.getOrCreate(serverLevel); + return savedData.getPartnerPositions(owner, getGlobalPos()); + } + + @Override + public void processLinkNotifications() { + if (!(getLevel() instanceof ServerLevel serverLevel)) return; + + UUID owner = getTeamUUID(); + if (owner == null) return; + + Set currentPartners = getLinkedPartners(); + + // Find new partners (in SavedData but not in our cache) + for (GlobalPos partner : currentPartners) { + if (!knownPartners.contains(partner)) { + onLinkEstablished(partner); + } + } + + // Find removed partners (in our cache but not in SavedData) + Set removed = new HashSet<>(knownPartners); + removed.removeAll(currentPartners); + for (GlobalPos partner : removed) { + onLinkBroken(partner); + } + + // Update cache + knownPartners = new HashSet<>(currentPartners); + } + + // ==================== Lifecycle ==================== + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + // Process any pending link notifications from when we were unloaded + processLinkNotifications(); + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + // Don't remove links when structure breaks - links persist to SavedData + // They'll be cleaned up when the machine is actually destroyed + } + + @Override + public void onMachineDestroyed() { + super.onMachineDestroyed(); + + if (getLevel() instanceof ServerLevel serverLevel) { + UUID owner = getTeamUUID(); + GlobalPos myPos = getGlobalPos(); + + if (owner != null && myPos != null) { + // Release any force-loaded chunks + LinkedMultiblockHelper.releaseAllTickets(serverLevel.getServer(), myPos); + + // Remove all links from SavedData + LinkedMultiblockSavedData savedData = LinkedMultiblockSavedData.getOrCreate(serverLevel); + savedData.removeAllLinks(owner, myPos); + + // Notify partners (if loaded) + for (GlobalPos partner : knownPartners) { + ILinkedMultiblock partnerMachine = LinkedMultiblockHelper.getLinkedMachine( + serverLevel.getServer(), partner); + if (partnerMachine != null) { + partnerMachine.onLinkBroken(myPos); + } + } + } + } + } + + // ==================== Datastick Handling ==================== + + @Override + public InteractionResult onDataStickShiftUse(Player player, ItemStack dataStick) { + if (isRemote()) { + return InteractionResult.SUCCESS; + } + + GlobalPos myPos = getGlobalPos(); + UUID owner = getTeamUUID(); + + if (myPos == null || owner == null) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.not_ready") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // Write link data to datastick + CompoundTag linkData = new CompoundTag(); + GlobalPos.CODEC.encodeStart(NbtOps.INSTANCE, myPos) + .result() + .ifPresent(encoded -> linkData.put(TAG_POS, encoded)); + linkData.putUUID(TAG_OWNER, owner); + + ItemData.mutateTag(dataStick, rootTag -> rootTag.put(DATASTICK_TAG_KEY, linkData)); + + String machineName = getDefinition().getName(); + dataStick.set(DataComponents.CUSTOM_NAME, Component.translatable("cosmiccore.datastick.link_copied", machineName)); + + player.sendSystemMessage(Component.translatable("cosmiccore.link.copied", machineName) + .withStyle(ChatFormatting.GREEN)); + + return InteractionResult.SUCCESS; + } + + @Override + public InteractionResult onDataStickUse(Player player, ItemStack dataStick) { + if (isRemote()) { + return InteractionResult.sidedSuccess(true); + } + + CompoundTag rootTag = ItemData.readTag(dataStick); + if (!rootTag.contains(DATASTICK_TAG_KEY)) { + return InteractionResult.PASS; + } + + CompoundTag linkData = rootTag.getCompound(DATASTICK_TAG_KEY); + + // Parse partner info from datastick + GlobalPos partnerPos = GlobalPos.CODEC + .decode(NbtOps.INSTANCE, linkData.get(TAG_POS)) + .result() + .map(pair -> pair.getFirst()) + .orElse(null); + + if (partnerPos == null) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.invalid_data") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + UUID partnerOwner = linkData.getUUID(TAG_OWNER); + + // Attempt to establish link + return tryLink(player, partnerPos, partnerOwner); + } + + /** + * Attempt to establish a link with the partner machine. + * Handles all validation, negotiation, and persistence. + */ + protected InteractionResult tryLink(Player player, GlobalPos partnerPos, UUID partnerOwner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return InteractionResult.FAIL; + } + + MinecraftServer server = serverLevel.getServer(); + GlobalPos myPos = getGlobalPos(); + UUID myOwner = getTeamUUID(); + + // === Validation === + + // Self-link check + if (myPos.equals(partnerPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.cannot_self_link") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // NOTE: We intentionally do NOT check partnerOwner from datastick NBT here. + // The datastick may be stale (team changed since it was written). + // Ownership is verified at runtime after loading the partner machine. + + // Partner limit check (this machine) + Set currentPartners = getLinkedPartners(); + if (currentPartners.size() >= getMaxPartners() && !currentPartners.contains(partnerPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.limit_reached_self") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // Already linked check + if (currentPartners.contains(partnerPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.already_linked") + .withStyle(ChatFormatting.YELLOW)); + return InteractionResult.FAIL; + } + + // === Load and verify partner === + // SECURITY: Always load partner to verify ownership and compatibility + boolean needsUnload = false; + if (!LinkedMultiblockHelper.isPartnerOnline(server, partnerPos)) { + // Try to force-load partner temporarily + if (!LinkedMultiblockHelper.forceLoadPartnerChunk(server, myPos, partnerPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.partner_not_loaded") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + needsUnload = true; + } + + try { + MetaMachine rawPartner = LinkedMultiblockHelper.getMachine(server, partnerPos); + if (rawPartner == null) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.partner_missing") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + if (!(rawPartner instanceof ILinkedMultiblock partnerMachine)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.not_linkable") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // Verify ownership matches at runtime + UUID actualPartnerOwner = partnerMachine.getTeamUUID(); + if (!Objects.equals(myOwner, actualPartnerOwner)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.different_owner") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // === Partner capacity check === + Set partnerLinks = partnerMachine.getLinkedPartners(); + if (partnerLinks.size() >= partnerMachine.getMaxPartners() && !partnerLinks.contains(myPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.limit_reached_partner") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // === Role Negotiation === + RolePair roles = LinkedMultiblockHelper.negotiateRoles(getLinkRole(), partnerMachine.getLinkRole()); + if (roles == null) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.incompatible_roles", + getLinkRole().name(), partnerMachine.getLinkRole().name()) + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // === Type compatibility check === + if (!canLinkTo(partnerPos, partnerMachine)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.incompatible_self") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + if (!partnerMachine.canLinkTo(myPos, this)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.incompatible_partner") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // === Persist link === + LinkedMultiblockSavedData savedData = LinkedMultiblockSavedData.getOrCreate(serverLevel); + savedData.link(myOwner, myPos, partnerPos, roles.aRole(), roles.bRole()); + + // === Notify both machines === + onLinkEstablished(partnerPos); + knownPartners.add(partnerPos); + + partnerMachine.onLinkEstablished(myPos); + + // Success feedback + String myName = getDefinition().getName(); + String partnerName = rawPartner.getDefinition().getName(); + player.sendSystemMessage(Component.translatable("cosmiccore.link.established", myName, partnerName) + .withStyle(ChatFormatting.GREEN)); + + return InteractionResult.SUCCESS; + + } finally { + // Release temporary chunk load + if (needsUnload) { + LinkedMultiblockHelper.releasePartnerChunk(server, myPos, partnerPos); + } + } + } + + // ==================== Default Implementations ==================== + + @Override + public boolean canLinkTo(GlobalPos partner, ILinkedMultiblock partnerMachine) { + // Default: allow linking to any ILinkedMultiblock + // Subclasses should override for type-specific restrictions + return true; + } + + @Override + public LinkRole getLinkRole() { + // Default: bidirectional peer + return LinkRole.PEER; + } + + @Override + public void onLinkEstablished(GlobalPos partner) { + // Default: just log + CosmicCore.LOGGER.debug("Link established: {} -> {}", getGlobalPos(), partner); + } + + @Override + public void onLinkBroken(GlobalPos partner) { + // Default: just log and update cache + CosmicCore.LOGGER.debug("Link broken: {} -> {}", getGlobalPos(), partner); + knownPartners.remove(partner); + } + + // ==================== Utility Methods ==================== + + /** + * Get a linked partner's machine instance. + * Does NOT force-load chunks - returns null if partner is unloaded. + */ + @Nullable + protected ILinkedMultiblock getPartnerMachine(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return null; + } + return LinkedMultiblockHelper.getLinkedMachine(serverLevel.getServer(), partner); + } + + /** + * Check if this machine can query the given partner (based on effective role). + */ + protected boolean canQueryPartner(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + return LinkedMultiblockHelper.canQuery(serverLevel.getServer(), owner, getGlobalPos(), partner); + } + + /** + * Get the effective role for this machine in relation to a specific partner. + */ + @Nullable + protected LinkRole getEffectiveRole(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return null; + } + UUID owner = getTeamUUID(); + if (owner == null) return null; + + LinkedMultiblockSavedData savedData = LinkedMultiblockSavedData.getOrCreate(serverLevel); + LinkEntry link = savedData.getLinkTo(owner, getGlobalPos(), partner); + return link != null ? link.effectiveRole() : null; + } + + // ==================== Partner Resource Queries ==================== + + /** + * Check if a partner has a specific item in its input handlers. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @param itemPredicate Predicate to test items (e.g., stack -> stack.is(Items.DIAMOND)) + * @return true if partner has matching item, false otherwise or if unavailable + */ + protected boolean partnerHasItem(GlobalPos partner, Predicate itemPredicate) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + + return LinkedMultiblockHelper.partnerHasItem( + serverLevel.getServer(), owner, getGlobalPos(), partner, itemPredicate); + } + + /** + * Check if a partner has a specific fluid in its input handlers. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @param fluidPredicate Predicate to test fluids (e.g., stack -> stack.getFluid().is(Fluids.LAVA)) + * @return true if partner has matching fluid, false otherwise or if unavailable + */ + protected boolean partnerHasFluid(GlobalPos partner, Predicate fluidPredicate) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + + return LinkedMultiblockHelper.partnerHasFluid( + serverLevel.getServer(), owner, getGlobalPos(), partner, fluidPredicate); + } + + /** + * Get total energy stored in a partner's energy containers. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @return Energy stored in EU, or 0 if unavailable + */ + protected long getPartnerEnergyStored(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return 0L; + } + UUID owner = getTeamUUID(); + if (owner == null) return 0L; + + return LinkedMultiblockHelper.getPartnerEnergyStored( + serverLevel.getServer(), owner, getGlobalPos(), partner); + } + + /** + * Check if a partner's multiblock is formed. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @return true if partner is formed, false otherwise or if unavailable + */ + protected boolean isPartnerFormed(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + + return LinkedMultiblockHelper.isPartnerFormed( + serverLevel.getServer(), owner, getGlobalPos(), partner); + } + + /** + * Check if a partner is currently running a recipe. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @return true if partner is working, false otherwise or if unavailable + */ + protected boolean isPartnerWorking(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + + return LinkedMultiblockHelper.isPartnerWorking( + serverLevel.getServer(), owner, getGlobalPos(), partner); + } + + /** + * Execute a custom query on a partner machine. + * Handles chunk loading and permission checks automatically. + * + * @param partner The partner to query + * @param query The query function + * @return Query result, or null if unavailable + */ + @Nullable + protected T queryPartner(GlobalPos partner, LinkedMultiblockHelper.PartnerQuery query) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return null; + } + UUID owner = getTeamUUID(); + if (owner == null) return null; + + return LinkedMultiblockHelper.queryPartner( + serverLevel.getServer(), owner, getGlobalPos(), partner, query); + } + + /** + * Check if ANY linked partner has a specific item. + * Useful for recipe conditions that require "a linked partner has X". + * + * @param itemPredicate Predicate to test items + * @return true if any partner has the item + */ + protected boolean anyPartnerHasItem(Predicate itemPredicate) { + for (GlobalPos partner : getLinkedPartners()) { + if (partnerHasItem(partner, itemPredicate)) { + return true; + } + } + return false; + } + + /** + * Check if ANY linked partner has a specific fluid. + * + * @param fluidPredicate Predicate to test fluids + * @return true if any partner has the fluid + */ + protected boolean anyPartnerHasFluid(Predicate fluidPredicate) { + for (GlobalPos partner : getLinkedPartners()) { + if (partnerHasFluid(partner, fluidPredicate)) { + return true; + } + } + return false; + } + + /** + * Check if ANY linked partner is formed and working. + * + * @return true if any partner is actively working + */ + public boolean anyPartnerWorking() { + for (GlobalPos partner : getLinkedPartners()) { + if (isPartnerWorking(partner)) { + return true; + } + } + return false; + } + + /** + * Count how many linked partners are currently formed. + * + * @return Number of formed partners + */ + public int countFormedPartners() { + int count = 0; + for (GlobalPos partner : getLinkedPartners()) { + if (isPartnerFormed(partner)) { + count++; + } + } + return count; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/LinkedWorkableMultiblockMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/LinkedWorkableMultiblockMachine.java new file mode 100644 index 000000000..c43dfea81 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/LinkedWorkableMultiblockMachine.java @@ -0,0 +1,610 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock; +import com.ghostipedia.cosmiccore.api.data.savedData.LinkEntry; +import com.ghostipedia.cosmiccore.api.data.savedData.LinkedMultiblockSavedData; +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper; +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper.RolePair; +import com.ghostipedia.cosmiccore.utils.ItemData; + +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; +import com.gregtechceu.gtceu.common.machine.owner.FTBOwner; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.GlobalPos; +import net.minecraft.core.component.DataComponents; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.NbtOps; +import net.minecraft.network.chat.Component; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.fluids.FluidStack; + +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.function.Predicate; + +/** + * Base class for non-electric multiblocks that support cross-dimensional linking. + *

+ * For electric multiblocks, use {@link LinkedWorkableElectricMultiblockMachine} instead. + *

+ * Subclasses should override: + *

    + *
  • {@link #canLinkTo(GlobalPos, ILinkedMultiblock)} - Type compatibility checks
  • + *
  • {@link #getLinkRole()} - Define role preference (PEER, CONTROLLER, REMOTE)
  • + *
  • {@link #getMaxPartners()} - Override if more/fewer than 4 partners needed
  • + *
  • {@link #onLinkEstablished(GlobalPos)} - React to new links
  • + *
  • {@link #onLinkBroken(GlobalPos)} - Cleanup when links break
  • + *
+ */ +public abstract class LinkedWorkableMultiblockMachine extends WorkableMultiblockMachine + implements ILinkedMultiblock, IDisplayUIMachine { + + + private static final String DATASTICK_TAG_KEY = "cosmiccore:link_data"; + private static final String TAG_POS = "Pos"; + private static final String TAG_OWNER = "Owner"; + + /** + * Local cache of known partners, rebuilt from SavedData on structure form. + * Used to detect changes for lifecycle callbacks. + * NOT persisted - rebuilt from SavedData which is the source of truth. + */ + protected Set knownPartners = new HashSet<>(); + + public LinkedWorkableMultiblockMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + + // ==================== ILinkedMultiblock Implementation ==================== + + @Override + public GlobalPos getGlobalPos() { + if (getLevel() instanceof ServerLevel serverLevel) { + return GlobalPos.of(serverLevel.dimension(), getBlockPos()); + } + return null; + } + + @Override + @Nullable + public UUID getTeamUUID() { + var team = getOwner() instanceof FTBOwner ftbOwner ? ftbOwner.getPlayerTeam(getOwnerUUID()) : null; + return team != null ? team.getTeamId() : getOwnerUUID(); + } + + @Override + public Set getLinkedPartners() { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return Collections.emptySet(); + } + + UUID owner = getTeamUUID(); + if (owner == null) return Collections.emptySet(); + + LinkedMultiblockSavedData savedData = LinkedMultiblockSavedData.getOrCreate(serverLevel); + return savedData.getPartnerPositions(owner, getGlobalPos()); + } + + @Override + public void processLinkNotifications() { + if (!(getLevel() instanceof ServerLevel serverLevel)) return; + + UUID owner = getTeamUUID(); + if (owner == null) return; + + Set currentPartners = getLinkedPartners(); + + // Find new partners (in SavedData but not in our cache) + for (GlobalPos partner : currentPartners) { + if (!knownPartners.contains(partner)) { + onLinkEstablished(partner); + } + } + + // Find removed partners (in our cache but not in SavedData) + Set removed = new HashSet<>(knownPartners); + removed.removeAll(currentPartners); + for (GlobalPos partner : removed) { + onLinkBroken(partner); + } + + // Update cache + knownPartners = new HashSet<>(currentPartners); + } + + // ==================== Lifecycle ==================== + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + // Process any pending link notifications from when we were unloaded + processLinkNotifications(); + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + // Don't remove links when structure breaks - links persist to SavedData + // They'll be cleaned up when the machine is actually destroyed + } + + @Override + public void onMachineDestroyed() { + super.onMachineDestroyed(); + + if (getLevel() instanceof ServerLevel serverLevel) { + UUID owner = getTeamUUID(); + GlobalPos myPos = getGlobalPos(); + + if (owner != null && myPos != null) { + // Release any force-loaded chunks + LinkedMultiblockHelper.releaseAllTickets(serverLevel.getServer(), myPos); + + // Remove all links from SavedData + LinkedMultiblockSavedData savedData = LinkedMultiblockSavedData.getOrCreate(serverLevel); + savedData.removeAllLinks(owner, myPos); + + // Notify partners (if loaded) + for (GlobalPos partner : knownPartners) { + ILinkedMultiblock partnerMachine = LinkedMultiblockHelper.getLinkedMachine( + serverLevel.getServer(), partner); + if (partnerMachine != null) { + partnerMachine.onLinkBroken(myPos); + } + } + } + } + } + + // ==================== Datastick Handling ==================== + + @Override + public InteractionResult onDataStickShiftUse(Player player, ItemStack dataStick) { + if (isRemote()) { + return InteractionResult.SUCCESS; + } + + GlobalPos myPos = getGlobalPos(); + UUID owner = getTeamUUID(); + + if (myPos == null || owner == null) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.not_ready") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + CompoundTag linkData = new CompoundTag(); + GlobalPos.CODEC.encodeStart(NbtOps.INSTANCE, myPos) + .result() + .ifPresent(encoded -> linkData.put(TAG_POS, encoded)); + linkData.putUUID(TAG_OWNER, owner); + + ItemData.mutateTag(dataStick, rootTag -> rootTag.put(DATASTICK_TAG_KEY, linkData)); + + String machineName = getDefinition().getName(); + dataStick.set(DataComponents.CUSTOM_NAME, Component.translatable("cosmiccore.datastick.link_copied", machineName)); + + player.sendSystemMessage(Component.translatable("cosmiccore.link.copied", machineName) + .withStyle(ChatFormatting.GREEN)); + + return InteractionResult.SUCCESS; + } + + @Override + public InteractionResult onDataStickUse(Player player, ItemStack dataStick) { + if (isRemote()) { + return InteractionResult.sidedSuccess(true); + } + + CompoundTag rootTag = ItemData.readTag(dataStick); + if (!rootTag.contains(DATASTICK_TAG_KEY)) { + return InteractionResult.PASS; + } + + CompoundTag linkData = rootTag.getCompound(DATASTICK_TAG_KEY); + + GlobalPos partnerPos = GlobalPos.CODEC + .decode(NbtOps.INSTANCE, linkData.get(TAG_POS)) + .result() + .map(pair -> pair.getFirst()) + .orElse(null); + + if (partnerPos == null) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.invalid_data") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + UUID partnerOwner = linkData.getUUID(TAG_OWNER); + + // Attempt to establish link + return tryLink(player, partnerPos, partnerOwner); + } + + /** + * Attempt to establish a link with the partner machine. + * Handles all validation, negotiation, and persistence. + */ + protected InteractionResult tryLink(Player player, GlobalPos partnerPos, UUID partnerOwner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return InteractionResult.FAIL; + } + + MinecraftServer server = serverLevel.getServer(); + GlobalPos myPos = getGlobalPos(); + UUID myOwner = getTeamUUID(); + + // === Validation === + + // Self-link check + if (myPos.equals(partnerPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.cannot_self_link") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // NOTE: We intentionally do NOT check partnerOwner from datastick NBT here. + // The datastick may be stale (team changed since it was written). + // Ownership is verified at runtime after loading the partner machine. + + // Partner limit check (this machine) + Set currentPartners = getLinkedPartners(); + if (currentPartners.size() >= getMaxPartners() && !currentPartners.contains(partnerPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.limit_reached_self") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // Already linked check + if (currentPartners.contains(partnerPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.already_linked") + .withStyle(ChatFormatting.YELLOW)); + return InteractionResult.FAIL; + } + + // === Load and verify partner === + // SECURITY: Always load partner to verify ownership and compatibility + boolean needsUnload = false; + if (!LinkedMultiblockHelper.isPartnerOnline(server, partnerPos)) { + // Try to force-load partner temporarily + if (!LinkedMultiblockHelper.forceLoadPartnerChunk(server, myPos, partnerPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.partner_not_loaded") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + needsUnload = true; + } + + try { + MetaMachine rawPartner = LinkedMultiblockHelper.getMachine(server, partnerPos); + if (rawPartner == null) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.partner_missing") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + if (!(rawPartner instanceof ILinkedMultiblock partnerMachine)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.not_linkable") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // Verify ownership matches at runtime + UUID actualPartnerOwner = partnerMachine.getTeamUUID(); + if (!Objects.equals(myOwner, actualPartnerOwner)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.different_owner") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // === Partner capacity check === + Set partnerLinks = partnerMachine.getLinkedPartners(); + if (partnerLinks.size() >= partnerMachine.getMaxPartners() && !partnerLinks.contains(myPos)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.limit_reached_partner") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // === Role Negotiation === + RolePair roles = LinkedMultiblockHelper.negotiateRoles(getLinkRole(), partnerMachine.getLinkRole()); + if (roles == null) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.incompatible_roles", + getLinkRole().name(), partnerMachine.getLinkRole().name()) + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // === Type compatibility check === + if (!canLinkTo(partnerPos, partnerMachine)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.incompatible_self") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + if (!partnerMachine.canLinkTo(myPos, this)) { + player.sendSystemMessage(Component.translatable("cosmiccore.link.incompatible_partner") + .withStyle(ChatFormatting.RED)); + return InteractionResult.FAIL; + } + + // === Persist link === + LinkedMultiblockSavedData savedData = LinkedMultiblockSavedData.getOrCreate(serverLevel); + savedData.link(myOwner, myPos, partnerPos, roles.aRole(), roles.bRole()); + + // === Notify both machines === + onLinkEstablished(partnerPos); + knownPartners.add(partnerPos); + + partnerMachine.onLinkEstablished(myPos); + + // Success feedback + String myName = getDefinition().getName(); + String partnerName = rawPartner.getDefinition().getName(); + player.sendSystemMessage(Component.translatable("cosmiccore.link.established", myName, partnerName) + .withStyle(ChatFormatting.GREEN)); + + return InteractionResult.SUCCESS; + + } finally { + // Release temporary chunk load + if (needsUnload) { + LinkedMultiblockHelper.releasePartnerChunk(server, myPos, partnerPos); + } + } + } + + // ==================== Default Implementations ==================== + + @Override + public boolean canLinkTo(GlobalPos partner, ILinkedMultiblock partnerMachine) { + // Default: allow linking to any ILinkedMultiblock + // Subclasses should override for type-specific restrictions + return true; + } + + @Override + public LinkRole getLinkRole() { + // Default: bidirectional peer + return LinkRole.PEER; + } + + @Override + public void onLinkEstablished(GlobalPos partner) { + // Default: just log + CosmicCore.LOGGER.debug("Link established: {} -> {}", getGlobalPos(), partner); + } + + @Override + public void onLinkBroken(GlobalPos partner) { + // Default: just log and update cache + CosmicCore.LOGGER.debug("Link broken: {} -> {}", getGlobalPos(), partner); + knownPartners.remove(partner); + } + + // ==================== Utility Methods ==================== + + /** + * Get a linked partner's machine instance. + * Does NOT force-load chunks - returns null if partner is unloaded. + */ + @Nullable + protected ILinkedMultiblock getPartnerMachine(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return null; + } + return LinkedMultiblockHelper.getLinkedMachine(serverLevel.getServer(), partner); + } + + /** + * Check if this machine can query the given partner (based on effective role). + */ + protected boolean canQueryPartner(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + return LinkedMultiblockHelper.canQuery(serverLevel.getServer(), owner, getGlobalPos(), partner); + } + + /** + * Get the effective role for this machine in relation to a specific partner. + */ + @Nullable + protected LinkRole getEffectiveRole(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return null; + } + UUID owner = getTeamUUID(); + if (owner == null) return null; + + LinkedMultiblockSavedData savedData = LinkedMultiblockSavedData.getOrCreate(serverLevel); + LinkEntry link = savedData.getLinkTo(owner, getGlobalPos(), partner); + return link != null ? link.effectiveRole() : null; + } + + // ==================== Partner Resource Queries ==================== + + /** + * Check if a partner has a specific item in its input handlers. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @param itemPredicate Predicate to test items (e.g., stack -> stack.is(Items.DIAMOND)) + * @return true if partner has matching item, false otherwise or if unavailable + */ + protected boolean partnerHasItem(GlobalPos partner, Predicate itemPredicate) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + + return LinkedMultiblockHelper.partnerHasItem( + serverLevel.getServer(), owner, getGlobalPos(), partner, itemPredicate); + } + + /** + * Check if a partner has a specific fluid in its input handlers. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @param fluidPredicate Predicate to test fluids (e.g., stack -> stack.getFluid().is(Fluids.LAVA)) + * @return true if partner has matching fluid, false otherwise or if unavailable + */ + protected boolean partnerHasFluid(GlobalPos partner, Predicate fluidPredicate) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + + return LinkedMultiblockHelper.partnerHasFluid( + serverLevel.getServer(), owner, getGlobalPos(), partner, fluidPredicate); + } + + /** + * Get total energy stored in a partner's energy containers. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @return Energy stored in EU, or 0 if unavailable + */ + protected long getPartnerEnergyStored(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return 0L; + } + UUID owner = getTeamUUID(); + if (owner == null) return 0L; + + return LinkedMultiblockHelper.getPartnerEnergyStored( + serverLevel.getServer(), owner, getGlobalPos(), partner); + } + + /** + * Check if a partner's multiblock is formed. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @return true if partner is formed, false otherwise or if unavailable + */ + protected boolean isPartnerFormed(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + + return LinkedMultiblockHelper.isPartnerFormed( + serverLevel.getServer(), owner, getGlobalPos(), partner); + } + + /** + * Check if a partner is currently running a recipe. + * Handles chunk loading automatically. + * + * @param partner The partner to query + * @return true if partner is working, false otherwise or if unavailable + */ + protected boolean isPartnerWorking(GlobalPos partner) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + UUID owner = getTeamUUID(); + if (owner == null) return false; + + return LinkedMultiblockHelper.isPartnerWorking( + serverLevel.getServer(), owner, getGlobalPos(), partner); + } + + /** + * Execute a custom query on a partner machine. + * Handles chunk loading and permission checks automatically. + * + * @param partner The partner to query + * @param query The query function + * @return Query result, or null if unavailable + */ + @Nullable + protected T queryPartner(GlobalPos partner, LinkedMultiblockHelper.PartnerQuery query) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return null; + } + UUID owner = getTeamUUID(); + if (owner == null) return null; + + return LinkedMultiblockHelper.queryPartner( + serverLevel.getServer(), owner, getGlobalPos(), partner, query); + } + + /** + * Check if ANY linked partner has a specific item. + * Useful for recipe conditions that require "a linked partner has X". + * + * @param itemPredicate Predicate to test items + * @return true if any partner has the item + */ + protected boolean anyPartnerHasItem(Predicate itemPredicate) { + for (GlobalPos partner : getLinkedPartners()) { + if (partnerHasItem(partner, itemPredicate)) { + return true; + } + } + return false; + } + + /** + * Check if ANY linked partner has a specific fluid. + * + * @param fluidPredicate Predicate to test fluids + * @return true if any partner has the fluid + */ + protected boolean anyPartnerHasFluid(Predicate fluidPredicate) { + for (GlobalPos partner : getLinkedPartners()) { + if (partnerHasFluid(partner, fluidPredicate)) { + return true; + } + } + return false; + } + + /** + * Check if ANY linked partner is formed and working. + * + * @return true if any partner is actively working + */ + public boolean anyPartnerWorking() { + for (GlobalPos partner : getLinkedPartners()) { + if (isPartnerWorking(partner)) { + return true; + } + } + return false; + } + + /** + * Count how many linked partners are currently formed. + * + * @return Number of formed partners + */ + public int countFormedPartners() { + int count = 0; + for (GlobalPos partner : getLinkedPartners()) { + if (isPartnerFormed(partner)) { + count++; + } + } + return count; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/MagnetWorkableElectricMultiblockMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/MagnetWorkableElectricMultiblockMachine.java index 7ba535fb1..4e9cf6d19 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/MagnetWorkableElectricMultiblockMachine.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/MagnetWorkableElectricMultiblockMachine.java @@ -2,22 +2,22 @@ import com.ghostipedia.cosmiccore.api.block.IMagnetType; import com.ghostipedia.cosmiccore.common.block.MagnetBlock; -import com.gregtechceu.gtceu.api.block.ICoilType; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; + +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; -import com.gregtechceu.gtceu.utils.GTUtil; -import lombok.Getter; -@Getter public class MagnetWorkableElectricMultiblockMachine extends WorkableElectricMultiblockMachine { - @Getter private IMagnetType magnetType = MagnetBlock.MagnetType.HIGH_POWERED; - public MagnetWorkableElectricMultiblockMachine(IMachineBlockEntity holder) { + public MagnetWorkableElectricMultiblockMachine(BlockEntityCreationInfo holder) { super(holder); } + public IMagnetType getMagnetType() { + return magnetType; + } + @Override public void onStructureFormed() { super.onStructureFormed(); @@ -30,10 +30,12 @@ public void onStructureFormed() { public int getMagnetStrength() { return magnetType.getMagnetFieldCapacity(); } + public int getMagnetRegen() { return magnetType.getMagnetRegenRate(); } - public int getEnergyCost(){ + + public int getEnergyCost() { return magnetType.energyConsumption(); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/ModularizedWorkableElectricMultiblockMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/ModularizedWorkableElectricMultiblockMachine.java new file mode 100644 index 000000000..454363987 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/ModularizedWorkableElectricMultiblockMachine.java @@ -0,0 +1,70 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.ghostipedia.cosmiccore.api.block.IMultiblockProvider; +import com.ghostipedia.cosmiccore.api.block.IMultiblockReciever; + +import com.gregtechceu.gtceu.api.capability.IEnergyContainer; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; + +import lombok.Getter; +import lombok.Setter; + +import javax.annotation.Nullable; + +public abstract class ModularizedWorkableElectricMultiblockMachine extends WorkableElectricMultiblockMachine + implements IMultiblockReciever { + + @Getter + protected final int tier; + @Getter + protected final int moduleTier; + @Getter + protected final int minModuleTier; + @Nullable + @Getter + @Setter + private IMultiblockProvider multiBlockProvider; + protected final long energyConsumption; + + @Getter + private IEnergyContainer energyStorageContainer; + + protected boolean isActive; + + public ModularizedWorkableElectricMultiblockMachine(BlockEntityCreationInfo holder, int tier, int moduleTier, + int minModuleTier) { + super(holder); + this.tier = tier; + this.moduleTier = moduleTier; + this.minModuleTier = minModuleTier; + this.energyConsumption = (long) (Math.pow(4, this.tier + 2) / 2.0); + this.energyStorageContainer = new NotifiableEnergyContainer(this, + (long) (160008000L * Math.pow(4, this.tier - 9)), this.energyConsumption, 1, 1, 1); + } + + @Override + public boolean checkPattern() { + if (getModularMultiBlock() != null) { + if (getModularMultiBlock().getModulatorTier() >= minModuleTier) { + super.checkPatternWithLock(); + } + } + return super.checkPatternWithLock(); + } + + @Override + public boolean isActive() { + return this.isActive && isWorkingEnabled(); + } + + @Override + public IMultiblockProvider getModularMultiBlock() { + return this.multiBlockProvider; + } + + public void setModularMultiBlock(IMultiblockProvider provider) { + this.multiBlockProvider = provider; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/StellarBaseModule.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/StellarBaseModule.java new file mode 100644 index 000000000..ac3170a30 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/StellarBaseModule.java @@ -0,0 +1,500 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.ghostipedia.cosmiccore.api.data.wireless.WirelessEnergySavedData; +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarIrisProvider; +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarModuleReceiver; +import com.ghostipedia.cosmiccore.client.gui.widget.stellar.StellarModuleContentWidget; +import com.ghostipedia.cosmiccore.client.gui.widget.stellar.StellarModuleUIWidget; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; +import com.gregtechceu.gtceu.api.machine.feature.IOverclockMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.common.machine.owner.FTBOwner; +import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; +import com.gregtechceu.gtceu.utils.GTUtil; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.player.Player; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class StellarBaseModule extends WorkableMultiblockMachine + implements IStellarModuleReceiver, IDisplayUIMachine, IFancyUIMachine, + IOverclockMachine { + + + @Nullable + private IStellarIrisProvider stellarIris; + + @DescSynced + private long energyConsumedPerTick = 0; + + @DescSynced + private boolean wirelessEnergyAvailable = false; + + @DescSynced + private boolean powerFailure = false; + + @Persisted + @DescSynced + private int configuredMaxParallel = 1; + + @Persisted + @DescSynced + private long configuredVoltagePerParallel = 32; + + private NotifiableEnergyContainer virtualEnergyContainer; + + public StellarBaseModule(BlockEntityCreationInfo holder) { + super(holder); + this.virtualEnergyContainer = new NotifiableEnergyContainer(this, + Long.MAX_VALUE, Long.MAX_VALUE, Long.MAX_VALUE, 0, 0); + this.virtualEnergyContainer.setSideInputCondition(side -> false); + this.virtualEnergyContainer.setSideOutputCondition(side -> false); + } + + @Override + @Nullable + public IStellarIrisProvider getStellarIris() { + return stellarIris; + } + + @Override + public void setStellarIris(@Nullable IStellarIrisProvider provider) { + this.stellarIris = provider; + } + + public long getEnergyConsumedPerTick() { + return energyConsumedPerTick; + } + + public boolean isWirelessEnergyAvailable() { + return wirelessEnergyAvailable; + } + + public int getConfiguredMaxParallel() { + return configuredMaxParallel; + } + + public void setConfiguredMaxParallel(int configuredMaxParallel) { + this.configuredMaxParallel = configuredMaxParallel; + } + + public long getConfiguredVoltagePerParallel() { + return configuredVoltagePerParallel; + } + + public void setConfiguredVoltagePerParallel(long configuredVoltagePerParallel) { + this.configuredVoltagePerParallel = configuredVoltagePerParallel; + } + + + protected UUID getTeamUUID() { + var owner = getOwner(); + var ownerUUID = getOwnerUUID(); + + if (owner == null) return MachineOwner.EMPTY; + if (ownerUUID == null) return MachineOwner.EMPTY; + + if (owner instanceof FTBOwner ftbOwner) { + var team = ftbOwner.getPlayerTeam(ownerUUID); + if (team != null) { + return team.getTeamId(); + } + } + return ownerUUID; + } + + protected boolean drainWirelessEnergy(long amount) { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + + UUID owner = getTeamUUID(); + if (owner == MachineOwner.EMPTY) { + return false; + } + + WirelessEnergySavedData data = WirelessEnergySavedData.getOrCreate(serverLevel); + + if (!data.isActive(owner)) { + return false; + } + + BigInteger stored = data.getEnergyStored(owner); + if (stored.compareTo(BigInteger.valueOf(amount)) < 0) { + return false; + } + + BigInteger leftover = data.addEUToGlobalWirelessEnergy(owner, BigInteger.valueOf(-amount)); + if (leftover.equals(BigInteger.ZERO)) { + data.setEnergyOutput(owner, getBlockPos(), amount); + return true; + } + return false; + } + + protected boolean checkWirelessEnergyAvailable() { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + + UUID owner = getTeamUUID(); + if (owner == MachineOwner.EMPTY) { + return false; + } + + WirelessEnergySavedData data = WirelessEnergySavedData.getOrCreate(serverLevel); + return data.isActive(owner); + } + + protected BigInteger getWirelessEnergyStored() { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return BigInteger.ZERO; + } + + UUID owner = getTeamUUID(); + if (owner == MachineOwner.EMPTY) { + return BigInteger.ZERO; + } + + WirelessEnergySavedData data = WirelessEnergySavedData.getOrCreate(serverLevel); + return data.getEnergyStored(owner); + } + + @Override + public void onLoad() { + super.onLoad(); + if (isFormed() && stellarIris == null) { + findAndRegisterWithIris(); + } + virtualEnergyContainer.setEnergyStored(Long.MAX_VALUE / 2); + this.wirelessEnergyAvailable = checkWirelessEnergyAvailable(); + + if (isFormed() && getLevel() instanceof ServerLevel serverLevel) { + serverLevel.getServer().tell(new net.minecraft.server.TickTask( + serverLevel.getServer().getTickCount() + 20, + () -> { + if (isFormed() && stellarIris == null) { + findAndRegisterWithIris(); + } + getRecipeLogic().updateTickSubscription(); + })); + } + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + this.wirelessEnergyAvailable = checkWirelessEnergyAvailable(); + findAndRegisterWithIris(); + virtualEnergyContainer.setEnergyStored(Long.MAX_VALUE / 2); + } + + @Override + public Map, List>>> getCapabilitiesFlat() { + Map, List>>> flat = super.getCapabilitiesFlat(); + Map, List>> inputCaps = flat.get(IO.IN); + boolean hasEnergy = inputCaps != null && inputCaps.containsKey(EURecipeCapability.CAP) && + !inputCaps.get(EURecipeCapability.CAP).isEmpty(); + if (!hasEnergy) { + flat.computeIfAbsent(IO.IN, k -> new HashMap<>()) + .computeIfAbsent(EURecipeCapability.CAP, k -> new ArrayList<>()) + .add(virtualEnergyContainer); + } + return flat; + } + + protected void findAndRegisterWithIris() { + if (getLevel() == null || stellarIris != null) return; + + BlockPos modulePos = getBlockPos(); + int maxRadius = 80; + + for (int radius = 1; radius <= maxRadius; radius++) { + for (int x = -radius; x <= radius; x++) { + for (int z = -radius; z <= radius; z++) { + if (Math.abs(x) != radius && Math.abs(z) != radius) continue; + + for (int y = -10; y <= 10; y++) { + BlockPos checkPos = modulePos.offset(x, y, z); + MetaMachine machine = MetaMachine.getMachine(getLevel(), checkPos); + + if (machine instanceof IrisMultiblockMachine iris && iris.isFormed()) { + if (iris.registerModule(this)) { + return; + } + } + } + } + } + } + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + + if (stellarIris instanceof IrisMultiblockMachine iris) { + iris.unregisterModule(this); + } + + this.stellarIris = null; + this.wirelessEnergyAvailable = false; + this.energyConsumedPerTick = 0; + clearEnergyOutput(); + } + + @Override + public boolean isRecipeLogicAvailable() { + if (!super.isRecipeLogicAvailable()) { + return false; + } + + IStellarIrisProvider iris = getStellarIris(); + if (iris == null) { + findAndRegisterWithIris(); + iris = getStellarIris(); + } + + if (iris == null || !iris.isFormed()) { + return false; + } + + if (!iris.canProcess()) { + return false; + } + + this.wirelessEnergyAvailable = checkWirelessEnergyAvailable(); + return wirelessEnergyAvailable; + } + + @Override + public boolean beforeWorking(@Nullable GTRecipe recipe) { + if (recipe == null) return false; + + long euPerTick = RecipeHelper.getRealEUt(recipe).getTotalEU(); + euPerTick = applyEnergyDiscount(euPerTick); + + if (!drainWirelessEnergy(euPerTick)) { + this.powerFailure = true; + return false; + } + + this.powerFailure = false; + this.energyConsumedPerTick = euPerTick; + return super.beforeWorking(recipe); + } + + @Override + public boolean onWorking() { + if (!super.onWorking()) { + return false; + } + + virtualEnergyContainer.setEnergyStored(Long.MAX_VALUE / 2); + + GTRecipe lastRecipe = getRecipeLogic().getLastRecipe(); + if (lastRecipe != null) { + long euPerTick = RecipeHelper.getRealEUt(lastRecipe).getTotalEU(); + euPerTick = applyEnergyDiscount(euPerTick); + this.energyConsumedPerTick = euPerTick; + + if (!drainWirelessEnergy(euPerTick)) { + this.powerFailure = true; + return false; + } + } + + this.powerFailure = false; + return true; + } + + private long applyEnergyDiscount(long baseEU) { + IStellarIrisProvider iris = getStellarIris(); + if (iris != null && iris.canProcess()) { + double discount = iris.getEnergyDiscount(); + baseEU = (long) (baseEU * discount); + } + return Math.max(1, baseEU); + } + + @Override + public void afterWorking() { + super.afterWorking(); + this.energyConsumedPerTick = 0; + this.powerFailure = false; + clearEnergyOutput(); + } + + private void clearEnergyOutput() { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return; + } + UUID owner = getTeamUUID(); + if (owner == MachineOwner.EMPTY) { + return; + } + WirelessEnergySavedData data = WirelessEnergySavedData.getOrCreate(serverLevel); + data.removeEnergyOutput(owner, getBlockPos()); + } + + @Override + @Nullable + protected GTRecipe getRealRecipe(GTRecipe recipe) { + GTRecipe modified = super.getRealRecipe(recipe); + if (modified == null) { + return null; + } + + int recipeTier = RecipeHelper.getRecipeEUtTier(recipe); + if (recipeTier > getOverclockTier()) { + return null; + } + + IStellarIrisProvider iris = getStellarIris(); + if (iris == null || !iris.canProcess()) { + return modified; + } + + double speedBonus = iris.getSpeedBonus(); + if (speedBonus > 1.0) { + int newDuration = (int) Math.max(1, modified.duration / speedBonus); + modified = modified.copy(); + modified.duration = newDuration; + } + + return modified; + } + + public int getEffectiveParallelLimit() { + IStellarIrisProvider iris = getStellarIris(); + int irisLimit = (iris != null && iris.canProcess()) ? iris.getParallelLimit() : 1; + return Math.min(configuredMaxParallel, irisLimit); + } + + public int getIrisParallelLimit() { + IStellarIrisProvider iris = getStellarIris(); + if (iris == null || !iris.canProcess()) { + return 1; + } + return iris.getParallelLimit(); + } + + @Override + public int getOverclockTier() { + return GTUtil.getTierByVoltage(configuredVoltagePerParallel); + } + + @Override + public void setOverclockTier(int tier) { + tier = Math.max(getMinOverclockTier(), Math.min(tier, getMaxOverclockTier())); + this.configuredVoltagePerParallel = GTValues.V[tier]; + } + + @Override + public int getMaxOverclockTier() { + return GTValues.MAX; + } + + @Override + public int getMinOverclockTier() { + return GTValues.ULV; + } + + @Override + public long getOverclockVoltage() { + return configuredVoltagePerParallel * getEffectiveParallelLimit(); + } + + public long getMaxEUt() { + return configuredVoltagePerParallel * getEffectiveParallelLimit(); + } + + @Override + public Widget createUIWidget() { + return new StellarModuleContentWidget(() -> this); + } + + @Override + public ModularUI createUI(Player entityPlayer) { + return new ModularUI(198, 208, this, entityPlayer) + .widget(new StellarModuleUIWidget(this, 198, 208, () -> this)); + } + + @Override + public void addDisplayText(List textList) { + IDisplayUIMachine.super.addDisplayText(textList); + + if (isFormed()) { + if (powerFailure) { + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.power_failure") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED).withBold(true))); + } + + if (!wirelessEnergyAvailable) { + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.no_wireless") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + } else if (energyConsumedPerTick > 0) { + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.energy_usage", + String.format("%,d", energyConsumedPerTick)) + .setStyle(Style.EMPTY.withColor(ChatFormatting.YELLOW))); + } + + String tierName = GTValues.VNF[getOverclockTier()]; + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.power_config", + tierName, getEffectiveParallelLimit()) + .setStyle(Style.EMPTY.withColor(ChatFormatting.AQUA))); + + IStellarIrisProvider iris = getStellarIris(); + if (iris == null) { + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.not_connected")); + } else if (!iris.isFormed()) { + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.iris_not_formed")); + } else if (!iris.canProcess()) { + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.iris_not_ready")); + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.stage", + iris.getStage().toString())); + } else { + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.connected")); + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.stage", + iris.getStage().toString())); + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.speed_bonus", + String.format("%.1fx", iris.getSpeedBonus()))); + textList.add(Component.translatable("cosmiccore.multiblock.stellar_module.parallel", + iris.getParallelLimit())); + } + } + } + + public boolean isPowerFailure() { + return powerFailure; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/StellarIrisUpgrade.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/StellarIrisUpgrade.java new file mode 100644 index 000000000..80a1a2ac3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/StellarIrisUpgrade.java @@ -0,0 +1,236 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import java.util.EnumSet; +import java.util.Set; +import java.util.function.Supplier; + +public enum StellarIrisUpgrade { + + // IGNITION - Star Lifecycle + THERMAL_STABILIZER(Branch.IGNITION, 1, 15, 1, () -> Set.of()), + PLASMA_CONDUITS(Branch.IGNITION, 1, 15, 1, () -> Set.of()), + FUSION_CATALYST(Branch.IGNITION, 2, 25, 1, () -> Set.of(THERMAL_STABILIZER, PLASMA_CONDUITS)), + MAGNETIC_CONFINEMENT(Branch.IGNITION, 2, 25, 1, () -> Set.of(THERMAL_STABILIZER, PLASMA_CONDUITS)), + CORE_HARMONICS(Branch.IGNITION, 3, 40, 1, () -> Set.of(MAGNETIC_CONFINEMENT)), + PROTON_RECYCLER(Branch.IGNITION, 3, 40, 1, () -> Set.of(FUSION_CATALYST)), + STELLAR_REGENERATION(Branch.IGNITION, 4, 60, 1, () -> Set.of(CORE_HARMONICS, PROTON_RECYCLER)), + ETERNAL_EMBER(Branch.IGNITION, 4, 60, 1, () -> Set.of(CORE_HARMONICS, PROTON_RECYCLER)), + PHOENIX_PROTOCOL(Branch.IGNITION, 5, 80, 1, () -> Set.of(STELLAR_REGENERATION)), + SOLAR_DOMINION(Branch.IGNITION, 5, 80, 1, () -> Set.of(ETERNAL_EMBER)), + PERPETUAL_IGNITION(Branch.IGNITION, 6, 100, 1, () -> Set.of(PHOENIX_PROTOCOL, SOLAR_DOMINION)), + SUPERNOVA_CORE(Branch.IGNITION, 7, 130, 1, () -> Set.of(PERPETUAL_IGNITION)), + PLASMA_HURRICANE(Branch.IGNITION, 7, 130, 1, () -> Set.of(PERPETUAL_IGNITION)), + STELLAR_NURSERY(Branch.IGNITION, 8, 170, 1, () -> Set.of(SUPERNOVA_CORE)), + CORONA_EXPANSION(Branch.IGNITION, 8, 170, 1, () -> Set.of(PLASMA_HURRICANE)), + HELIOS_FORGE(Branch.IGNITION, 9, 220, 1, () -> Set.of(STELLAR_NURSERY, CORONA_EXPANSION)), + FUSION_OVERDRIVE(Branch.IGNITION, 9, 220, 1, () -> Set.of(STELLAR_NURSERY, CORONA_EXPANSION)), + DYSON_LATTICE(Branch.IGNITION, 10, 280, 1, () -> Set.of(HELIOS_FORGE)), + SOLAR_GENESIS(Branch.IGNITION, 10, 280, 1, () -> Set.of(FUSION_OVERDRIVE)), + PRIMORDIAL_FLAME(Branch.IGNITION, 11, 350, 1, () -> Set.of(DYSON_LATTICE, SOLAR_GENESIS)), + + // FUSION - Processing Power + GRAVITON_LENS(Branch.FUSION, 1, 15, 1, () -> Set.of()), + SUPERCONDUCTING_GRID(Branch.FUSION, 1, 15, 1, () -> Set.of()), + TEMPORAL_ACCELERATION(Branch.FUSION, 2, 25, 1, () -> Set.of(GRAVITON_LENS, SUPERCONDUCTING_GRID)), + PARALLEL_MANIFOLD(Branch.FUSION, 2, 25, 1, () -> Set.of(GRAVITON_LENS, SUPERCONDUCTING_GRID)), + STELLAR_COMPRESSION(Branch.FUSION, 3, 40, 1, () -> Set.of(TEMPORAL_ACCELERATION)), + MASS_EFFICIENCY(Branch.FUSION, 3, 40, 1, () -> Set.of(SUPERCONDUCTING_GRID, PARALLEL_MANIFOLD)), + RELATIVISTIC_PROCESSING(Branch.FUSION, 4, 60, 1, () -> Set.of(STELLAR_COMPRESSION)), + QUANTUM_TUNNELING(Branch.FUSION, 4, 60, 1, () -> Set.of(STELLAR_COMPRESSION, MASS_EFFICIENCY)), + HYPERDENSE_CORE(Branch.FUSION, 5, 80, 1, () -> Set.of(RELATIVISTIC_PROCESSING)), + TACHYON_WEAVE(Branch.FUSION, 5, 80, 1, () -> Set.of(QUANTUM_TUNNELING)), + SINGULARITY_ENGINE(Branch.FUSION, 6, 100, 1, () -> Set.of(HYPERDENSE_CORE, TACHYON_WEAVE)), + NEUTRON_CASCADE(Branch.FUSION, 7, 130, 1, () -> Set.of(SINGULARITY_ENGINE)), + WARP_FIELD_MATRIX(Branch.FUSION, 7, 130, 1, () -> Set.of(SINGULARITY_ENGINE)), + PARTICLE_STORM(Branch.FUSION, 8, 170, 1, () -> Set.of(NEUTRON_CASCADE)), + SUBSPACE_HARMONICS(Branch.FUSION, 8, 170, 1, () -> Set.of(WARP_FIELD_MATRIX)), + ANTIMATTER_INJECTION(Branch.FUSION, 9, 220, 1, () -> Set.of(PARTICLE_STORM, SUBSPACE_HARMONICS)), + ZERO_POINT_TAP(Branch.FUSION, 9, 220, 1, () -> Set.of(PARTICLE_STORM, SUBSPACE_HARMONICS)), + QUARK_GLUON_PLASMA(Branch.FUSION, 10, 280, 1, () -> Set.of(ANTIMATTER_INJECTION)), + PLANCK_RESONANCE(Branch.FUSION, 10, 280, 1, () -> Set.of(ZERO_POINT_TAP)), + OMEGA_COMPRESSION(Branch.FUSION, 11, 350, 1, () -> Set.of(QUARK_GLUON_PLASMA, PLANCK_RESONANCE)), + + // COLLAPSE - Prestige + SHARD_COLLECTOR(Branch.COLLAPSE, 1, 15, 1, () -> Set.of()), + RESONANT_SACRIFICE(Branch.COLLAPSE, 1, 15, 1, () -> Set.of()), + EARLY_HARVEST(Branch.COLLAPSE, 2, 25, 1, () -> Set.of(SHARD_COLLECTOR, RESONANT_SACRIFICE)), + EFFICIENT_CONSUMPTION(Branch.COLLAPSE, 2, 25, 1, () -> Set.of(SHARD_COLLECTOR, RESONANT_SACRIFICE)), + POINT_AMPLIFIER(Branch.COLLAPSE, 3, 40, 1, () -> Set.of(SHARD_COLLECTOR, EARLY_HARVEST)), + DUAL_SACRIFICE(Branch.COLLAPSE, 3, 40, 1, () -> Set.of(RESONANT_SACRIFICE, EFFICIENT_CONSUMPTION)), + PRESTIGE_MOMENTUM(Branch.COLLAPSE, 4, 60, 1, () -> Set.of(POINT_AMPLIFIER)), + ECHO_OF_COLLAPSE(Branch.COLLAPSE, 5, 80, 1, () -> Set.of(PRESTIGE_MOMENTUM)), + ENTROPY_HARVEST(Branch.COLLAPSE, 5, 80, 1, () -> Set.of(DUAL_SACRIFICE)), + INFINITE_RECURSION(Branch.COLLAPSE, 6, 100, 1, () -> Set.of(ECHO_OF_COLLAPSE, ENTROPY_HARVEST)), + CASCADING_COLLAPSE(Branch.COLLAPSE, 7, 130, 1, () -> Set.of(INFINITE_RECURSION)), + TEMPORAL_ECHO(Branch.COLLAPSE, 7, 130, 1, () -> Set.of(INFINITE_RECURSION)), + MASS_CONVERSION(Branch.COLLAPSE, 8, 170, 1, () -> Set.of(CASCADING_COLLAPSE)), + STELLAR_DEBT(Branch.COLLAPSE, 8, 170, 1, () -> Set.of(TEMPORAL_ECHO)), + ENTROPY_ENGINE(Branch.COLLAPSE, 9, 220, 1, () -> Set.of(MASS_CONVERSION, STELLAR_DEBT)), + SACRIFICE_AMPLIFIER(Branch.COLLAPSE, 9, 220, 1, () -> Set.of(MASS_CONVERSION, STELLAR_DEBT)), + COSMIC_TITHE(Branch.COLLAPSE, 10, 280, 1, () -> Set.of(ENTROPY_ENGINE)), + ANNIHILATION_YIELD(Branch.COLLAPSE, 10, 280, 1, () -> Set.of(SACRIFICE_AMPLIFIER)), + HEAT_DEATH(Branch.COLLAPSE, 11, 350, 1, () -> Set.of(COSMIC_TITHE, ANNIHILATION_YIELD)), + + // VOID - Black Hole + HAWKING_RADIATOR(Branch.VOID, 1, 15, 1, () -> Set.of()), + CHROMATIC_TUNING(Branch.VOID, 1, 15, 1, () -> Set.of()), + EXOTIC_MATTER_TAP(Branch.VOID, 2, 25, 1, () -> Set.of(HAWKING_RADIATOR, CHROMATIC_TUNING)), + VOID_WHISPERS(Branch.VOID, 2, 25, 1, () -> Set.of(HAWKING_RADIATOR)), + EVENT_HORIZON_LOCK(Branch.VOID, 3, 40, 1, () -> Set.of(VOID_WHISPERS)), + SINGULARITY_SIPHON(Branch.VOID, 3, 40, 1, () -> Set.of(EXOTIC_MATTER_TAP)), + GRAVITATIONAL_MASTERY(Branch.VOID, 4, 60, 1, () -> Set.of(SINGULARITY_SIPHON)), + VOID_HARVESTER(Branch.VOID, 4, 60, 1, () -> Set.of(EVENT_HORIZON_LOCK)), + ELDRITCH_INSIGHT(Branch.VOID, 5, 80, 1, () -> Set.of(GRAVITATIONAL_MASTERY)), + ABYSS_WALKER(Branch.VOID, 5, 80, 1, () -> Set.of(VOID_HARVESTER)), + ETERNAL_VOID(Branch.VOID, 6, 100, 1, () -> Set.of(ELDRITCH_INSIGHT, ABYSS_WALKER)), + DARK_MATTER_LENS(Branch.VOID, 7, 130, 1, () -> Set.of(ETERNAL_VOID)), + NEGATIVE_MASS(Branch.VOID, 7, 130, 1, () -> Set.of(ETERNAL_VOID)), + VACUUM_DECAY(Branch.VOID, 8, 170, 1, () -> Set.of(DARK_MATTER_LENS)), + PHOTON_SPHERE(Branch.VOID, 8, 170, 1, () -> Set.of(NEGATIVE_MASS)), + SCHWARZSCHILD_RADIUS(Branch.VOID, 9, 220, 1, () -> Set.of(VACUUM_DECAY, PHOTON_SPHERE)), + ERGOSPHERE_TAP(Branch.VOID, 9, 220, 1, () -> Set.of(VACUUM_DECAY, PHOTON_SPHERE)), + PENROSE_PROCESS(Branch.VOID, 10, 280, 1, () -> Set.of(SCHWARZSCHILD_RADIUS)), + KERR_EXTRACTION(Branch.VOID, 10, 280, 1, () -> Set.of(ERGOSPHERE_TAP)), + FALSE_VACUUM(Branch.VOID, 11, 350, 1, () -> Set.of(PENROSE_PROCESS, KERR_EXTRACTION)), + + // REPEATABLE + STELLAR_EFFICIENCY(Branch.REPEATABLE, 0, 10, 10, () -> Set.of()), + PARALLEL_THREADING(Branch.REPEATABLE, 0, 15, 8, () -> Set.of()), + ENERGY_OPTIMIZATION(Branch.REPEATABLE, 0, 12, 10, () -> Set.of()), + FUEL_EFFICIENCY(Branch.REPEATABLE, 0, 10, 10, () -> Set.of()), + PRESTIGE_AMPLIFIER(Branch.REPEATABLE, 0, 8, 10, () -> Set.of()), + DECAY_RESISTANCE(Branch.REPEATABLE, 0, 10, 10, () -> Set.of()), + GROWTH_CATALYST(Branch.REPEATABLE, 0, 10, 10, () -> Set.of()), + VOID_ATTUNEMENT(Branch.REPEATABLE, 0, 12, 10, () -> Set.of()); + + public enum Branch { + IGNITION, + FUSION, + COLLAPSE, + VOID, + REPEATABLE + } + + private final Branch branch; + private final int row; + private final int baseCost; + private final int maxLevel; + private final Supplier> prerequisitesSupplier; + private Set prerequisites; + + StellarIrisUpgrade(Branch branch, int row, int cost, int maxLevel, Supplier> prereqs) { + this.branch = branch; + this.row = row; + this.baseCost = cost; + this.maxLevel = maxLevel; + this.prerequisitesSupplier = prereqs; + } + + public Branch getBranch() { + return branch; + } + + public int getRow() { + return row; + } + + public int getCost() { + return baseCost; + } + + public int getCostForLevel(int level) { + if (!isRepeatable() || level <= 1) return baseCost; + return (int) Math.ceil(baseCost * Math.pow(1.5, level - 1)); + } + + public int getTotalCostForLevel(int targetLevel) { + int total = 0; + for (int i = 1; i <= targetLevel; i++) { + total += getCostForLevel(i); + } + return total; + } + + public int getMaxLevel() { + return maxLevel; + } + + public boolean isRepeatable() { + return branch == Branch.REPEATABLE; + } + + public Set getPrerequisites() { + if (prerequisites == null) { + prerequisites = prerequisitesSupplier.get(); + } + return prerequisites; + } + + public int getRequiredTier() { + return isRepeatable() ? 0 : Math.max(0, row - 1); + } + + public boolean isCapstone() { + return row == 11 && !isRepeatable(); + } + + public boolean canUnlock(Set owned, int currentTier) { + if (isRepeatable()) return true; + if (currentTier < getRequiredTier()) return false; + if (owned.contains(this)) return false; + + Set prereqs = getPrerequisites(); + if (prereqs.isEmpty()) return true; + + if (row <= 2) { + for (StellarIrisUpgrade prereq : prereqs) { + if (owned.contains(prereq)) return true; + } + return false; + } + return owned.containsAll(prereqs); + } + + public String getTranslationKey() { + return "cosmiccore.stellar.upgrade." + name().toLowerCase(); + } + + public String getDescriptionKey() { + return getTranslationKey() + ".desc"; + } + + public static Set getByBranch(Branch branch) { + EnumSet result = EnumSet.noneOf(StellarIrisUpgrade.class); + for (StellarIrisUpgrade upgrade : values()) { + if (upgrade.branch == branch) result.add(upgrade); + } + return result; + } + + public static Set getByRow(int row) { + EnumSet result = EnumSet.noneOf(StellarIrisUpgrade.class); + for (StellarIrisUpgrade upgrade : values()) { + if (upgrade.row == row && !upgrade.isRepeatable()) result.add(upgrade); + } + return result; + } + + public static StellarIrisUpgrade getCapstone(Branch branch) { + for (StellarIrisUpgrade upgrade : values()) { + if (upgrade.branch == branch && upgrade.isCapstone()) return upgrade; + } + return null; + } + + public static Set getRepeatables() { + return getByBranch(Branch.REPEATABLE); + } + + public static int getTotalCost() { + int total = 0; + for (StellarIrisUpgrade upgrade : values()) { + if (!upgrade.isRepeatable()) total += upgrade.baseCost; + } + return total; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/UniqueWorkableElectricMultiblockMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/UniqueWorkableElectricMultiblockMachine.java new file mode 100644 index 000000000..339b68c41 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/UniqueWorkableElectricMultiblockMachine.java @@ -0,0 +1,80 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +import com.ghostipedia.cosmiccore.api.data.savedData.UniqueMultiblockSavedData; + +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.common.machine.owner.FTBOwner; + +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.server.level.ServerLevel; + +import java.util.List; +import java.util.UUID; + +public class UniqueWorkableElectricMultiblockMachine extends WorkableElectricMultiblockMachine { + + + public UniqueWorkableElectricMultiblockMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + // Used to make sure you cannot have more than one of this multiblock per player / team + @Persisted + public boolean isDuplicate = false; + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + + if (getLevel() instanceof ServerLevel serverLevel) { + var owner = getTeamUUID(); + var multiblockId = getDefinition().getId().toString(); + var uniqueMultiblockMapping = UniqueMultiblockSavedData.getOrCreate(serverLevel); + + if (uniqueMultiblockMapping.hasData(owner, multiblockId, getDimension())) { + this.isDuplicate = !uniqueMultiblockMapping.isUnique(owner, multiblockId, getDimension(), getBlockPos()); + if (isDuplicate) recipeLogic.setStatus(RecipeLogic.Status.SUSPEND); + } else uniqueMultiblockMapping.addMultiblock(owner, getDefinition().getId().toString(), getDimension(), + getBlockPos()); + + } + } + + protected UUID getTeamUUID() { + var team = getOwner() instanceof FTBOwner ftbOwner ? ftbOwner.getPlayerTeam(getOwnerUUID()) : null; + return team != null ? team.getTeamId() : getOwnerUUID(); + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + if (getLevel() instanceof ServerLevel serverLevel) { + var owner = getTeamUUID(); + var uniqueMultiblockMapping = UniqueMultiblockSavedData.getOrCreate(serverLevel); + uniqueMultiblockMapping.removeMultiblock(owner, getDefinition().getId().toString(), getDimension(), + getBlockPos()); + } + } + + @Override + public void addDisplayText(List textList) { + if (this.isDuplicate) { + textList.add(Component.translatable("cosmic.multiblock.capacitor.duplicate.multiblock.1") + .setStyle(Style.EMPTY.withColor(ChatFormatting.DARK_RED))); + textList.add(Component.translatable("cosmic.multiblock.capacitor.duplicate.multiblock.2") + .setStyle(Style.EMPTY.withColor(ChatFormatting.DARK_RED))); + } else super.addDisplayText(textList); + } + + private String getDimension() { + if (getLevel() instanceof ServerLevel serverLevel) { + return serverLevel.dimension().location().toString(); + } + return null; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/WorkableElectricModuleMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/WorkableElectricModuleMachine.java new file mode 100644 index 000000000..daaa488ff --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/multiblock/WorkableElectricModuleMachine.java @@ -0,0 +1,3 @@ +package com.ghostipedia.cosmiccore.api.machine.multiblock; + +public class WorkableElectricModuleMachine {} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/CosmicPartAbility.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/CosmicPartAbility.java index 7d6a36171..495280c93 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/CosmicPartAbility.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/CosmicPartAbility.java @@ -3,7 +3,24 @@ import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; public class CosmicPartAbility { - public static final PartAbility SOUL_CONTAINER= new PartAbility("soul_container"); + + public static final PartAbility SOUL_CONTAINER = new PartAbility("soul_container"); public static final PartAbility IMPORT_SOUL = new PartAbility("import_soul"); public static final PartAbility EXPORT_SOUL = new PartAbility("export_soul"); + public static final PartAbility COSMIC_PARALLEL_HATCH = new PartAbility("cosmic_parallel_hatch"); + public static final PartAbility MODULE_HATCH = new PartAbility("module_hatch"); + public static final PartAbility PSS_SENSORS = new PartAbility("pss_sensors"); + + public static final PartAbility STERILIZE_HATCH = new PartAbility("sterilization_hatch"); + + public static final PartAbility IMPORT_THERMIA = new PartAbility("import_thermia"); + public static final PartAbility EXPORT_THERMIA = new PartAbility("export_thermia"); + + public static final PartAbility IMPORT_EMBER = new PartAbility("import_ember"); + public static final PartAbility EXPORT_EMBER = new PartAbility("export_ember"); + public static final PartAbility BEE_HOLDER = new PartAbility("bee_holder"); + public static final PartAbility ME_ASSEMBLY_PARTS = new PartAbility("me_assembly_parts"); + public static final PartAbility ME_ASSEMBLY_PARTS_FLUID = new PartAbility("me_assembly_parts_fluid"); + + public static final PartAbility ALVEARY_MODIFIER = new PartAbility("alveary_modifier"); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/DroneMaintenanceInterfacePartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/DroneMaintenanceInterfacePartMachine.java new file mode 100644 index 000000000..a4b310e97 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/DroneMaintenanceInterfacePartMachine.java @@ -0,0 +1,215 @@ +package com.ghostipedia.cosmiccore.api.machine.part; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.DroneStationMachine; +import com.ghostipedia.cosmiccore.api.misc.DroneStationConnection; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.fancy.IFancyTooltip; +import com.gregtechceu.gtceu.api.gui.fancy.TooltipsPanel; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.resources.ResourceLocation; + +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Set; + +public class DroneMaintenanceInterfacePartMachine extends TieredPartMachine + implements IMaintenanceMachine { + + + @Persisted + protected int timeActive; + @Persisted + @DescSynced + protected byte maintenanceProblems = startProblems(); + @Persisted + private float durationMultiplier = 1f; + @Nullable + protected TickableSubscription maintenanceSubs; + + private DroneStationConnection connection; + + // Can't sync a DroneStationConnection so magic value it is + // -1 = no connection, otherwise it's the Long packed BPos + @DescSynced + private long syncedConnectionPos; + + public DroneMaintenanceInterfacePartMachine(BlockEntityCreationInfo holder) { + super(holder, GTValues.HV); + } + + ////////////////////////////////////// + // ****** Initialization ******// + ////////////////////////////////////// + + + @Override + public byte startProblems() { + return ALL_PROBLEMS; + } + + ////////////////////////////////////// + // ********* Logic **********// + ////////////////////////////////////// + @Override + public int getTimeActive() { + return timeActive; + } + + @Override + public void setTimeActive(int timeActive) { + this.timeActive = timeActive; + } + + @Override + public byte getMaintenanceProblems() { + return maintenanceProblems; + } + + @Override + public float getDurationMultiplier() { + return durationMultiplier; + } + + public DroneStationConnection getConnection() { + return connection; + } + + @Override + public void setMaintenanceProblems(byte problems) { + this.maintenanceProblems = problems; + } + + @Override + public void onLoad() { + super.onLoad(); + if (!isRemote()) { + maintenanceSubs = subscribeServerTick(maintenanceSubs, this::update); + } + } + + @Override + public void onUnload() { + if (maintenanceSubs != null) { + maintenanceSubs.unsubscribe(); + maintenanceSubs = null; + } + } + + @Override + public void onMachineDestroyed() { + super.onMachineDestroyed(); + if (hasConnection()) connection.machine = null; + } + + public void update() { + if (isRemote()) return; + // Fix maintenance problems every second + if (getOffsetTimer() % 20 == 0) { + if (hasConnection()) { + syncedConnectionPos = connection.droneStationPos.asLong(); + updateCleanroomStyle(); + if (hasMaintenanceProblems()) { + // See if we are allowed to fix maintenance issues + potentially consume a drone + if (connection.droneStation.fixMaintenanceIssue()) { + fixAllMaintenanceProblems(); + } + } + } else { + syncedConnectionPos = -1; + // Find a new connection every 10 seconds + if (getOffsetTimer() % 200 == 0) { + tryFindConnection(); + } + } + } + } + + private void updateCleanroomStyle() { + if (!hasConnection()) return; + if (connection.droneStation.currentTier != DroneStationMachine.DroneTier.SANGUINE && + connection.droneStation.currentTier != DroneStationMachine.DroneTier.PLASMATIC) + return; + // TODO[GTCEu 8.0 port]: cleanroom-supplying disabled. The 1.20.1 API used here + // (ICleanroomProvider / ICleanroomReceiver / DummyCleanroom.createForTypes) was removed. + // 8.0 replaces it with the trait pair CleanroomProviderTrait / CleanroomReceiverTrait + // (com.gregtechceu.gtceu.api.machine.trait). Reimplementing requires attaching a + // CleanroomProviderTrait to this part and pushing it into each controller's + // CleanroomReceiverTrait via CleanroomReceiverTrait#setCleanroomProvider; there is no + // DummyCleanroom factory anymore, so a real provider trait must be constructed. + } + + public boolean hasConnection() { + if (connection == null) return false; + if (connection.isValid()) return true; + return connection.reCheckConnection(); + } + + private void tryFindConnection() { + ResourceLocation dimension = this.getLevel().dimension().location(); + if (!DroneStationMachine.droneStations.containsKey(dimension)) return; + + Set stations = DroneStationMachine.droneStations.get(dimension); + for (DroneStationMachine station : stations) { + // TODO: Do we want to take specifically the closest one (slower), or just take the first within range + // (faster)? + // the speed difference should be negligible :P + long blockLimit = station.getBlockLimit(); + if (station.getBlockPos().distSqr(this.getBlockPos()) > blockLimit * blockLimit) continue; + if (!station.isActive()) continue; + connection = new DroneStationConnection(this, station); + station.connections.add(connection); + return; + } + } + + @Override + public void attachTooltips(TooltipsPanel tooltipsPanel) { + IMaintenanceMachine.super.attachTooltips(tooltipsPanel); + tooltipsPanel.attachTooltips(new IFancyTooltip.Basic( + () -> GuiTextures.GREGTECH_LOGO, + () -> List.of(Component + .translatable("cosmiccore.multiblock.drone_maintenance_interface.connection_location", + BlockPos.of(this.syncedConnectionPos).getX(), + BlockPos.of(this.syncedConnectionPos).getY(), + BlockPos.of(this.syncedConnectionPos).getZ()) + .setStyle(Style.EMPTY.withColor(ChatFormatting.GREEN))), + () -> this.syncedConnectionPos != -1, + () -> null)); + tooltipsPanel.attachTooltips(new IFancyTooltip.Basic( + () -> GuiTextures.GREGTECH_LOGO, + () -> List.of(Component.translatable("cosmiccore.multiblock.drone_maintenance_interface.no_connection") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))), + (() -> this.syncedConnectionPos == -1), + () -> null)); + } + + public void fixAllMaintenanceProblems() { + for (int i = 0; i < 6; i++) setMaintenanceFixed(i); + } + + @Override + public boolean isFullAuto() { + return false; + } + + @Override + public void setTaped(boolean ignored) {} + + @Override + public boolean isTaped() { + return false; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/SteamFluidHatchPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/SteamFluidHatchPartMachine.java new file mode 100644 index 000000000..4b76e6517 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/SteamFluidHatchPartMachine.java @@ -0,0 +1,46 @@ +package com.ghostipedia.cosmiccore.api.machine.part; + +import com.ghostipedia.cosmiccore.common.data.CosmicMachines; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.MachineDefinition; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.part.FluidHatchPartMachine; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.state.BlockState; + +public class SteamFluidHatchPartMachine extends FluidHatchPartMachine { + + public SteamFluidHatchPartMachine(BlockEntityCreationInfo holder, IO io, long initialCapacity, int slots) { + super(holder, 1, io, 2000, 1); + } + + @Override + public boolean swapIO() { + BlockPos blockPos = getBlockPos(); + MachineDefinition newDefinition = null; + + if (io == IO.IN) { + newDefinition = CosmicMachines.STEAM_EXPORT_HATCH; + } else if (io == IO.OUT) { + newDefinition = CosmicMachines.STEAM_IMPORT_HATCH; + } + if (newDefinition == null) return false; + + BlockState newBlockState = newDefinition.getBlock().defaultBlockState(); + + getLevel().setBlockAndUpdate(blockPos, newBlockState); + + if (MetaMachine.getMachine(getLevel(), blockPos) instanceof SteamFluidHatchPartMachine newMachine) { + newMachine.setFrontFacing(this.getFrontFacing()); + newMachine.setUpwardsFacing(this.getUpwardsFacing()); + newMachine.setPaintingColor(this.getPaintingColor()); + for (int i = 0; i < this.tank.getTanks(); i++) { + newMachine.tank.setFluidInTank(i, this.tank.getFluidInTank(i)); + } + } + return true; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/WirelessEnergyHatchPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/WirelessEnergyHatchPartMachine.java new file mode 100644 index 000000000..185881962 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/part/WirelessEnergyHatchPartMachine.java @@ -0,0 +1,199 @@ +package com.ghostipedia.cosmiccore.api.machine.part; + +import com.ghostipedia.cosmiccore.api.data.wireless.WirelessEnergySavedData; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.common.machine.owner.FTBOwner; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import com.gregtechceu.gtceu.utils.ISubscription; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.network.chat.Component; +import net.minecraft.server.TickTask; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.BlockHitResult; + +import lombok.Getter; + +import java.util.ArrayList; +import java.util.UUID; + +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class WirelessEnergyHatchPartMachine extends TieredIOPartMachine { + + protected static final long ticks_between_save_data_operations = 5L * 20L; + + + @Persisted + public final NotifiableEnergyContainer energyContainer; + protected TickableSubscription wirelessSub; + @Nullable + protected ISubscription energyListener; + @Getter + protected int amperage; + + public WirelessEnergyHatchPartMachine(BlockEntityCreationInfo holder, int tier, IO io, int amperage) { + super(holder, tier, io); + this.amperage = amperage; + this.energyContainer = createEnergyContainer(); + } + + protected NotifiableEnergyContainer createEnergyContainer() { + NotifiableEnergyContainer container; + if (this.io == IO.OUT) { + container = NotifiableEnergyContainer.emitterContainer(this, getEnergyCapacity(tier, amperage), + GTValues.V[tier], amperage); + container.setSideOutputCondition(s -> s == getFrontFacing() && isWorkingEnabled()); + container.setCapabilityValidator(s -> s == null || s == getFrontFacing()); + } else { + container = NotifiableEnergyContainer.receiverContainer(this, getEnergyCapacity(tier, amperage), + GTValues.V[tier], amperage); + container.setSideInputCondition(s -> s == getFrontFacing() && isWorkingEnabled()); + container.setCapabilityValidator(s -> s == null || s == getFrontFacing()); + } + return container; + } + + public static long getEnergyCapacity(int tier, int amperage) { + // Capacity is twice the maximum throughput over the duration between saveData calls + return GTValues.V[tier] * amperage * ((long) (ticks_between_save_data_operations * 1.1)); + } + + @Override + public boolean shouldOpenUI(Player player, InteractionHand hand, BlockHitResult hit) { + return false; + } + + @Override + public void onLoad() { + super.onLoad(); + if (getLevel() instanceof ServerLevel serverLevel) + serverLevel.getServer().tell(new TickTask(0, this::updateWirelessSubscription)); + energyListener = energyContainer.addChangedListener(this::updateWirelessSubscription); + } + + @Override + public void onUnload() { + super.onUnload(); + if (energyListener != null) { + energyListener.unsubscribe(); + energyListener = null; + } + } + + protected void updateWirelessSubscription() { + if (isWorkingEnabled()) wirelessSub = subscribeServerTick(wirelessSub, this::wirelessHandler); + else if (wirelessSub != null) { + wirelessSub.unsubscribe(); + wirelessSub = null; + } + } + + protected UUID getTeamUUID() { + if (getOwner() instanceof FTBOwner ftbOwner) { + var team = ftbOwner.getPlayerTeam(getOwnerUUID()); + if (team != null) return team.getTeamId(); + } + return getOwnerUUID(); + } + + @Override + public void onMachinePlaced(@org.jetbrains.annotations.Nullable LivingEntity player, ItemStack stack) { + super.onMachinePlaced(player, stack); + if (getLevel() instanceof ServerLevel serverLevel) { + if (io == IO.IN) { + var data = WirelessEnergySavedData.getOrCreate(serverLevel); + var owner = getTeamUUID(); + + long euToTransfer = energyContainer.getEnergyCapacity() - energyContainer.getEnergyStored(); + long euTransferred = data.addEUToGlobalWirelessEnergy(owner, -euToTransfer); + energyContainer.changeEnergy(euToTransfer - euTransferred); + } + } + } + + @Override + public void onMachineDestroyed() { + super.onMachineDestroyed(); + if (getLevel() instanceof ServerLevel serverLevel) { + var data = WirelessEnergySavedData.getOrCreate(serverLevel); + var owner = getTeamUUID(); + data.removeEnergyBuffered(owner, getBlockPos()); + if (io == IO.OUT) data.removeEnergyInput(owner, getBlockPos()); + if (io == IO.IN) data.removeEnergyOutput(owner, getBlockPos()); + data.addEUToGlobalWirelessEnergy(owner, energyContainer.getEnergyStored()); + energyContainer.setEnergyStored(0L); + } + } + + protected void wirelessHandler() { + if (getLevel() instanceof ServerLevel serverLevel) { + if (isWorkingEnabled()) { + if (getOffsetTimer() % 20 == 0) { + var data = WirelessEnergySavedData.getOrCreate(serverLevel); + var owner = getTeamUUID(); + data.setEnergyBuffered(owner, getBlockPos(), energyContainer.getEnergyStored()); + if (io == IO.IN) data.setEnergyOutput(owner, getBlockPos(), energyContainer.getOutputPerSec() / 20); + if (io == IO.OUT) data.setEnergyInput(owner, getBlockPos(), energyContainer.getInputPerSec() / 20); + } + if (getOffsetTimer() % ticks_between_save_data_operations == 0) { + var data = WirelessEnergySavedData.getOrCreate(serverLevel); + var owner = getTeamUUID(); + + if (data.isActive(owner)) { + if (io == IO.IN) { + long euToTransfer = energyContainer.getEnergyCapacity() - energyContainer.getEnergyStored(); + long euTransferred = data.addEUToGlobalWirelessEnergy(owner, -euToTransfer); + energyContainer.changeEnergy(euToTransfer - euTransferred); + } else if (io == IO.OUT) { + long euToTransfer = energyContainer.getEnergyStored(); + long euTransferred = data.addEUToGlobalWirelessEnergy(owner, euToTransfer); + energyContainer.changeEnergy(-(euToTransfer - euTransferred)); + } + } + } + } + } + } + + public static Component[] getTooltipComponents(int tier, IO io, int amperage) { + var tooltip = new ArrayList(); + + if (io == IO.IN) { + tooltip.add(Component.translatable("gtceu.universal.tooltip.voltage_in", + FormattingUtil.formatNumbers(GTValues.V[tier]), GTValues.VNF[tier])); + tooltip.add(Component.translatable("gtceu.universal.tooltip.amperage_in", amperage)); + } else if (io == IO.OUT) { + tooltip.add(Component.translatable("gtceu.universal.tooltip.voltage_out", + FormattingUtil.formatNumbers(GTValues.V[tier]), GTValues.VNF[tier])); + tooltip.add(Component.translatable("gtceu.universal.tooltip.amperage_out", amperage)); + } + + tooltip.add(Component.translatable("gtceu.universal.tooltip.energy_storage_capacity", + FormattingUtil.formatNumbers(getEnergyCapacity(tier, amperage)))); + + if (io == IO.IN) { + tooltip.add(Component.translatable(amperage > 1 ? "gtceu.machine.energy_hatch.input_hi_amp.tooltip" : + "gtceu.machine.energy_hatch.input.tooltip")); + } else if (io == IO.OUT) { + tooltip.add(Component.translatable(amperage > 1 ? "gtceu.machine.energy_hatch.output_hi_amp.tooltip" : + "gtceu.machine.energy_hatch.output.tooltip")); + } + + return tooltip.toArray(new Component[0]); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/trait/NotifiableSoulContainer.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/trait/NotifiableSoulContainer.java index 90ae3f2c0..8a7153bc6 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/machine/trait/NotifiableSoulContainer.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/trait/NotifiableSoulContainer.java @@ -1,130 +1,136 @@ package com.ghostipedia.cosmiccore.api.machine.trait; -import com.ghostipedia.cosmiccore.api.capability.recipe.SoulRecipeCapability; -import com.ghostipedia.cosmiccore.api.capability.ISoulContainer; +import com.ghostipedia.cosmiccore.api.capability.recipe.CosmicRecipeCapabilities; +import com.ghostipedia.cosmiccore.api.data.souls.SoulNetwork; +import com.ghostipedia.cosmiccore.api.data.souls.SoulNetworkSavedData; +import com.ghostipedia.cosmiccore.api.recipe.ingredient.SoulIngredient; +import com.ghostipedia.cosmiccore.api.recipe.ingredient.SoulStack; + import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; -import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.machine.trait.NotifiableRecipeHandlerTrait; import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; -import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import com.gregtechceu.gtceu.common.machine.owner.FTBOwner; + +import net.minecraft.server.level.ServerLevel; + import lombok.Getter; -import org.jetbrains.annotations.Nullable; -import wayoftime.bloodmagic.core.data.SoulNetwork; -import wayoftime.bloodmagic.core.data.SoulTicket; -import wayoftime.bloodmagic.util.helper.NetworkHelper; -import com.gregtechceu.gtceu.api.GTValues; +import org.jetbrains.annotations.NotNull; -import java.util.Collections; +import java.util.ArrayList; import java.util.List; import java.util.UUID; -public class NotifiableSoulContainer extends NotifiableRecipeHandlerTrait implements ISoulContainer { - public static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(NotifiableSoulContainer.class, NotifiableRecipeHandlerTrait.MANAGED_FIELD_HOLDER); +public class NotifiableSoulContainer extends NotifiableRecipeHandlerTrait { - @Getter - private final IO handlerIO; - private final ConditionalSubscriptionHandler conditionalSubscriptionHandler; + public static final MachineTraitType TYPE = + new MachineTraitType<>(NotifiableSoulContainer.class); - @Getter - @Persisted @DescSynced - private UUID owner; + public final IO handlerIO; @Getter - @DescSynced - private int currentEssence; - - @Persisted - private int maxCapacity; + private final int throughput; - @Persisted - private int maxConsumption; + @Getter + private final int capacity; - public NotifiableSoulContainer(MetaMachine machine, IO io, int maxCapacity, int maxConsumption) { + public NotifiableSoulContainer(MetaMachine machine, IO io, int throughput, int capacity) { super(machine); this.handlerIO = io; - this.currentEssence = -1; - this.maxCapacity = maxCapacity; - this.maxConsumption = maxConsumption; - conditionalSubscriptionHandler = new ConditionalSubscriptionHandler(machine, this::querySoulNetwork, () -> owner != null); + this.throughput = throughput; + this.capacity = capacity; } - private void querySoulNetwork() { - if (this.machine.getOffsetTimer() % 20 != 0) return; - - var network = this.getSoulNetwork(); - if (network == null) return; + @Override + public IO getHandlerIO() { + return handlerIO; + } - var essence = network.getCurrentEssence(); - if (this.currentEssence == essence) return; + public int getThroughput() { + return throughput; + } - this.currentEssence = essence; - this.notifyListeners(); + public int getCapacity() { + return capacity; } @Override - public List handleRecipeInner(IO io, GTRecipe recipe, List left, @Nullable String slotName, boolean simulate) { - ISoulContainer container = this; - if (container.getOwner() == null) return null; - - int lifeEssence = left.stream().reduce(0, Integer::sum); - if (io == IO.IN) { - var canOutput = Math.min(this.maxConsumption, container.getSoulNetwork().getCurrentEssence()); - if (!simulate) lifeEssence = container.getSoulNetwork().syphon(SoulTicket.block(this.machine.getLevel(), this.machine.getPos(), Math.min(canOutput, lifeEssence)), false); - lifeEssence = lifeEssence - canOutput; - } else if (io == IO.OUT) { - var canInput = this.maxCapacity - container.getSoulNetwork().getCurrentEssence(); - if (!simulate) lifeEssence = container.getSoulNetwork().add(SoulTicket.block(this.machine.getLevel(), this.machine.getPos(), Math.min(canInput, lifeEssence)), this.maxCapacity); - lifeEssence = lifeEssence - canInput; - } - - return lifeEssence <= 0 ? null : Collections.singletonList(lifeEssence); + public MachineTraitType getTraitType() { + return TYPE; } - @Override - public List getContents() { - if (this.owner == null) return Collections.emptyList(); - return List.of(this.getSoulNetwork().getCurrentEssence()); + private SoulNetwork getSoulNetwork() { + if (this.machine.getLevel() instanceof ServerLevel serverLevel) { + return SoulNetworkSavedData.getSoulNetwork(serverLevel, getOwner()); + } + return new SoulNetwork(); } - @Override - public double getTotalContentAmount() { - if (this.owner == null)return 0; - return this.getSoulNetwork().getCurrentEssence(); + private UUID getOwner() { + if (this.machine.getOwner() instanceof FTBOwner ftbOwner) { + var team = ftbOwner.getPlayerTeam(this.machine.getOwnerUUID()); + if (team != null) return team.getTeamId(); + } + return this.machine.getOwnerUUID(); } @Override - public RecipeCapability getCapability() { - return SoulRecipeCapability.CAP; + public List handleRecipeInner(IO io, GTRecipe recipe, List left, boolean simulate) { + if (io != handlerIO) return left; + if (io != IO.IN && io != IO.OUT) return left.isEmpty() ? null : left; + + var network = getSoulNetwork(); + List result = new ArrayList<>(); + + for (SoulIngredient ingredient : left) { + SoulStack requiredStack = ingredient.stack(); + if (requiredStack.isEmpty()) continue; + + if (io == IO.IN) { + SoulStack consumedStack = network.syphon(requiredStack, simulate); + if (consumedStack.amount() < requiredStack.amount()) { + result.add(SoulIngredient + .of(requiredStack.withAmount(requiredStack.amount() - consumedStack.amount()))); + } + } else { + SoulStack canInput = network.add(requiredStack, throughput, capacity, simulate); + SoulStack reminder = requiredStack.withAmount(requiredStack.amount() - canInput.amount()); + if (reminder.amount() > 0) result.add(SoulIngredient.of(reminder)); + } + } + + return result.isEmpty() ? null : result; } @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; + public @NotNull List getContents() { + return getSoulNetwork().getContents().stream() + .map(SoulIngredient::new) + .map(Object.class::cast) + .toList(); } - @Override - public SoulNetwork getSoulNetwork() { - return NetworkHelper.getSoulNetwork(this.owner); + /** Server-only access to the underlying network's stacks for UI display. */ + public List getStacks() { + return getSoulNetwork().getContents(); } @Override public int getSize() { - return 1; + return getSoulNetwork().getContents().size(); } @Override - public void setOwner(UUID owner) { - this.owner = owner; - conditionalSubscriptionHandler.updateSubscription(); + public double getTotalContentAmount() { + return getSoulNetwork().getContents().stream() + .mapToInt(SoulStack::amount) + .sum(); } @Override - public void onMachineLoad() { - super.onMachineLoad(); - conditionalSubscriptionHandler.initialize(this.machine.getLevel()); + public RecipeCapability getCapability() { + return CosmicRecipeCapabilities.SOUL; } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/trait/NotifiableSterileTank.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/trait/NotifiableSterileTank.java new file mode 100644 index 000000000..102f77177 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/trait/NotifiableSterileTank.java @@ -0,0 +1,21 @@ +package com.ghostipedia.cosmiccore.api.machine.trait; + +import com.ghostipedia.cosmiccore.api.capability.recipe.SterileRecipeCapability; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import net.neoforged.neoforge.fluids.crafting.SizedFluidIngredient; + +public class NotifiableSterileTank extends NotifiableFluidTank { + + public NotifiableSterileTank(MetaMachine machine, int slots, int capacity, IO io, IO capabilityIO) { + super(machine, slots, capacity, io, capabilityIO); + } + + @Override + public RecipeCapability getCapability() { + return SterileRecipeCapability.CAP; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/machine/trait/NotifiableThermiaContainer.java b/src/main/java/com/ghostipedia/cosmiccore/api/machine/trait/NotifiableThermiaContainer.java new file mode 100644 index 000000000..255230c6d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/machine/trait/NotifiableThermiaContainer.java @@ -0,0 +1,115 @@ +package com.ghostipedia.cosmiccore.api.machine.trait; + +import com.ghostipedia.cosmiccore.api.capability.recipe.IHeatContainer; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableRecipeHandlerTrait; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; + +import net.minecraft.core.Direction; + +import lombok.Getter; + +import java.util.List; +import java.util.function.Predicate; + +public class NotifiableThermiaContainer extends NotifiableRecipeHandlerTrait implements IHeatContainer { + + public static final MachineTraitType TYPE = + new MachineTraitType<>(NotifiableThermiaContainer.class); + + private final IO handlerIO; + @Getter + private final long overloadLimit; + @Persisted + @DescSynced + @Getter + private final long currentTemp; + private Predicate sideInputCondition; + private Predicate sideOutputCondition; + + public NotifiableThermiaContainer(MetaMachine machine, IO io, long overloadLimit, long currentTemp) { + super(machine); + this.handlerIO = io; + this.overloadLimit = overloadLimit; + this.currentTemp = currentTemp; + } + + @Override + public IO getHandlerIO() { + return handlerIO; + } + + @Override + public long getOverloadLimit() { + return overloadLimit; + } + + public long getCurrentTemp() { + return currentTemp; + } + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + public void serverTick() { + if (getMachine().getLevel().isClientSide) return; + } + + @Override + public long acceptHeatFromNetwork(Direction side) { + return 0; + } + + @Override + public boolean inputsHeat(Direction side) { + return false; + } + + @Override + public long changeHeat(long heatDifference) { + return 0; + } + + @Override + public long getHeatStorage() { + return this.getHeatInfo().stored(); + } + + @Override + public List handleRecipeInner(IO io, GTRecipe recipe, List left, + boolean simulate) { + return null; + } + + @Override + public List getContents() { + return null; + } + + @Override + public double getTotalContentAmount() { + return 0; + } + + @Override + public RecipeCapability getCapability() { + return null; + } + + public void setSideInputCondition(final Predicate sideInputCondition) { + this.sideInputCondition = sideInputCondition; + } + + public void setSideOutputCondition(final Predicate sideOutputCondition) { + this.sideOutputCondition = sideOutputCondition; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/misc/DroneStationConnection.java b/src/main/java/com/ghostipedia/cosmiccore/api/misc/DroneStationConnection.java new file mode 100644 index 000000000..9f617ed69 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/misc/DroneStationConnection.java @@ -0,0 +1,56 @@ +package com.ghostipedia.cosmiccore.api.misc; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.DroneStationMachine; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; + + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; + +import org.jetbrains.annotations.NotNull; + +public class DroneStationConnection { + + public MetaMachine machine; + public BlockPos machinePos; + public DroneStationMachine droneStation; + public BlockPos droneStationPos; + public Level world; + + public DroneStationConnection(MetaMachine machine, DroneStationMachine droneStation) { + this.machine = machine; + this.machinePos = machine.getBlockPos(); + this.droneStation = droneStation; + this.droneStationPos = droneStation.getBlockPos(); + this.world = machine.getLevel(); + } + + public boolean reCheckConnection() { + if (machine == null) this.machine = getMetaMachineAt(machinePos, world); + if (droneStation == null) { + MetaMachine droneStation = getMetaMachineAt(droneStationPos, world); + if (!(droneStation instanceof DroneStationMachine droneStationMachine)) return false; + this.droneStation = droneStationMachine; + } + + if (machine != null && !droneStation.connections.contains(this)) + droneStation.connections.add(this); + return isValid(); + } + + // gets a metamachine at a position + private MetaMachine getMetaMachineAt(@NotNull BlockPos pos, Level level) { + BlockEntity blockEntity = level.getBlockEntity(pos); + if (blockEntity == null) return null; + if (blockEntity instanceof MetaMachine machineBlockEntity) { + return machineBlockEntity; + } + return null; + } + + public boolean isValid() { + return machine != null && !machine.isRemoved() && droneStation != null && !droneStation.isRemoved(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/misc/HeatInfoProviderList.java b/src/main/java/com/ghostipedia/cosmiccore/api/misc/HeatInfoProviderList.java new file mode 100644 index 000000000..f96bef043 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/misc/HeatInfoProviderList.java @@ -0,0 +1,43 @@ +package com.ghostipedia.cosmiccore.api.misc; + +import com.ghostipedia.cosmiccore.api.capability.IHeatInfoProvider; + +import net.minecraft.MethodsReturnNonnullByDefault; + +import java.util.List; + +import javax.annotation.ParametersAreNonnullByDefault; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +public class HeatInfoProviderList implements IHeatInfoProvider { + + private final List list; + + public HeatInfoProviderList(List list) { + this.list = list; + } + + @Override + public HeatInfo getHeatInfo() { + Long capacity = 0L; + Long stored = 0L; + boolean overload = true; + // This was done differently in the EnergyProviderList. + // In our case let's just reassign the longs to their contained info..? + // IDK go ask someone more sentient! + for (IHeatInfoProvider heatInfoProvider : list) { + HeatInfo heatInfo = heatInfoProvider.getHeatInfo(); + capacity = heatInfo.capacity(); + stored = heatInfo.stored(); + overload = heatInfo.overload(); + } + return new HeatInfo(capacity, stored, overload); + } + + @Override + public boolean supportsImpossibleHeatValues() { + // Not 100% confident on what this is returning, assuming it's the list of all heat providers...? + return list.size() > 1; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/misc/PlanetKeys.java b/src/main/java/com/ghostipedia/cosmiccore/api/misc/PlanetKeys.java new file mode 100644 index 000000000..ab4860d41 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/misc/PlanetKeys.java @@ -0,0 +1,19 @@ +package com.ghostipedia.cosmiccore.api.misc; + +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; + +public class PlanetKeys { + + public static final ResourceKey SUN; + public static final ResourceKey JUPITER; + public static final ResourceKey SATURN; + + static { + SUN = ResourceKey.create(Registries.DIMENSION, ResourceLocation.fromNamespaceAndPath("frontiers", "sun")); + JUPITER = ResourceKey.create(Registries.DIMENSION, ResourceLocation.fromNamespaceAndPath("frontiers", "jupiter")); + SATURN = ResourceKey.create(Registries.DIMENSION, ResourceLocation.fromNamespaceAndPath("frontiers", "saturn")); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/pattern/CosmicPredicates.java b/src/main/java/com/ghostipedia/cosmiccore/api/pattern/CosmicPredicates.java index 474cae969..68298dc00 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/pattern/CosmicPredicates.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/pattern/CosmicPredicates.java @@ -2,18 +2,52 @@ import com.ghostipedia.cosmiccore.api.CosmicCoreAPI; import com.ghostipedia.cosmiccore.api.block.IMagnetType; +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarModuleReceiver; import com.ghostipedia.cosmiccore.common.block.MagnetBlock; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.MothCargoStation; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; import com.gregtechceu.gtceu.api.pattern.error.PatternStringError; +import com.gregtechceu.gtceu.api.pattern.util.PatternMatchContext; + import com.lowdragmc.lowdraglib.utils.BlockInfo; + +import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; + +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import java.util.Comparator; +import java.util.HashSet; import java.util.Map; +import java.util.Set; import java.util.function.Supplier; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; + public class CosmicPredicates { + + private static Block[] researchHubRingTiers; + + public static Block[] getResearchHubRingTiers() { + if (researchHubRingTiers == null) { + researchHubRingTiers = new Block[] { + CASING_STEEL_SOLID.get(), // T1 + CASING_ALUMINIUM_FROSTPROOF.get(), // T2 + CASING_STAINLESS_CLEAN.get(), // T3 + CASING_TITANIUM_STABLE.get(), // T4 + CASING_TUNGSTENSTEEL_ROBUST.get() // T5 + }; + } + return researchHubRingTiers; + } + public static TraceabilityPredicate magnetCoils() { return new TraceabilityPredicate(blockWorldState -> { var blockState = blockWorldState.getBlockState(); @@ -36,6 +70,186 @@ public static TraceabilityPredicate magnetCoils() { .toArray(BlockInfo[]::new)) .addTooltips(Component.translatable("gtceu.multiblock.pattern.error.coils")); } - public static void init() { + + public static TraceabilityPredicate starLadderModules() { + return new TraceabilityPredicate(blockWorldState -> { + var blockState = blockWorldState.getBlockState(); + PatternMatchContext matchContext = blockWorldState.getMatchContext(); + for (var entry : CosmicCoreAPI.STARLADDER_MODULES.entrySet()) { + if (blockState.is(entry.getValue().get())) { + var modulatorTier = entry.getKey().getModulatorTier(); + Object currentModule = blockWorldState.getMatchContext().getOrPut("ModuleType", modulatorTier); + matchContext.getOrCreate("moduleMap", Long2ObjectOpenHashMap::new) + .put(blockWorldState.getPos().asLong(), blockState); + return true; + } + } + return false; + }, () -> CosmicCoreAPI.STARLADDER_MODULES.values().stream() + .map(blockSupplier -> BlockInfo.fromBlockState(blockSupplier.get().defaultBlockState())) + .toArray(BlockInfo[]::new)) + .addTooltips(Component.translatable("gtceu.multiblock.pattern.error.filters")); + } + + public static TraceabilityPredicate mothHomes() { + return new TraceabilityPredicate(blockWorldState -> { + var blockState = blockWorldState.getBlockState(); + // Check if it's steel casing (always allowed as placeholder) + if (blockState.is(CASING_STEEL_SOLID.get())) { + return true; + } + // Check if it's a valid Forestry beehive + return MothCargoStation.isMothHome(blockState); + }, () -> { + // Provide block previews for JEI - look up Forestry blocks at render time + return new BlockInfo[] { + BlockInfo.fromBlockState(getBlockOrFallback(MothCargoStation.BEEHIVE_FOREST)), + BlockInfo.fromBlockState(getBlockOrFallback(MothCargoStation.BEEHIVE_LUSH)), + BlockInfo.fromBlockState(getBlockOrFallback(MothCargoStation.BEEHIVE_DESERT)), + BlockInfo.fromBlockState(getBlockOrFallback(MothCargoStation.BEEHIVE_END)), + BlockInfo.fromBlockState(CASING_STEEL_SOLID.get().defaultBlockState()) + }; + }).addTooltips(Component.literal("Forestry Beehive or Steel Casing")); + } + + private static net.minecraft.world.level.block.state.BlockState getBlockOrFallback(ResourceLocation loc) { + Block block = BuiltInRegistries.BLOCK.get(loc); + return (block != Blocks.AIR ? block : Blocks.BEEHIVE).defaultBlockState(); + } + + public static TraceabilityPredicate stellarModuleSlot() { + return new TraceabilityPredicate(blockWorldState -> { + var blockState = blockWorldState.getBlockState(); + if (blockState.isAir()) return true; + + var blockEntity = blockWorldState.getBlockEntity(); + if (blockEntity instanceof MetaMachine machine) { + if (machine instanceof MultiblockControllerMachine && machine instanceof IStellarModuleReceiver moduleReceiver) { + Set modules = blockWorldState.getMatchContext() + .getOrCreate("stellarModules", HashSet::new); + modules.add(moduleReceiver); + return true; + } + } + return false; + }, () -> new BlockInfo[] { BlockInfo.fromBlockState(Blocks.AIR.defaultBlockState()) }) + .addTooltips(Component.translatable("cosmiccore.multiblock.pattern.stellar_module_slot")); + } + + // SLRH tier predicates - accept air or tier block, track in context + + public static TraceabilityPredicate slrhTier0BlockA() { + return slrhTierBlock(CosmicBlocks.SUPERHEAVY_STEEL_CASING.get(), 0); + } + + public static TraceabilityPredicate slrhTier0BlockB() { + return slrhTierBlock(CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.get(), 0); + } + + public static TraceabilityPredicate slrhTier0BlockC() { + return slrhTierBlock(CosmicBlocks.SOMARUST_CASING.get(), 0); + } + + public static TraceabilityPredicate slrhTier0BlockD() { + return slrhTierBlock(CosmicBlocks.SOUL_MUTED_CASING.get(), 0); + } + + public static TraceabilityPredicate slrhTier1Block() { + return slrhTierBlock(CosmicBlocks.BICHROMAL_NEVRAMITE_CASING.get(), 1); + } + + public static TraceabilityPredicate slrhTier2BlockF() { + return slrhTierBlock(CosmicBlocks.OSCILLATING_GILDED_PTHANTERUM_CASING.get(), 2); + } + + public static TraceabilityPredicate slrhTier2BlockG() { + return slrhTierBlock(CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.get(), 2); + } + + public static TraceabilityPredicate slrhTier3BlockH() { + return slrhTierBlock(CosmicBlocks.ROYAL_ICHORIUM_CASING.get(), 3); + } + + public static TraceabilityPredicate slrhTier3BlockI() { + return slrhTierBlock(CosmicBlocks.MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get(), 3); + } + + public static TraceabilityPredicate slrhTier3BlockJ() { + return slrhTierBlock(CosmicBlocks.ULTRA_POWERED_CASING.get(), 3); + } + + private static TraceabilityPredicate slrhTierBlock(Block requiredBlock, int tier) { + return new TraceabilityPredicate(blockWorldState -> { + var blockState = blockWorldState.getBlockState(); + PatternMatchContext ctx = blockWorldState.getMatchContext(); + + if (blockState.isAir()) { + ctx.getOrCreate("SLRHTiersWithAir", HashSet::new).add(tier); + return true; + } + + if (blockState.is(requiredBlock)) { + ctx.getOrCreate("SLRHTiersWithBlocks", HashSet::new).add(tier); + return true; + } + return false; + }, () -> new BlockInfo[] { + BlockInfo.fromBlockState(requiredBlock.defaultBlockState()), + BlockInfo.fromBlockState(Blocks.AIR.defaultBlockState()) + }).addTooltips(Component.translatable("cosmiccore.multiblock.pattern.slrh_tier_block")); + } + + public static int validateSLRHTier(PatternMatchContext ctx) { + Set tiersWithBlocks = ctx.get("SLRHTiersWithBlocks"); + Set tiersWithAir = ctx.get("SLRHTiersWithAir"); + + if (tiersWithBlocks == null || tiersWithBlocks.isEmpty()) { + return -1; + } + + boolean t0HasBlocks = tiersWithBlocks.contains(0); + boolean t0HasAir = tiersWithAir != null && tiersWithAir.contains(0); + + if (!t0HasBlocks || t0HasAir) { + return -1; + } + + int highestCompleteTier = 0; + for (int tier = 1; tier <= 3; tier++) { + boolean hasBlocks = tiersWithBlocks.contains(tier); + boolean hasAir = tiersWithAir != null && tiersWithAir.contains(tier); + + if (hasBlocks && !hasAir && tier == highestCompleteTier + 1) { + highestCompleteTier = tier; + } + } + + return highestCompleteTier; + } + + public static int getSLRHPartialTierIndex(PatternMatchContext ctx) { + Set tiersWithBlocks = ctx.get("SLRHTiersWithBlocks"); + Set tiersWithAir = ctx.get("SLRHTiersWithAir"); + + if (tiersWithAir == null) { + return 0; + } + + boolean t0HasBlocks = tiersWithBlocks != null && tiersWithBlocks.contains(0); + boolean t0HasAir = tiersWithAir.contains(0); + if (t0HasAir) { + return t0HasBlocks ? 0 : -1; + } + + for (int tier = 1; tier <= 3; tier++) { + boolean hasBlocks = tiersWithBlocks != null && tiersWithBlocks.contains(tier); + boolean hasAir = tiersWithAir.contains(tier); + if (hasBlocks && hasAir) { + return tier; + } + } + return 0; } + + public static void init() {} } diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/recipe/content/SerializerSoulStack.java b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/content/SerializerSoulStack.java new file mode 100644 index 000000000..31969bea1 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/content/SerializerSoulStack.java @@ -0,0 +1,47 @@ +package com.ghostipedia.cosmiccore.api.recipe.content; + +import com.ghostipedia.cosmiccore.api.recipe.ingredient.SoulStack; + +import com.gregtechceu.gtceu.api.recipe.content.IContentSerializer; + +import net.minecraft.network.RegistryFriendlyByteBuf; + +import com.mojang.serialization.Codec; + +public class SerializerSoulStack implements IContentSerializer { + + public static SerializerSoulStack INSTANCE = new SerializerSoulStack(); + + private SerializerSoulStack() {} + + @Override + public void toNetwork(RegistryFriendlyByteBuf buf, SoulStack content) { + content.toNetwork(buf); + } + + @Override + public SoulStack fromNetwork(RegistryFriendlyByteBuf buf) { + return SoulStack.fromNetwork(buf); + } + + @Override + public SoulStack of(Object o) { + if (o instanceof SoulStack stack) return stack; + else return SoulStack.EMPTY; + } + + @Override + public SoulStack defaultValue() { + return SoulStack.EMPTY; + } + + @Override + public Class contentClass() { + return SoulStack.class; + } + + @Override + public Codec codec() { + return SoulStack.CODEC; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/recipe/ingredient/SoulIngredient.java b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/ingredient/SoulIngredient.java new file mode 100644 index 000000000..f10639c85 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/ingredient/SoulIngredient.java @@ -0,0 +1,39 @@ +package com.ghostipedia.cosmiccore.api.recipe.ingredient; + +import com.ghostipedia.cosmiccore.api.capability.souls.SoulType; + +import com.mojang.serialization.Codec; +import org.jetbrains.annotations.NotNull; + +import java.util.function.Predicate; + +public record SoulIngredient(SoulStack stack) implements Predicate { + + public static final Codec CODEC = SoulStack.CODEC.xmap(SoulIngredient::new, SoulIngredient::stack); + + public static SoulIngredient of(final SoulStack stack) { + return new SoulIngredient(stack); + } + + public static SoulIngredient of(SoulType soulType, int amount) { + return new SoulIngredient(new SoulStack(soulType, amount)); + } + + @Override + public boolean test(SoulStack soulStack) { + return this.stack.type() == soulStack.type() && this.stack.amount() <= soulStack.amount(); + } + + @Override + public @NotNull String toString() { + return "SoulIngredient{stack=" + stack + "}"; + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof SoulIngredient other)) { + return false; + } + return stack.equals(other.stack); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/recipe/ingredient/SoulStack.java b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/ingredient/SoulStack.java new file mode 100644 index 000000000..bd13ea813 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/ingredient/SoulStack.java @@ -0,0 +1,47 @@ +package com.ghostipedia.cosmiccore.api.recipe.ingredient; + +import com.ghostipedia.cosmiccore.api.capability.souls.SoulType; + +import net.minecraft.network.FriendlyByteBuf; + +import com.google.common.base.Preconditions; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import lombok.With; + +@With +public record SoulStack(SoulType type, int amount) { + + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + SoulType.CODEC.fieldOf("type").forGetter(SoulStack::type), + Codec.INT.fieldOf("amount").forGetter(SoulStack::amount)).apply(instance, SoulStack::new)); + + public static final SoulStack EMPTY = new SoulStack(SoulType.Raw, 0); + + public boolean isEmpty() { + return this.amount <= 0; + } + + public SoulStack add(int amount) { + Preconditions.checkArgument(this.amount + amount >= 0, "Resulting amount must be non-negative"); + return new SoulStack(this.type, this.amount + amount); + } + + public SoulStack withAmount(int amount) { + return new SoulStack(this.type, amount); + } + + public SoulStack sum(SoulStack a, SoulStack b) { + Preconditions.checkArgument(a.type == b.type, "SoulStack types don't match"); + return a.add(b.amount); + } + + public void toNetwork(FriendlyByteBuf buf) { + buf.writeEnum(this.type); + buf.writeVarInt(this.amount); + } + + public static SoulStack fromNetwork(FriendlyByteBuf buf) { + return new SoulStack(buf.readEnum(SoulType.class), buf.readVarInt()); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/recipe/lookup/MapEmberIngredient.java b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/lookup/MapEmberIngredient.java new file mode 100644 index 000000000..1b11f3983 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/lookup/MapEmberIngredient.java @@ -0,0 +1,34 @@ +package com.ghostipedia.cosmiccore.api.recipe.lookup; + +import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.AbstractMapIngredient; + +import java.util.Collections; +import java.util.List; + +public class MapEmberIngredient extends AbstractMapIngredient { + + public final Double embers; + + public MapEmberIngredient(Double embers) { + this.embers = embers; + } + + @Override + protected int hash() { + return MapEmberIngredient.class.hashCode(); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof MapEmberIngredient; + } + + @Override + public String toString() { + return "MapEmberIngredient{" + "embers=" + embers + '}'; + } + + public static List convertToMapIngredient(Double embers) { + return Collections.singletonList(new MapEmberIngredient(embers)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/recipe/lookup/MapHeatIngredient.java b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/lookup/MapHeatIngredient.java new file mode 100644 index 000000000..ba6d20511 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/lookup/MapHeatIngredient.java @@ -0,0 +1,27 @@ +package com.ghostipedia.cosmiccore.api.recipe.lookup; + +import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.AbstractMapIngredient; + +public class MapHeatIngredient extends AbstractMapIngredient { + + public final long thermia; + + public MapHeatIngredient(Long temp) { + this.thermia = temp; + } + + @Override + protected int hash() { + return MapHeatIngredient.class.hashCode(); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof MapHeatIngredient; + } + + @Override + public String toString() { + return "MapHeatIngredient{" + "thermia=" + thermia + '}'; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/recipe/lookup/MapSoulIngredient.java b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/lookup/MapSoulIngredient.java index 11b55ec73..fdcb9792b 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/recipe/lookup/MapSoulIngredient.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/lookup/MapSoulIngredient.java @@ -1,27 +1,38 @@ package com.ghostipedia.cosmiccore.api.recipe.lookup; -import com.gregtechceu.gtceu.api.recipe.lookup.AbstractMapIngredient; +import com.ghostipedia.cosmiccore.api.recipe.ingredient.SoulIngredient; +import com.ghostipedia.cosmiccore.api.recipe.ingredient.SoulStack; + +import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.AbstractMapIngredient; + +import java.util.List; public class MapSoulIngredient extends AbstractMapIngredient { - public final Integer souls; + public final SoulStack stack; - public MapSoulIngredient(Integer souls) { - this.souls = souls; + public MapSoulIngredient(SoulStack stack) { + this.stack = stack; } @Override protected int hash() { - return MapSoulIngredient.class.hashCode(); + return 0; } @Override - public boolean equals(Object obj) { - return obj instanceof MapSoulIngredient; + public boolean equals(Object o) { + if (!(o instanceof MapSoulIngredient other)) return false; + return stack.type().equals(other.stack.type()); + } + + public static List from(SoulIngredient soulIngredient) { + SoulStack stack = soulIngredient.stack(); + return List.of(new MapSoulIngredient(stack)); } @Override public String toString() { - return "MapSoulIngredient{" + "souls=" + souls + '}'; + return "MapSoulIngredient{stack=" + stack + "}"; } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/recipe/lookup/MapSterileIngredient.java b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/lookup/MapSterileIngredient.java new file mode 100644 index 000000000..897aa302f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/recipe/lookup/MapSterileIngredient.java @@ -0,0 +1,36 @@ +package com.ghostipedia.cosmiccore.api.recipe.lookup; + +import com.gregtechceu.gtceu.api.recipe.lookup.ingredient.AbstractMapIngredient; + +import net.neoforged.neoforge.fluids.FluidStack; + +import java.util.Collections; +import java.util.List; + +public class MapSterileIngredient extends AbstractMapIngredient { + + public final FluidStack sterileFluid; + + public MapSterileIngredient(FluidStack fluid) { + this.sterileFluid = fluid; + } + + @Override + protected int hash() { + return MapSterileIngredient.class.hashCode(); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof MapSterileIngredient; + } + + @Override + public String toString() { + return "MapSterileIngredient{" + "fluid=" + sterileFluid + '}'; + } + + public static List convertToMapIngredient(FluidStack fluid) { + return Collections.singletonList(new MapSterileIngredient(fluid)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/registries/CosmicRegistration.java b/src/main/java/com/ghostipedia/cosmiccore/api/registries/CosmicRegistration.java index ac2c02046..8d4e577fb 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/api/registries/CosmicRegistration.java +++ b/src/main/java/com/ghostipedia/cosmiccore/api/registries/CosmicRegistration.java @@ -1,7 +1,10 @@ package com.ghostipedia.cosmiccore.api.registries; + import com.ghostipedia.cosmiccore.CosmicCore; + import com.gregtechceu.gtceu.api.registry.registrate.GTRegistrate; public class CosmicRegistration { - public static final GTRegistrate REGISTRATE = GTRegistrate.create(CosmicCore.MOD_ID); -} \ No newline at end of file + + public static final GTRegistrate REGISTRATE = GTRegistrate.create(CosmicCore.MOD_ID); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/api/wireless/IWirelessStore.java b/src/main/java/com/ghostipedia/cosmiccore/api/wireless/IWirelessStore.java new file mode 100644 index 000000000..5244dfa9e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/api/wireless/IWirelessStore.java @@ -0,0 +1,10 @@ +package com.ghostipedia.cosmiccore.api.wireless; + +public interface IWirelessStore { + + void clearData(); + + void uploadData(T data); + + T downloadData(); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/CosmicCoreClient.java b/src/main/java/com/ghostipedia/cosmiccore/client/CosmicCoreClient.java new file mode 100644 index 000000000..4af2f0f2f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/CosmicCoreClient.java @@ -0,0 +1,416 @@ +package com.ghostipedia.cosmiccore.client; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.client.keybind.BootsKeybinds; +import com.ghostipedia.cosmiccore.client.keybind.QuakeMovementKeybinds; +import com.ghostipedia.cosmiccore.client.keybind.SoulSuperKeybind; +import com.ghostipedia.cosmiccore.client.renderer.machine.*; + +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderManager; + +import net.minecraft.client.renderer.ShaderInstance; +import net.minecraft.client.resources.model.ModelResourceLocation; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.neoforge.client.event.ModelEvent; +import net.neoforged.neoforge.client.event.RegisterGuiLayersEvent; +import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; +import net.neoforged.neoforge.client.event.RegisterShadersEvent; +import net.neoforged.neoforge.client.event.RenderGuiLayerEvent; +import net.neoforged.neoforge.client.gui.VanillaGuiLayers; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; + +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import lombok.Getter; + +import java.io.IOException; +import java.util.function.Consumer; + +import static dev.ftb.mods.ftblibrary.util.KnownServerRegistries.client; + +public class CosmicCoreClient { + + private CosmicCoreClient() {} + + public static void init(IEventBus modBus) { + modBus.register(CosmicCoreClient.class); + + DynamicRenderManager.register(CosmicCore.id("hellfire_foundry_parts"), HellFireFoundryPartRender.TYPE); + DynamicRenderManager.register(CosmicCore.id("hemographic_transfuser"), HemophagicTransfuserRender.TYPE); + DynamicRenderManager.register(CosmicCore.id("suffering_chamber"), SufferingChamberRenderer.TYPE); + DynamicRenderManager.register(CosmicCore.id("stellar_iris"), StellarIrisRender.TYPE); + DynamicRenderManager.register(CosmicCore.id("star_ballast"), StarBallastRender.TYPE); + DynamicRenderManager.register(CosmicCore.id("welder_arm_render"), WelderArmRender.TYPE); + DynamicRenderManager.register(CosmicCore.id("concept_incinerator"), ConceptIncineratorRender.TYPE); + DynamicRenderManager.register(CosmicCore.id("spirit_crucible"), SpiritCrucibleRender.TYPE); + DynamicRenderManager.register(CosmicCore.id("biovat_render"), BioVatRender.TYPE); + DynamicRenderManager.register(CosmicCore.id("tester_render"), RenderTesterHelper.TYPE); + DynamicRenderManager.register(CosmicCore.id("star_ladder_render"), StarLadderRender.TYPE); + } + + @Getter + private static ShaderInstance nebulaeShader; + + @Getter + private static ShaderInstance soulAuraShader; + + @Getter + private static ShaderInstance voidBgShader; + + @Getter + private static ShaderInstance galaxyBgShader; + + @Getter + private static ShaderInstance soulCoreShader; + + @Getter + private static ShaderInstance soulThreadsShader; + + @SubscribeEvent + public static void shaderRegistry(RegisterShadersEvent event) { + try { + event.registerShader(new ShaderInstance(event.getResourceProvider(), CosmicCore.id("rendertype_nebulae"), + DefaultVertexFormat.POSITION), (shaderInstance) -> nebulaeShader = shaderInstance); + + event.registerShader(new ShaderInstance(event.getResourceProvider(), CosmicCore.id("soul_aura"), + DefaultVertexFormat.POSITION_TEX), (shaderInstance) -> soulAuraShader = shaderInstance); + + event.registerShader(new ShaderInstance(event.getResourceProvider(), CosmicCore.id("void_bg"), + DefaultVertexFormat.POSITION_TEX), (shaderInstance) -> voidBgShader = shaderInstance); + + event.registerShader(new ShaderInstance(event.getResourceProvider(), CosmicCore.id("galaxy_bg"), + DefaultVertexFormat.POSITION_TEX), (shaderInstance) -> galaxyBgShader = shaderInstance); + + event.registerShader(new ShaderInstance(event.getResourceProvider(), CosmicCore.id("soul_core"), + DefaultVertexFormat.POSITION_TEX), (shaderInstance) -> soulCoreShader = shaderInstance); + + event.registerShader(new ShaderInstance(event.getResourceProvider(), CosmicCore.id("soul_threads"), + DefaultVertexFormat.POSITION_TEX), (shaderInstance) -> soulThreadsShader = shaderInstance); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @SubscribeEvent + public static void onGUIRegisterUIOverlays(RegisterGuiLayersEvent event) { + event.registerAboveAll(CosmicCore.id("cosmichud"), new CosmicHudGuiOverlay()); + } + + @SubscribeEvent + public static void registerKeyMappings(RegisterKeyMappingsEvent event) { + BootsKeybinds.registerKeyMappings(event); + QuakeMovementKeybinds.registerKeyMappings(event); + SoulSuperKeybind.registerKeyMappings(event); + } + + @SubscribeEvent + public static void registerAdditionalModels(ModelEvent.RegisterAdditional event) { + event.register(ModelResourceLocation.standalone(StellarIrisRender.IRIS_MODEL_CORE)); + event.register(ModelResourceLocation.standalone(StellarIrisRender.IRIS_MODEL_RING)); + event.register(ModelResourceLocation.standalone(StellarIrisRender.IRIS_MODEL_RING_WHITE)); + + event.register(ModelResourceLocation.standalone(ConceptIncineratorRender.IRIS_MODEL_CORE)); + event.register(ModelResourceLocation.standalone(ConceptIncineratorRender.IRIS_MODEL_RING)); + event.register(ModelResourceLocation.standalone(ConceptIncineratorRender.IRIS_MODEL_RING_WHITE)); + event.register(ModelResourceLocation.standalone(ConceptIncineratorRender.STAR_CORE)); + event.register(ModelResourceLocation.standalone(ConceptIncineratorRender.STAR_CORE_MIDDLE)); + event.register(ModelResourceLocation.standalone(ConceptIncineratorRender.STAR_CORE_OUTER)); + + event.register(ModelResourceLocation.standalone(StarBallastRender.STAR_MODEL_CORE)); + event.register(ModelResourceLocation.standalone(StarBallastRender.STAR_MODEL_OUTER)); + event.register(ModelResourceLocation.standalone(StarBallastRender.STAR_MODEL_INNER)); + event.register(ModelResourceLocation.standalone(StarBallastRender.STAR_MODEL_BEAM)); + } + + /* SHELVED bee client registration — Forestry dropped on 1.21.1 (bead cosmiccore-42.13) + public static class CosmicBeesClientRegistration implements Consumer { + + @Override + public void accept(IClientRegistration client) { + registerApiculture(client); + } + + // Spotless: off + private static void registerApiculture(IClientRegistration client) { + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_OXYGEN, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_OXYGEN, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_OXYGEN, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_HYDROGEN, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_HYDROGEN, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_HYDROGEN, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_NITROGEN, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_NITROGEN, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_NITROGEN, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_ARGON, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_ARGON, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.LOFTY_ARGON, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.ROSE_POLYMER, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.ROSE_POLYMER, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.ROSE_POLYMER, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.CITRUS_POLYMER, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.CITRUS_POLYMER, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.CITRUS_POLYMER, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.WAXY_POLYMER, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.WAXY_POLYMER, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.WAXY_POLYMER, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.BIOHAZARD, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.BIOHAZARD, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.BIOHAZARD, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.PALE, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.PALE, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.PALE, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.SOUL, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.SOUL, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.SOUL, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.RUNIC, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.RUNIC, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.RUNIC, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.AMBROSIC, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.AMBROSIC, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.AMBROSIC, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.ABRASIVE, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.ABRASIVE, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.ABRASIVE, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.ENERGIZED, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.ENERGIZED, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.ENERGIZED, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.SLICK, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.SLICK, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.SLICK, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.PYROLYTIC, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.PYROLYTIC, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.PYROLYTIC, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.LUNAR, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.LUNAR, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.LUNAR, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.SOLAR, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.SOLAR, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.SOLAR, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.COSMOS, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.COSMOS, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.COSMOS, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + // NEW BEES + client.setCustomBeeModel(CosmicBeesSpecies.HADAL, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.HADAL, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.HADAL, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.SHAMAN, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.SHAMAN, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.SHAMAN, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.COSMOS, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.COSMOS, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.COSMOS, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.ASHEN, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.ASHEN, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.ASHEN, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.FRACKING, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.FRACKING, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.FRACKING, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.FATE, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.FATE, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.FATE, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.GRAND_GARDEN, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.GRAND_GARDEN, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.GRAND_GARDEN, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.ARCHITECT, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.ARCHITECT, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.ARCHITECT, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.INQUISITIVE, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.INQUISITIVE, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.INQUISITIVE, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.HELLSMITH, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.HELLSMITH, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.HELLSMITH, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.RADOXIA, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.RADOXIA, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.RADOXIA, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.ABSENT, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.ABSENT, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.ABSENT, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.ILLUSIVE, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.ILLUSIVE, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.ILLUSIVE, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.CONSTRUCTIVE, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.CONSTRUCTIVE, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.CONSTRUCTIVE, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.PRISMATIC, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.PRISMATIC, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.PRISMATIC, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.HYDRAULIC, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.HYDRAULIC, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.HYDRAULIC, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.COBBLED, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.COBBLED, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.COBBLED, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.EXHAUSTIVE, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.EXHAUSTIVE, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.EXHAUSTIVE, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + + client.setCustomBeeModel(CosmicBeesSpecies.VIRTUE, BeeLifeStage.DRONE, + CosmicCore.id("item/bee/bee_drone_fuzzy")); + client.setCustomBeeModel(CosmicBeesSpecies.VIRTUE, BeeLifeStage.PRINCESS, + CosmicCore.id("item/bee/bee_drone_fuzzy_princess")); + client.setCustomBeeModel(CosmicBeesSpecies.VIRTUE, BeeLifeStage.QUEEN, + CosmicCore.id("item/bee/bee_drone_fuzzy_queen")); + } + } + */ + + @EventBusSubscriber(modid = CosmicCore.MOD_ID, value = Dist.CLIENT, bus = EventBusSubscriber.Bus.GAME) + public static final class HideVanillaOverlays { + + @SubscribeEvent + public static void onOverlayPre(RenderGuiLayerEvent.Pre event) { + if (event.getName().equals(VanillaGuiLayers.AIR_LEVEL)) { + event.setCanceled(true); + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/CosmicFluidTooltipAddon.java b/src/main/java/com/ghostipedia/cosmiccore/client/CosmicFluidTooltipAddon.java new file mode 100644 index 000000000..d8c47ed2d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/CosmicFluidTooltipAddon.java @@ -0,0 +1,93 @@ +package com.ghostipedia.cosmiccore.client; + +public class CosmicFluidTooltipAddon { + // + // private static final String modid = CosmicCore.MOD_ID; + // static String prefix = ".tooltip.prefix"; + // public static HashMap> data = new HashMap<>(); + // + // public static void appendFluidTooltip(ItemStack itemStack) { + // if (itemStack.getItem() instanceof BucketItem bucketItem) { + // Fluid fluid = bucketItem.getFluid(); + // String fluidID = ForgeRegistries.FLUIDS.getKey(fluid).toString(); + // if (data.isEmpty()) { + // hashMapInit(data); + // } + // Set keySet = data.keySet(); + // for (String i : keySet) { + // if (data.get(i).containsKey(fluidID)) { + // HashMap tmp = data.get(i); + // ResourceLocation fluidResource = ResourceLocation.fromNamespaceAndPath(fluidID); + // if (fluid instanceof GTFluid attributeFluid) { + // FluidAttribute attribute; + // if (".calorific".equals(i)) { + // attribute = new FluidAttribute( + // fluidResource, + // list -> list.accept(Component.translatable(modid + i + prefix, + // NumberUtils.formatThousandsSeparators(tmp.get(fluidID)) + " EU/mB")), + // list -> {}); + // } else { + // attribute = new FluidAttribute( + // fluidResource, + // list -> list.accept(Component.translatable(modid + i + prefix, + // tmp.get(fluidID).intValue())), + // list -> {}); + // } + // attributeFluid.addAttribute(attribute); + // } + // } + // } + // } + // } + // + // public static void hashMapInit(HashMap> hashMap) { + // hashMap.put(".calorific", getFuelEnergy()); + // hashMap.put(".lubricant", getLubricantTier()); + // hashMap.put(".booster", getBoosterTier()); + // CosmicCore.LOGGER.info("Cosmic Additional Fluid Tooltip Init Finished!"); + // } + // + // public static HashMap getFuelEnergy() { + // GTRecipeType[] gtRecipeTypes = { + // GTRecipeTypes.STEAM_TURBINE_FUELS, + // GTRecipeTypes.GAS_TURBINE_FUELS, + // GTRecipeTypes.COMBUSTION_GENERATOR_FUELS, + // CosmicRecipeTypes.NAQUAHINE_REACTOR + // }; + // ArrayList recipes = new ArrayList<>(); + // for (GTRecipeType i : gtRecipeTypes) { + // recipes.addAll(i.getRecipesInCategory(i.getCategory())); + // } + // HashMap calorificValue = new HashMap<>(); + // for (GTRecipe i : recipes) { + // int fluidInputAmount = RecipeHelper.getInputFluids(i).get(0).getAmount(); + // String fluidInputID = ForgeRegistries.FLUIDS + // .getKey(RecipeHelper.getInputFluids(i).get(0).getFluid()).toString(); + // long EUt = i.getOutputEUt().getTotalEU(); + // int duration = i.duration; + // long EUTotal = EUt * duration; + // double EUPer = (double) EUTotal / (double) fluidInputAmount; + // calorificValue.put(fluidInputID, EUPer); + // } + // calorificValue.putIfAbsent("gtceu:steam", calorificValue.get("embers:steam")); + // return calorificValue; // Why default steam is embers steam??? + // } + // + // public static HashMap getLubricantTier() { + // HashMap lubricantTier = new HashMap<>(); + // var tier = ExoticCombustionEngineMachine.getLubricantTiers(); + // for (FluidStack i : tier.keySet()) { + // lubricantTier.put(ForgeRegistries.FLUIDS.getKey(i.getFluid()).toString(), (double) tier.getInt(i) - 1); + // } // Lubricant Tier from 2 to 4? + // return lubricantTier; + // } + // + // public static HashMap getBoosterTier() { + // HashMap boosterTier = new HashMap<>(); + // var tier = ExoticCombustionEngineMachine.getBoostingTiers(); + // for (FluidStack i : tier.keySet()) { + // boosterTier.put(ForgeRegistries.FLUIDS.getKey(i.getFluid()).toString(), (double) tier.getInt(i)); + // } + // return boosterTier; + // } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/CosmicHudGuiOverlay.java b/src/main/java/com/ghostipedia/cosmiccore/client/CosmicHudGuiOverlay.java new file mode 100644 index 000000000..44e3c75fe --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/CosmicHudGuiOverlay.java @@ -0,0 +1,218 @@ +package com.ghostipedia.cosmiccore.client; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.item.behavior.WirelessPDABehavior; + +import com.gregtechceu.gtceu.api.item.ComponentItem; +import com.gregtechceu.gtceu.api.item.component.IItemComponent; +import com.gregtechceu.gtceu.api.item.component.IItemHUDProvider; + +import net.minecraft.client.DeltaTracker; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.LayeredDraw; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; + +import com.mojang.blaze3d.systems.RenderSystem; +import lombok.NoArgsConstructor; +import org.jetbrains.annotations.NotNull; + +@NoArgsConstructor +public class CosmicHudGuiOverlay implements LayeredDraw.Layer { + + // Oxygen bar textures + private static final ResourceLocation OXY_BG = CosmicCore.id("textures/gui/oxygen_bg.png"); + private static final ResourceLocation OXY_FILL = CosmicCore.id("textures/gui/oxygen_fill.png"); + private static final int TEX_W = 64, TEX_H = 12; + + // Time bar state + private static long timeTicksLeft = -1; + private static long timeMaxTicks = 0; + + // Oxygen bar state + private static long oxygenTicksLeft = -1; + private static long oxygenMaxTicks = 0; + private static boolean oxygenShow = true; + private static double lastRateTicksPerSecond = Double.NaN; + + // Track displayed value to prevent visual jitter (bar only moves in direction of rate) + private static long displayedOxygen = -1; + + // Colors for oxygen bar text + private static final int COLOR_DRAIN = 0x000000; // Black for draining (no shadow) + private static final int COLOR_REGEN = 0x00ff66; + private static final int COLOR_IDLE = 0xAAAAAA; + + public static void setTimeBar(ResourceLocation dim, long left, long max) { + timeTicksLeft = left; + timeMaxTicks = max; + } + + public static void setOxygenBar(long left, long max, boolean show, double ratePerSecond) { + oxygenTicksLeft = left; + oxygenMaxTicks = max; + oxygenShow = show; + lastRateTicksPerSecond = ratePerSecond; + + // Update displayed value with monotonic constraint based on rate direction + // This prevents visual jitter from server-side fluctuations + if (displayedOxygen < 0) { + // First sync - just use the value + displayedOxygen = left; + } else if (ratePerSecond < -0.1) { + // Draining: bar can only decrease or stay same + displayedOxygen = Math.min(displayedOxygen, left); + } else if (ratePerSecond > 0.1) { + // Regenerating: bar can only increase or stay same + displayedOxygen = Math.max(displayedOxygen, left); + } else { + // Idle/neutral: snap to actual value + displayedOxygen = left; + } + } + + @Override + public void render(GuiGraphics guiGraphics, DeltaTracker deltaTracker) { + Minecraft mc = Minecraft.getInstance(); + if (mc.level != null && !mc.gui.getDebugOverlay().showDebugScreen() && !mc.options.hideGui) { + int screenWidth = guiGraphics.guiWidth(); + int screenHeight = guiGraphics.guiHeight(); + renderHUDWirelessPDA(WirelessPDABehavior.CosmicCuriosUtils.getPDACurio(mc.player), guiGraphics); + renderTimeBudgetBar(guiGraphics, screenWidth, screenHeight); + renderOxygenBar(guiGraphics, screenWidth, screenHeight); + } + } + + private static void renderHUDWirelessPDA(@NotNull ItemStack stack, GuiGraphics guiGraphics) { + if (stack.getItem() instanceof ComponentItem valueItem) { + for (IItemComponent behaviour : valueItem.getComponents()) { + if (behaviour instanceof IItemHUDProvider provider) { + IItemHUDProvider.tryDrawHud(provider, stack, guiGraphics); + } + } + } + } + + private static void renderTimeBudgetBar(GuiGraphics gg, int sw, int sh) { + if (timeTicksLeft < 0 || timeMaxTicks <= 0) return; + + int w = Math.min(sw - 20, 200); + int h = 6; + int x = (sw - w) / 2; + int y = sh - 335; // above hotbar; tweak if it overlaps other overlays + + double frac = Math.max(0d, Math.min(1d, (double) timeTicksLeft / (double) timeMaxTicks)); + int filled = (int) (w * frac); + + // background & filled bar + gg.fill(x, y, x + w, y + h, 0xAA000000); + gg.fill(x, y, x + filled, y + h, 0xAAFF5555); + + // mm:ss label + long sec = Math.max(0, timeTicksLeft / 20); + String txt = (sec / 60) + ":" + String.format("%02d", (sec % 60)); + gg.drawString(Minecraft.getInstance().font, txt, + x + w / 2 - Minecraft.getInstance().font.width(txt) / 2, + y - 10, 0xFFFFFF, true); + } + + // ------------------------------------------------------------------------- + // Oxygen Bar Rendering + // Uses matrix scaling to render at 81px wide (matching hunger bar) without texture stretching + // ------------------------------------------------------------------------- + + // Scale factor to match vanilla hunger bar width (81px target / 64px texture) + private static final float BAR_SCALE = 81f / TEX_W; // ~1.265625 + + private static void renderOxygenBar(GuiGraphics gg, int screenWidth, int screenHeight) { + if (!oxygenShow || oxygenTicksLeft < 0 || oxygenMaxTicks <= 0) return; + + // Final rendered dimensions after scaling + int renderedWidth = (int) (TEX_W * BAR_SCALE); + int renderedHeight = (int) (TEX_H * BAR_SCALE); + + // Position to match vanilla hunger bar (right edge at screenWidth/2 + 91) + int x = screenWidth / 2 + 10; + int y = screenHeight - 39 - renderedHeight; + + // Use displayedOxygen for visual (has monotonic constraint to prevent jitter) + long visualOxygen = displayedOxygen >= 0 ? displayedOxygen : oxygenTicksLeft; + double frac = Math.max(0d, Math.min(1d, (double) visualOxygen / (double) oxygenMaxTicks)); + + // Calculate filled width in texture pixels (before scaling) + int filledTexW = (int) (TEX_W * frac); + filledTexW = Math.max(0, Math.min(TEX_W, filledTexW)); + + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + + // Push matrix and apply scale transform + var pose = gg.pose(); + pose.pushPose(); + pose.translate(x, y, 0); + pose.scale(BAR_SCALE, BAR_SCALE, 1f); + + // Background - render at native texture size (scaling handled by matrix) + gg.blit(OXY_BG, 0, 0, 0, 0, TEX_W, TEX_H, TEX_W, TEX_H); + + // Fill bar - clip horizontally based on fill amount + if (filledTexW > 0) { + gg.blit(OXY_FILL, 0, 0, 0, 0, filledTexW, TEX_H, TEX_W, TEX_H); + } + + pose.popPose(); + + // ETA text - render outside the scaled context for crisp text + var font = Minecraft.getInstance().font; + var comp = computeOxygenETA(); + int tx = x + renderedWidth / 2 - font.width(comp) / 2; + int ty = y + (renderedHeight - 8) / 2 + 1; // +1 to nudge down for better centering + // Disable shadow for draining (black text), enable for others + boolean useShadow = !isDraining(); + gg.drawString(font, comp, tx, ty, 0xFFFFFF, useShadow); + + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + } + + private static boolean isDraining() { + if (oxygenTicksLeft <= 0) return true; // Suffocating + if (oxygenTicksLeft >= oxygenMaxTicks) return false; // Full + double r = lastRateTicksPerSecond; + return Double.isFinite(r) && r < -0.01; // Negative rate = draining + } + + private static Component computeOxygenETA() { + if (oxygenTicksLeft <= 0) { + return Component.literal("SUFFOCATING").withStyle(s -> s.withColor(COLOR_DRAIN)); + } + if (oxygenTicksLeft >= oxygenMaxTicks) { + return Component.literal("--:--").withStyle(s -> s.withColor(COLOR_IDLE)); + } + + double r = lastRateTicksPerSecond; + if (!Double.isFinite(r) || Math.abs(r) < 0.01) { + return Component.literal("--:--").withStyle(s -> s.withColor(COLOR_IDLE)); + } + + if (r < 0) { + // Draining + long etaSec = (long) Math.ceil(oxygenTicksLeft / (-r)); + return Component.literal("<- " + formatSeconds(etaSec) + " >").withStyle(s -> s.withColor(COLOR_DRAIN)); + } else { + // Regenerating + long ticksNeeded = oxygenMaxTicks - oxygenTicksLeft; + long etaSec = (long) Math.ceil(ticksNeeded / r); + return Component.literal("< " + formatSeconds(etaSec) + " ->").withStyle(s -> s.withColor(COLOR_REGEN)); + } + } + + private static String formatSeconds(long sec) { + if (sec < 0) sec = 0; + long m = sec / 60; + long s = sec % 60; + return m + ":" + String.format("%02d", s); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/ForgeClientEventHandler.java b/src/main/java/com/ghostipedia/cosmiccore/client/ForgeClientEventHandler.java new file mode 100644 index 000000000..9f0b453ec --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/ForgeClientEventHandler.java @@ -0,0 +1,71 @@ +package com.ghostipedia.cosmiccore.client; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.CosmicUtils; +import com.ghostipedia.cosmiccore.client.renderer.RingUpgradePreviewRenderer; +import com.ghostipedia.cosmiccore.client.renderer.StructureBoundingBox; + +import net.minecraft.client.renderer.FogRenderer; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.neoforge.client.event.RenderLevelStageEvent; +import net.neoforged.neoforge.client.event.ViewportEvent; +import net.neoforged.neoforge.event.level.LevelEvent; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; + +import com.mojang.blaze3d.shaders.FogShape; + +@SuppressWarnings("unused") +@EventBusSubscriber(modid = CosmicCore.MOD_ID, bus = EventBusSubscriber.Bus.GAME, value = Dist.CLIENT) +public class ForgeClientEventHandler { + + @SubscribeEvent + public static void onRenderWorldLast(RenderLevelStageEvent event) { + var stage = event.getStage(); + if (stage == RenderLevelStageEvent.Stage.AFTER_TRIPWIRE_BLOCKS) { + StructureBoundingBox.renderStructureSelect(event.getPoseStack(), event.getCamera()); + RingUpgradePreviewRenderer.renderPreviews(event.getPoseStack(), event.getCamera()); + } + } + + @SubscribeEvent + public static void onWorldUnload(LevelEvent.Unload event) { + // Clear all previews when world unloads to prevent stale data + if (event.getLevel().isClientSide()) { + RingUpgradePreviewRenderer.clearAllPreviews(); + } + } + + @SubscribeEvent + public static void onRenderFog(ViewportEvent.RenderFog event) { + if (CosmicUtils.hasTheOneRing(event.getCamera().getEntity())) { + event.setFogShape(FogShape.SPHERE); + + // Shrink the fog to be very close + if (event.getMode() == FogRenderer.FogMode.FOG_SKY) { + event.setFarPlaneDistance(16.0F); + event.setNearPlaneDistance(0.0F); + } else { + event.setFarPlaneDistance(10.0F); + event.setNearPlaneDistance(3.0F); + } + event.setCanceled(true); + } + } + + @SubscribeEvent + public static void onComputeFogColor(ViewportEvent.ComputeFogColor event) { + if (CosmicUtils.hasTheOneRing(event.getCamera().getEntity())) { + // and make the fog a blue mist. + // #7CBADA + event.setRed(0.671F); + event.setGreen(0.792F); + event.setBlue(0.855F); + } + } + + // @SubscribeEvent + // public static void onTooltipEvent(ItemTooltipEvent event) { + // CosmicFluidTooltipAddon.appendFluidTooltip(event.getItemStack()); + // } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/AlphaOverrideVertexConsumer.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/AlphaOverrideVertexConsumer.java new file mode 100644 index 000000000..7b8561d8f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/AlphaOverrideVertexConsumer.java @@ -0,0 +1,25 @@ +package com.ghostipedia.cosmiccore.client.gui; + +import com.ghostipedia.cosmiccore.client.renderer.DelegatingVertexConsumer; + +import com.mojang.blaze3d.vertex.VertexConsumer; +import org.jetbrains.annotations.NotNull; + +public class AlphaOverrideVertexConsumer extends DelegatingVertexConsumer { + + private final int alpha; + + public AlphaOverrideVertexConsumer(VertexConsumer delegate, double alpha) { + this(delegate, (int) ((double) 255.0F * alpha)); + } + + public AlphaOverrideVertexConsumer(VertexConsumer delegate, int alpha) { + super(delegate); + this.alpha = alpha; + } + + @Override + public @NotNull VertexConsumer setColor(int r, int g, int b, int a) { + return super.setColor(r, g, b, this.alpha); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/IPatternEncodingTerminalMenu.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/IPatternEncodingTerminalMenu.java new file mode 100644 index 000000000..df22fe141 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/IPatternEncodingTerminalMenu.java @@ -0,0 +1,6 @@ +package com.ghostipedia.cosmiccore.client.gui; + +public interface IPatternEncodingTerminalMenu { + + default void cosCore$ModifyPattern(Integer value) {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/SprayCanScreen.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/SprayCanScreen.java new file mode 100644 index 000000000..3512c3b53 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/SprayCanScreen.java @@ -0,0 +1,295 @@ +package com.ghostipedia.cosmiccore.client.gui; + +import com.ghostipedia.cosmiccore.common.data.CosmicSounds; +import com.ghostipedia.cosmiccore.common.item.behavior.ExtendedDyeColor; +import com.ghostipedia.cosmiccore.common.item.behavior.InfiniteSprayCanBehavior; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; + +public class SprayCanScreen extends Screen { + + private static final int GUI_WIDTH = 176; + private static final int GUI_HEIGHT = 90; + private static final int BUTTON_SIZE = 18; + private static final int GRID_COLS = 8; + private static final int GRID_ROWS = 2; + private static final int PADDING = 8; + + private static final int BG_TOP = 0xFF080c14; + private static final int BG_BOTTOM = 0xFF040608; + private static final int GRID_COLOR = 0x0A4080FF; + private static final int BORDER_COLOR = 0xFF304060; + private static final int ACCENT_COLOR = 0xFF4080C0; + private static final int BUTTON_BG = 0xC0101018; + private static final int BUTTON_BORDER = 0xFF405070; + private static final int BUTTON_HOVER = 0xFF6090D0; + + private final Player player; + private final InfiniteSprayCanBehavior behavior; + + private int guiLeft; + private int guiTop; + private int hoveredColorIndex = -1; + + public SprayCanScreen(Player player, InfiniteSprayCanBehavior behavior) { + super(Component.translatable("cosmiccore.item.spraycan.gui.title")); + this.player = player; + this.behavior = behavior; + } + + @Override + protected void init() { + super.init(); + guiLeft = (width - GUI_WIDTH) / 2; + guiTop = (height - GUI_HEIGHT) / 2; + } + + @Override + public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) { + renderBackground(graphics, mouseX, mouseY, partialTick); + drawBackground(graphics); + drawColorGrid(graphics, mouseX, mouseY); + drawSolventButton(graphics, mouseX, mouseY); + drawCurrentColor(graphics); + drawTooltip(graphics, mouseX, mouseY); + super.render(graphics, mouseX, mouseY, partialTick); + } + + private void drawBackground(GuiGraphics graphics) { + // Gradient background + for (int row = 0; row < GUI_HEIGHT; row++) { + float progress = (float) row / GUI_HEIGHT; + int color = lerpColor(BG_TOP, BG_BOTTOM, progress); + graphics.fill(guiLeft, guiTop + row, guiLeft + GUI_WIDTH, guiTop + row + 1, color); + } + + // Grid pattern + int spacing = 10; + for (int gx = guiLeft + spacing; gx < guiLeft + GUI_WIDTH; gx += spacing) { + graphics.fill(gx, guiTop, gx + 1, guiTop + GUI_HEIGHT, GRID_COLOR); + } + for (int gy = guiTop + spacing; gy < guiTop + GUI_HEIGHT; gy += spacing) { + graphics.fill(guiLeft, gy, guiLeft + GUI_WIDTH, gy + 1, GRID_COLOR); + } + + // Border + drawBorder(graphics, guiLeft, guiTop, GUI_WIDTH, GUI_HEIGHT, BORDER_COLOR); + + // Corner accents + drawCornerAccents(graphics, guiLeft, guiTop, GUI_WIDTH, GUI_HEIGHT, ACCENT_COLOR); + + // Title + var font = Minecraft.getInstance().font; + Component title = getTitle(); + int titleWidth = font.width(title); + int titleX = guiLeft + (GUI_WIDTH - titleWidth) / 2; + graphics.drawString(font, title, titleX, guiTop + 4, ACCENT_COLOR, true); + } + + private void drawColorGrid(GuiGraphics graphics, int mouseX, int mouseY) { + hoveredColorIndex = -1; + int startX = guiLeft + PADDING; + int startY = guiTop + 18; + + for (int i = 0; i < 16; i++) { + ExtendedDyeColor dyeColor = ExtendedDyeColor.values()[i]; + int col = i % GRID_COLS; + int row = i / GRID_COLS; + int x = startX + col * BUTTON_SIZE + col * 2; + int y = startY + row * BUTTON_SIZE + row * 2; + + boolean hovered = mouseX >= x && mouseX < x + BUTTON_SIZE && mouseY >= y && mouseY < y + BUTTON_SIZE; + boolean selected = behavior.getColor() == dyeColor; + + if (hovered) { + hoveredColorIndex = i; + } + + drawColorButton(graphics, x, y, dyeColor, hovered, selected); + } + } + + private void drawColorButton(GuiGraphics graphics, int x, int y, ExtendedDyeColor color, boolean hovered, + boolean selected) { + // Button background + graphics.fill(x, y, x + BUTTON_SIZE, y + BUTTON_SIZE, BUTTON_BG); + + // Border + int borderColor = selected ? ACCENT_COLOR : (hovered ? BUTTON_HOVER : BUTTON_BORDER); + drawBorder(graphics, x, y, BUTTON_SIZE, BUTTON_SIZE, borderColor); + + // Color fill (inner area) + int innerPad = 2; + int dyeRgb = color.getTextColor(); + int fillColor = 0xFF000000 | dyeRgb; + graphics.fill(x + innerPad, y + innerPad, x + BUTTON_SIZE - innerPad, y + BUTTON_SIZE - innerPad, fillColor); + } + + private void drawSolventButton(GuiGraphics graphics, int mouseX, int mouseY) { + // Align to rightmost column of the grid + int gridWidth = GRID_COLS * BUTTON_SIZE + (GRID_COLS - 1) * 2; + int x = guiLeft + PADDING + gridWidth - BUTTON_SIZE; + int y = guiTop + GUI_HEIGHT - 28; + + boolean hovered = mouseX >= x && mouseX < x + BUTTON_SIZE && mouseY >= y && mouseY < y + BUTTON_SIZE; + boolean selected = behavior.getColor() == ExtendedDyeColor.SOLVENT; + + if (hovered) { + hoveredColorIndex = 16; // Solvent index + } + + // Button background + graphics.fill(x, y, x + BUTTON_SIZE, y + BUTTON_SIZE, BUTTON_BG); + + // Border + int borderColor = selected ? ACCENT_COLOR : (hovered ? BUTTON_HOVER : BUTTON_BORDER); + drawBorder(graphics, x, y, BUTTON_SIZE, BUTTON_SIZE, borderColor); + + // X pattern for solvent + int innerPad = 4; + int lineColor = 0xFFCC4444; + // Draw X + for (int i = 0; i < BUTTON_SIZE - innerPad * 2; i++) { + graphics.fill(x + innerPad + i, y + innerPad + i, x + innerPad + i + 1, y + innerPad + i + 2, lineColor); + graphics.fill(x + BUTTON_SIZE - innerPad - i - 1, y + innerPad + i, x + BUTTON_SIZE - innerPad - i, + y + innerPad + i + 2, lineColor); + } + } + + private void drawCurrentColor(GuiGraphics graphics) { + var font = Minecraft.getInstance().font; + int y = guiTop + 18 + GRID_ROWS * (BUTTON_SIZE + 2) + 4; + + ExtendedDyeColor current = behavior.getColor(); + String colorName = current != null ? current.name().replace('_', ' ') : "NONE"; + int textColor = getReadableTextColor(current); + + String label = "Color: "; + graphics.drawString(font, label, guiLeft + PADDING, y, 0xFFAAAAAA, false); + graphics.drawString(font, colorName, guiLeft + PADDING + font.width(label), y, textColor, false); + } + + private int getReadableTextColor(ExtendedDyeColor color) { + if (color == null || color == ExtendedDyeColor.SOLVENT) { + return 0xFFFFFFFF; + } + // Black and other dark colors need a lighter display color + if (color == ExtendedDyeColor.BLACK) { + return 0xFF666666; + } + return 0xFF000000 | color.getTextColor(); + } + + private void drawTooltip(GuiGraphics graphics, int mouseX, int mouseY) { + if (hoveredColorIndex < 0) return; + + Component tooltip; + if (hoveredColorIndex == 16) { + tooltip = Component.translatable("cosmiccore.item.spraycan.gui.solvent"); + } else { + String colorName = ExtendedDyeColor.values()[hoveredColorIndex].name().replace('_', ' '); + tooltip = Component.literal(colorName); + } + + graphics.renderTooltip(Minecraft.getInstance().font, tooltip, mouseX, mouseY); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0) { + int clickedIndex = getColorIndexAt((int) mouseX, (int) mouseY); + if (clickedIndex >= 0) { + ExtendedDyeColor newColor; + if (clickedIndex == 16) { + newColor = ExtendedDyeColor.SOLVENT; + } else { + newColor = ExtendedDyeColor.values()[clickedIndex]; + } + behavior.setColor(newColor); + behavior.sendColorToTag(player, newColor); + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(CosmicSounds.SHAKE_CAN.getMainEvent(), 1.0f, 1.0f)); + return true; + } + } + return super.mouseClicked(mouseX, mouseY, button); + } + + private int getColorIndexAt(int mouseX, int mouseY) { + int startX = guiLeft + PADDING; + int startY = guiTop + 18; + + // Check color grid + for (int i = 0; i < 16; i++) { + int col = i % GRID_COLS; + int row = i / GRID_COLS; + int x = startX + col * BUTTON_SIZE + col * 2; + int y = startY + row * BUTTON_SIZE + row * 2; + + if (mouseX >= x && mouseX < x + BUTTON_SIZE && mouseY >= y && mouseY < y + BUTTON_SIZE) { + return i; + } + } + + // Check solvent button (aligned to rightmost column) + int gridWidth = GRID_COLS * BUTTON_SIZE + (GRID_COLS - 1) * 2; + int solventX = guiLeft + PADDING + gridWidth - BUTTON_SIZE; + int solventY = guiTop + GUI_HEIGHT - 28; + if (mouseX >= solventX && mouseX < solventX + BUTTON_SIZE && mouseY >= solventY && + mouseY < solventY + BUTTON_SIZE) { + return 16; + } + + return -1; + } + + @Override + public boolean isPauseScreen() { + return false; + } + + private void drawBorder(GuiGraphics graphics, int x, int y, int w, int h, int color) { + graphics.fill(x, y, x + w, y + 1, color); // Top + graphics.fill(x, y + h - 1, x + w, y + h, color); // Bottom + graphics.fill(x, y, x + 1, y + h, color); // Left + graphics.fill(x + w - 1, y, x + w, y + h, color); // Right + } + + private void drawCornerAccents(GuiGraphics graphics, int x, int y, int w, int h, int color) { + int len = 12; + int thickness = 2; + int accentAlpha = (color & 0x00FFFFFF) | 0x60000000; + + // Top-left + graphics.fill(x, y, x + len, y + thickness, accentAlpha); + graphics.fill(x, y, x + thickness, y + len, accentAlpha); + // Top-right + graphics.fill(x + w - len, y, x + w, y + thickness, accentAlpha); + graphics.fill(x + w - thickness, y, x + w, y + len, accentAlpha); + // Bottom-left + graphics.fill(x, y + h - thickness, x + len, y + h, accentAlpha); + graphics.fill(x, y + h - len, x + thickness, y + h, accentAlpha); + // Bottom-right + graphics.fill(x + w - len, y + h - thickness, x + w, y + h, accentAlpha); + graphics.fill(x + w - thickness, y + h - len, x + w, y + h, accentAlpha); + } + + private int lerpColor(int c1, int c2, float t) { + int a1 = (c1 >> 24) & 0xFF, a2 = (c2 >> 24) & 0xFF; + int r1 = (c1 >> 16) & 0xFF, r2 = (c2 >> 16) & 0xFF; + int g1 = (c1 >> 8) & 0xFF, g2 = (c2 >> 8) & 0xFF; + int b1 = c1 & 0xFF, b2 = c2 & 0xFF; + + int a = (int) (a1 + (a2 - a1) * t); + int r = (int) (r1 + (r2 - r1) * t); + int g = (int) (g1 + (g2 - g1) * t); + int b = (int) (b1 + (b2 - b1) * t); + + return (a << 24) | (r << 16) | (g << 8) | b; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/screen/StellarConvergenceScreen.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/screen/StellarConvergenceScreen.java new file mode 100644 index 000000000..e81934ab9 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/screen/StellarConvergenceScreen.java @@ -0,0 +1,932 @@ +package com.ghostipedia.cosmiccore.client.gui.screen; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarIrisUpgrade; +import com.ghostipedia.cosmiccore.client.renderer.BackgroundRenderer; +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.network.packet.StellarUpgradePacket; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.*; + +/** + * Full-screen cosmic upgrade tree for the Stellar IRIS. + * Inspired by constellation/skill tree designs with organic node layouts. + */ +@OnlyIn(Dist.CLIENT) +public class StellarConvergenceScreen extends Screen { + + // Machine reference + private final BlockPos machinePos; + private int spendablePoints; + private int lifetimePoints; + private int tier; + private int ascensionLevel; + private Set unlockedUpgrades; + private Map repeatableLevels; + + // Node system + private final List nodes = new ArrayList<>(); + private final Map nodeMap = new HashMap<>(); + + // Visual state + private float fadeAlpha = 0f; + private int ticks = 0; + + // Interaction + private UpgradeNode hoveredNode = null; + private UpgradeNode selectedNode = null; + private float panelSlide = 0f; + + // Pan and zoom + private float viewOffsetX = 0f; + private float viewOffsetY = 0f; + private float zoom = 1.0f; + private boolean isDragging = false; + private double lastDragX, lastDragY; + + // Particles + private final List particles = new ArrayList<>(); + private final Random random = new Random(); + + // Constants + private static final float MIN_ZOOM = 0.3f; + private static final float MAX_ZOOM = 1.8f; + private static final int PARTICLE_COUNT = 60; + + public StellarConvergenceScreen(BlockPos machinePos, int spendablePoints, int lifetimePoints, + int tier, int ascensionLevel, Set unlockedUpgrades, + int[] repeatableLevels) { + super(Component.literal("Stellar Convergence")); + this.machinePos = machinePos; + this.spendablePoints = spendablePoints; + this.lifetimePoints = lifetimePoints; + this.tier = tier; + this.ascensionLevel = ascensionLevel; + this.unlockedUpgrades = unlockedUpgrades != null ? + EnumSet.copyOf(unlockedUpgrades) : EnumSet.noneOf(StellarIrisUpgrade.class); + // Convert int[] to Map for internal use + this.repeatableLevels = new HashMap<>(); + if (repeatableLevels != null) { + for (int i = 0; i < repeatableLevels.length; i++) { + if (repeatableLevels[i] > 0) { + this.repeatableLevels.put(i, repeatableLevels[i]); + } + } + } + } + + public static void open(IrisMultiblockMachine machine) { + if (machine == null) return; + + Set upgrades = machine.getUnlockedUpgrades(); + StellarConvergenceScreen screen = new StellarConvergenceScreen( + machine.getBlockPos(), + machine.getSpendablePoints(), + machine.getLifetimePrestigePoints(), + machine.getPrestigeTier(), + machine.getAscensionLevel(), + upgrades.isEmpty() ? null : upgrades, + machine.getRepeatableUpgradeLevels()); + Minecraft.getInstance().setScreen(screen); + } + + @Override + protected void init() { + super.init(); + buildNodeLayout(); + initParticles(); + } + + private void buildNodeLayout() { + nodes.clear(); + nodeMap.clear(); + + int cx = width / 2; + int cy = height / 2; + + // Create organic tree layout + // Central core with 4 main branches spiraling outward + + for (StellarIrisUpgrade upgrade : StellarIrisUpgrade.values()) { + float[] pos = calculateNodePosition(upgrade, cx, cy); + UpgradeNode node = new UpgradeNode(upgrade, pos[0], pos[1]); + nodes.add(node); + nodeMap.put(upgrade, node); + } + } + + private float[] calculateNodePosition(StellarIrisUpgrade upgrade, int cx, int cy) { + StellarIrisUpgrade.Branch branch = upgrade.getBranch(); + int row = upgrade.getRow(); + + // Repeatable upgrades go in a ring around the center + if (branch == StellarIrisUpgrade.Branch.REPEATABLE) { + List repeatables = new ArrayList<>(StellarIrisUpgrade.getRepeatables()); + repeatables.sort(Comparator.comparingInt(Enum::ordinal)); + int idx = repeatables.indexOf(upgrade); + int count = repeatables.size(); + + // Inner ring around center + float radius = 55; + float angleStep = (float) (2 * Math.PI / count); + float angle = idx * angleStep - (float) Math.PI / 2; // Start from top + + float x = cx + Mth.cos(angle) * radius; + float y = cy + Mth.sin(angle) * radius; + return new float[] { x, y }; + } + + // Each branch gets a quadrant, nodes spiral outward + float baseAngle = switch (branch) { + case IGNITION -> (float) (-Math.PI * 0.75); // Top-left + case FUSION -> (float) (-Math.PI * 0.25); // Top-right + case COLLAPSE -> (float) (Math.PI * 0.75); // Bottom-left + case VOID -> (float) (Math.PI * 0.25); // Bottom-right + case REPEATABLE -> 0; // Handled above + }; + + // Get upgrades in same branch/row for spreading + List sameRowBranch = new ArrayList<>(); + for (StellarIrisUpgrade u : StellarIrisUpgrade.values()) { + if (u.getBranch() == branch && u.getRow() == row) { + sameRowBranch.add(u); + } + } + sameRowBranch.sort(Comparator.comparingInt(Enum::ordinal)); + + int idx = sameRowBranch.indexOf(upgrade); + int count = sameRowBranch.size(); + + // Radial distance increases with row - much more spread out + float radius = 95 + row * 50; // Pushed out more to make room for repeatables + + // Spread nodes in same row - wider spread + float spreadAngle = 0.38f; // How much to spread within a row + float nodeAngle = baseAngle; + if (count > 1) { + nodeAngle += (idx - (count - 1) / 2.0f) * spreadAngle; + } + + // Add slight spiral effect + nodeAngle += row * 0.05f; + + float x = cx + Mth.cos(nodeAngle) * radius; + float y = cy + Mth.sin(nodeAngle) * radius; + + return new float[] { x, y }; + } + + private void initParticles() { + particles.clear(); + for (int i = 0; i < PARTICLE_COUNT; i++) { + particles.add(new CosmicParticle(width, height, random)); + } + } + + @Override + public void tick() { + super.tick(); + ticks++; + + if (fadeAlpha < 1f) { + fadeAlpha = Math.min(1f, fadeAlpha + 0.08f); + } + + // Update particles + for (CosmicParticle p : particles) { + p.tick(); + if (p.isDead()) { + p.reset(width, height, random); + } + } + + // Update nodes + for (UpgradeNode node : nodes) { + node.tick(); + } + + // Panel animation + if (selectedNode != null) { + panelSlide = Math.min(1f, panelSlide + 0.12f); + } else { + panelSlide = Math.max(0f, panelSlide - 0.15f); + } + } + + @Override + public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) { + // Cosmic background + BackgroundRenderer.render(graphics.pose(), BackgroundRenderer.BackgroundType.GALAXY, fadeAlpha, width, height); + + if (fadeAlpha < 0.1f) return; + + // Particles + for (CosmicParticle p : particles) { + p.render(graphics, fadeAlpha); + } + + // Vignette + renderVignette(graphics); + + // Update node positions with view offset + int cx = width / 2; + int cy = height / 2; + hoveredNode = null; + + for (UpgradeNode node : nodes) { + float[] basePos = calculateNodePosition(node.upgrade, cx, cy); + node.screenX = (basePos[0] - cx) * zoom + cx + viewOffsetX; + node.screenY = (basePos[1] - cy) * zoom + cy + viewOffsetY; + + if (node.isMouseOver(mouseX, mouseY, zoom)) { + hoveredNode = node; + } + } + + // Draw connections + renderConnections(graphics); + + // Draw central core + renderCentralCore(graphics, cx, cy); + + // Draw nodes + for (UpgradeNode node : nodes) { + StellarIrisUpgrade upgrade = node.upgrade; + boolean owned; + boolean available; + boolean tierLocked = tier < upgrade.getRequiredTier(); + + if (upgrade.isRepeatable()) { + int level = repeatableLevels.getOrDefault(upgrade.ordinal(), 0); + owned = level > 0; + available = level < upgrade.getMaxLevel() && + spendablePoints >= upgrade.getCostForLevel(level + 1); + } else { + owned = unlockedUpgrades.contains(upgrade); + available = !owned && upgrade.canUnlock(unlockedUpgrades, tier) && + spendablePoints >= upgrade.getCost(); + } + + node.render(graphics, font, fadeAlpha, zoom, ticks, partialTick, + owned, available, tierLocked, + node == hoveredNode, node == selectedNode); + } + + // Header + renderHeader(graphics); + + // Detail panel + if (panelSlide > 0.01f) { + renderDetailPanel(graphics, mouseX, mouseY); + } + + // Tooltip for non-selected hover + if (hoveredNode != null && hoveredNode != selectedNode) { + renderTooltip(graphics, mouseX, mouseY); + } + + // Controls hint + renderControlsHint(graphics); + } + + private void renderVignette(GuiGraphics graphics) { + int strength = (int) (fadeAlpha * 120); + for (int i = 0; i < 40; i += 2) { + int alpha = (int) (strength * (1f - (float) i / 40f)); + int color = (alpha << 24); + graphics.fill(0, i, width, i + 2, color); + graphics.fill(0, height - i - 2, width, height - i, color); + } + } + + private void renderConnections(GuiGraphics graphics) { + for (UpgradeNode node : nodes) { + for (StellarIrisUpgrade prereq : node.upgrade.getPrerequisites()) { + UpgradeNode prereqNode = nodeMap.get(prereq); + if (prereqNode == null) continue; + + boolean bothOwned = unlockedUpgrades.contains(node.upgrade) && + unlockedUpgrades.contains(prereq); + boolean prereqOwned = unlockedUpgrades.contains(prereq); + + int[] color = node.getColor(); + int alpha; + if (bothOwned) { + alpha = (int) (fadeAlpha * 180); + } else if (prereqOwned) { + alpha = (int) (fadeAlpha * 80); + } else { + alpha = (int) (fadeAlpha * 30); + } + + int lineColor = (alpha << 24) | (color[0] << 16) | (color[1] << 8) | color[2]; + drawConnection(graphics, prereqNode, node, lineColor, bothOwned); + } + } + } + + private void drawConnection(GuiGraphics graphics, UpgradeNode from, UpgradeNode to, int color, boolean animated) { + int x1 = (int) from.screenX; + int y1 = (int) from.screenY; + int x2 = (int) to.screenX; + int y2 = (int) to.screenY; + + // Draw dotted line + int dx = Math.abs(x2 - x1); + int dy = Math.abs(y2 - y1); + int steps = Math.max(dx, dy); + if (steps == 0) return; + + int dotSpacing = 6; + for (int i = 0; i <= steps; i += dotSpacing) { + int x = x1 + (x2 - x1) * i / steps; + int y = y1 + (y2 - y1) * i / steps; + graphics.fill(x, y, x + 2, y + 2, color); + } + + // Animated energy pulse on owned connections + if (animated) { + float t = (ticks % 40) / 40f; + int px = (int) Mth.lerp(t, x1, x2); + int py = (int) Mth.lerp(t, y1, y2); + int pulseAlpha = (int) (fadeAlpha * 220); + graphics.fill(px - 2, py - 2, px + 3, py + 3, (pulseAlpha << 24) | 0xFFFFFF); + } + } + + private void renderCentralCore(GuiGraphics graphics, int cx, int cy) { + int coreX = (int) (cx + viewOffsetX); + int coreY = (int) (cy + viewOffsetY); + int baseRadius = (int) (45 * zoom); + + // Pulsing + float pulse = (float) (Math.sin(ticks * 0.06) * 0.1 + 1.0); + int radius = (int) (baseRadius * pulse); + + // Outer glow + for (int r = radius + 25; r > radius; r -= 3) { + float p = (float) (r - radius) / 25f; + int alpha = (int) ((1f - p) * 40 * fadeAlpha); + int glowColor = (alpha << 24) | 0xFFCC44; + drawCircle(graphics, coreX, coreY, r, glowColor); + } + + // Core + int coreAlpha = (int) (fadeAlpha * 255); + for (int r = radius; r > 0; r -= 2) { + float p = (float) r / radius; + int alpha = (int) (coreAlpha * (0.5f + 0.5f * p)); + int cr = (int) (255 * p + 200 * (1 - p)); + int cg = (int) (200 * p + 150 * (1 - p)); + int cb = (int) (100 * p + 50 * (1 - p)); + drawCircle(graphics, coreX, coreY, r, (alpha << 24) | (cr << 16) | (cg << 8) | cb); + } + + // Ascension rings + if (ascensionLevel > 0) { + int ringAlpha = (int) (fadeAlpha * 150); + for (int i = 0; i < ascensionLevel; i++) { + int ringR = radius + 30 + i * 8; + float rotation = ticks * 0.02f + i * 0.5f; + for (int a = 0; a < 8; a++) { + float angle = rotation + a * Mth.PI / 4; + int rx = coreX + (int) (Mth.cos(angle) * ringR); + int ry = coreY + (int) (Mth.sin(angle) * ringR); + graphics.fill(rx - 1, ry - 1, rx + 2, ry + 2, (ringAlpha << 24) | 0xFFDD66); + } + } + } + } + + private void drawCircle(GuiGraphics graphics, int cx, int cy, int radius, int color) { + if (radius <= 0) return; + for (int y = -radius; y <= radius; y += 2) { + int halfWidth = (int) Math.sqrt(radius * radius - y * y); + graphics.fill(cx - halfWidth, cy + y, cx + halfWidth + 1, cy + y + 2, color); + } + } + + private void renderHeader(GuiGraphics graphics) { + int alpha = (int) (fadeAlpha * 255); + + // Points display + String pointsStr = "\u2726 " + spendablePoints; + int pointsColor = spendablePoints > 0 ? 0xFFCC44 : 0x808080; + graphics.drawString(font, pointsStr, 20, 20, (alpha << 24) | pointsColor, false); + + // Tier display + String tierStr = "Tier " + tier; + if (ascensionLevel > 0) { + tierStr = "\u2605".repeat(ascensionLevel) + " " + tierStr; + } + graphics.drawString(font, tierStr, 20, 34, (alpha << 24) | 0xAAAAAA, false); + + // Title + String title = "STELLAR CONVERGENCE"; + int titleW = font.width(title); + graphics.drawString(font, title, (width - titleW) / 2, 15, (alpha << 24) | 0xE0E0F0, false); + } + + private void renderDetailPanel(GuiGraphics graphics, int mouseX, int mouseY) { + if (selectedNode == null) return; + + StellarIrisUpgrade upgrade = selectedNode.upgrade; + int panelW = 220; + int panelH = 180; + int panelX = width - (int) (panelSlide * (panelW + 15)); + int panelY = (height - panelH) / 2; + + int bgAlpha = (int) (fadeAlpha * panelSlide * 230); + int borderAlpha = (int) (fadeAlpha * panelSlide * 255); + + // Background + graphics.fill(panelX, panelY, panelX + panelW, panelY + panelH, (bgAlpha << 24) | 0x0C0C14); + + // Border + int[] color = selectedNode.getColor(); + int borderColor = (borderAlpha << 24) | (color[0] << 16) | (color[1] << 8) | color[2]; + graphics.fill(panelX, panelY, panelX + panelW, panelY + 2, borderColor); + graphics.fill(panelX, panelY, panelX + 2, panelY + panelH, borderColor); + graphics.fill(panelX + panelW - 2, panelY, panelX + panelW, panelY + panelH, borderColor); + graphics.fill(panelX, panelY + panelH - 2, panelX + panelW, panelY + panelH, borderColor); + + int textAlpha = (int) (fadeAlpha * panelSlide * 255); + int textPadding = 10; + int maxTextWidth = panelW - textPadding * 2; + + // Name + String name = Component.translatable(upgrade.getTranslationKey()).getString(); + graphics.drawString(font, name, panelX + textPadding, panelY + 10, + (textAlpha << 24) | (color[0] << 16) | (color[1] << 8) | color[2], false); + + // Description with word wrapping + String desc = Component.translatable(upgrade.getDescriptionKey()).getString(); + int descY = panelY + 28; + List descLines = wrapText(desc, maxTextWidth); + for (String line : descLines) { + graphics.drawString(font, line, panelX + textPadding, descY, (textAlpha << 24) | 0x9090A0, false); + descY += 10; + } + + // Dynamic Y position after description + int infoY = descY + 6; + + // Handle repeatable vs non-repeatable differently + if (upgrade.isRepeatable()) { + int currentLevel = repeatableLevels.getOrDefault(upgrade.ordinal(), 0); + int maxLevel = upgrade.getMaxLevel(); + boolean isMaxed = currentLevel >= maxLevel; + + // Level display + String levelStr = isMaxed ? + "Level " + currentLevel + " / " + maxLevel + " (MAX)" : + "Level " + currentLevel + " / " + maxLevel; + int levelColor = isMaxed ? 0x44FF44 : 0xAAAAAA; + graphics.drawString(font, levelStr, panelX + textPadding, infoY, (textAlpha << 24) | levelColor, false); + infoY += 14; + + // Cost for next level + if (!isMaxed) { + int nextCost = upgrade.getCostForLevel(currentLevel + 1); + String costStr = "Next Level: " + nextCost + " pts"; + boolean canAfford = spendablePoints >= nextCost; + int costColor = canAfford ? 0xFFCC44 : 0xFF5544; + graphics.drawString(font, costStr, panelX + textPadding, infoY, (textAlpha << 24) | costColor, false); + infoY += 14; + + // Status + String status = canAfford ? "[Click to upgrade]" : "Not enough points"; + int statusColor = canAfford ? 0x88FF88 : 0xFF8844; + graphics.drawString(font, status, panelX + textPadding, panelY + panelH - 24, + (textAlpha << 24) | statusColor, false); + } else { + graphics.drawString(font, "MAX LEVEL", panelX + textPadding, panelY + panelH - 24, + (textAlpha << 24) | 0x44FF44, false); + } + } else { + // Non-repeatable upgrade + // Cost + String cost = "Cost: " + upgrade.getCost() + " pts"; + boolean canAfford = spendablePoints >= upgrade.getCost(); + int costColor = canAfford ? 0xFFCC44 : 0xFF5544; + graphics.drawString(font, cost, panelX + textPadding, infoY, (textAlpha << 24) | costColor, false); + infoY += 14; + + // Tier requirement + String tierReq = "Requires Tier " + upgrade.getRequiredTier(); + boolean tierMet = tier >= upgrade.getRequiredTier(); + int tierColor = tierMet ? 0x707080 : 0xFF5544; + graphics.drawString(font, tierReq, panelX + textPadding, infoY, (textAlpha << 24) | tierColor, false); + + // Status + boolean owned = unlockedUpgrades.contains(upgrade); + boolean available = !owned && upgrade.canUnlock(unlockedUpgrades, tier); + + String status; + int statusColor; + if (owned) { + status = "UNLOCKED"; + statusColor = 0x44FF44; + } else if (available && canAfford && tierMet) { + status = "[Click to unlock]"; + statusColor = 0x88FF88; + } else if (!tierMet) { + status = "Tier locked"; + statusColor = 0xFF5544; + } else if (!canAfford) { + status = "Not enough points"; + statusColor = 0xFF8844; + } else { + status = "Prerequisites needed"; + statusColor = 0x888888; + } + graphics.drawString(font, status, panelX + textPadding, panelY + panelH - 24, + (textAlpha << 24) | statusColor, false); + } + } + + private List wrapText(String text, int maxWidth) { + List lines = new ArrayList<>(); + if (text == null || text.isEmpty()) return lines; + + String[] words = text.split(" "); + StringBuilder currentLine = new StringBuilder(); + + for (String word : words) { + String testLine = currentLine.length() == 0 ? word : currentLine + " " + word; + if (font.width(testLine) <= maxWidth) { + if (currentLine.length() > 0) currentLine.append(" "); + currentLine.append(word); + } else { + if (currentLine.length() > 0) { + lines.add(currentLine.toString()); + currentLine = new StringBuilder(word); + } else { + // Word is too long, just add it + lines.add(word); + } + } + } + if (currentLine.length() > 0) { + lines.add(currentLine.toString()); + } + return lines; + } + + private void renderTooltip(GuiGraphics graphics, int mouseX, int mouseY) { + if (hoveredNode == null) return; + + String name = Component.translatable(hoveredNode.upgrade.getTranslationKey()).getString(); + int tw = font.width(name) + 12; + int th = 18; + int tx = mouseX + 12; + int ty = mouseY - th - 5; + + if (tx + tw > width - 10) tx = width - tw - 10; + if (ty < 10) ty = mouseY + 15; + + int alpha = (int) (fadeAlpha * 230); + graphics.fill(tx - 2, ty - 2, tx + tw + 2, ty + th + 2, (alpha << 24) | 0x0C0C14); + + int[] color = hoveredNode.getColor(); + int textColor = (255 << 24) | (color[0] << 16) | (color[1] << 8) | color[2]; + graphics.drawString(font, name, tx + 4, ty + 4, textColor, false); + } + + private void renderControlsHint(GuiGraphics graphics) { + int alpha = (int) (fadeAlpha * 100); + int color = (alpha << 24) | 0x606070; + + graphics.drawString(font, "[ESC] Close", 20, height - 25, color, false); + graphics.drawString(font, "Scroll: Zoom | Drag: Pan", width - font.width("Scroll: Zoom | Drag: Pan") - 20, + height - 25, color, false); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0) { + // Left click + if (hoveredNode != null) { + if (selectedNode == hoveredNode) { + // Double-click to unlock + tryUnlock(hoveredNode.upgrade); + } else { + selectedNode = hoveredNode; + } + return true; + } + selectedNode = null; + return true; + } + + if (button == 1) { + // Right-click drag + isDragging = true; + lastDragX = mouseX; + lastDragY = mouseY; + return true; + } + + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (button == 1) { + isDragging = false; + return true; + } + return super.mouseReleased(mouseX, mouseY, button); + } + + @Override + public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { + if (isDragging) { + viewOffsetX += (float) (mouseX - lastDragX); + viewOffsetY += (float) (mouseY - lastDragY); + lastDragX = mouseX; + lastDragY = mouseY; + return true; + } + return super.mouseDragged(mouseX, mouseY, button, dragX, dragY); + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double scrollX, double scrollY) { + float oldZoom = zoom; + zoom = Mth.clamp(zoom + (float) scrollY * 0.15f, MIN_ZOOM, MAX_ZOOM); + + // Zoom toward mouse + if (oldZoom != zoom) { + float ratio = zoom / oldZoom; + float mx = (float) mouseX - width / 2f; + float my = (float) mouseY - height / 2f; + viewOffsetX = (viewOffsetX - mx) * ratio + mx; + viewOffsetY = (viewOffsetY - my) * ratio + my; + } + return true; + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (keyCode == 256) { // ESC + if (selectedNode != null) { + selectedNode = null; + return true; + } + onClose(); + return true; + } + + return super.keyPressed(keyCode, scanCode, modifiers); + } + + private void tryUnlock(StellarIrisUpgrade upgrade) { + if (upgrade.isRepeatable()) { + tryLevelUpRepeatable(upgrade); + return; + } + + if (unlockedUpgrades.contains(upgrade)) return; + if (!upgrade.canUnlock(unlockedUpgrades, tier)) return; + if (spendablePoints < upgrade.getCost()) return; + + // Send packet to server + CCoreNetwork.sendToServer(new StellarUpgradePacket(machinePos, upgrade, false)); + + // Optimistic update + unlockedUpgrades.add(upgrade); + spendablePoints -= upgrade.getCost(); + } + + private void tryLevelUpRepeatable(StellarIrisUpgrade upgrade) { + if (!upgrade.isRepeatable()) return; + + int currentLevel = repeatableLevels.getOrDefault(upgrade.ordinal(), 0); + if (currentLevel >= upgrade.getMaxLevel()) return; + + int nextLevel = currentLevel + 1; + int cost = upgrade.getCostForLevel(nextLevel); + + if (spendablePoints < cost) return; + + // Send packet to server + CCoreNetwork.sendToServer(new StellarUpgradePacket(machinePos, upgrade, false)); + + // Optimistic update + repeatableLevels.put(upgrade.ordinal(), nextLevel); + spendablePoints -= cost; + } + + private int getUpgradeLevel(StellarIrisUpgrade upgrade) { + if (upgrade.isRepeatable()) { + return repeatableLevels.getOrDefault(upgrade.ordinal(), 0); + } + return unlockedUpgrades.contains(upgrade) ? 1 : 0; + } + + @Override + public boolean isPauseScreen() { + return false; + } + + // Node class + private static class UpgradeNode { + + final StellarIrisUpgrade upgrade; + float screenX, screenY; + float pulsePhase; + + UpgradeNode(StellarIrisUpgrade upgrade, float x, float y) { + this.upgrade = upgrade; + this.screenX = x; + this.screenY = y; + this.pulsePhase = (float) (Math.random() * Math.PI * 2); + } + + void tick() { + pulsePhase += 0.08f; + } + + boolean isMouseOver(int mx, int my, float zoom) { + float r = getRadius() * zoom; + float dx = mx - screenX; + float dy = my - screenY; + return dx * dx + dy * dy <= r * r * 1.5f; + } + + float getRadius() { + if (upgrade.isRepeatable()) return 12; // Smaller for repeatables + if (upgrade.isCapstone()) return 18; + if (upgrade.getRow() == 5) return 15; // T5 upgrades + return 14; + } + + int[] getColor() { + return switch (upgrade.getBranch()) { + case IGNITION -> new int[] { 255, 120, 60 }; // Fiery orange + case FUSION -> new int[] { 80, 180, 255 }; // Electric blue + case COLLAPSE -> new int[] { 180, 80, 220 }; // Void purple + case VOID -> new int[] { 80, 255, 180 }; // Ethereal teal + case REPEATABLE -> new int[] { 220, 200, 120 }; // Golden for repeatables + }; + } + + void render(GuiGraphics graphics, net.minecraft.client.gui.Font font, float fadeAlpha, float zoom, + int ticks, float partialTick, boolean owned, boolean available, boolean tierLocked, + boolean hovered, boolean selected) { + int[] rgb = getColor(); + float baseRadius = getRadius() * zoom; + + // Pulse for owned/available/hovered + float pulse = 1f; + if (owned || available || hovered || selected) { + float smooth = pulsePhase + 0.08f * partialTick; + pulse = 1f + Mth.sin(smooth) * 0.12f; + } + int radius = (int) (baseRadius * pulse); + + // Alpha based on state + float stateAlpha; + if (owned) stateAlpha = 1f; + else if (available) stateAlpha = hovered ? 0.9f : 0.6f; + else if (tierLocked) stateAlpha = 0.25f; + else stateAlpha = 0.4f; + + int alpha = (int) (fadeAlpha * stateAlpha * 255); + + // Glow for owned/available + if (owned || available || selected) { + for (int r = radius + 14; r > radius; r -= 3) { + float p = (float) (r - radius) / 14f; + int glowAlpha = (int) ((1f - p) * 60 * fadeAlpha * stateAlpha); + int glowColor = (glowAlpha << 24) | (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + drawNodeCircle(graphics, (int) screenX, (int) screenY, r, glowColor); + } + } + + // Core - darker if locked + int coreR = owned ? rgb[0] : (int) (rgb[0] * 0.4f); + int coreG = owned ? rgb[1] : (int) (rgb[1] * 0.4f); + int coreB = owned ? rgb[2] : (int) (rgb[2] * 0.4f); + if (tierLocked) { + coreR = coreG = coreB = 40; + } + int coreColor = (alpha << 24) | (coreR << 16) | (coreG << 8) | coreB; + drawNodeCircle(graphics, (int) screenX, (int) screenY, radius, coreColor); + + // Border + int borderAlpha = (int) (fadeAlpha * (hovered || selected ? 255 : 150)); + int borderColor; + if (owned) { + borderColor = (borderAlpha << 24) | (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + } else if (available) { + float bpulse = Mth.sin(pulsePhase) * 0.3f + 0.7f; + int br = (int) (rgb[0] * bpulse); + int bg = (int) (rgb[1] * bpulse); + int bb = (int) (rgb[2] * bpulse); + borderColor = (borderAlpha << 24) | (br << 16) | (bg << 8) | bb; + } else { + borderColor = (borderAlpha << 24) | 0x404050; + } + drawNodeRing(graphics, (int) screenX, (int) screenY, radius, borderColor); + + // Selection ring + if (selected) { + int ringAlpha = (int) (fadeAlpha * 200); + float rot = ticks * 0.05f + partialTick * 0.05f; + for (int i = 0; i < 8; i++) { + float angle = rot + i * Mth.PI / 4; + int rx = (int) (screenX + Mth.cos(angle) * (radius + 6)); + int ry = (int) (screenY + Mth.sin(angle) * (radius + 6)); + graphics.fill(rx - 1, ry - 1, rx + 2, ry + 2, (ringAlpha << 24) | 0xFFFFFF); + } + } + + // Icon/text inside + if (owned) { + graphics.drawString(font, "\u2713", (int) screenX - 3, (int) screenY - 4, + (alpha << 24) | 0xFFFFFF, false); + } else if (tierLocked) { + String lock = "T" + upgrade.getRequiredTier(); + graphics.drawString(font, lock, (int) screenX - font.width(lock) / 2, (int) screenY - 3, + (alpha << 24) | 0x505050, false); + } else { + String cost = String.valueOf(upgrade.getCost()); + int costColor = available ? 0xFFCC44 : 0x606060; + graphics.drawString(font, cost, (int) screenX - font.width(cost) / 2, (int) screenY - 3, + (alpha << 24) | costColor, false); + } + } + + private void drawNodeCircle(GuiGraphics g, int cx, int cy, int radius, int color) { + if (radius <= 0) return; + for (int y = -radius; y <= radius; y++) { + int halfWidth = (int) Math.sqrt(radius * radius - y * y); + g.fill(cx - halfWidth, cy + y, cx + halfWidth + 1, cy + y + 1, color); + } + } + + private void drawNodeRing(GuiGraphics g, int cx, int cy, int radius, int color) { + for (int a = 0; a < 360; a += 8) { + float rad = a * Mth.DEG_TO_RAD; + int px = cx + (int) (Mth.cos(rad) * radius); + int py = cy + (int) (Mth.sin(rad) * radius); + g.fill(px, py, px + 1, py + 1, color); + } + } + } + + // Particle class + private static class CosmicParticle { + + float x, y; + float twinkle; + float maxAlpha; + int life, age; + + CosmicParticle(int w, int h, Random r) { + reset(w, h, r); + } + + void reset(int w, int h, Random r) { + x = r.nextFloat() * w; + y = r.nextFloat() * h; + twinkle = r.nextFloat() * Mth.TWO_PI; + maxAlpha = 0.15f + r.nextFloat() * 0.3f; + life = 150 + r.nextInt(200); + age = 0; + } + + void tick() { + age++; + twinkle += 0.06f; + } + + boolean isDead() { + return age >= life; + } + + void render(GuiGraphics g, float screenAlpha) { + float t = Mth.sin(twinkle) * 0.3f + 0.7f; + float lifeFade = 1f; + float p = (float) age / life; + if (p < 0.1f) lifeFade = p / 0.1f; + else if (p > 0.9f) lifeFade = (1f - p) / 0.1f; + + int alpha = (int) (maxAlpha * t * lifeFade * screenAlpha * 255); + if (alpha <= 0) return; + + g.fill((int) x, (int) y, (int) x + 1, (int) y + 1, (alpha << 24) | 0xCCCCDD); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/drill/OreExtractionDrillBackgroundWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/drill/OreExtractionDrillBackgroundWidget.java new file mode 100644 index 000000000..ed6bd898c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/drill/OreExtractionDrillBackgroundWidget.java @@ -0,0 +1,97 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.drill; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import javax.annotation.Nonnull; + +public class OreExtractionDrillBackgroundWidget extends Widget { + + private float forgeGlow = 0f; + + public OreExtractionDrillBackgroundWidget(int x, int y, int width, int height) { + super(x, y, width, height); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + forgeGlow += 0.06f; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + graphics.fill(x, y, x + w, y + h, 0xFF101014); + drawForgeGlow(graphics, x, y, w, h); + drawCornerBrackets(graphics, x, y, w, h); + drawEdgeRivets(graphics, x, y, w, h); + } + + private void drawForgeGlow(GuiGraphics graphics, int x, int y, int w, int h) { + float pulse = Mth.sin(forgeGlow) * 0.3f + 0.7f; + + int glowH = 8; + for (int row = 0; row < glowH; row++) { + float progress = (float) row / glowH; + int alpha = (int) (0x20 * progress * pulse); + int color = (alpha << 24) | 0xCC4400; + graphics.fill(x, y + h - glowH + row, x + w, y + h - glowH + row + 1, color); + } + } + + private void drawCornerBrackets(GuiGraphics graphics, int x, int y, int w, int h) { + int bracketLen = 10; + int bracketThick = 2; + int bracketColor = 0xFF2a2a2a; + int highlightColor = 0xFF3a3a3a; + + graphics.fill(x, y, x + bracketLen, y + bracketThick, bracketColor); + graphics.fill(x, y, x + bracketThick, y + bracketLen, bracketColor); + graphics.fill(x, y, x + bracketLen, y + 1, highlightColor); + + graphics.fill(x + w - bracketLen, y, x + w, y + bracketThick, bracketColor); + graphics.fill(x + w - bracketThick, y, x + w, y + bracketLen, bracketColor); + + graphics.fill(x, y + h - bracketThick, x + bracketLen, y + h, bracketColor); + graphics.fill(x, y + h - bracketLen, x + bracketThick, y + h, bracketColor); + + graphics.fill(x + w - bracketLen, y + h - bracketThick, x + w, y + h, bracketColor); + graphics.fill(x + w - bracketThick, y + h - bracketLen, x + w, y + h, bracketColor); + } + + private void drawEdgeRivets(GuiGraphics graphics, int x, int y, int w, int h) { + int rivetColor = 0xFF222222; + int rivetHighlight = 0xFF2a2a2a; + + for (int rx = 20; rx < w - 10; rx += 30) { + graphics.fill(x + rx, y + 1, x + rx + 2, y + 3, rivetColor); + graphics.fill(x + rx, y + 1, x + rx + 1, y + 2, rivetHighlight); + } + + for (int rx = 20; rx < w - 10; rx += 30) { + graphics.fill(x + rx, y + h - 3, x + rx + 2, y + h - 1, rivetColor); + } + + for (int ry = 20; ry < h - 10; ry += 30) { + graphics.fill(x + 1, y + ry, x + 3, y + ry + 2, rivetColor); + graphics.fill(x + 1, y + ry, x + 2, y + ry + 1, rivetHighlight); + } + + for (int ry = 20; ry < h - 10; ry += 30) { + graphics.fill(x + w - 3, y + ry, x + w - 1, y + ry + 2, rivetColor); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/drill/OreExtractionDrillFancyUIWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/drill/OreExtractionDrillFancyUIWidget.java new file mode 100644 index 000000000..0807303e1 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/drill/OreExtractionDrillFancyUIWidget.java @@ -0,0 +1,212 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.drill; + +import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; +import com.gregtechceu.gtceu.api.gui.fancy.IFancyUIProvider; + +import com.lowdragmc.lowdraglib.gui.texture.ColorBorderTexture; +import com.lowdragmc.lowdraglib.gui.texture.ColorRectTexture; +import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; +import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.SlotWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.IntSupplier; + +import javax.annotation.Nonnull; + +public class OreExtractionDrillFancyUIWidget extends FancyMachineUIWidget { + + private final IntSupplier tierSupplier; + + private static final int BG_COLOR = 0xE00a0c10; + private static final int BORDER_COLOR = 0xFF404840; + private static final int SLOT_BG_COLOR = 0xC0101418; + private static final int SLOT_BORDER_COLOR = 0xFF505850; + + private static final int[] TIER_COLORS = { + 0xFFC08040, // LV - Copper/Bronze + 0xFF60A0D0, // HV - Steel Blue + 0xFF8080C0, // IV - Titanium Purple + 0xFFD0A040 // ZPM - Tungsten Gold + }; + + public OreExtractionDrillFancyUIWidget(IFancyUIProvider mainPage, int width, int height, IntSupplier tierSupplier) { + super(mainPage, width, height); + this.tierSupplier = tierSupplier; + setBackground((IGuiTexture) null); + applyDarkTheme(); + } + + private void applyDarkTheme() { + IGuiTexture titleBarBg = new GuiTextureGroup( + new ColorRectTexture(BG_COLOR), + new ColorBorderTexture(1, BORDER_COLOR)); + + if (titleBar != null) { + titleBar.setBackground((IGuiTexture) null); + for (Widget widget : titleBar.widgets) { + if (widget instanceof WidgetGroup group) { + group.setBackground(titleBarBg); + } + } + } + + if (sideTabsWidget != null) { + sideTabsWidget.setBackground((IGuiTexture) null); + updateTabStyling(); + } + + if (configuratorPanel != null) { + configuratorPanel.setVisible(false); + configuratorPanel.setActive(false); + } + + applySlotStyling(); + } + + private void applySlotStyling() { + if (playerInventory != null) { + playerInventory.setBackground((IGuiTexture) null); + IGuiTexture darkSlot = new GuiTextureGroup( + new ColorRectTexture(SLOT_BG_COLOR), + new ColorBorderTexture(1, SLOT_BORDER_COLOR)); + for (Widget widget : playerInventory.widgets) { + if (widget instanceof SlotWidget slotWidget) { + slotWidget.setBackground(darkSlot); + } + } + } + } + + private void updateTabStyling() { + if (sideTabsWidget == null) return; + + int tier = tierSupplier != null ? tierSupplier.getAsInt() : 0; + int accentColor = getTierColor(tier); + int accentColorDim = dimColor(accentColor, 0.6f); + + IGuiTexture tabNormal = new GuiTextureGroup( + new ColorRectTexture(0xA00a0c10), + new ColorBorderTexture(1, accentColorDim)); + IGuiTexture tabHover = new GuiTextureGroup( + new ColorRectTexture(0xC0141820), + new ColorBorderTexture(1, accentColor)); + IGuiTexture tabPressed = new GuiTextureGroup( + new ColorRectTexture(0xE00c1018), + new ColorBorderTexture(1, accentColor)); + + sideTabsWidget.setTabTexture(tabNormal); + sideTabsWidget.setTabHoverTexture(tabHover); + sideTabsWidget.setTabPressedTexture(tabPressed); + } + + private int getTierColor(int tier) { + if (tier < 0) return TIER_COLORS[0]; + if (tier >= TIER_COLORS.length) return TIER_COLORS[TIER_COLORS.length - 1]; + return TIER_COLORS[tier]; + } + + private int dimColor(int color, float factor) { + int a = (color >> 24) & 0xFF; + int r = (int) (((color >> 16) & 0xFF) * factor); + int g = (int) (((color >> 8) & 0xFF) * factor); + int b = (int) ((color & 0xFF) * factor); + return (a << 24) | (r << 16) | (g << 8) | b; + } + + @Override + public void initWidget() { + super.initWidget(); + applySlotStyling(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + updateTabStyling(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + drawFullBackground(graphics); + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + drawTitleText(graphics); + } + + private void drawFullBackground(GuiGraphics graphics) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + int tier = tierSupplier != null ? tierSupplier.getAsInt() : 0; + int tierColor = getTierColor(tier); + + DrawerHelper.drawGradientRect(graphics, x, y, w, h, 0xFF0c0e12, 0xFF080a0c, false); + drawGridPattern(graphics, x, y, w, h); + drawCornerAccents(graphics, x, y, w, h, (tierColor & 0x00FFFFFF) | 0x40000000); + DrawerHelper.drawBorder(graphics, x, y, w, h, (tierColor & 0x00FFFFFF) | 0x30000000, 1); + + if (playerInventory != null && playerInventory.isVisible()) { + int invY = playerInventory.getPosition().y; + int accentColor = (tierColor & 0x00FFFFFF) | 0x60000000; + graphics.fill(x + 10, invY - 2, x + w - 10, invY - 1, accentColor); + } + } + + private void drawGridPattern(GuiGraphics graphics, int x, int y, int w, int h) { + int gridColor = 0x08808060; + int spacing = 24; + for (int gx = x + spacing; gx < x + w; gx += spacing) { + graphics.fill(gx, y, gx + 1, y + h, gridColor); + } + for (int gy = y + spacing; gy < y + h; gy += spacing) { + graphics.fill(x, gy, x + w, gy + 1, gridColor); + } + } + + private void drawCornerAccents(GuiGraphics graphics, int x, int y, int w, int h, int color) { + int len = 18; + int thickness = 2; + graphics.fill(x, y, x + len, y + thickness, color); + graphics.fill(x, y, x + thickness, y + len, color); + graphics.fill(x + w - len, y, x + w, y + thickness, color); + graphics.fill(x + w - thickness, y, x + w, y + len, color); + graphics.fill(x, y + h - thickness, x + len, y + h, color); + graphics.fill(x, y + h - len, x + thickness, y + h, color); + graphics.fill(x + w - len, y + h - thickness, x + w, y + h, color); + graphics.fill(x + w - thickness, y + h - len, x + w, y + h, color); + } + + private void drawTitleText(GuiGraphics graphics) { + if (titleBar == null || mainPage == null) return; + + var font = Minecraft.getInstance().font; + String title = mainPage.getTitle().getString(); + + int titleBarX = getPosition().x + 8; + int titleBarY = getPosition().y - 16; + int textAreaX = titleBarX + 18 + 16; + int textAreaY = titleBarY + 3; + int textAreaWidth = getSize().width - 16 - 18 - 18 - 16; + int textAreaHeight = 13; + + graphics.fill(textAreaX, textAreaY, textAreaX + textAreaWidth, textAreaY + textAreaHeight, BG_COLOR); + + int textWidth = font.width(title); + int centeredX = textAreaX + (textAreaWidth - textWidth) / 2; + int centeredY = textAreaY + (textAreaHeight - font.lineHeight) / 2; + + int tier = tierSupplier != null ? tierSupplier.getAsInt() : 0; + int titleColor = getTierColor(tier); + graphics.drawString(font, title, centeredX, centeredY, titleColor, true); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/drill/OreExtractionDrillWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/drill/OreExtractionDrillWidget.java new file mode 100644 index 000000000..84abb6fc4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/drill/OreExtractionDrillWidget.java @@ -0,0 +1,418 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.drill; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.OreExtractionDrillLogic; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.OreExtractionDrillMachine; + +import com.gregtechceu.gtceu.api.GTValues; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class OreExtractionDrillWidget extends WidgetGroup { + + public static final int WIDTH = 280; + public static final int HEIGHT = 150; + + private static final int[] TIER_COLORS = { + 0xFFC08040, + 0xFF60A0D0, + 0xFF8080C0, + 0xFFD0A040 + }; + + private final Supplier machineSupplier; + + private int tier = 0; + private int phase = 0; + private float scanProgress = 0f; + private int currentOre = 0; + private int totalOres = 0; + private int miningProgressSec = 0; + private int totalMiningSec = 10; + private float removalChance = 0.5f; + private int yieldMultiplier = 2; + private Map oreTypes = new LinkedHashMap<>(); + + private float animPhase = 0f; + private float drillAnim = 0f; + + // Ore list scrolling + private int oreScrollOffset = 0; + private static final int MAX_VISIBLE_ORES = 8; + + public OreExtractionDrillWidget(Supplier machineSupplier) { + super(0, 0, WIDTH, HEIGHT); + this.machineSupplier = machineSupplier; + initWidgets(); + } + + private void initWidgets() { + addWidget(new OreExtractionDrillBackgroundWidget(0, 0, WIDTH, HEIGHT)); + } + + @Override + public void writeInitialData(RegistryFriendlyByteBuf buffer) { + super.writeInitialData(buffer); + syncDrillData(buffer); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readInitialData(RegistryFriendlyByteBuf buffer) { + super.readInitialData(buffer); + readDrillData(buffer); + } + + private void syncDrillData(RegistryFriendlyByteBuf buffer) { + OreExtractionDrillMachine machine = machineSupplier.get(); + if (machine == null) { + buffer.writeInt(0); + buffer.writeInt(0); + buffer.writeFloat(0f); + buffer.writeInt(0); + buffer.writeInt(0); + buffer.writeInt(0); + buffer.writeInt(10); + buffer.writeFloat(0.5f); + buffer.writeInt(2); + buffer.writeInt(0); + return; + } + + OreExtractionDrillLogic logic = machine.getRecipeLogic(); + buffer.writeInt(machine.getTierIndex()); + buffer.writeInt(logic.getPhase().ordinal()); + buffer.writeFloat(logic.getScanProgressPercent()); + buffer.writeInt(logic.getCurrentOreIndex()); + buffer.writeInt(logic.getPendingOreCount()); + buffer.writeInt(logic.getMiningProgressSeconds()); + buffer.writeInt(logic.getTotalMiningSeconds()); + buffer.writeFloat(machine.getRemovalChance()); + buffer.writeInt(machine.getEffectiveYieldMultiplier()); + + Map oreCounts = logic.getOreTypeCounts(); + buffer.writeInt(oreCounts.size()); + for (Map.Entry entry : oreCounts.entrySet()) { + buffer.writeUtf(entry.getKey()); + buffer.writeInt(entry.getValue()); + } + } + + private void readDrillData(RegistryFriendlyByteBuf buffer) { + tier = buffer.readInt(); + phase = buffer.readInt(); + scanProgress = buffer.readFloat(); + currentOre = buffer.readInt(); + totalOres = buffer.readInt(); + miningProgressSec = buffer.readInt(); + totalMiningSec = buffer.readInt(); + removalChance = buffer.readFloat(); + yieldMultiplier = buffer.readInt(); + + oreTypes.clear(); + int count = buffer.readInt(); + for (int i = 0; i < count; i++) { + String key = buffer.readUtf(); + int value = buffer.readInt(); + oreTypes.put(key, value); + } + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + OreExtractionDrillMachine machine = machineSupplier.get(); + if (machine == null) return; + + OreExtractionDrillLogic logic = machine.getRecipeLogic(); + int newPhase = logic.getPhase().ordinal(); + int newCurrent = logic.getCurrentOreIndex(); + int newTotal = logic.getPendingOreCount(); + float newScan = logic.getScanProgressPercent(); + + if (newPhase != phase || newCurrent != currentOre || newTotal != totalOres || + Math.abs(newScan - scanProgress) > 1f) { + writeUpdateInfo(501, this::syncDrillData); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, RegistryFriendlyByteBuf buffer) { + if (id == 501) { + readDrillData(buffer); + } else { + super.readUpdateInfo(id, buffer); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + animPhase += 0.05f; + if (phase == 2) { + drillAnim += 0.15f; + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + int tierColor = getTierColor(); + DrawerHelper.drawBorder(graphics, x, y, w, h, (tierColor & 0x00FFFFFF) | 0x60000000, 1); + + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + drawPhasePanel(graphics, x, y, w); + drawStatsPanel(graphics, x, y, w, h); + drawOreList(graphics, x, y, w, h); + } + + private void drawPhasePanel(GuiGraphics graphics, int x, int y, int w) { + var font = Minecraft.getInstance().font; + int tierColor = getTierColor(); + + int panelY = y + 5; + int panelH = 36; + + DrawerHelper.drawSolidRect(graphics, x + 5, panelY, w - 10, panelH, 0xF0181820); + + String phaseName = switch (phase) { + case 0 -> "IDLE"; + case 1 -> "SCANNING"; + case 2 -> "MINING"; + case 3 -> "COMPLETE"; + default -> "UNKNOWN"; + }; + + int phaseColor = switch (phase) { + case 0 -> 0xFF808080; + case 1 -> 0xFFFFCC44; + case 2 -> 0xFF44FF88; + case 3 -> 0xFF44CCFF; + default -> 0xFFFFFFFF; + }; + + float pulse = Mth.sin(animPhase * 2f) * 0.2f + 0.8f; + if (phase == 1 || phase == 2) { + int pulseAlpha = (int) (0xFF * pulse); + phaseColor = (pulseAlpha << 24) | (phaseColor & 0x00FFFFFF); + } + + graphics.drawString(font, "Phase: " + phaseName, x + 10, panelY + 4, phaseColor, false); + + int barY = panelY + 16; + int barW = w - 20; + int barH = 14; + + DrawerHelper.drawSolidRect(graphics, x + 10, barY, barW, barH, 0xFF202030); + + float progress = 0f; + String progressText = ""; + + if (phase == 1) { + progress = scanProgress / 100f; + progressText = String.format("%.1f%% - %d ores found", scanProgress, totalOres); + } else if (phase == 2) { + progress = totalOres > 0 ? (float) currentOre / totalOres : 0f; + progressText = String.format("Ore %d / %d (%ds / %ds)", currentOre + 1, totalOres, miningProgressSec, + totalMiningSec); + } else if (phase == 3) { + progress = 1f; + progressText = "Area cleared - Use screwdriver to restart"; + } + + int fillW = (int) (barW * progress); + if (fillW > 0) { + int fillColor = darkenColor(tierColor, 0.7f); + DrawerHelper.drawGradientRect(graphics, x + 10, barY, fillW, barH, fillColor, tierColor, true); + + if (phase == 2 && fillW > 4) { + float edgePulse = Mth.sin(drillAnim) * 0.4f + 0.6f; + int edgeAlpha = (int) (0xFF * edgePulse); + int edgeColor = (edgeAlpha << 24) | 0xFFFFFF; + graphics.fill(x + 10 + fillW - 3, barY, x + 10 + fillW, barY + barH, edgeColor); + } + } + + int textColor = progress > 0.5f ? 0xFF000000 : 0xFFCCCCCC; + int textX = x + 10 + (barW - font.width(progressText)) / 2; + graphics.drawString(font, progressText, textX, barY + 3, textColor, false); + } + + private void drawStatsPanel(GuiGraphics graphics, int x, int y, int w, int h) { + var font = Minecraft.getInstance().font; + int tierColor = getTierColor(); + + int panelX = x + 5; + int panelY = y + 45; + int panelW = 115; + int panelH = h - 51; + + DrawerHelper.drawSolidRect(graphics, panelX, panelY, panelW, panelH, 0xF0181820); + DrawerHelper.drawBorder(graphics, panelX, panelY, panelW, panelH, (tierColor & 0x00FFFFFF) | 0x60000000, 1); + + graphics.drawString(font, "STATS", panelX + 4, panelY + 3, 0xFF909090, false); + + int statY = panelY + 15; + int statGap = 11; + + String chanceText = String.format("%.1f%% Depletion", removalChance * 100f); + graphics.drawString(font, chanceText, panelX + 6, statY, 0xFFFFCC44, false); + statY += statGap; + + long euPerTick = GTValues.V[tierIndexToGTTier(tier)]; + String euText = euPerTick + " EU/t"; + graphics.drawString(font, euText, panelX + 6, statY, 0xFF44CCFF, false); + statY += statGap; + + String areaText = "144x144 area"; + graphics.drawString(font, areaText, panelX + 6, statY, 0xFF808080, false); + } + + private java.util.List> getGroupedOres() { + Map grouped = new LinkedHashMap<>(); + for (var entry : oreTypes.entrySet()) { + grouped.merge(entry.getKey(), entry.getValue(), Integer::sum); + } + return grouped.entrySet().stream() + .sorted((a, b) -> b.getValue().compareTo(a.getValue())) + .toList(); + } + + private void drawOreList(GuiGraphics graphics, int x, int y, int w, int h) { + var font = Minecraft.getInstance().font; + int tierColor = getTierColor(); + + int panelX = x + 125; + int panelY = y + 45; + int panelW = w - 130; + int panelH = h - 51; + + DrawerHelper.drawSolidRect(graphics, panelX, panelY, panelW, panelH, 0xF0181820); + DrawerHelper.drawBorder(graphics, panelX, panelY, panelW, panelH, (tierColor & 0x00FFFFFF) | 0x60000000, 1); + + graphics.drawString(font, "ORE TYPES", panelX + 4, panelY + 3, 0xFF909090, false); + + if (oreTypes.isEmpty()) { + graphics.drawString(font, "No ores found", panelX + 6, panelY + 16, 0xFF606060, false); + return; + } + + var groupedOres = getGroupedOres(); + + int totalOreTypes = groupedOres.size(); + int maxScroll = Math.max(0, totalOreTypes - MAX_VISIBLE_ORES); + oreScrollOffset = Math.min(oreScrollOffset, maxScroll); + + int oreY = panelY + 16; + int endIndex = Math.min(oreScrollOffset + MAX_VISIBLE_ORES, totalOreTypes); + + for (int i = oreScrollOffset; i < endIndex; i++) { + var entry = groupedOres.get(i); + String oreName = entry.getKey(); + String countText = "x" + entry.getValue(); + + int countWidth = font.width(countText); + int maxNameWidth = panelW - countWidth - 16; + + String displayName = oreName; + if (font.width(displayName) > maxNameWidth) { + while (font.width(displayName + "..") > maxNameWidth && displayName.length() > 1) { + displayName = displayName.substring(0, displayName.length() - 1); + } + displayName = displayName + ".."; + } + + graphics.drawString(font, displayName, panelX + 6, oreY, 0xFFB0B0B0, false); + graphics.drawString(font, countText, panelX + panelW - countWidth - 6, oreY, 0xFFAAAAAA, false); + + oreY += 10; + } + + if (totalOreTypes > MAX_VISIBLE_ORES) { + int scrollBarX = panelX + panelW - 4; + int scrollBarY = panelY + 14; + int scrollBarH = panelH - 18; + + graphics.fill(scrollBarX, scrollBarY, scrollBarX + 2, scrollBarY + scrollBarH, 0xFF0a0a0a); + + float scrollPercent = maxScroll > 0 ? (float) oreScrollOffset / maxScroll : 0f; + int thumbH = Math.max(8, scrollBarH * MAX_VISIBLE_ORES / totalOreTypes); + int thumbY = scrollBarY + (int) ((scrollBarH - thumbH) * scrollPercent); + graphics.fill(scrollBarX, thumbY, scrollBarX + 2, thumbY + thumbH, (tierColor & 0x00FFFFFF) | 0xA0000000); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseWheelMove(double mouseX, double mouseY, double scrollX, double scrollY) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + int panelX = x + 125; + int panelY = y + 45; + int panelW = w - 130; + int panelH = h - 51; + + if (mouseX >= panelX && mouseX < panelX + panelW && + mouseY >= panelY && mouseY < panelY + panelH) { + int totalOreTypes = getGroupedOres().size(); + int maxScroll = Math.max(0, totalOreTypes - MAX_VISIBLE_ORES); + + if (scrollY > 0) { + oreScrollOffset = Math.max(0, oreScrollOffset - 1); + } else if (scrollY < 0) { + oreScrollOffset = Math.min(maxScroll, oreScrollOffset + 1); + } + return true; + } + return super.mouseWheelMove(mouseX, mouseY, scrollX, scrollY); + } + + private int getTierColor() { + if (tier < 0) return TIER_COLORS[0]; + if (tier >= TIER_COLORS.length) return TIER_COLORS[TIER_COLORS.length - 1]; + return TIER_COLORS[tier]; + } + + private int tierIndexToGTTier(int index) { + return switch (index) { + case 0 -> GTValues.LV; + case 1 -> GTValues.HV; + case 2 -> GTValues.IV; + case 3 -> GTValues.ZPM; + default -> GTValues.LV; + }; + } + + private int darkenColor(int color, float factor) { + int a = (color >> 24) & 0xFF; + int r = (int) (((color >> 16) & 0xFF) * factor); + int g = (int) (((color >> 8) & 0xFF) * factor); + int b = (int) ((color & 0xFF) * factor); + return (a << 24) | (r << 16) | (g << 8) | b; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/LinkStatusWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/LinkStatusWidget.java new file mode 100644 index 000000000..f96b14d4f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/LinkStatusWidget.java @@ -0,0 +1,250 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.starladder; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class LinkStatusWidget extends Widget { + + private static final int[] TIER_COLORS = { + 0xFF4080C0, // T0 - Blue + 0xFF40C080, // T1 - Green + 0xFFC0A040, // T2 - Gold + 0xFFC040C0 // T3 - Purple + }; + + private final Supplier linkedSupplier; + private final Supplier partnerOnlineSupplier; + private final Supplier partnerNameSupplier; + private final Supplier partnerLocationSupplier; + private final java.util.function.IntSupplier tierSupplier; + + private float pulsePhase = 0f; + private float connectionAnim = 0f; + private float dataPacketPhase = 0f; + + public LinkStatusWidget(int x, int y, int width, int height, + Supplier linkedSupplier, + Supplier partnerOnlineSupplier, + Supplier partnerNameSupplier, + Supplier partnerLocationSupplier, + java.util.function.IntSupplier tierSupplier) { + super(x, y, width, height); + this.linkedSupplier = linkedSupplier; + this.partnerOnlineSupplier = partnerOnlineSupplier; + this.partnerNameSupplier = partnerNameSupplier; + this.partnerLocationSupplier = partnerLocationSupplier; + this.tierSupplier = tierSupplier; + } + + // Legacy constructor for backwards compatibility + public LinkStatusWidget(int x, int y, int width, int height, + Supplier linkedSupplier, + Supplier partnerOnlineSupplier, + Supplier partnerNameSupplier, + Supplier partnerLocationSupplier) { + this(x, y, width, height, linkedSupplier, partnerOnlineSupplier, + partnerNameSupplier, partnerLocationSupplier, () -> 0); + } + + private int getTierColor() { + int tier = tierSupplier.getAsInt(); + if (tier < 0) return TIER_COLORS[0]; + if (tier >= TIER_COLORS.length) return TIER_COLORS[TIER_COLORS.length - 1]; + return TIER_COLORS[tier]; + } + + private int adjustAlpha(int color, float factor) { + int a = (int) (((color >> 24) & 0xFF) * factor); + return (a << 24) | (color & 0x00FFFFFF); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + pulsePhase += 0.08f; + + boolean online = partnerOnlineSupplier.get(); + float targetAnim = online ? 1f : 0f; + connectionAnim = Mth.lerp(0.1f, connectionAnim, targetAnim); + + // Animate data packets traveling along the line when online + if (online) { + dataPacketPhase += 0.04f; + if (dataPacketPhase > 1f) { + dataPacketPhase = 0f; + } + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + int tierColor = getTierColor(); + DrawerHelper.drawSolidRect(graphics, x, y, w, h, 0xA0101828); + DrawerHelper.drawBorder(graphics, x, y, w, h, adjustAlpha(tierColor, 0.5f), 1); + + var font = Minecraft.getInstance().font; + boolean isLinked = linkedSupplier.get(); + + if (!isLinked) { + drawUnlinkedState(graphics, x, y, w, h, font); + return; + } + + boolean online = partnerOnlineSupplier.get(); + String partnerName = partnerNameSupplier.get(); + String location = partnerLocationSupplier.get(); + + drawConnectionLine(graphics, x, y, w, h, online); + drawPartnerInfo(graphics, x, y, w, h, font, partnerName, location, online); + } + + private void drawUnlinkedState(GuiGraphics graphics, int x, int y, int w, int h, + net.minecraft.client.gui.Font font) { + float pulse = Mth.sin(pulsePhase) * 0.2f + 0.8f; + int alpha = (int) (0x80 * pulse); + int textColor = (alpha << 24) | 0x606080; + + String text = "NO LINK"; + int textX = x + (w - font.width(text)) / 2; + int textY = y + (h - font.lineHeight) / 2; + graphics.drawString(font, text, textX, textY, textColor, false); + + int dotX = x + w / 2; + int dotY = y + h - 8; + int dotColor = (alpha << 24) | 0x404060; + graphics.fill(dotX - 2, dotY - 2, dotX + 2, dotY + 2, dotColor); + } + + private void drawConnectionLine(GuiGraphics graphics, int x, int y, int w, int h, boolean online) { + int tierColor = getTierColor(); + int lineY = y + h - 6; + int lineStartX = x + 10; + int lineEndX = x + w - 10; + int lineWidth = lineEndX - lineStartX; + + // Background track + DrawerHelper.drawSolidRect(graphics, lineStartX, lineY, lineWidth, 2, 0xFF202040); + + if (connectionAnim > 0.01f) { + int connectedWidth = (int) (lineWidth * connectionAnim); + // Use tier color for the connection line when online + int connColor = online ? tierColor : 0xFFFF8040; + DrawerHelper.drawSolidRect(graphics, lineStartX, lineY, connectedWidth, 2, connColor); + + // Draw animated data packets traveling along the line when online + if (online && connectedWidth > 20) { + int numPackets = 3; + for (int i = 0; i < numPackets; i++) { + float packetProgress = (dataPacketPhase + i * 0.33f) % 1.0f; + int packetX = lineStartX + (int) (connectedWidth * packetProgress); + + // Packet glow effect + float packetBrightness = 0.6f + 0.4f * Mth.sin(pulsePhase * 4f + i * 2f); + int packetAlpha = (int) (0xFF * packetBrightness * connectionAnim); + int packetColor = (packetAlpha << 24) | (tierColor & 0x00FFFFFF); + + // Draw packet as a small bright segment + int packetWidth = 6; + int drawX = Math.max(lineStartX, + Math.min(packetX - packetWidth / 2, lineStartX + connectedWidth - packetWidth)); + graphics.fill(drawX, lineY - 1, drawX + packetWidth, lineY + 3, packetColor); + + // Trailing glow + int trailAlpha = (int) (packetAlpha * 0.3f); + int trailColor = (trailAlpha << 24) | (tierColor & 0x00FFFFFF); + int trailX = Math.max(lineStartX, drawX - 4); + graphics.fill(trailX, lineY, drawX, lineY + 2, trailColor); + } + } + + // Pulse effect at the leading edge + float pulse = Mth.sin(pulsePhase * 3f) * 0.3f + 0.7f; + int pulseAlpha = (int) (0xFF * pulse * connectionAnim); + int pulseX = lineStartX + connectedWidth - 4; + if (pulseX > lineStartX) { + int pulseColor = (pulseAlpha << 24) | (connColor & 0x00FFFFFF); + graphics.fill(pulseX, lineY - 1, pulseX + 4, lineY + 3, pulseColor); + } + } + + // Start node (hub side) - use tier color + int startDotColor = adjustAlpha(tierColor, 0.7f); + graphics.fill(lineStartX - 2, lineY - 1, lineStartX + 2, lineY + 3, startDotColor); + + // End node (partner side) - brighter when connected + int endDotAlpha = (int) (0xFF * connectionAnim); + int endDotColor = online ? ((endDotAlpha << 24) | (tierColor & 0x00FFFFFF)) : ((endDotAlpha << 24) | 0xFF8040); + graphics.fill(lineEndX - 2, lineY - 1, lineEndX + 2, lineY + 3, endDotColor); + + // Add a pulsing glow around end node when online + if (online && connectionAnim > 0.5f) { + float glowPulse = Mth.sin(pulsePhase * 2f) * 0.4f + 0.3f; + int glowAlpha = (int) (0x60 * glowPulse * connectionAnim); + int glowColor = (glowAlpha << 24) | (tierColor & 0x00FFFFFF); + graphics.fill(lineEndX - 4, lineY - 3, lineEndX + 4, lineY + 5, glowColor); + } + } + + private void drawPartnerInfo(GuiGraphics graphics, int x, int y, int w, int h, + net.minecraft.client.gui.Font font, + String partnerName, String location, boolean online) { + int statusColor = online ? 0xFF40FF80 : 0xFFFF6040; + String statusText = online ? "ONLINE" : "OFFLINE"; + + int statusX = x + 8; + int statusY = y + 4; + int maxTextWidth = w - 16; // Leave padding on both sides + + float pulse = online ? 1f : (Mth.sin(pulsePhase * 3f) * 0.3f + 0.7f); + int pulseAlpha = (int) (0xFF * pulse); + int dotColor = (pulseAlpha << 24) | (statusColor & 0x00FFFFFF); + graphics.fill(statusX, statusY + 2, statusX + 4, statusY + 6, dotColor); + + graphics.drawString(font, statusText, statusX + 8, statusY, statusColor, false); + + int nameY = statusY + font.lineHeight + 2; + String displayName = truncateText(font, partnerName, maxTextWidth); + graphics.drawString(font, displayName, statusX, nameY, 0xFFB0C0D0, false); + + if (location != null && !location.isEmpty()) { + int locY = nameY + font.lineHeight + 1; + String displayLoc = truncateText(font, location, maxTextWidth); + graphics.drawString(font, displayLoc, statusX, locY, 0xFF707890, false); + } + } + + private String truncateText(net.minecraft.client.gui.Font font, String text, int maxWidth) { + if (font.width(text) <= maxWidth) { + return text; + } + String ellipsis = "..."; + int ellipsisWidth = font.width(ellipsis); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < text.length(); i++) { + if (font.width(sb.toString() + text.charAt(i)) + ellipsisWidth > maxWidth) { + return sb.toString() + ellipsis; + } + sb.append(text.charAt(i)); + } + return sb.toString(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/NextTierRequirementsWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/NextTierRequirementsWidget.java new file mode 100644 index 000000000..fb3a775de --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/NextTierRequirementsWidget.java @@ -0,0 +1,286 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.starladder; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.IntSupplier; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +/** + * Widget that displays what blocks are needed for the next tier upgrade. + * Supports scrolling when there are many requirements. + */ +public class NextTierRequirementsWidget extends Widget { + + private static final int[] TIER_COLORS = { + 0xFF4080C0, // T0 - Blue + 0xFF40C080, // T1 - Green + 0xFFC0A040, // T2 - Gold + 0xFFC040C0 // T3 - Purple + }; + + private static final int LINE_HEIGHT = 16; + private static final int ITEM_SIZE = 14; + private static final int HEADER_HEIGHT = 14; + private static final int SCROLLBAR_WIDTH = 6; + + private final IntSupplier tierSupplier; + private final Supplier canUpgradeSupplier; + private final Supplier> requirementsSupplier; + + private float animPhase = 0f; + private int scrollOffset = 0; + private boolean isDraggingScrollbar = false; + + // Cached requirements for rendering + private List cachedRequirements = new ArrayList<>(); + private int cachedTier = -1; + + private record BlockRequirement(Block block, int count, ItemStack displayStack) {} + + public NextTierRequirementsWidget(int x, int y, int width, int height, + IntSupplier tierSupplier, + Supplier canUpgradeSupplier, + Supplier> requirementsSupplier) { + super(x, y, width, height); + this.tierSupplier = tierSupplier; + this.canUpgradeSupplier = canUpgradeSupplier; + this.requirementsSupplier = requirementsSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + animPhase += 0.06f; + + // Update cached requirements if tier changed + int currentTier = tierSupplier.getAsInt(); + if (currentTier != cachedTier) { + cachedTier = currentTier; + updateCachedRequirements(); + } + } + + private void updateCachedRequirements() { + cachedRequirements.clear(); + if (!canUpgradeSupplier.get()) return; + + Map reqs = requirementsSupplier.get(); + if (reqs == null || reqs.isEmpty()) return; + + for (Map.Entry entry : reqs.entrySet()) { + Block block = entry.getKey(); + int count = entry.getValue(); + ItemStack stack = new ItemStack(block.asItem()); + cachedRequirements.add(new BlockRequirement(block, count, stack)); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + int tier = tierSupplier.getAsInt(); + int tierColor = getTierColor(tier); + + // Background + DrawerHelper.drawSolidRect(graphics, x, y, w, h, 0xA0101828); + DrawerHelper.drawBorder(graphics, x, y, w, h, adjustAlpha(tierColor, 0.4f), 1); + + var font = Minecraft.getInstance().font; + + if (tier >= 3) { + // Max tier reached + drawMaxTierMessage(graphics, x, y, w, h, font); + } else if (!canUpgradeSupplier.get()) { + // Cannot upgrade (not formed?) + drawNotAvailableMessage(graphics, x, y, w, h, font); + } else if (cachedRequirements.isEmpty()) { + // No requirements (shouldn't happen but handle it) + drawNoRequirementsMessage(graphics, x, y, w, h, font); + } else { + // Show requirements + drawRequirements(graphics, x, y, w, h, font, tier, tierColor); + } + } + + private void drawMaxTierMessage(GuiGraphics graphics, int x, int y, int w, int h, + net.minecraft.client.gui.Font font) { + float pulse = Mth.sin(animPhase * 2f) * 0.15f + 0.85f; + int alpha = (int) (0xFF * pulse); + int color = (alpha << 24) | 0xC0A040; + + String text = "MAXIMUM TIER"; + int textX = x + (w - font.width(text)) / 2; + int textY = y + (h - font.lineHeight) / 2; + graphics.drawString(font, text, textX, textY, color, false); + } + + private void drawNotAvailableMessage(GuiGraphics graphics, int x, int y, int w, int h, + net.minecraft.client.gui.Font font) { + String text = "---"; + int textX = x + (w - font.width(text)) / 2; + int textY = y + (h - font.lineHeight) / 2; + graphics.drawString(font, text, textX, textY, 0xFF505060, false); + } + + private void drawNoRequirementsMessage(GuiGraphics graphics, int x, int y, int w, int h, + net.minecraft.client.gui.Font font) { + String text = "READY"; + int textX = x + (w - font.width(text)) / 2; + int textY = y + (h - font.lineHeight) / 2; + graphics.drawString(font, text, textX, textY, 0xFF40C080, false); + } + + private void drawRequirements(GuiGraphics graphics, int x, int y, int w, int h, + net.minecraft.client.gui.Font font, int tier, int tierColor) { + // Header + String header = "NEXT: T" + (tier + 1); + int nextTierColor = getTierColor(tier + 1); + graphics.drawString(font, header, x + 4, y + 3, nextTierColor, false); + + // Calculate visible area + int contentY = y + HEADER_HEIGHT; + int contentH = h - HEADER_HEIGHT - 2; + int visibleItems = contentH / LINE_HEIGHT; + int totalItems = cachedRequirements.size(); + boolean needsScrollbar = totalItems > visibleItems; + + // Clamp scroll offset + int maxScroll = Math.max(0, totalItems - visibleItems); + scrollOffset = Mth.clamp(scrollOffset, 0, maxScroll); + + // Content width (account for scrollbar) + int contentW = needsScrollbar ? w - SCROLLBAR_WIDTH - 4 : w - 4; + + // Enable scissor to clip content + graphics.enableScissor(x, contentY, x + w - (needsScrollbar ? SCROLLBAR_WIDTH + 2 : 0), y + h); + + // Draw items + for (int i = 0; i < totalItems; i++) { + int visualIdx = i - scrollOffset; + if (visualIdx < 0) continue; + if (visualIdx >= visibleItems + 1) break; // +1 for partial visibility + + BlockRequirement req = cachedRequirements.get(i); + int drawY = contentY + visualIdx * LINE_HEIGHT; + + // Draw item icon + graphics.pose().pushPose(); + graphics.pose().translate(x + 4, drawY, 0); + float scale = ITEM_SIZE / 16f; + graphics.pose().scale(scale, scale, 1f); + graphics.renderItem(req.displayStack, 0, 0); + graphics.pose().popPose(); + + // Draw count next to item + String countStr = "x" + req.count; + graphics.drawString(font, countStr, x + 4 + ITEM_SIZE + 4, drawY + 3, 0xFFA0A0B0, false); + } + + graphics.disableScissor(); + + // Draw scrollbar if needed + if (needsScrollbar) { + drawScrollbar(graphics, x + w - SCROLLBAR_WIDTH - 2, contentY, SCROLLBAR_WIDTH, contentH, + scrollOffset, maxScroll, visibleItems, totalItems, tierColor); + } + } + + private void drawScrollbar(GuiGraphics graphics, int x, int y, int w, int h, + int offset, int maxOffset, int visibleItems, int totalItems, int tierColor) { + // Background track + graphics.fill(x, y, x + w, y + h, 0x40000000); + + // Calculate thumb size and position + float thumbRatio = (float) visibleItems / totalItems; + int thumbHeight = Math.max(10, (int) (h * thumbRatio)); + float scrollRatio = maxOffset > 0 ? (float) offset / maxOffset : 0; + int thumbY = y + (int) ((h - thumbHeight) * scrollRatio); + + // Draw thumb + int thumbColor = adjustAlpha(tierColor, 0.7f); + graphics.fill(x + 1, thumbY, x + w - 1, thumbY + thumbHeight, thumbColor); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInForeground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInForeground(graphics, mouseX, mouseY, partialTicks); + + // Tooltip for hovered items + if (!isMouseOverElement(mouseX, mouseY)) return; + if (cachedRequirements.isEmpty()) return; + + int x = getPosition().x; + int y = getPosition().y; + int h = getSize().height; + + int contentY = y + HEADER_HEIGHT; + int contentH = h - HEADER_HEIGHT - 2; + int visibleItems = contentH / LINE_HEIGHT; + + for (int i = 0; i < cachedRequirements.size(); i++) { + int visualIdx = i - scrollOffset; + if (visualIdx < 0 || visualIdx >= visibleItems) continue; + + BlockRequirement req = cachedRequirements.get(i); + int drawY = contentY + visualIdx * LINE_HEIGHT; + + if (mouseX >= x + 4 && mouseX < x + 4 + ITEM_SIZE && + mouseY >= drawY && mouseY < drawY + ITEM_SIZE) { + graphics.renderTooltip(Minecraft.getInstance().font, req.displayStack, mouseX, mouseY); + return; + } + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseWheelMove(double mouseX, double mouseY, double scrollX, double scrollY) { + if (isMouseOverElement(mouseX, mouseY) && !cachedRequirements.isEmpty()) { + int h = getSize().height; + int contentH = h - HEADER_HEIGHT - 2; + int visibleItems = contentH / LINE_HEIGHT; + int totalItems = cachedRequirements.size(); + + if (totalItems > visibleItems) { + int maxScroll = totalItems - visibleItems; + scrollOffset = Mth.clamp(scrollOffset - (int) Math.signum(scrollY), 0, maxScroll); + return true; + } + } + return super.mouseWheelMove(mouseX, mouseY, scrollX, scrollY); + } + + private int getTierColor(int tier) { + if (tier < 0) return TIER_COLORS[0]; + if (tier >= TIER_COLORS.length) return TIER_COLORS[TIER_COLORS.length - 1]; + return TIER_COLORS[tier]; + } + + private int adjustAlpha(int color, float factor) { + int a = (int) (((color >> 24) & 0xFF) * factor); + return (a << 24) | (color & 0x00FFFFFF); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/StarLadderBackgroundWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/StarLadderBackgroundWidget.java new file mode 100644 index 000000000..fad1c682e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/StarLadderBackgroundWidget.java @@ -0,0 +1,191 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.starladder; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import javax.annotation.Nonnull; + +public class StarLadderBackgroundWidget extends Widget { + + private final List stars = new ArrayList<>(); + private final List gridLines = new ArrayList<>(); + private final Random random = new Random(12345); + + private float driftPhase = 0f; + private float gridPulse = 0f; + + private static class BackgroundStar { + + float x, y; + float baseX, baseY; + float size; + float twinkleSpeed; + float twinkleOffset; + int color; + float depth; + } + + private static class GridLine { + + float pos; + boolean horizontal; + float pulseOffset; + } + + public StarLadderBackgroundWidget(int x, int y, int width, int height) { + super(x, y, width, height); + initStars(width, height); + initGrid(width, height); + } + + private void initStars(int w, int h) { + int starCount = 50; + for (int i = 0; i < starCount; i++) { + BackgroundStar star = new BackgroundStar(); + star.baseX = random.nextFloat() * w; + star.baseY = random.nextFloat() * h; + star.x = star.baseX; + star.y = star.baseY; + star.size = 0.5f + random.nextFloat() * 1.2f; + star.twinkleSpeed = 0.015f + random.nextFloat() * 0.04f; + star.twinkleOffset = random.nextFloat() * Mth.TWO_PI; + star.depth = 0.3f + random.nextFloat() * 0.7f; + + float colorRand = random.nextFloat(); + if (colorRand < 0.5f) { + star.color = 0xAABBFF; + } else if (colorRand < 0.7f) { + star.color = 0xFFFFFF; + } else if (colorRand < 0.85f) { + star.color = 0x99DDFF; + } else { + star.color = 0xDDAAFF; + } + stars.add(star); + } + } + + private void initGrid(int w, int h) { + int gridSpacing = 20; + for (int x = gridSpacing; x < w; x += gridSpacing) { + GridLine line = new GridLine(); + line.pos = x; + line.horizontal = false; + line.pulseOffset = random.nextFloat() * Mth.TWO_PI; + gridLines.add(line); + } + for (int y = gridSpacing; y < h; y += gridSpacing) { + GridLine line = new GridLine(); + line.pos = y; + line.horizontal = true; + line.pulseOffset = random.nextFloat() * Mth.TWO_PI; + gridLines.add(line); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + driftPhase += 0.012f; + gridPulse += 0.03f; + + float driftX = Mth.sin(driftPhase * 0.3f) * 1.5f; + float driftY = Mth.cos(driftPhase * 0.2f) * 1f; + + for (BackgroundStar star : stars) { + star.x = star.baseX + driftX * star.depth; + star.y = star.baseY + driftY * star.depth; + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + drawSpaceGradient(graphics, x, y, w, h); + drawGrid(graphics, x, y, w, h); + drawStars(graphics, x, y, w, h); + } + + private void drawSpaceGradient(GuiGraphics graphics, int x, int y, int w, int h) { + int topColor = 0xFF060812; + int bottomColor = 0xFF020408; + + for (int row = 0; row < h; row++) { + float progress = (float) row / h; + int color = lerpColor(topColor, bottomColor, progress); + graphics.fill(x, y + row, x + w, y + row + 1, color); + } + } + + private void drawGrid(GuiGraphics graphics, int x, int y, int w, int h) { + for (GridLine line : gridLines) { + float pulse = Mth.sin(gridPulse + line.pulseOffset) * 0.3f + 0.7f; + int alpha = (int) (0x15 * pulse); + int color = (alpha << 24) | 0x4080FF; + + if (line.horizontal) { + int ly = y + (int) line.pos; + if (ly >= y && ly < y + h) { + graphics.fill(x, ly, x + w, ly + 1, color); + } + } else { + int lx = x + (int) line.pos; + if (lx >= x && lx < x + w) { + graphics.fill(lx, y, lx + 1, y + h, color); + } + } + } + } + + private void drawStars(GuiGraphics graphics, int x, int y, int w, int h) { + for (BackgroundStar star : stars) { + float twinkle = Mth.sin(driftPhase * star.twinkleSpeed * 60f + star.twinkleOffset); + float brightness = 0.5f + 0.5f * twinkle; + int alpha = (int) (0xCC * brightness); + + int starX = x + (int) star.x; + int starY = y + (int) star.y; + + if (starX < x || starX >= x + w || starY < y || starY >= y + h) continue; + + int color = (alpha << 24) | (star.color & 0x00FFFFFF); + + if (star.size > 1.0f) { + graphics.fill(starX - 1, starY, starX + 2, starY + 1, color); + graphics.fill(starX, starY - 1, starX + 1, starY + 2, color); + } else { + graphics.fill(starX, starY, starX + 1, starY + 1, color); + } + } + } + + private int lerpColor(int c1, int c2, float t) { + int a1 = (c1 >> 24) & 0xFF, a2 = (c2 >> 24) & 0xFF; + int r1 = (c1 >> 16) & 0xFF, r2 = (c2 >> 16) & 0xFF; + int g1 = (c1 >> 8) & 0xFF, g2 = (c2 >> 8) & 0xFF; + int b1 = c1 & 0xFF, b2 = c2 & 0xFF; + + int a = (int) Mth.lerp(t, a1, a2); + int r = (int) Mth.lerp(t, r1, r2); + int g = (int) Mth.lerp(t, g1, g2); + int b = (int) Mth.lerp(t, b1, b2); + + return (a << 24) | (r << 16) | (g << 8) | b; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/StarLadderFancyUIWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/StarLadderFancyUIWidget.java new file mode 100644 index 000000000..a43c7c9a0 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/StarLadderFancyUIWidget.java @@ -0,0 +1,212 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.starladder; + +import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; +import com.gregtechceu.gtceu.api.gui.fancy.IFancyUIProvider; + +import com.lowdragmc.lowdraglib.gui.texture.ColorBorderTexture; +import com.lowdragmc.lowdraglib.gui.texture.ColorRectTexture; +import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; +import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.SlotWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.IntSupplier; + +import javax.annotation.Nonnull; + +public class StarLadderFancyUIWidget extends FancyMachineUIWidget { + + private final IntSupplier tierSupplier; + + private static final int BG_COLOR = 0xE0080812; + private static final int BORDER_COLOR = 0xFF304060; + private static final int SLOT_BG_COLOR = 0xC0101018; + private static final int SLOT_BORDER_COLOR = 0xFF405070; + + private static final int[] TIER_COLORS = { + 0xFF4080C0, // T0 - Blue + 0xFF40C080, // T1 - Green + 0xFFC0A040, // T2 - Gold + 0xFFC040C0 // T3 - Purple + }; + + public StarLadderFancyUIWidget(IFancyUIProvider mainPage, int width, int height, IntSupplier tierSupplier) { + super(mainPage, width, height); + this.tierSupplier = tierSupplier; + setBackground((IGuiTexture) null); + applyDarkTheme(); + } + + private void applyDarkTheme() { + IGuiTexture titleBarBg = new GuiTextureGroup( + new ColorRectTexture(BG_COLOR), + new ColorBorderTexture(1, BORDER_COLOR)); + + if (titleBar != null) { + titleBar.setBackground((IGuiTexture) null); + for (Widget widget : titleBar.widgets) { + if (widget instanceof WidgetGroup group) { + group.setBackground(titleBarBg); + } + } + } + + if (sideTabsWidget != null) { + sideTabsWidget.setBackground((IGuiTexture) null); + updateTabStyling(); + } + + if (configuratorPanel != null) { + configuratorPanel.setVisible(false); + configuratorPanel.setActive(false); + } + + applySlotStyling(); + } + + private void applySlotStyling() { + if (playerInventory != null) { + playerInventory.setBackground((IGuiTexture) null); + IGuiTexture darkSlot = new GuiTextureGroup( + new ColorRectTexture(SLOT_BG_COLOR), + new ColorBorderTexture(1, SLOT_BORDER_COLOR)); + for (Widget widget : playerInventory.widgets) { + if (widget instanceof SlotWidget slotWidget) { + slotWidget.setBackground(darkSlot); + } + } + } + } + + private void updateTabStyling() { + if (sideTabsWidget == null) return; + + int tier = tierSupplier != null ? tierSupplier.getAsInt() : 0; + int accentColor = getTierColor(tier); + int accentColorDim = dimColor(accentColor, 0.6f); + + IGuiTexture tabNormal = new GuiTextureGroup( + new ColorRectTexture(0xA0080812), + new ColorBorderTexture(1, accentColorDim)); + IGuiTexture tabHover = new GuiTextureGroup( + new ColorRectTexture(0xC0101828), + new ColorBorderTexture(1, accentColor)); + IGuiTexture tabPressed = new GuiTextureGroup( + new ColorRectTexture(0xE0081020), + new ColorBorderTexture(1, accentColor)); + + sideTabsWidget.setTabTexture(tabNormal); + sideTabsWidget.setTabHoverTexture(tabHover); + sideTabsWidget.setTabPressedTexture(tabPressed); + } + + private int getTierColor(int tier) { + if (tier < 0) return TIER_COLORS[0]; + if (tier >= TIER_COLORS.length) return TIER_COLORS[TIER_COLORS.length - 1]; + return TIER_COLORS[tier]; + } + + private int dimColor(int color, float factor) { + int a = (color >> 24) & 0xFF; + int r = (int) (((color >> 16) & 0xFF) * factor); + int g = (int) (((color >> 8) & 0xFF) * factor); + int b = (int) ((color & 0xFF) * factor); + return (a << 24) | (r << 16) | (g << 8) | b; + } + + @Override + public void initWidget() { + super.initWidget(); + applySlotStyling(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + updateTabStyling(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + drawFullBackground(graphics); + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + drawTitleText(graphics); + } + + private void drawFullBackground(GuiGraphics graphics) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + int tier = tierSupplier != null ? tierSupplier.getAsInt() : 0; + int tierColor = getTierColor(tier); + + DrawerHelper.drawGradientRect(graphics, x, y, w, h, 0xFF080c14, 0xFF040608, false); + drawGridPattern(graphics, x, y, w, h); + drawCornerAccents(graphics, x, y, w, h, (tierColor & 0x00FFFFFF) | 0x40000000); + DrawerHelper.drawBorder(graphics, x, y, w, h, (tierColor & 0x00FFFFFF) | 0x30000000, 1); + + if (playerInventory != null && playerInventory.isVisible()) { + int invY = playerInventory.getPosition().y; + int accentColor = (tierColor & 0x00FFFFFF) | 0x60000000; + graphics.fill(x + 10, invY - 2, x + w - 10, invY - 1, accentColor); + } + } + + private void drawGridPattern(GuiGraphics graphics, int x, int y, int w, int h) { + int gridColor = 0x0A4080FF; + int spacing = 20; + for (int gx = x + spacing; gx < x + w; gx += spacing) { + graphics.fill(gx, y, gx + 1, y + h, gridColor); + } + for (int gy = y + spacing; gy < y + h; gy += spacing) { + graphics.fill(x, gy, x + w, gy + 1, gridColor); + } + } + + private void drawCornerAccents(GuiGraphics graphics, int x, int y, int w, int h, int color) { + int len = 16; + int thickness = 2; + graphics.fill(x, y, x + len, y + thickness, color); + graphics.fill(x, y, x + thickness, y + len, color); + graphics.fill(x + w - len, y, x + w, y + thickness, color); + graphics.fill(x + w - thickness, y, x + w, y + len, color); + graphics.fill(x, y + h - thickness, x + len, y + h, color); + graphics.fill(x, y + h - len, x + thickness, y + h, color); + graphics.fill(x + w - len, y + h - thickness, x + w, y + h, color); + graphics.fill(x + w - thickness, y + h - len, x + w, y + h, color); + } + + private void drawTitleText(GuiGraphics graphics) { + if (titleBar == null || mainPage == null) return; + + var font = Minecraft.getInstance().font; + String title = mainPage.getTitle().getString(); + + int titleBarX = getPosition().x + 8; + int titleBarY = getPosition().y - 16; + int textAreaX = titleBarX + 18 + 16; + int textAreaY = titleBarY + 3; + int textAreaWidth = getSize().width - 16 - 18 - 18 - 16; + int textAreaHeight = 13; + + graphics.fill(textAreaX, textAreaY, textAreaX + textAreaWidth, textAreaY + textAreaHeight, BG_COLOR); + + int textWidth = font.width(title); + int centeredX = textAreaX + (textAreaWidth - textWidth) / 2; + int centeredY = textAreaY + (textAreaHeight - font.lineHeight) / 2; + + int tier = tierSupplier != null ? tierSupplier.getAsInt() : 0; + int titleColor = getTierColor(tier); + graphics.drawString(font, title, centeredX, centeredY, titleColor, true); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/StarLadderResearchHubWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/StarLadderResearchHubWidget.java new file mode 100644 index 000000000..1839f6877 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/StarLadderResearchHubWidget.java @@ -0,0 +1,291 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.starladder; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.StarLadderResearchHubMachine; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.core.GlobalPos; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.minecraft.core.registries.BuiltInRegistries; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StarLadderResearchHubWidget extends WidgetGroup { + + public static final int WIDTH = 280; + public static final int HEIGHT = 180; + + private final Supplier machineSupplier; + + private int ringTier = 0; + private boolean isLinked = false; + private boolean partnerOnline = false; + private String partnerDimension = ""; + private String partnerCoords = ""; + private boolean previewEnabled = false; + private boolean canUpgrade = false; + private Map nextTierRequirements = new HashMap<>(); + + private float animPhase = 0f; + + public StarLadderResearchHubWidget(Supplier machineSupplier) { + super(0, 0, WIDTH, HEIGHT); + this.machineSupplier = machineSupplier; + initWidgets(); + } + + private void initWidgets() { + addWidget(new StarLadderBackgroundWidget(0, 0, WIDTH, HEIGHT)); + + // Left side: Telemetry panel (fake sci-fi data) + int telemetryX = 5; + int telemetryY = 5; + int telemetryW = 120; + int telemetryH = 100; + + addWidget(new TelemetryPanelWidget(telemetryX, telemetryY, telemetryW, telemetryH, () -> ringTier)); + + // Right side top: Link status + int linkStatusX = telemetryW + 10; + int linkStatusY = 5; + int linkStatusW = WIDTH - linkStatusX - 5; + int linkStatusH = 55; + + addWidget(new LinkStatusWidget( + linkStatusX, linkStatusY, linkStatusW, linkStatusH, + () -> isLinked, + () -> partnerOnline, + () -> "Star Ladder", + () -> partnerDimension + " " + partnerCoords, + () -> ringTier)); + + // Right side bottom: Next tier requirements (scrollable) + int reqsX = telemetryW + 10; + int reqsY = linkStatusY + linkStatusH + 5; + int reqsW = WIDTH - reqsX - 5; + int reqsH = HEIGHT - reqsY - 18; // Leave room for title at bottom + + addWidget(new NextTierRequirementsWidget( + reqsX, reqsY, reqsW, reqsH, + () -> ringTier, + () -> canUpgrade, + () -> nextTierRequirements)); + } + + @Override + public void writeInitialData(RegistryFriendlyByteBuf buffer) { + super.writeInitialData(buffer); + syncAllData(buffer); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readInitialData(RegistryFriendlyByteBuf buffer) { + super.readInitialData(buffer); + readAllData(buffer); + } + + private void syncAllData(RegistryFriendlyByteBuf buffer) { + StarLadderResearchHubMachine machine = machineSupplier.get(); + if (machine == null) { + buffer.writeInt(0); + buffer.writeBoolean(false); + buffer.writeBoolean(false); + buffer.writeBoolean(false); + buffer.writeInt(0); // No requirements + return; + } + + buffer.writeInt(machine.getRingTier()); + buffer.writeBoolean(machine.isRingPreviewEnabled()); + buffer.writeBoolean(machine.canUpgrade()); + + GlobalPos ladder = machine.getLinkedPartners().stream().findFirst().orElse(null); + boolean linked = ladder != null; + buffer.writeBoolean(linked); + + if (linked) { + var partner = machine.getLinkedPartnerMachine(ladder); + boolean online = partner != null; + buffer.writeBoolean(online); + buffer.writeUtf(LinkedMultiblockHelper.getDimensionName(ladder.dimension().location())); + buffer.writeUtf("[%d, %d, %d]".formatted(ladder.pos().getX(), ladder.pos().getY(), ladder.pos().getZ())); + } + + // Sync next tier requirements + Map reqs = machine.getNextRingBlockCounts(); + buffer.writeInt(reqs.size()); + for (Map.Entry entry : reqs.entrySet()) { + buffer.writeResourceLocation(BuiltInRegistries.BLOCK.getKey(entry.getKey())); + buffer.writeInt(entry.getValue()); + } + } + + private void readAllData(RegistryFriendlyByteBuf buffer) { + ringTier = buffer.readInt(); + previewEnabled = buffer.readBoolean(); + canUpgrade = buffer.readBoolean(); + isLinked = buffer.readBoolean(); + + if (isLinked) { + partnerOnline = buffer.readBoolean(); + partnerDimension = buffer.readUtf(); + partnerCoords = buffer.readUtf(); + } else { + partnerOnline = false; + partnerDimension = ""; + partnerCoords = ""; + } + + // Read next tier requirements + nextTierRequirements.clear(); + int reqCount = buffer.readInt(); + for (int i = 0; i < reqCount; i++) { + net.minecraft.world.level.block.Block block = BuiltInRegistries.BLOCK.get(buffer.readResourceLocation()); + int count = buffer.readInt(); + if (block != null) { + nextTierRequirements.put(block, count); + } + } + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + StarLadderResearchHubMachine machine = machineSupplier.get(); + if (machine == null) return; + + boolean needsUpdate = false; + + if (machine.getRingTier() != ringTier) needsUpdate = true; + if (machine.isRingPreviewEnabled() != previewEnabled) needsUpdate = true; + if (machine.canUpgrade() != canUpgrade) needsUpdate = true; + + GlobalPos ladder = machine.getLinkedPartners().stream().findFirst().orElse(null); + boolean newLinked = ladder != null; + if (newLinked != isLinked) needsUpdate = true; + + if (newLinked && !needsUpdate) { + var partner = machine.getLinkedPartnerMachine(ladder); + if ((partner != null) != partnerOnline) needsUpdate = true; + } + + if (needsUpdate) { + ringTier = machine.getRingTier(); + previewEnabled = machine.isRingPreviewEnabled(); + canUpgrade = machine.canUpgrade(); + isLinked = newLinked; + + writeUpdateInfo(501, buf -> syncAllData(buf)); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, RegistryFriendlyByteBuf buffer) { + if (id == 501) { + readAllData(buffer); + } else { + super.readUpdateInfo(id, buffer); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + animPhase += 0.05f; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + int tierColor = getTierColor(ringTier); + int borderColor = adjustAlpha(tierColor, 0.5f); + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + if (ringTier > 0) { + int glowColor = adjustAlpha(tierColor, 0.1f); + DrawerHelper.drawGradientRect(graphics, x + 1, y + 1, w - 2, 15, glowColor, 0x00000000, false); + } + + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + drawTitle(graphics, x, y, w, h); + drawTierIndicator(graphics, x, y, w, h); + drawPreviewIndicator(graphics, x, y, w, h); + } + + private void drawTitle(GuiGraphics graphics, int x, int y, int w, int h) { + var font = Minecraft.getInstance().font; + String title = "RESEARCH HUB"; + int titleX = x + (w - font.width(title)) / 2; + int titleY = y + h - font.lineHeight - 4; + int titleColor = getTierColor(ringTier); + graphics.drawString(font, title, titleX, titleY, titleColor, false); + } + + private void drawTierIndicator(GuiGraphics graphics, int x, int y, int w, int h) { + // Draw current tier in bottom left of telemetry panel area + var font = Minecraft.getInstance().font; + int tierColor = getTierColor(ringTier); + + String tierText = "T" + ringTier; + float pulse = Mth.sin(animPhase * 2f) * 0.1f + 0.9f; + int alpha = (int) (0xFF * pulse); + int color = (alpha << 24) | (tierColor & 0x00FFFFFF); + + graphics.drawString(font, tierText, x + 8, y + 108, color, false); + } + + private void drawPreviewIndicator(GuiGraphics graphics, int x, int y, int w, int h) { + if (!previewEnabled) return; + + var font = Minecraft.getInstance().font; + + float pulse = Mth.sin(animPhase * 3f) * 0.3f + 0.7f; + int alpha = (int) (0xFF * pulse); + int color = (alpha << 24) | 0x40FF80; + + String text = "PREVIEW ACTIVE"; + int textX = x + 5; + int textY = y + 120; + + graphics.drawString(font, text, textX, textY, color, false); + + graphics.fill(textX + font.width(text) + 4, textY + 2, + textX + font.width(text) + 8, textY + 6, color); + } + + private int getTierColor(int tier) { + return switch (tier) { + case 0 -> 0xFF4080C0; + case 1 -> 0xFF40C080; + case 2 -> 0xFFC0A040; + case 3 -> 0xFFC040C0; + default -> 0xFF606080; + }; + } + + private int adjustAlpha(int color, float factor) { + int a = (int) (((color >> 24) & 0xFF) * factor); + return (a << 24) | (color & 0x00FFFFFF); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/StarLadderWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/StarLadderWidget.java new file mode 100644 index 000000000..616dce76b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/StarLadderWidget.java @@ -0,0 +1,518 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.starladder; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.StarLadderMachine; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.StarLadderUplinkState; +import com.ghostipedia.cosmiccore.common.network.packet.StarLadderUplinkPackets; +import com.ghostipedia.cosmiccore.common.network.packet.StarLadderUplinkPackets.StarLadderUplinkClientState; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.core.GlobalPos; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StarLadderWidget extends WidgetGroup { + + public static final int WIDTH = 220; + public static final int HEIGHT = 140; + + private static final int BUTTON_W = 140; + private static final int BUTTON_H = 20; + private static final int CONFIRM_BUTTON_W = 120; + private static final int CONFIRM_BUTTON_H = 24; + private static final int ABORT_BUTTON_W = 50; + private static final int ABORT_BUTTON_H = 14; + private static final int WARNING_COLOR = 0xFFFF4444; + private static final int HOLD_TICKS_REQUIRED = 30; + + private final Supplier machineSupplier; + + private boolean isLinked = false; + private boolean partnerOnline = false; + private String partnerName = ""; + private String partnerDimension = ""; + private String partnerCoords = ""; + private int partnerTier = 0; + + private StarLadderUplinkState uplinkState = StarLadderUplinkState.IDLE; + private float animPhase = 0f; + + private boolean isHoldingInitiate = false; + private boolean isHoldingConfirm = false; + private int holdTicks = 0; + + private LinkStatusWidget linkStatusWidget; + private UplinkOverlayWidget uplinkOverlay; + + public StarLadderWidget(Supplier machineSupplier) { + super(0, 0, WIDTH, HEIGHT); + this.machineSupplier = machineSupplier; + initWidgets(); + } + + private void initWidgets() { + addWidget(new StarLadderBackgroundWidget(0, 0, WIDTH, HEIGHT)); + + linkStatusWidget = new LinkStatusWidget( + 5, 5, WIDTH - 10, 50, + () -> isLinked, + () -> partnerOnline, + () -> partnerName, + () -> partnerDimension + " " + partnerCoords, + () -> partnerTier >= 0 ? partnerTier : 0); + addWidget(linkStatusWidget); + + uplinkOverlay = new UplinkOverlayWidget(0, 0, WIDTH, HEIGHT); + addWidget(uplinkOverlay); + } + + // ---- Data Sync ---- + + @Override + public void writeInitialData(RegistryFriendlyByteBuf buffer) { + super.writeInitialData(buffer); + syncPartnerData(buffer); + syncUplinkState(buffer); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readInitialData(RegistryFriendlyByteBuf buffer) { + super.readInitialData(buffer); + readPartnerData(buffer); + readUplinkState(buffer); + } + + private void syncPartnerData(RegistryFriendlyByteBuf buffer) { + StarLadderMachine machine = machineSupplier.get(); + if (machine == null) { + buffer.writeBoolean(false); + return; + } + + GlobalPos hub = machine.getLinkedPartners().stream().findFirst().orElse(null); + boolean linked = hub != null; + buffer.writeBoolean(linked); + + if (linked) { + var partner = machine.getLinkedPartnerMachine(hub); + boolean online = partner != null; + buffer.writeBoolean(online); + + buffer.writeUtf(LinkedMultiblockHelper.getDimensionName(hub.dimension().location())); + buffer.writeUtf("[%d, %d, %d]".formatted(hub.pos().getX(), hub.pos().getY(), hub.pos().getZ())); + + if (online && + partner instanceof com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.StarLadderResearchHubMachine researchHub) { + buffer.writeInt(researchHub.getRingTier()); + } else { + buffer.writeInt(-1); + } + } + } + + private void syncUplinkState(RegistryFriendlyByteBuf buffer) { + StarLadderMachine machine = machineSupplier.get(); + if (machine == null) { + buffer.writeEnum(StarLadderUplinkState.IDLE); + return; + } + buffer.writeEnum(machine.getUplinkManager().getState()); + } + + private void readPartnerData(RegistryFriendlyByteBuf buffer) { + isLinked = buffer.readBoolean(); + + if (isLinked) { + partnerOnline = buffer.readBoolean(); + partnerDimension = buffer.readUtf(); + partnerCoords = buffer.readUtf(); + partnerTier = buffer.readInt(); + partnerName = Component.translatable("cosmiccore.star_ladder.hub_name").getString(); + } else { + partnerOnline = false; + partnerName = ""; + partnerDimension = ""; + partnerCoords = ""; + partnerTier = -1; + } + } + + private void readUplinkState(RegistryFriendlyByteBuf buffer) { + uplinkState = buffer.readEnum(StarLadderUplinkState.class); + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + StarLadderMachine machine = machineSupplier.get(); + if (machine == null) return; + + GlobalPos hub = machine.getLinkedPartners().stream().findFirst().orElse(null); + boolean newLinked = hub != null; + + if (newLinked != isLinked) { + writeUpdateInfo(401, this::syncPartnerData); + } else if (newLinked) { + var partner = machine.getLinkedPartnerMachine(hub); + boolean newOnline = partner != null; + + if (newOnline != partnerOnline) { + writeUpdateInfo(401, this::syncPartnerData); + } else if (newOnline && + partner instanceof com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.StarLadderResearchHubMachine researchHub) { + if (researchHub.getRingTier() != partnerTier) { + writeUpdateInfo(401, this::syncPartnerData); + } + } + } + + StarLadderUplinkState newUplinkState = machine.getUplinkManager().getState(); + if (newUplinkState != uplinkState) { + uplinkState = newUplinkState; + writeUpdateInfo(402, buf -> buf.writeEnum(newUplinkState)); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, RegistryFriendlyByteBuf buffer) { + if (id == 401) { + readPartnerData(buffer); + } else if (id == 402) { + uplinkState = buffer.readEnum(StarLadderUplinkState.class); + } else { + super.readUpdateInfo(id, buffer); + } + } + + // ---- Update & Draw ---- + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + animPhase += 0.05f; + + StarLadderUplinkState clientState = StarLadderUplinkClientState.getState(); + if (clientState != StarLadderUplinkState.IDLE) { + uplinkState = clientState; + } + + boolean showLink = uplinkState == StarLadderUplinkState.IDLE || uplinkState == StarLadderUplinkState.COMPLETED; + linkStatusWidget.setVisible(showLink); + linkStatusWidget.setActive(showLink); + + if (isHoldingInitiate || isHoldingConfirm) { + holdTicks++; + if (holdTicks >= HOLD_TICKS_REQUIRED) { + StarLadderMachine machine = machineSupplier.get(); + if (machine != null) { + if (isHoldingInitiate) { + StarLadderUplinkPackets.sendInitiate(machine.getBlockPos()); + playUISound(SoundEvents.UI_BUTTON_CLICK.value(), 0.7f, 0.6f); + } else { + StarLadderUplinkPackets.sendConfirm(machine.getBlockPos()); + playUISound(SoundEvents.BEACON_ACTIVATE, 0.5f, 1.5f); + } + } + isHoldingInitiate = false; + isHoldingConfirm = false; + holdTicks = 0; + } + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + int borderColor = isLinked && partnerOnline ? 0x804080C0 : 0x80404060; + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + switch (uplinkState) { + case IDLE -> { + drawTitle(graphics, x, y, w); + drawPartnerTierDisplay(graphics, x, y, w, h); + if (isLinked && partnerOnline) { + drawInitiateButton(graphics, x, y, w, h, mouseX, mouseY); + } + } + case AWAITING_CONFIRMATION -> drawConfirmationScreen(graphics, x, y, w, h, mouseX, mouseY); + case COMPLETED -> { + drawTitle(graphics, x, y, w); + drawCompletedDisplay(graphics, x, y, w, h); + } + default -> { + drawTitle(graphics, x, y, w); + if (uplinkState.isFightState()) { + drawAbortButton(graphics, x, y, w, h, mouseX, mouseY); + } + } + } + } + + // ---- Click Handling ---- + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button != 0) return super.mouseClicked(mouseX, mouseY, button); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + if (uplinkState == StarLadderUplinkState.IDLE && isLinked && partnerOnline) { + int btnX = x + (w - BUTTON_W) / 2; + int btnY = y + h - BUTTON_H - 20; + if (isInRect(mouseX, mouseY, btnX, btnY, BUTTON_W, BUTTON_H)) { + isHoldingInitiate = true; + holdTicks = 0; + playUISound(SoundEvents.STONE_PRESSURE_PLATE_CLICK_ON, 0.5f, 0.8f); + return true; + } + } + + if (uplinkState == StarLadderUplinkState.AWAITING_CONFIRMATION) { + int btnX = x + (w - CONFIRM_BUTTON_W) / 2; + int btnY = y + h - CONFIRM_BUTTON_H - 15; + if (isInRect(mouseX, mouseY, btnX, btnY, CONFIRM_BUTTON_W, CONFIRM_BUTTON_H)) { + isHoldingConfirm = true; + holdTicks = 0; + playUISound(SoundEvents.STONE_PRESSURE_PLATE_CLICK_ON, 0.5f, 0.6f); + return true; + } + } + + if (uplinkState.isFightState()) { + int abortX = x + w - ABORT_BUTTON_W - 5; + int abortY = y + h - ABORT_BUTTON_H - 4; + if (isInRect(mouseX, mouseY, abortX, abortY, ABORT_BUTTON_W, ABORT_BUTTON_H)) { + StarLadderMachine machine = machineSupplier.get(); + if (machine != null) { + StarLadderUplinkPackets.sendAbort(machine.getBlockPos()); + StarLadderUplinkClientState.reset(); + uplinkState = StarLadderUplinkState.IDLE; + playUISound(SoundEvents.BEACON_DEACTIVATE, 0.5f, 1.2f); + return true; + } + } + } + + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (button == 0 && (isHoldingInitiate || isHoldingConfirm)) { + isHoldingInitiate = false; + isHoldingConfirm = false; + holdTicks = 0; + playUISound(SoundEvents.STONE_PRESSURE_PLATE_CLICK_OFF, 0.4f, 0.6f); + return true; + } + return super.mouseReleased(mouseX, mouseY, button); + } + + private boolean isInRect(double mx, double my, int x, int y, int w, int h) { + return mx >= x && mx <= x + w && my >= y && my <= y + h; + } + + // ---- Drawing ---- + + private void drawTitle(GuiGraphics graphics, int x, int y, int w) { + var font = Minecraft.getInstance().font; + String title = Component.translatable("cosmiccore.star_ladder.title").getString(); + int titleX = x + (w - font.width(title)) / 2; + int titleY = y + HEIGHT - font.lineHeight - 4; + graphics.drawString(font, title, titleX, titleY, 0xFF6080B0, false); + } + + private void drawPartnerTierDisplay(GuiGraphics graphics, int x, int y, int w, int h) { + if (!isLinked || partnerTier < 0) return; + + var font = Minecraft.getInstance().font; + int panelY = y + 60; + int panelH = 34; + + DrawerHelper.drawSolidRect(graphics, x + 5, panelY, w - 10, panelH, 0x40102030); + + String tierText = Component.translatable("cosmiccore.star_ladder.hub_tier", partnerTier).getString(); + int tierColor = getTierColor(partnerTier); + graphics.drawString(font, tierText, x + 10, panelY + 6, tierColor, false); + + int barY = panelY + 18; + int barW = w - 20; + int barH = 10; + + DrawerHelper.drawSolidRect(graphics, x + 10, barY, barW, barH, 0xFF202030); + + float fillProgress = (partnerTier + 1) / 4f; + int fillW = (int) (barW * fillProgress); + if (fillW > 0) { + DrawerHelper.drawGradientRect(graphics, x + 10, barY, fillW, barH, + darkenColor(tierColor, 0.6f), tierColor, true); + } + + for (int i = 1; i <= 3; i++) { + int markerX = x + 10 + (barW * i) / 4; + graphics.fill(markerX, barY, markerX + 1, barY + barH, 0x80000000); + } + } + + private void drawInitiateButton(GuiGraphics graphics, int x, int y, int w, int h, int mouseX, int mouseY) { + var font = Minecraft.getInstance().font; + + int btnX = x + (w - BUTTON_W) / 2; + int btnY = y + h - BUTTON_H - 20; + boolean hovered = isInRect(mouseX, mouseY, btnX, btnY, BUTTON_W, BUTTON_H); + + float pulse = Mth.sin(animPhase * 2f) * 0.15f + 0.85f; + int bgAlpha = hovered ? 0x80 : (int) (0x50 * pulse); + DrawerHelper.drawSolidRect(graphics, btnX, btnY, BUTTON_W, BUTTON_H, (bgAlpha << 24) | 0x402040); + + int borderColor = hovered ? 0xC08040C0 : 0x806040A0; + DrawerHelper.drawBorder(graphics, btnX, btnY, BUTTON_W, BUTTON_H, borderColor, 1); + + String text = Component.translatable("cosmiccore.star_ladder.initiate").getString(); + int textColor = hovered ? 0xFFDDCCFF : 0xFFA080C0; + int textX = btnX + (BUTTON_W - font.width(text)) / 2; + int textY = btnY + (BUTTON_H - font.lineHeight) / 2; + graphics.drawString(font, text, textX, textY, textColor, false); + + if (isHoldingInitiate) { + drawHoldBar(graphics, btnX, btnY, BUTTON_W, BUTTON_H, 0xFFA060D0); + } + } + + private void drawConfirmationScreen(GuiGraphics graphics, int x, int y, int w, int h, int mouseX, int mouseY) { + var font = Minecraft.getInstance().font; + + DrawerHelper.drawSolidRect(graphics, x + 5, y + 5, w - 10, h - 10, 0xC0080810); + + String title = Component.translatable("cosmiccore.star_ladder.interrupted").getString(); + float titlePulse = Mth.sin(animPhase * 3f) * 0.3f + 0.7f; + int titleAlpha = (int) (255 * titlePulse); + graphics.drawString(font, title, x + (w - font.width(title)) / 2, y + 15, + (titleAlpha << 24) | 0xFF4444, false); + + int lineColor = 0xFFA0A0B0; + graphics.drawString(font, Component.translatable("cosmiccore.star_ladder.resisting").getString(), + x + 15, y + 35, lineColor, false); + graphics.drawString(font, Component.translatable("cosmiccore.star_ladder.demands_soul").getString(), + x + 15, y + 50, lineColor, false); + graphics.drawString(font, Component.translatable("cosmiccore.star_ladder.drain_rate", 5000).getString(), + x + 15, y + 65, WARNING_COLOR, false); + + int btnX = x + (w - CONFIRM_BUTTON_W) / 2; + int btnY = y + h - CONFIRM_BUTTON_H - 15; + boolean hovered = isInRect(mouseX, mouseY, btnX, btnY, CONFIRM_BUTTON_W, CONFIRM_BUTTON_H); + + float btnPulse = Mth.sin(animPhase * 4f) * 0.2f + 0.8f; + int btnBgAlpha = hovered ? 0xA0 : (int) (0x60 * btnPulse); + DrawerHelper.drawSolidRect(graphics, btnX, btnY, CONFIRM_BUTTON_W, CONFIRM_BUTTON_H, + (btnBgAlpha << 24) | 0x801020); + + DrawerHelper.drawBorder(graphics, btnX, btnY, CONFIRM_BUTTON_W, CONFIRM_BUTTON_H, + hovered ? 0xFFCC4444 : 0xC0993333, 1); + + String confirmText = Component.translatable("cosmiccore.star_ladder.confirm").getString(); + graphics.drawString(font, confirmText, + btnX + (CONFIRM_BUTTON_W - font.width(confirmText)) / 2, + btnY + (CONFIRM_BUTTON_H - font.lineHeight) / 2, + hovered ? 0xFFFFAAAA : 0xFFCC6666, false); + + if (isHoldingConfirm) { + drawHoldBar(graphics, btnX, btnY, CONFIRM_BUTTON_W, CONFIRM_BUTTON_H, 0xFFCC4444); + } + } + + private void drawCompletedDisplay(GuiGraphics graphics, int x, int y, int w, int h) { + var font = Minecraft.getInstance().font; + + String text = Component.translatable("cosmiccore.star_ladder.established").getString(); + float pulse = Mth.sin(animPhase) * 0.2f + 0.8f; + int alpha = (int) (255 * pulse); + graphics.drawString(font, text, x + (w - font.width(text)) / 2, + y + h / 2 - font.lineHeight / 2, (alpha << 24) | 0x40CC40, false); + } + + private void drawAbortButton(GuiGraphics graphics, int x, int y, int w, int h, int mouseX, int mouseY) { + var font = Minecraft.getInstance().font; + + int btnX = x + w - ABORT_BUTTON_W - 5; + int btnY = y + h - ABORT_BUTTON_H - 4; + boolean hovered = isInRect(mouseX, mouseY, btnX, btnY, ABORT_BUTTON_W, ABORT_BUTTON_H); + + int bg = hovered ? 0x80401010 : 0x40301010; + DrawerHelper.drawSolidRect(graphics, btnX, btnY, ABORT_BUTTON_W, ABORT_BUTTON_H, bg); + DrawerHelper.drawBorder(graphics, btnX, btnY, ABORT_BUTTON_W, ABORT_BUTTON_H, + hovered ? 0xC0CC4444 : 0x60993333, 1); + + String text = Component.translatable("cosmiccore.star_ladder.abort").getString(); + int textColor = hovered ? 0xFFFF6666 : 0xFF884444; + graphics.drawString(font, text, + btnX + (ABORT_BUTTON_W - font.width(text)) / 2, + btnY + (ABORT_BUTTON_H - font.lineHeight) / 2, + textColor, false); + } + + // ---- Utility ---- + + private void drawHoldBar(GuiGraphics graphics, int btnX, int btnY, int btnW, int btnH, int color) { + float progress = (float) holdTicks / HOLD_TICKS_REQUIRED; + int barH = 2; + int barY = btnY + btnH - barH; + int fillW = (int) (btnW * progress); + if (fillW > 0) { + DrawerHelper.drawSolidRect(graphics, btnX, barY, fillW, barH, color); + } + } + + @OnlyIn(Dist.CLIENT) + private void playUISound(net.minecraft.sounds.SoundEvent sound, float volume, float pitch) { + Minecraft.getInstance().getSoundManager() + .play(SimpleSoundInstance.forUI(sound, pitch, volume)); + } + + private int getTierColor(int tier) { + return switch (tier) { + case 0 -> 0xFF4080C0; + case 1 -> 0xFF40C080; + case 2 -> 0xFFC0A040; + case 3 -> 0xFFC040C0; + default -> 0xFF606080; + }; + } + + private int darkenColor(int color, float factor) { + int a = (color >> 24) & 0xFF; + int r = (int) (((color >> 16) & 0xFF) * factor); + int g = (int) (((color >> 8) & 0xFF) * factor); + int b = (int) ((color & 0xFF) * factor); + return (a << 24) | (r << 16) | (g << 8) | b; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/TelemetryPanelWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/TelemetryPanelWidget.java new file mode 100644 index 000000000..b23285e3e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/TelemetryPanelWidget.java @@ -0,0 +1,220 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.starladder; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.Random; +import java.util.function.IntSupplier; + +import javax.annotation.Nonnull; + +/** + * Fake telemetry panel that displays random sci-fi research data. + * Purely aesthetic - vomits technobabble for immersion. + */ +public class TelemetryPanelWidget extends Widget { + + private static final int[] TIER_COLORS = { + 0xFF4080C0, // T0 - Blue + 0xFF40C080, // T1 - Green + 0xFFC0A040, // T2 - Gold + 0xFFC040C0 // T3 - Purple + }; + + // Each metric paired with an appropriate unit + private static final String[][] METRICS = { + { "SOUL OUTPUT", "kSU" }, // kilo-Soul Units + { "SOLAR RADS", "Sv/h" }, // Sieverts per hour (radiation) + { "CABLE STR", "%" }, // percentage strength + { "DATA RATE", "Gb/s" }, // Gigabits per second + { "PACKET LOSS", "%" }, // percentage + { "ERROR MARGIN", "ppm" }, // parts per million + { "WEAR", "%" } // percentage wear + }; + + private static final String[] STATUS_LABELS = { + "NOMINAL", "STABLE", "ACTIVE", "SYNCED", "OPTIMAL" + }; + + private final IntSupplier tierSupplier; + private final Random random = new Random(); + + private float animPhase = 0f; + private float scanLineY = 0f; + + // Cached "readings" that update periodically + private int[] currentMetricIndices = new int[4]; + private float[] metricValues = new float[4]; + private float[] targetValues = new float[4]; + private int tickCounter = 0; + + public TelemetryPanelWidget(int x, int y, int width, int height, IntSupplier tierSupplier) { + super(x, y, width, height); + this.tierSupplier = tierSupplier; + initializeMetrics(); + } + + private void initializeMetrics() { + for (int i = 0; i < 4; i++) { + currentMetricIndices[i] = random.nextInt(METRICS.length); + metricValues[i] = random.nextFloat() * 100f; + targetValues[i] = random.nextFloat() * 100f; + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + animPhase += 0.08f; + scanLineY += 0.5f; + if (scanLineY > getSize().height) { + scanLineY = 0f; + } + + tickCounter++; + + // Smoothly interpolate values + for (int i = 0; i < 4; i++) { + metricValues[i] = Mth.lerp(0.05f, metricValues[i], targetValues[i]); + } + + // Periodically update targets and occasionally swap metrics + if (tickCounter % 20 == 0) { + for (int i = 0; i < 4; i++) { + targetValues[i] = targetValues[i] + (random.nextFloat() - 0.5f) * 20f; + targetValues[i] = Mth.clamp(targetValues[i], 0f, 100f); + } + } + + if (tickCounter % 100 == 0) { + int idx = random.nextInt(4); + currentMetricIndices[idx] = random.nextInt(METRICS.length); + targetValues[idx] = random.nextFloat() * 100f; + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + int tier = tierSupplier.getAsInt(); + int tierColor = getTierColor(tier); + + // Background + DrawerHelper.drawSolidRect(graphics, x, y, w, h, 0xC0081018); + DrawerHelper.drawBorder(graphics, x, y, w, h, adjustAlpha(tierColor, 0.4f), 1); + + // Scan line effect + int scanAlpha = (int) (0x20 * (1f - (scanLineY / h))); + int scanColor = (scanAlpha << 24) | (tierColor & 0x00FFFFFF); + graphics.fill(x + 1, y + (int) scanLineY, x + w - 1, y + (int) scanLineY + 2, scanColor); + + // Draw telemetry data + drawTelemetryLines(graphics, x, y, w, h, tier, tierColor); + } + + private void drawTelemetryLines(GuiGraphics graphics, int x, int y, int w, int h, int tier, int tierColor) { + var font = Minecraft.getInstance().font; + int lineHeight = 22; + int startY = y + 4; + + // Show up to 4 metrics + int maxMetrics = Math.min(4, currentMetricIndices.length); + + for (int i = 0; i < maxMetrics; i++) { + int lineY = startY + i * lineHeight; + if (lineY + lineHeight > y + h - 16) break; + + // Get metric name and unit from the paired array + int metricIdx = currentMetricIndices[i]; + String metricName = METRICS[metricIdx][0]; + String unit = METRICS[metricIdx][1]; + + // Metric name on the left (dim color) + graphics.drawString(font, metricName, x + 4, lineY, 0xFF606080, false); + + // Value with fluctuation + float value = metricValues[i]; + float displayValue = value + Mth.sin(animPhase + i * 1.3f) * (tier + 1) * 0.5f; + String valueStr = String.format("%.1f", displayValue); + + // Color based on tier and value + int valueColor = getValueColor(displayValue, tierColor); + float pulse = Mth.sin(animPhase * 2f + i) * 0.1f + 0.9f; + valueColor = adjustAlpha(valueColor, pulse); + + // Draw value and unit on right side + String valueWithUnit = valueStr + unit; + int valueX = x + w - font.width(valueWithUnit) - 4; + graphics.drawString(font, valueStr, valueX, lineY, valueColor, false); + graphics.drawString(font, unit, valueX + font.width(valueStr), lineY, 0xFF505060, false); + + // Mini bar indicator below + int barX = x + 4; + int barY = lineY + font.lineHeight + 1; + int barW = w - 8; + int barH = 2; + + // Background bar + graphics.fill(barX, barY, barX + barW, barY + barH, 0xFF202030); + + // Fill bar + int fillW = (int) (barW * (value / 100f)); + int barColor = adjustAlpha(tierColor, 0.6f); + graphics.fill(barX, barY, barX + fillW, barY + barH, barColor); + + // Pulse dot at end + if (fillW > 2) { + float dotPulse = Mth.sin(animPhase * 3f + i * 0.7f) * 0.3f + 0.7f; + int dotAlpha = (int) (0xFF * dotPulse); + int dotColor = (dotAlpha << 24) | (tierColor & 0x00FFFFFF); + graphics.fill(barX + fillW - 2, barY - 1, barX + fillW, barY + barH + 1, dotColor); + } + } + + // Status line at bottom + String status = STATUS_LABELS[tier % STATUS_LABELS.length]; + float statusPulse = Mth.sin(animPhase) * 0.15f + 0.85f; + int statusAlpha = (int) (0xFF * statusPulse); + int statusColor = (statusAlpha << 24) | (tierColor & 0x00FFFFFF); + + int statusY = y + h - font.lineHeight - 3; + graphics.drawString(font, "[" + status + "]", x + 4, statusY, statusColor, false); + } + + private int getValueColor(float value, int tierColor) { + if (value > 80f) { + return 0xFF40FF80; // Green - high + } else if (value > 50f) { + return tierColor; // Tier color - normal + } else if (value > 20f) { + return 0xFFC0A040; // Yellow - low + } else { + return 0xFFFF6040; // Red - critical + } + } + + private int getTierColor(int tier) { + if (tier < 0) return TIER_COLORS[0]; + if (tier >= TIER_COLORS.length) return TIER_COLORS[TIER_COLORS.length - 1]; + return TIER_COLORS[tier]; + } + + private int adjustAlpha(int color, float factor) { + int a = (int) (((color >> 24) & 0xFF) * factor); + return (a << 24) | (color & 0x00FFFFFF); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/TierDisplayWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/TierDisplayWidget.java new file mode 100644 index 000000000..4919c9a51 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/TierDisplayWidget.java @@ -0,0 +1,177 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.starladder; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.IntSupplier; + +import javax.annotation.Nonnull; + +public class TierDisplayWidget extends Widget { + + private static final int MAX_TIER = 3; + private static final int[] TIER_COLORS = { + 0xFF4080C0, // T0 - Blue + 0xFF40C080, // T1 - Green + 0xFFC0A040, // T2 - Gold + 0xFFC040C0 // T3 - Purple + }; + + private final IntSupplier tierSupplier; + + private float displayedTier = 0f; + private float pulsePhase = 0f; + private float ringRotation = 0f; + + public TierDisplayWidget(int x, int y, int width, int height, IntSupplier tierSupplier) { + super(x, y, width, height); + this.tierSupplier = tierSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + pulsePhase += 0.06f; + ringRotation += 0.02f; + + float targetTier = tierSupplier.getAsInt(); + displayedTier = Mth.lerp(0.08f, displayedTier, targetTier); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + int currentTier = tierSupplier.getAsInt(); + int tierColor = getTierColor(currentTier); + + DrawerHelper.drawSolidRect(graphics, x, y, w, h, 0xA0101828); + + int borderColor = adjustAlpha(tierColor, 0.5f); + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + drawTierRings(graphics, x, y, w, h, currentTier, tierColor); + drawTierLabel(graphics, x, y, w, h, currentTier, tierColor); + drawTierIndicators(graphics, x, y, w, h, currentTier); + } + + private void drawTierRings(GuiGraphics graphics, int x, int y, int w, int h, int tier, int tierColor) { + int centerX = x + w / 2; + int centerY = y + h / 2 - 8; + int baseRadius = Math.min(w, h) / 3; + + for (int ring = 0; ring <= tier && ring <= MAX_TIER; ring++) { + float ringProgress = ring <= displayedTier ? 1f : Math.max(0, displayedTier - ring + 1); + if (ringProgress <= 0) continue; + + int ringRadius = baseRadius + ring * 6; + int ringColor = getTierColor(ring); + + float pulse = Mth.sin(pulsePhase + ring * 0.5f) * 0.15f + 0.85f; + int alpha = (int) (0x60 * pulse * ringProgress); + int color = (alpha << 24) | (ringColor & 0x00FFFFFF); + + drawRing(graphics, centerX, centerY, ringRadius, color); + } + + float corePulse = Mth.sin(pulsePhase * 1.5f) * 0.2f + 0.8f; + int coreAlpha = (int) (0xA0 * corePulse); + int coreColor = (coreAlpha << 24) | (tierColor & 0x00FFFFFF); + + int coreSize = 8; + graphics.fill(centerX - coreSize / 2, centerY - coreSize / 2, + centerX + coreSize / 2, centerY + coreSize / 2, coreColor); + + int glowAlpha = (int) (0x30 * corePulse); + int glowColor = (glowAlpha << 24) | (tierColor & 0x00FFFFFF); + graphics.fill(centerX - coreSize, centerY - coreSize, + centerX + coreSize, centerY + coreSize, glowColor); + } + + private void drawRing(GuiGraphics graphics, int cx, int cy, int radius, int color) { + int segments = 32; + for (int i = 0; i < segments; i++) { + float angle1 = (i * Mth.TWO_PI / segments) + ringRotation; + float angle2 = ((i + 1) * Mth.TWO_PI / segments) + ringRotation; + + int x1 = cx + (int) (Mth.cos(angle1) * radius); + int y1 = cy + (int) (Mth.sin(angle1) * radius * 0.4f); + int x2 = cx + (int) (Mth.cos(angle2) * radius); + int y2 = cy + (int) (Mth.sin(angle2) * radius * 0.4f); + + if (i % 2 == 0) { + graphics.fill(x1, y1, x1 + 1, y1 + 1, color); + } + } + } + + private void drawTierLabel(GuiGraphics graphics, int x, int y, int w, int h, int tier, int tierColor) { + var font = Minecraft.getInstance().font; + + String tierText = "TIER " + tier; + int textX = x + (w - font.width(tierText)) / 2; + int textY = y + h - font.lineHeight - 16; + + graphics.drawString(font, tierText, textX, textY, tierColor, false); + + String subText = getTierName(tier); + int subX = x + (w - font.width(subText)) / 2; + int subY = textY + font.lineHeight + 2; + graphics.drawString(font, subText, subX, subY, 0xFF808090, false); + } + + private void drawTierIndicators(GuiGraphics graphics, int x, int y, int w, int h, int currentTier) { + int indicatorY = y + h - 8; + int totalWidth = (MAX_TIER + 1) * 10 - 4; + int startX = x + (w - totalWidth) / 2; + + for (int i = 0; i <= MAX_TIER; i++) { + int dotX = startX + i * 10; + int dotColor; + + if (i <= currentTier) { + float pulse = Mth.sin(pulsePhase + i * 0.3f) * 0.2f + 0.8f; + int alpha = (int) (0xFF * pulse); + dotColor = (alpha << 24) | (getTierColor(i) & 0x00FFFFFF); + } else { + dotColor = 0xFF303040; + } + + graphics.fill(dotX, indicatorY, dotX + 6, indicatorY + 4, dotColor); + } + } + + private int getTierColor(int tier) { + if (tier < 0) return TIER_COLORS[0]; + if (tier >= TIER_COLORS.length) return TIER_COLORS[TIER_COLORS.length - 1]; + return TIER_COLORS[tier]; + } + + private String getTierName(int tier) { + return switch (tier) { + case 0 -> "FOUNDATION"; + case 1 -> "EXPANSION"; + case 2 -> "ADVANCED"; + case 3 -> "MAXIMUM"; + default -> "UNKNOWN"; + }; + } + + private int adjustAlpha(int color, float factor) { + int a = (int) (((color >> 24) & 0xFF) * factor); + return (a << 24) | (color & 0x00FFFFFF); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/UplinkOverlayWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/UplinkOverlayWidget.java new file mode 100644 index 000000000..6adcc3f57 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/starladder/UplinkOverlayWidget.java @@ -0,0 +1,216 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.starladder; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.StarLadderUplinkState; +import com.ghostipedia.cosmiccore.common.network.packet.StarLadderUplinkPackets.ClientDemand; +import com.ghostipedia.cosmiccore.common.network.packet.StarLadderUplinkPackets.StarLadderUplinkClientState; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.Random; + +import javax.annotation.Nonnull; + +@OnlyIn(Dist.CLIENT) +public class UplinkOverlayWidget extends Widget { + + private static final int PROGRESS_BAR_COLOR = 0xFFC04040; + private static final int PROGRESS_BAR_BG = 0xFF202030; + private static final int PROGRESS_BAR_GLOW = 0x40FF4040; + private static final int DEMAND_TIMER_COLOR = 0xFFCC8800; + private static final int DEMAND_TIMER_BG = 0xFF302010; + private static final int LABEL_COLOR = 0xFF8090B0; + private static final int VALUE_COLOR = 0xFFCCDDEE; + private static final int WARNING_COLOR = 0xFFFF4444; + + private final Random random = new Random(); + + private float animPhase = 0f; + private float glitch = 0f; + private int[] glitchOffsets = new int[8]; + private boolean[] scanlines = new boolean[20]; + + public UplinkOverlayWidget(int x, int y, int width, int height) { + super(x, y, width, height); + randomizeGlitch(); + } + + private void randomizeGlitch() { + for (int i = 0; i < glitchOffsets.length; i++) { + glitchOffsets[i] = random.nextInt(20) - 10; + } + for (int i = 0; i < scanlines.length; i++) { + scanlines[i] = random.nextFloat() < 0.3f; + } + } + + @Override + public void updateScreen() { + super.updateScreen(); + animPhase += 0.05f; + + StarLadderUplinkState state = StarLadderUplinkClientState.getState(); + if (state.isActive()) { + float progressPct = StarLadderUplinkClientState.getUplinkProgress(); + glitch = 0.1f + progressPct * 0.3f; + + if (glitch > 0 && (int) (animPhase * 20) % 3 == 0) { + randomizeGlitch(); + } + } else { + glitch = 0; + } + } + + @Override + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + StarLadderUplinkState state = StarLadderUplinkClientState.getState(); + if (!state.isActive()) return; + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + drawUplinkProgress(graphics, x, y, w); + drawSoulDrainIndicator(graphics, x, y + 30, w); + + int panelTop = y + 50; + int panelH = h - 65; + int halfW = (w - 4) / 2; + drawDemandPanel(graphics, StarLadderUplinkClientState.getBulkDemand(), x, panelTop, halfW, panelH); + drawDemandPanel(graphics, StarLadderUplinkClientState.getComplexDemand(), x + halfW + 4, panelTop, halfW, + panelH); + + if (glitch > 0) drawGlitch(graphics, x, y, w, h); + drawVignette(graphics, x, y, w, h); + } + + private void drawUplinkProgress(GuiGraphics graphics, int x, int y, int w) { + var font = Minecraft.getInstance().font; + + String label = Component.translatable("cosmiccore.star_ladder.uplink_progress").getString(); + graphics.drawString(font, label, x + 5, y + 2, LABEL_COLOR, false); + + int pct = (int) (StarLadderUplinkClientState.getUplinkProgress() * 100); + String pctText = pct + "%"; + graphics.drawString(font, pctText, x + w - font.width(pctText) - 5, y + 2, VALUE_COLOR, false); + + int barY = y + 14; + int barH = 10; + int barW = w - 10; + + DrawerHelper.drawSolidRect(graphics, x + 5, barY, barW, barH, PROGRESS_BAR_BG); + + float progress = StarLadderUplinkClientState.getUplinkProgress(); + int fillW = (int) (barW * progress); + if (fillW > 0) { + float pulse = Mth.sin(animPhase * 3f) * 0.15f + 0.85f; + int r = (int) (((PROGRESS_BAR_COLOR >> 16) & 0xFF) * pulse); + int g = (int) (((PROGRESS_BAR_COLOR >> 8) & 0xFF) * pulse); + int b = (int) ((PROGRESS_BAR_COLOR & 0xFF) * pulse); + int pulsedColor = 0xFF000000 | (r << 16) | (g << 8) | b; + + DrawerHelper.drawGradientRect(graphics, x + 5, barY, fillW, barH, + darkenColor(pulsedColor, 0.6f), pulsedColor, true); + + DrawerHelper.drawSolidRect(graphics, x + 5, barY, fillW, 1, PROGRESS_BAR_GLOW); + } + + DrawerHelper.drawBorder(graphics, x + 5, barY, barW, barH, 0x60FFFFFF, 1); + } + + private void drawSoulDrainIndicator(GuiGraphics graphics, int x, int y, int w) { + var font = Minecraft.getInstance().font; + + int drainRate = StarLadderUplinkClientState.getDrainRate(); + String text = Component.translatable("cosmiccore.star_ladder.soul_drain", drainRate).getString(); + + float pulse = Mth.sin(animPhase * 2f) * 0.3f + 0.7f; + int alpha = (int) (255 * pulse); + int color = (alpha << 24) | 0xCC4444; + + graphics.drawString(font, text, x + 5, y + 2, color, false); + } + + private void drawDemandPanel(GuiGraphics graphics, ClientDemand demand, int x, int y, int w, int h) { + if (!demand.isActive()) return; + + var font = Minecraft.getInstance().font; + + DrawerHelper.drawSolidRect(graphics, x + 3, y, w - 6, h - 3, 0x40102030); + DrawerHelper.drawBorder(graphics, x + 3, y, w - 6, h - 3, 0x60CC8800, 1); + + String demandLabel = Component.translatable("cosmiccore.star_ladder.requisition").getString(); + graphics.drawString(font, demandLabel, x + 8, y + 4, WARNING_COLOR, false); + + graphics.renderItem(demand.item, x + 8, y + 16); + + String itemName = demand.item.getHoverName().getString(); + String qtyText = "x" + demand.qtyRemaining; + graphics.drawString(font, itemName, x + 28, y + 16, VALUE_COLOR, false); + graphics.drawString(font, qtyText, x + 28, y + 26, DEMAND_TIMER_COLOR, false); + + float timerProgress = demand.getTimerProgress(); + int timerBarY = y + h - 12; + int timerBarW = w - 16; + int timerBarH = 6; + + DrawerHelper.drawSolidRect(graphics, x + 8, timerBarY, timerBarW, timerBarH, DEMAND_TIMER_BG); + + float remaining = 1f - timerProgress; + int timerFillW = (int) (timerBarW * remaining); + if (timerFillW > 0) { + int timerColor = remaining < 0.25f ? WARNING_COLOR : DEMAND_TIMER_COLOR; + DrawerHelper.drawSolidRect(graphics, x + 8, timerBarY, timerFillW, timerBarH, timerColor); + } + + DrawerHelper.drawBorder(graphics, x + 8, timerBarY, timerBarW, timerBarH, 0x40FFFFFF, 1); + } + + private void drawGlitch(GuiGraphics graphics, int x, int y, int w, int h) { + for (int i = 0; i < scanlines.length; i++) { + if (scanlines[i] && random.nextFloat() < glitch) { + int sy = y + (h * i / scanlines.length); + int sh = h / scanlines.length; + int off = glitchOffsets[i % glitchOffsets.length]; + int a = (int) (30 * glitch); + + graphics.fill(x + off - 2, sy, x + w + off - 2, sy + sh, (a << 24) | 0xFF0000); + graphics.fill(x - off + 2, sy, x + w - off + 2, sy + sh, (a << 24) | 0x00FFFF); + } + } + + if (random.nextFloat() < glitch * 0.3f) { + int a = (int) (40 * glitch * random.nextFloat()); + graphics.fill(x, y, x + w, y + h, (a << 24) | 0xFFFFFF); + } + } + + private void drawVignette(GuiGraphics graphics, int x, int y, int w, int h) { + float strength = 0.3f; + int edgeAlpha = (int) (80 * strength); + int edgeSize = h / 5; + + for (int row = 0; row < edgeSize; row++) { + int a = (int) (edgeAlpha * (1f - (float) row / edgeSize)); + graphics.fill(x, y + row, x + w, y + row + 1, (a << 24) | 0x200000); + graphics.fill(x, y + h - 1 - row, x + w, y + h - row, (a << 24) | 0x200000); + } + } + + private int darkenColor(int color, float factor) { + int a = (color >> 24) & 0xFF; + int r = (int) (((color >> 16) & 0xFF) * factor); + int g = (int) (((color >> 8) & 0xFF) * factor); + int b = (int) ((color & 0xFF) * factor); + return (a << 24) | (r << 16) | (g << 8) | b; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/DebugPrimeButton.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/DebugPrimeButton.java new file mode 100644 index 000000000..4da634ff8 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/DebugPrimeButton.java @@ -0,0 +1,63 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import javax.annotation.Nonnull; + +public class DebugPrimeButton extends Widget { + + private final Runnable onClick; + private boolean hovered = false; + + public DebugPrimeButton(int x, int y, int width, int height, Runnable onClick) { + super(x, y, width, height); + this.onClick = onClick; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + hovered = isMouseOverElement(mouseX, mouseY); + + // Background - yellow/gold tint for "prime" + int bgColor = hovered ? 0xAA404020 : 0x80302010; + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + // Border - golden when hovered + int borderColor = hovered ? 0xFFFFCC44 : 0xFF806020; + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + // Label + var font = Minecraft.getInstance().font; + String label = "[PRIME]"; + int labelWidth = font.width(label); + int labelX = x + (w - labelWidth) / 2; + int labelY = y + (h - font.lineHeight) / 2 + 1; + + int textColor = hovered ? 0xFFFFDD66 : 0xFFAA9944; + graphics.drawString(font, label, labelX, labelY, textColor, false); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0 && isMouseOverElement(mouseX, mouseY)) { + onClick.run(); + return true; + } + return false; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/DebugStageButton.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/DebugStageButton.java new file mode 100644 index 000000000..fdeb4bbe7 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/DebugStageButton.java @@ -0,0 +1,104 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.Consumer; + +import javax.annotation.Nonnull; + +public class DebugStageButton extends Widget { + + private final Stage stage; + private final Consumer onClick; + private boolean hovered = false; + + public DebugStageButton(int x, int y, int width, int height, Stage stage, Consumer onClick) { + super(x, y, width, height); + this.stage = stage; + this.onClick = onClick; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + hovered = isMouseOverElement(mouseX, mouseY); + + // Background + int bgColor = hovered ? 0xAA303040 : 0x80202030; + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + // Border with stage color + int borderColor = getStageColor(); + if (hovered) { + borderColor = brighten(borderColor); + } + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + // Label + var font = Minecraft.getInstance().font; + String label = getShortLabel(); + int labelWidth = font.width(label); + int labelX = x + (w - labelWidth) / 2; + int labelY = y + (h - font.lineHeight) / 2 + 1; + + int textColor = hovered ? 0xFFFFFFFF : 0xFFAAAAAA; + graphics.drawString(font, label, labelX, labelY, textColor, false); + } + + private String getShortLabel() { + return switch (stage) { + case EMPTY -> "EMP"; + case GROWING -> "GRW"; + case STAR -> "STR"; + case SUPERSTAR -> "SUP"; + case BLACK_HOLE -> "BLK"; + case DEATH -> "DTH"; + case DEATH_GRACEFUL -> "GRC"; + }; + } + + private int getStageColor() { + return switch (stage) { + case EMPTY -> 0xFF404050; + case GROWING -> 0xFF6080FF; + case STAR -> 0xFFFFCC44; + case SUPERSTAR -> 0xFFFF8844; + case BLACK_HOLE -> 0xFF8040FF; + case DEATH -> 0xFFFF2020; + case DEATH_GRACEFUL -> 0xFF804040; + }; + } + + private int brighten(int color) { + int a = (color >> 24) & 0xFF; + int r = Math.min(255, ((color >> 16) & 0xFF) + 40); + int g = Math.min(255, ((color >> 8) & 0xFF) + 40); + int b = Math.min(255, (color & 0xFF) + 40); + return (a << 24) | (r << 16) | (g << 8) | b; + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0 && isMouseOverElement(mouseX, mouseY)) { + onClick.accept(stage); + return true; + } + return false; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/EnergyConduitWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/EnergyConduitWidget.java new file mode 100644 index 000000000..7f7b38b8c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/EnergyConduitWidget.java @@ -0,0 +1,229 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class EnergyConduitWidget extends Widget { + + private final Supplier stageSupplier; + private final List pulses = new ArrayList<>(); + + private float flowPhase = 0f; + private float pulseSpawnTimer = 0f; + + private static class EnergyPulse { + + float position; + float speed; + float intensity; + int conduitIndex; + boolean alive = true; + } + + public EnergyConduitWidget(int x, int y, int width, int height, Supplier stageSupplier) { + super(x, y, width, height); + this.stageSupplier = stageSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + Stage stage = stageSupplier.get(); + float flowSpeed = getFlowSpeed(stage); + flowPhase += flowSpeed; + + pulseSpawnTimer += flowSpeed * 2f; + if (pulseSpawnTimer > 1f && stage != Stage.EMPTY && stage != Stage.DEATH_GRACEFUL) { + pulseSpawnTimer = 0f; + spawnPulse(stage); + } + + pulses.removeIf(p -> !p.alive); + for (EnergyPulse pulse : pulses) { + pulse.position += pulse.speed; + if (pulse.position > 1f) { + pulse.alive = false; + } + } + } + + private void spawnPulse(Stage stage) { + if (pulses.size() > 20) return; + + EnergyPulse pulse = new EnergyPulse(); + pulse.position = 0f; + pulse.speed = 0.02f + (float) Math.random() * 0.03f; + pulse.intensity = 0.5f + (float) Math.random() * 0.5f; + pulse.conduitIndex = (int) (Math.random() * 4); + + if (stage == Stage.DEATH) { + pulse.speed *= 2f; + } else if (stage == Stage.BLACK_HOLE) { + pulse.speed *= 1.5f; + } + + pulses.add(pulse); + } + + private float getFlowSpeed(Stage stage) { + return switch (stage) { + case EMPTY -> 0.005f; + case GROWING -> 0.03f; + case STAR -> 0.02f; + case SUPERSTAR -> 0.04f; + case BLACK_HOLE -> 0.05f; + case DEATH -> 0.08f; + case DEATH_GRACEFUL -> 0.01f; + }; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + Stage stage = stageSupplier.get(); + int baseColor = getStageColor(stage); + + drawConduitLines(graphics, x, y, w, h, baseColor, stage); + drawFlowingEnergy(graphics, x, y, w, h, baseColor, stage); + drawPulses(graphics, x, y, w, h, baseColor); + drawConduitNodes(graphics, x, y, w, h, baseColor, stage); + } + + private void drawConduitLines(GuiGraphics graphics, int x, int y, int w, int h, int baseColor, Stage stage) { + int lineColor = 0x40000000 | (baseColor & 0x00FFFFFF); + int glowColor = 0x20000000 | (baseColor & 0x00FFFFFF); + + int topY = y + 8; + graphics.fill(x, topY - 1, x + w, topY + 2, glowColor); + graphics.fill(x, topY, x + w, topY + 1, lineColor); + + int bottomY = y + h - 8; + graphics.fill(x, bottomY - 1, x + w, bottomY + 2, glowColor); + graphics.fill(x, bottomY, x + w, bottomY + 1, lineColor); + + int leftX = x + 8; + graphics.fill(leftX - 1, y, leftX + 2, y + h, glowColor); + graphics.fill(leftX, y, leftX + 1, y + h, lineColor); + + int rightX = x + w - 8; + graphics.fill(rightX - 1, y, rightX + 2, y + h, glowColor); + graphics.fill(rightX, y, rightX + 1, y + h, lineColor); + } + + private void drawFlowingEnergy(GuiGraphics graphics, int x, int y, int w, int h, int baseColor, Stage stage) { + if (stage == Stage.EMPTY) return; + + int segmentCount = 20; + float segmentSpacing = 1f / segmentCount; + + for (int i = 0; i < segmentCount; i++) { + float segmentPhase = (flowPhase + i * segmentSpacing) % 1f; + float brightness = Mth.sin(segmentPhase * Mth.PI) * 0.8f; + if (brightness < 0.1f) continue; + + int alpha = (int) (0x60 * brightness); + int color = (alpha << 24) | (baseColor & 0x00FFFFFF); + + int topY = y + 8; + int segX = x + (int) (w * segmentPhase); + graphics.fill(segX - 1, topY - 1, segX + 2, topY + 2, color); + + int bottomY = y + h - 8; + int reverseX = x + w - (int) (w * segmentPhase); + graphics.fill(reverseX - 1, bottomY - 1, reverseX + 2, bottomY + 2, color); + + int leftX = x + 8; + int segY = y + (int) (h * segmentPhase); + graphics.fill(leftX - 1, segY - 1, leftX + 2, segY + 2, color); + + int rightX = x + w - 8; + int reverseY = y + h - (int) (h * segmentPhase); + graphics.fill(rightX - 1, reverseY - 1, rightX + 2, reverseY + 2, color); + } + } + + private void drawPulses(GuiGraphics graphics, int x, int y, int w, int h, int baseColor) { + for (EnergyPulse pulse : pulses) { + float brightness = pulse.intensity * (1f - pulse.position * 0.5f); + int alpha = (int) (0xC0 * brightness); + int color = (alpha << 24) | (baseColor & 0x00FFFFFF); + int coreColor = (alpha << 24) | 0xFFFFFF; + + int px, py; + switch (pulse.conduitIndex) { + case 0 -> { + px = x + (int) (w * pulse.position); + py = y + 8; + } + case 1 -> { + px = x + w - (int) (w * pulse.position); + py = y + h - 8; + } + case 2 -> { + px = x + 8; + py = y + (int) (h * pulse.position); + } + default -> { + px = x + w - 8; + py = y + h - (int) (h * pulse.position); + } + } + + graphics.fill(px - 3, py - 3, px + 4, py + 4, color); + graphics.fill(px - 1, py - 1, px + 2, py + 2, coreColor); + } + } + + private void drawConduitNodes(GuiGraphics graphics, int x, int y, int w, int h, int baseColor, Stage stage) { + float nodePulse = Mth.sin(flowPhase * 3f) * 0.3f + 0.7f; + int nodeAlpha = (int) (0x80 * nodePulse); + int nodeColor = (nodeAlpha << 24) | (baseColor & 0x00FFFFFF); + int nodeGlow = (nodeAlpha / 2 << 24) | (baseColor & 0x00FFFFFF); + + int[][] nodePositions = { + { x + 8, y + 8 }, + { x + w - 8, y + 8 }, + { x + 8, y + h - 8 }, + { x + w - 8, y + h - 8 } + }; + + for (int[] pos : nodePositions) { + graphics.fill(pos[0] - 4, pos[1] - 4, pos[0] + 5, pos[1] + 5, nodeGlow); + graphics.fill(pos[0] - 2, pos[1] - 2, pos[0] + 3, pos[1] + 3, nodeColor); + graphics.fill(pos[0] - 1, pos[1] - 1, pos[0] + 2, pos[1] + 2, 0xFFFFFFFF); + } + } + + private int getStageColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0x405060; + case GROWING -> 0x6090FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF7722; + case BLACK_HOLE -> 0xAA55FF; + case DEATH -> 0xFF3030; + case DEATH_GRACEFUL -> 0x664040; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/FuelGaugeWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/FuelGaugeWidget.java new file mode 100644 index 000000000..b89dccbfc --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/FuelGaugeWidget.java @@ -0,0 +1,121 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class FuelGaugeWidget extends Widget { + + private final Supplier fuelLevelSupplier; + + private float displayedLevel = 0f; + private float animPhase = 0f; + + public FuelGaugeWidget(int x, int y, int width, int height, Supplier fuelLevelSupplier) { + super(x, y, width, height); + this.fuelLevelSupplier = fuelLevelSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + animPhase += 0.1f; + + float target = fuelLevelSupplier.get(); + displayedLevel = Mth.lerp(0.1f, displayedLevel, target); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + // Label + var font = Minecraft.getInstance().font; + graphics.drawString(font, "STELLAR FUEL", x, y, 0xFF909090, false); + + // Gauge background + int gaugeY = y + 12; + int gaugeH = h - 12; + DrawerHelper.drawSolidRect(graphics, x, gaugeY, w, gaugeH, 0xFF101020); + + // Border + DrawerHelper.drawBorder(graphics, x, gaugeY, w, gaugeH, 0xFF303050, 1); + + // Filled portion with gradient based on level + int fillW = (int) (w * displayedLevel); + if (fillW > 0) { + int fillColor = getFillColor(displayedLevel); + int fillColorDark = darkenColor(fillColor, 0.6f); + + DrawerHelper.drawGradientRect(graphics, x + 1, gaugeY + 1, fillW - 2, gaugeH - 2, + fillColorDark, fillColor, true); + + // Animated shimmer + float shimmerPos = (animPhase % (w * 2)) - w; + if (shimmerPos > 0 && shimmerPos < fillW) { + int shimmerX = x + (int) shimmerPos; + int shimmerW = Math.min(10, fillW - (int) shimmerPos); + graphics.fill(shimmerX, gaugeY + 1, shimmerX + shimmerW, gaugeY + gaugeH - 1, + 0x20FFFFFF); + } + } + + // Threshold markers + drawThresholdMarker(graphics, x, gaugeY, w, gaugeH, 0.8f, "IGNITE"); + + // Percentage text + int percent = (int) (displayedLevel * 100); + String percentStr = percent + "%"; + int textX = x + w - font.width(percentStr) - 2; + int textColor = displayedLevel >= 0.8f ? 0xFF80FF80 : 0xFFFFFFFF; + graphics.drawString(font, percentStr, textX, gaugeY + (gaugeH - font.lineHeight) / 2 + 1, + textColor, false); + } + + private void drawThresholdMarker(GuiGraphics graphics, int x, int y, int w, int h, + float threshold, String label) { + int markerX = x + (int) (w * threshold); + + // Vertical line + graphics.fill(markerX, y, markerX + 1, y + h, 0xFF80FF80); + + // Small triangle indicator + graphics.fill(markerX - 2, y - 3, markerX + 3, y, 0xFF80FF80); + } + + private int getFillColor(float level) { + if (level >= 0.8f) { + return 0xFF40FF60; // Green - ready + } else if (level >= 0.5f) { + return 0xFFFFCC40; // Yellow - charging + } else if (level >= 0.2f) { + return 0xFFFF8040; // Orange - low + } else { + return 0xFFFF4040; // Red - critical + } + } + + private int darkenColor(int color, float factor) { + int a = (color >> 24) & 0xFF; + int r = (int) (((color >> 16) & 0xFF) * factor); + int g = (int) (((color >> 8) & 0xFF) * factor); + int b = (int) ((color & 0xFF) * factor); + return (a << 24) | (r << 16) | (g << 8) | b; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/HolographicScanlineWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/HolographicScanlineWidget.java new file mode 100644 index 000000000..5e750f9ed --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/HolographicScanlineWidget.java @@ -0,0 +1,187 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class HolographicScanlineWidget extends Widget { + + private final Supplier stageSupplier; + private float scanY = 0f; + private float glitchTimer = 0f; + private float interferencePhase = 0f; + + public HolographicScanlineWidget(int x, int y, int width, int height, Supplier stageSupplier) { + super(x, y, width, height); + this.stageSupplier = stageSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + Stage stage = stageSupplier.get(); + float scanSpeed = getScanSpeed(stage); + scanY = (scanY + scanSpeed) % 1f; + + interferencePhase += 0.07f; + + if (stage == Stage.DEATH || stage == Stage.BLACK_HOLE) { + glitchTimer += 0.15f; + } else { + glitchTimer *= 0.95f; + } + } + + private float getScanSpeed(Stage stage) { + return switch (stage) { + case EMPTY -> 0.003f; + case GROWING -> 0.008f; + case STAR -> 0.005f; + case SUPERSTAR -> 0.012f; + case BLACK_HOLE -> 0.02f; + case DEATH -> 0.04f; + case DEATH_GRACEFUL -> 0.002f; + }; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + Stage stage = stageSupplier.get(); + int baseColor = getStageColor(stage); + + drawScanLines(graphics, x, y, w, h, baseColor); + drawMainScanBeam(graphics, x, y, w, h, baseColor); + drawInterferencePattern(graphics, x, y, w, h, stage); + + if (glitchTimer > 0.5f) { + drawGlitchEffect(graphics, x, y, w, h, stage); + } + + drawEdgeVignette(graphics, x, y, w, h, baseColor); + } + + private void drawScanLines(GuiGraphics graphics, int x, int y, int w, int h, int baseColor) { + int lineAlpha = 0x08; + int lineColor = (lineAlpha << 24) | (baseColor & 0x00FFFFFF); + + for (int ly = y; ly < y + h; ly += 2) { + graphics.fill(x, ly, x + w, ly + 1, lineColor); + } + } + + private void drawMainScanBeam(GuiGraphics graphics, int x, int y, int w, int h, int baseColor) { + int beamY = y + (int) (h * scanY); + int beamHeight = 3; + + for (int i = 0; i < 8; i++) { + int spread = i * 2; + float falloff = 1f - (i / 8f); + int alpha = (int) (0x40 * falloff); + int color = (alpha << 24) | (baseColor & 0x00FFFFFF); + + int drawY = beamY - spread; + if (drawY >= y && drawY < y + h) { + graphics.fill(x, drawY, x + w, drawY + beamHeight, color); + } + drawY = beamY + spread; + if (drawY >= y && drawY < y + h) { + graphics.fill(x, drawY, x + w, drawY + beamHeight, color); + } + } + + int coreAlpha = 0x80; + int coreColor = (coreAlpha << 24) | 0xFFFFFF; + if (beamY >= y && beamY < y + h - beamHeight) { + graphics.fill(x, beamY, x + w, beamY + beamHeight, coreColor); + } + } + + private void drawInterferencePattern(GuiGraphics graphics, int x, int y, int w, int h, Stage stage) { + if (stage == Stage.EMPTY || stage == Stage.DEATH_GRACEFUL) return; + + float intensity = switch (stage) { + case GROWING -> 0.3f; + case STAR -> 0.2f; + case SUPERSTAR -> 0.5f; + case BLACK_HOLE -> 0.7f; + case DEATH -> 0.9f; + default -> 0f; + }; + + int bands = 3 + (int) (intensity * 5); + for (int i = 0; i < bands; i++) { + float bandPhase = interferencePhase + i * 0.7f; + float bandY = (Mth.sin(bandPhase) * 0.5f + 0.5f); + int by = y + (int) (h * bandY); + + float bandIntensity = Mth.sin(bandPhase * 2.3f) * 0.5f + 0.5f; + int alpha = (int) (0x15 * intensity * bandIntensity); + int color = (alpha << 24) | 0x00FFFF; + + if (by >= y && by < y + h - 2) { + graphics.fill(x, by, x + w, by + 2, color); + } + } + } + + private void drawGlitchEffect(GuiGraphics graphics, int x, int y, int w, int h, Stage stage) { + long time = System.currentTimeMillis(); + int glitchCount = stage == Stage.DEATH ? 8 : 3; + + for (int i = 0; i < glitchCount; i++) { + if (((time / 50) + i * 17) % 7 < 2) { + int glitchY = y + (int) ((time / 30 + i * 43) % h); + int glitchH = 2 + (int) (Math.random() * 4); + int offsetX = (int) ((Math.random() - 0.5) * 10); + + int glitchColor = stage == Stage.DEATH ? 0x40FF0000 : 0x30FF00FF; + graphics.fill(x + offsetX, glitchY, x + w + offsetX, Math.min(glitchY + glitchH, y + h), glitchColor); + } + } + } + + private void drawEdgeVignette(GuiGraphics graphics, int x, int y, int w, int h, int baseColor) { + int vignetteSize = 15; + for (int i = 0; i < vignetteSize; i++) { + float progress = (float) i / vignetteSize; + int alpha = (int) (0x30 * (1f - progress)); + int color = (alpha << 24) | (baseColor & 0x00FFFFFF); + + graphics.fill(x, y + i, x + w, y + i + 1, color); + graphics.fill(x, y + h - i - 1, x + w, y + h - i, color); + graphics.fill(x + i, y, x + i + 1, y + h, color); + graphics.fill(x + w - i - 1, y, x + w - i, y + h, color); + } + } + + private int getStageColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0x4080A0; + case GROWING -> 0x60A0FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF6622; + case BLACK_HOLE -> 0xAA44FF; + case DEATH -> 0xFF2020; + case DEATH_GRACEFUL -> 0x664444; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/IgnitionButtonWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/IgnitionButtonWidget.java new file mode 100644 index 000000000..bd608bfc4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/IgnitionButtonWidget.java @@ -0,0 +1,293 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.BooleanSupplier; + +import javax.annotation.Nonnull; + +public class IgnitionButtonWidget extends Widget { + + private final BooleanSupplier canIgnite; + private final BooleanSupplier isVisible; + private final Runnable onIgnite; + + private float hoverProgress = 0f; + private float pulsePhase = 0f; + private float chargeProgress = 0f; + private boolean isCharging = false; + private boolean wasHovered = false; + + private static final int CHARGE_TICKS = 40; + private int chargeTicks = 0; + + public IgnitionButtonWidget(int x, int y, int width, int height, + BooleanSupplier canIgnite, + BooleanSupplier isVisible, + Runnable onIgnite) { + super(x, y, width, height); + this.canIgnite = canIgnite; + this.isVisible = isVisible; + this.onIgnite = onIgnite; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + pulsePhase += 0.15f; + + super.setVisible(isVisible.getAsBoolean()); + + boolean hovered = isMouseOverElement(lastMouseX, lastMouseY); + float targetHover = hovered ? 1f : 0f; + hoverProgress = Mth.lerp(0.2f, hoverProgress, targetHover); + + if (hovered && !wasHovered && isVisible()) { + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK.value(), 1.5f, 0.3f)); + } + wasHovered = hovered; + + if (isCharging && canIgnite.getAsBoolean()) { + chargeTicks++; + chargeProgress = (float) chargeTicks / CHARGE_TICKS; + if (chargeTicks >= CHARGE_TICKS) { + onIgnite.run(); + isCharging = false; + chargeTicks = 0; + chargeProgress = 0f; + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.RESPAWN_ANCHOR_SET_SPAWN, 0.8f, 1.0f)); + } + } else if (isCharging) { + isCharging = false; + chargeTicks = 0; + chargeProgress = Mth.lerp(0.3f, chargeProgress, 0f); + } else { + chargeProgress = Mth.lerp(0.2f, chargeProgress, 0f); + } + } + + private int lastMouseX, lastMouseY; + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + lastMouseX = mouseX; + lastMouseY = mouseY; + + if (!isVisible()) return; + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + boolean enabled = canIgnite.getAsBoolean(); + + int bgColor; + int borderColor; + int textColor; + + if (!enabled) { + bgColor = 0xFF1A1A2A; + borderColor = 0xFF303040; + textColor = 0xFF505060; + } else if (isCharging) { + float chargeGlow = 0.5f + chargeProgress * 0.5f; + int r = (int) (255 * chargeGlow); + int g = (int) (100 * (1f - chargeProgress * 0.5f)); + bgColor = 0xFF000000 | (r << 16) | (g << 8); + borderColor = 0xFFFF8040; + textColor = 0xFFFFFFFF; + } else { + float pulse = (float) (0.6f + 0.4f * Math.sin(pulsePhase)); + float hover = hoverProgress; + int baseR = (int) (40 + 60 * pulse + 40 * hover); + int baseG = (int) (30 + 40 * pulse + 30 * hover); + int baseB = (int) (10 + 20 * pulse); + bgColor = 0xFF000000 | (baseR << 16) | (baseG << 8) | baseB; + borderColor = 0xFFFFAA40; + textColor = 0xFFFFDD80; + } + + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + if (enabled) { + float glowIntensity = hoverProgress * 0.5f + chargeProgress * 0.5f; + if (glowIntensity > 0.01f) { + int glowAlpha = (int) (glowIntensity * 60); + int glowColor = (glowAlpha << 24) | (borderColor & 0x00FFFFFF); + DrawerHelper.drawSolidRect(graphics, x - 2, y - 2, w + 4, h + 4, glowColor); + DrawerHelper.drawSolidRect(graphics, x - 1, y - 1, w + 2, h + 2, glowColor); + } + } + + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + if (chargeProgress > 0.01f) { + int chargeW = (int) (w * chargeProgress); + int chargeColor = lerpColor(0x40FF8040, 0x80FF4020, chargeProgress); + DrawerHelper.drawSolidRect(graphics, x + 1, y + 1, chargeW - 2, h - 2, chargeColor); + + if (chargeW > 3) { + graphics.fill(x + chargeW - 2, y + 1, x + chargeW, y + h - 1, 0xCCFFFFFF); + } + } + + if (isCharging && chargeProgress > 0.3f) { + drawEnergyArcs(graphics, x, y, w, h, chargeProgress); + } + + var font = Minecraft.getInstance().font; + String text = getButtonText(enabled); + int textW = font.width(text); + int textX = x + (w - textW) / 2; + int textY = y + (h - font.lineHeight) / 2; + + if (enabled) { + graphics.drawString(font, text, textX + 1, textY + 1, 0xFF000000, false); + } + graphics.drawString(font, text, textX, textY, textColor, false); + + if (enabled && !isCharging) { + float shimmerPos = (pulsePhase * 2) % (w + 40) - 20; + if (shimmerPos > 0 && shimmerPos < w) { + int shimmerX = x + (int) shimmerPos; + int shimmerW = Math.min(8, w - (int) shimmerPos); + graphics.fill(shimmerX, y + 1, shimmerX + shimmerW, y + h - 1, 0x15FFFFFF); + } + } + + if (enabled) { + int accentColor = isCharging ? 0xFFFF6040 : 0xFFFFAA40; + graphics.fill(x, y, x + 4, y + 1, accentColor); + graphics.fill(x, y, x + 1, y + 4, accentColor); + graphics.fill(x + w - 4, y, x + w, y + 1, accentColor); + graphics.fill(x + w - 1, y, x + w, y + 4, accentColor); + graphics.fill(x, y + h - 1, x + 4, y + h, accentColor); + graphics.fill(x, y + h - 4, x + 1, y + h, accentColor); + graphics.fill(x + w - 4, y + h - 1, x + w, y + h, accentColor); + graphics.fill(x + w - 1, y + h - 4, x + w, y + h, accentColor); + } + } + + private void drawEnergyArcs(GuiGraphics graphics, int x, int y, int w, int h, float intensity) { + long time = System.currentTimeMillis(); + int centerX = x + w / 2; + int centerY = y + h / 2; + int particleCount = 3 + (int) (intensity * 5); + + for (int i = 0; i < particleCount; i++) { + float particlePhase = ((time / 800f) + i * 0.15f) % 1f; + float angle = (i * 2.39996f) + (time / 2000f); + float edgeX, edgeY; + + if (i % 4 == 0) { + edgeX = x + (w * ((i * 0.37f) % 1f)); + edgeY = y; + } else if (i % 4 == 1) { + edgeX = x + w; + edgeY = y + (h * ((i * 0.37f) % 1f)); + } else if (i % 4 == 2) { + edgeX = x + (w * ((i * 0.37f) % 1f)); + edgeY = y + h; + } else { + edgeX = x; + edgeY = y + (h * ((i * 0.37f) % 1f)); + } + + float progress = particlePhase * particlePhase; + int particleX = (int) Mth.lerp(progress, edgeX, centerX); + int particleY = (int) Mth.lerp(progress, edgeY, centerY); + + float brightness = 0.4f + 0.6f * progress; + int alpha = (int) (brightness * 200 * intensity); + int particleColor = (alpha << 24) | 0xFFFF80; + + int size = 1 + (int) (progress * 2); + graphics.fill(particleX - size, particleY - size, particleX + size, particleY + size, particleColor); + + if (progress > 0.1f) { + float trailProgress = progress - 0.1f; + int trailX = (int) Mth.lerp(trailProgress * trailProgress, edgeX, centerX); + int trailY = (int) Mth.lerp(trailProgress * trailProgress, edgeY, centerY); + int trailAlpha = (int) (alpha * 0.3f); + int trailColor = (trailAlpha << 24) | 0xFFAA40; + graphics.fill(trailX - 1, trailY - 1, trailX + 1, trailY + 1, trailColor); + } + } + } + + private String getButtonText(boolean enabled) { + if (!enabled) { + return "INSUFFICIENT FUEL"; + } else if (isCharging) { + int percent = (int) (chargeProgress * 100); + return "CHARGING... " + percent + "%"; + } else { + return "[ IGNITE STELLAR CORE ]"; + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (!isVisible() || !isMouseOverElement(mouseX, mouseY)) { + return false; + } + + if (button == 0 && canIgnite.getAsBoolean()) { + isCharging = true; + chargeTicks = 0; + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.RESPAWN_ANCHOR_CHARGE, 1.2f, 0.8f)); + return true; + } + return false; + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (button == 0 && isCharging) { + isCharging = false; + if (chargeTicks < CHARGE_TICKS) { + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.FIRE_EXTINGUISH, 1.0f, 0.5f)); + } + return true; + } + return false; + } + + private int lerpColor(int color1, int color2, float t) { + int a1 = (color1 >> 24) & 0xFF; + int r1 = (color1 >> 16) & 0xFF; + int g1 = (color1 >> 8) & 0xFF; + int b1 = color1 & 0xFF; + + int a2 = (color2 >> 24) & 0xFF; + int r2 = (color2 >> 16) & 0xFF; + int g2 = (color2 >> 8) & 0xFF; + int b2 = color2 & 0xFF; + + int a = (int) Mth.lerp(t, a1, a2); + int r = (int) Mth.lerp(t, r1, r2); + int g = (int) Mth.lerp(t, g1, g2); + int b = (int) Mth.lerp(t, b1, b2); + + return (a << 24) | (r << 16) | (g << 8) | b; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/ModuleConfigPopout.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/ModuleConfigPopout.java new file mode 100644 index 000000000..ba423b9fe --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/ModuleConfigPopout.java @@ -0,0 +1,454 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.gregtechceu.gtceu.api.GTValues; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class ModuleConfigPopout extends WidgetGroup { + + public static final int WIDTH = 170; + public static final int HEIGHT = 140; + private static final int TITLE_HEIGHT = 16; + private static final int SETTINGS_BUTTON_SIZE = 24; + private static final ResourceLocation GEAR_TEXTURE = ResourceLocation.fromNamespaceAndPath("gtceu", + "textures/item/material_sets/dull/gear_small.png"); + + private final Supplier machineSupplier; + private final Runnable onClose; + + private int moduleIndex = -1; + private boolean dragging = false; + private double lastDeltaX, lastDeltaY; + + private String moduleName = ""; + private boolean moduleConnected = false; + private boolean moduleWorking = false; + private long energyPerTick = 0; + private double speedBonus = 0; + private Stage irisStage = Stage.EMPTY; + + private int configuredMaxParallel = 1; + private long configuredVoltage = 32; + private int irisParallelLimit = 1; + + private long maxEUt = 0; + private int effectiveParallel = 1; + private int overclockTier = 0; + + private PowerControlPopup powerPopup; + private boolean showingPowerPopup = false; + private java.util.function.BiConsumer onPowerSettingsChanged; + + private float pulsePhase = 0f; + private float appearProgress = 0f; + + public ModuleConfigPopout(int x, int y, Supplier machineSupplier, Runnable onClose) { + super(x, y, WIDTH, HEIGHT); + this.machineSupplier = machineSupplier; + this.onClose = onClose; + setVisible(false); + initPowerPopup(); + } + + private void initPowerPopup() { + powerPopup = new PowerControlPopup(WIDTH + 10, 0, this::hidePowerPopup, this::onPowerSettingsApplied); + addWidget(powerPopup); + } + + public void setOnPowerSettingsChanged(java.util.function.BiConsumer callback) { + this.onPowerSettingsChanged = callback; + } + + private void showPowerPopup() { + showingPowerPopup = true; + powerPopup.show(configuredMaxParallel, configuredVoltage); + } + + private void hidePowerPopup() { + showingPowerPopup = false; + powerPopup.hide(); + } + + private void onPowerSettingsApplied(PowerControlPopup.PowerSettings settings) { + this.configuredMaxParallel = settings.maxParallel(); + this.configuredVoltage = settings.voltagePerParallel(); + + if (onPowerSettingsChanged != null) { + onPowerSettingsChanged.accept(configuredMaxParallel, configuredVoltage); + } + } + + public void showForModule(int index) { + this.moduleIndex = index; + this.appearProgress = 0f; + setVisible(true); + setActive(true); + } + + public void hide() { + setVisible(false); + setActive(false); + moduleIndex = -1; + hidePowerPopup(); + } + + @OnlyIn(Dist.CLIENT) + public void updateModuleData(String name, boolean connected, boolean working, long energy, double speed, + Stage stage, + int maxParallel, long voltage, int irisLimit, + long moduleMaxEUt, int moduleEffectiveParallel, int moduleOverclockTier) { + this.moduleName = name; + this.moduleConnected = connected; + this.moduleWorking = working; + this.energyPerTick = energy; + this.speedBonus = speed; + this.irisStage = stage; + this.configuredMaxParallel = maxParallel; + this.configuredVoltage = voltage; + this.irisParallelLimit = irisLimit; + this.maxEUt = moduleMaxEUt; + this.effectiveParallel = moduleEffectiveParallel; + this.overclockTier = moduleOverclockTier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + pulsePhase += 0.1f; + + if (isVisible() && appearProgress < 1f) { + appearProgress = Math.min(1f, appearProgress + 0.15f); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + if (!isVisible()) return; + + float alpha = appearProgress; + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + int bgAlpha = (int) (0xE0 * alpha); + int bgColor = (bgAlpha << 24) | 0x0c0c14; + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + int gridAlpha = (int) (0x08 * alpha); + int gridColor = (gridAlpha << 24) | 0xFFFFFF; + for (int gx = x + 8; gx < x + w; gx += 8) { + graphics.fill(gx, y, gx + 1, y + h, gridColor); + } + for (int gy = y + 8; gy < y + h; gy += 8) { + graphics.fill(x, gy, x + w, gy + 1, gridColor); + } + + int titleBgAlpha = (int) (0xC0 * alpha); + int titleBgColor = (titleBgAlpha << 24) | 0x101820; + DrawerHelper.drawSolidRect(graphics, x, y, w, TITLE_HEIGHT, titleBgColor); + + int accentColor = getAccentColor(); + int accentAlpha = (int) (0x80 * alpha); + int borderColor = (accentAlpha << 24) | (accentColor & 0x00FFFFFF); + + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + graphics.fill(x + 1, y + TITLE_HEIGHT - 2, x + w - 1, y + TITLE_HEIGHT, borderColor); + + drawTitle(graphics, x, y, w, alpha); + drawContent(graphics, x, y + TITLE_HEIGHT + 4, w, alpha); + drawSettingsButton(graphics, x + w - SETTINGS_BUTTON_SIZE - 4, y + h - SETTINGS_BUTTON_SIZE - 4, mouseX, mouseY, + alpha); + drawCloseButton(graphics, x + w - 14, y + 3, mouseX, mouseY, alpha); + + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + } + + private void drawTitle(GuiGraphics graphics, int x, int y, int w, float alpha) { + var font = Minecraft.getInstance().font; + + String title = moduleName.isEmpty() ? Component.translatable("cosmiccore.stellar.module.config").getString() : + Component.translatable(moduleName).getString(); + int maxWidth = w - 24; + if (font.width(title) > maxWidth) { + while (font.width(title + "...") > maxWidth && title.length() > 1) { + title = title.substring(0, title.length() - 1); + } + title = title + "..."; + } + + int textColor = (int) (0xFF * alpha) << 24 | 0xFFFFFF; + graphics.drawString(font, title, x + 4, y + (TITLE_HEIGHT - font.lineHeight) / 2 + 1, textColor, false); + } + + private void drawContent(GuiGraphics graphics, int x, int y, int w, float alpha) { + var font = Minecraft.getInstance().font; + int labelColor = (int) (0xFF * alpha) << 24 | 0x808090; + int valueColor = (int) (0xFF * alpha) << 24 | 0xDDDDDD; + int accentColor = (int) (0xFF * alpha) << 24 | 0x80C0FF; + + int lineHeight = 11; + int contentX = x + 6; + int valueX = x + 70; + int currentY = y; + + String statusValue; + int statusColor; + if (moduleWorking) { + statusValue = Component.translatable("cosmiccore.stellar.module.status.processing").getString(); + statusColor = 0x44FF44; + } else if (moduleConnected) { + statusValue = Component.translatable("cosmiccore.stellar.module.status.idle").getString(); + statusColor = 0x6090CC; + } else { + statusValue = Component.translatable("cosmiccore.stellar.module.status.offline").getString(); + statusColor = 0xFF5555; + } + statusColor = (int) (0xFF * alpha) << 24 | statusColor; + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.status").getString(), contentX, + currentY, labelColor, false); + graphics.drawString(font, statusValue, valueX, currentY, statusColor, false); + currentY += lineHeight; + + int sepAlpha = (int) (0x30 * alpha); + graphics.fill(contentX, currentY, x + w - 6, currentY + 1, (sepAlpha << 24) | 0x4080FF); + currentY += 4; + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.max_eut").getString(), contentX, + currentY, labelColor, false); + String maxEUtStr = formatEnergy(maxEUt); + graphics.drawString(font, maxEUtStr, valueX, currentY, valueColor, false); + + String tierName = overclockTier < GTValues.VNF.length ? GTValues.VNF[overclockTier] : "MAX"; + int tierColor = getTierColor(overclockTier); + int badgeX = x + w - 6 - font.width(tierName) - 4; + int badgeAlpha = (int) (0x90 * alpha); + graphics.fill(badgeX - 2, currentY - 1, badgeX + font.width(tierName) + 2, currentY + font.lineHeight, + (badgeAlpha << 24) | (tierColor & 0x00333333)); + graphics.drawString(font, tierName, badgeX, currentY, (int) (0xFF * alpha) << 24 | tierColor, false); + currentY += lineHeight; + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.parallel").getString(), contentX, + currentY, labelColor, false); + String parallelStr = effectiveParallel + "x"; + if (effectiveParallel < configuredMaxParallel) { + parallelStr = Component + .translatable("cosmiccore.stellar.module.parallel_max", effectiveParallel, configuredMaxParallel) + .getString(); + } + graphics.drawString(font, parallelStr, valueX, currentY, accentColor, false); + currentY += lineHeight; + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.current").getString(), contentX, + currentY, labelColor, false); + if (energyPerTick > 0) { + String currentEUStr = formatEnergy(energyPerTick); + graphics.drawString(font, currentEUStr, valueX, currentY, (int) (0xFF * alpha) << 24 | 0xFFCC44, false); + } else { + graphics.drawString(font, "---", valueX, currentY, (int) (0x80 * alpha) << 24 | 0x606060, false); + } + currentY += lineHeight; + + graphics.fill(contentX, currentY, x + w - 6, currentY + 1, (sepAlpha << 24) | 0x4080FF); + currentY += 4; + + if (moduleConnected) { + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.speed_bonus").getString(), + contentX, currentY, labelColor, false); + String speedStr = speedBonus > 0 ? String.format("%.1fx", speedBonus) : "1.0x"; + int speedColor = speedBonus > 1.0 ? 0x66FF66 : 0xCCCCCC; + graphics.drawString(font, speedStr, valueX, currentY, (int) (0xFF * alpha) << 24 | speedColor, false); + currentY += lineHeight; + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.iris_limit").getString(), + contentX, currentY, labelColor, false); + graphics.drawString(font, irisParallelLimit + "x", valueX, currentY, valueColor, false); + } else { + int disconnectedColor = (int) (0x80 * alpha) << 24 | 0x808080; + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.not_linked").getString(), + contentX, currentY, disconnectedColor, false); + } + + if (moduleWorking) { + int barY = y + HEIGHT - TITLE_HEIGHT - 14; + int barWidth = w - 12; + float progress = (float) (0.5f + 0.5f * Math.sin(System.currentTimeMillis() / 400.0)); + int fillWidth = (int) (barWidth * progress); + + int barBg = (int) (0x40 * alpha) << 24 | 0x000000; + int barFill = (int) (0xC0 * alpha) << 24 | 0x44FF44; + + graphics.fill(contentX, barY, contentX + barWidth, barY + 3, barBg); + graphics.fill(contentX, barY, contentX + fillWidth, barY + 3, barFill); + } + } + + private int getTierColor(int tier) { + return switch (tier) { + case 0 -> 0x808080; + case 1 -> 0xC0C0C0; + case 2 -> 0x00FFFF; + case 3 -> 0xFFFF00; + case 4 -> 0x0080FF; + case 5 -> 0x8000FF; + case 6 -> 0xFF0080; + case 7 -> 0xFF00FF; + case 8 -> 0x00FF00; + default -> 0xFF4040; + }; + } + + private void drawSettingsButton(GuiGraphics graphics, int x, int y, int mouseX, int mouseY, float alpha) { + int size = SETTINGS_BUTTON_SIZE; + boolean hovered = mouseX >= x && mouseX < x + size && mouseY >= y && mouseY < y + size; + + int bgColor = hovered ? (int) (0xC0 * alpha) << 24 | 0x4080FF : (int) (0x60 * alpha) << 24 | 0x404050; + + graphics.fill(x, y, x + size, y + size, bgColor); + graphics.blit(GEAR_TEXTURE, x, y, 0, 0, size, size, size, size); + } + + private void drawCloseButton(GuiGraphics graphics, int x, int y, int mouseX, int mouseY, float alpha) { + int size = 10; + boolean hovered = mouseX >= x && mouseX < x + size && mouseY >= y && mouseY < y + size; + + int bgColor = hovered ? (int) (0xC0 * alpha) << 24 | 0xFF4444 : (int) (0x60 * alpha) << 24 | 0x404050; + int fgColor = (int) (0xFF * alpha) << 24 | 0xFFFFFF; + + graphics.fill(x, y, x + size, y + size, bgColor); + graphics.fill(x + 2, y + 3, x + 4, y + 7, fgColor); + graphics.fill(x + 6, y + 3, x + 8, y + 7, fgColor); + graphics.fill(x + 3, y + 4, x + 7, y + 6, fgColor); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (!isVisible()) return false; + + if (showingPowerPopup && powerPopup.isVisible()) { + if (powerPopup.mouseClicked(mouseX, mouseY, button)) { + return true; + } + } + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + int settingsX = x + w - SETTINGS_BUTTON_SIZE - 4; + int settingsY = y + h - SETTINGS_BUTTON_SIZE - 4; + if (mouseX >= settingsX && mouseX < settingsX + SETTINGS_BUTTON_SIZE && mouseY >= settingsY && + mouseY < settingsY + SETTINGS_BUTTON_SIZE) { + if (showingPowerPopup) { + hidePowerPopup(); + } else { + showPowerPopup(); + } + playButtonClickSound(); + return true; + } + + int closeX = x + w - 14; + int closeY = y + 3; + if (mouseX >= closeX && mouseX < closeX + 10 && mouseY >= closeY && mouseY < closeY + 10) { + if (onClose != null) { + onClose.run(); + } + hide(); + playButtonClickSound(); + return true; + } + + if (mouseX >= x && mouseX < x + w - 30 && mouseY >= y && mouseY < y + TITLE_HEIGHT) { + dragging = true; + lastDeltaX = 0; + lastDeltaY = 0; + return true; + } + + if (isMouseOverElement(mouseX, mouseY)) { + return true; + } + + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { + double dx = dragX + lastDeltaX; + double dy = dragY + lastDeltaY; + int intDx = (int) dx; + int intDy = (int) dy; + lastDeltaX = dx - intDx; + lastDeltaY = dy - intDy; + + if (dragging) { + addSelfPosition(intDx, intDy); + return true; + } + return super.mouseDragged(mouseX, mouseY, button, dragX, dragY); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (dragging) { + dragging = false; + lastDeltaX = 0; + lastDeltaY = 0; + return true; + } + return super.mouseReleased(mouseX, mouseY, button); + } + + private String formatEnergy(long eu) { + if (eu >= 1_000_000_000) return String.format("%.1fG EU/t", eu / 1_000_000_000.0); + if (eu >= 1_000_000) return String.format("%.1fM EU/t", eu / 1_000_000.0); + if (eu >= 1000) return String.format("%.1fk EU/t", eu / 1000.0); + return String.format("%d EU/t", eu); + } + + private int getAccentColor() { + if (moduleConnected) { + return getStageColorRaw(irisStage); + } + return 0x4080AA; + } + + private int getStageColorRaw(Stage stage) { + return switch (stage) { + case EMPTY -> 0x606060; + case GROWING -> 0x66AAFF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF8844; + case BLACK_HOLE -> 0xAA66FF; + case DEATH -> 0xFF4444; + case DEATH_GRACEFUL -> 0x886666; + }; + } + + public int getModuleIndex() { + return moduleIndex; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/ModuleSelectorWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/ModuleSelectorWidget.java new file mode 100644 index 000000000..6a0f77839 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/ModuleSelectorWidget.java @@ -0,0 +1,484 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarModuleReceiver; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class ModuleSelectorWidget extends Widget { + + public static final int MAX_MODULES = 8; + public static final int INNER_RING_COUNT = 4; + public static final int OUTER_RING_COUNT = 4; + + private final Supplier machineSupplier; + private final Consumer onModuleSelected; + + private final List moduleSlots = new ArrayList<>(); + private float animPhase = 0f; + private int hoveredSlot = -1; + private int selectedSlot = -1; + private float pulsePhase = 0f; + + public ModuleSelectorWidget(int x, int y, int size, Supplier machineSupplier, + Consumer onModuleSelected) { + super(x, y, size, size); + this.machineSupplier = machineSupplier; + this.onModuleSelected = onModuleSelected; + + for (int i = 0; i < MAX_MODULES; i++) { + moduleSlots.add(new ModuleSlotData()); + } + } + + @Override + public void detectAndSendChanges() { + // Always call super and sync data even when not visible + // so that data is ready when we become visible + super.detectAndSendChanges(); + + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + + List modules = new ArrayList<>(machine.getConnectedModules()); + + // Check for changes and sync + boolean changed = false; + for (int i = 0; i < MAX_MODULES; i++) { + ModuleSlotData slot = moduleSlots.get(i); + boolean hasModule = i < modules.size(); + String newName = hasModule ? getModuleName(modules.get(i)) : ""; + boolean newWorking = hasModule && isModuleWorking(modules.get(i)); + + if (slot.populated != hasModule || !slot.moduleName.equals(newName) || slot.working != newWorking) { + slot.populated = hasModule; + slot.moduleName = newName; + slot.working = newWorking; + changed = true; + } + } + + if (changed) { + writeUpdateInfo(200, buf -> { + for (ModuleSlotData slot : moduleSlots) { + buf.writeBoolean(slot.populated); + buf.writeUtf(slot.moduleName); + buf.writeBoolean(slot.working); + } + }); + } + } + + public void forceSync() { + detectAndSendChanges(); + } + + private String getModuleName(IStellarModuleReceiver module) { + if (module instanceof com.gregtechceu.gtceu.api.machine.MetaMachine metaMachine) { + return metaMachine.getBlockState().getBlock().getDescriptionId(); + } + return "Unknown Module"; + } + + private boolean isModuleWorking(IStellarModuleReceiver module) { + if (module instanceof com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine workable) { + return workable.getRecipeLogic().isWorking(); + } + return false; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, RegistryFriendlyByteBuf buffer) { + if (id == 200) { + for (ModuleSlotData slot : moduleSlots) { + slot.populated = buffer.readBoolean(); + slot.moduleName = buffer.readUtf(); + slot.working = buffer.readBoolean(); + } + } else { + super.readUpdateInfo(id, buffer); + } + } + + @Override + public void writeInitialData(RegistryFriendlyByteBuf buffer) { + super.writeInitialData(buffer); + + // Populate slot data before writing + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine != null) { + List modules = new ArrayList<>(machine.getConnectedModules()); + for (int i = 0; i < MAX_MODULES; i++) { + ModuleSlotData slot = moduleSlots.get(i); + boolean hasModule = i < modules.size(); + slot.populated = hasModule; + slot.moduleName = hasModule ? getModuleName(modules.get(i)) : ""; + slot.working = hasModule && isModuleWorking(modules.get(i)); + } + } + + for (ModuleSlotData slot : moduleSlots) { + buffer.writeBoolean(slot.populated); + buffer.writeUtf(slot.moduleName); + buffer.writeBoolean(slot.working); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readInitialData(RegistryFriendlyByteBuf buffer) { + super.readInitialData(buffer); + for (ModuleSlotData slot : moduleSlots) { + slot.populated = buffer.readBoolean(); + slot.moduleName = buffer.readUtf(); + slot.working = buffer.readBoolean(); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + animPhase += 0.02f; + pulsePhase += 0.08f; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int cx = getPosition().x + getSize().width / 2; + int cy = getPosition().y + getSize().height / 2; + int maxRadius = getSize().width / 2 - 5; + + // Draw the two rings + drawRings(graphics, cx, cy, maxRadius); + + // Draw central hub + drawCentralHub(graphics, cx, cy); + + // Draw module slots on both rings + drawModuleSlots(graphics, cx, cy, maxRadius, mouseX, mouseY); + + // Draw connecting lines from hub to slots + drawConnectingLines(graphics, cx, cy, maxRadius); + } + + private int getRingRadius(int ringIndex, int maxRadius) { + // Inner ring at 40% of max, outer ring at 75% of max + // Leaves room for future rings + return switch (ringIndex) { + case 0 -> (int) (maxRadius * 0.40); // Inner ring + case 1 -> (int) (maxRadius * 0.75); // Outer ring + default -> (int) (maxRadius * (0.40 + ringIndex * 0.35)); + }; + } + + private float getCardinalAngle(int slotInRing) { + // Start from top (North = -PI/2), go clockwise + return switch (slotInRing) { + case 0 -> -Mth.HALF_PI; // North (top) + case 1 -> 0f; // East (right) + case 2 -> Mth.HALF_PI; // South (bottom) + case 3 -> Mth.PI; // West (left) + default -> 0f; + }; + } + + private int[] getSlotPosition(int moduleIndex) { + int ring = moduleIndex / INNER_RING_COUNT; + int slotInRing = moduleIndex % INNER_RING_COUNT; + return new int[] { ring, slotInRing }; + } + + private void drawRings(GuiGraphics graphics, int cx, int cy, int maxRadius) { + // Draw both ring circles + int ringColor = 0x60606080; + int ringColorBright = 0x908080A0; + + for (int ringIndex = 0; ringIndex < 2; ringIndex++) { + int ringRadius = getRingRadius(ringIndex, maxRadius); + + // Draw ring circle + for (int angle = 0; angle < 360; angle += 3) { + float rad = angle * Mth.DEG_TO_RAD; + int px = cx + (int) (Mth.cos(rad) * ringRadius); + int py = cy + (int) (Mth.sin(rad) * ringRadius); + + // Brighter at cardinal points + boolean isCardinal = (angle % 90) < 10 || (angle % 90) > 80; + int color = isCardinal ? ringColorBright : ringColor; + graphics.fill(px, py, px + 1, py + 1, color); + } + } + + // Inner glow + int hubRadius = 15; + for (int r = hubRadius + 10; r > hubRadius; r -= 2) { + float progress = (float) (r - hubRadius) / 10f; + int alpha = (int) (20 * (1f - progress)); + int color = (alpha << 24) | 0x101020; + drawCircle(graphics, cx, cy, r, color); + } + } + + private void drawCentralHub(GuiGraphics graphics, int cx, int cy) { + int hubRadius = 15; + + // Hub glow + for (int r = hubRadius + 5; r > hubRadius; r--) { + int alpha = (int) (60 * (1f - (float) (r - hubRadius) / 5f)); + int color = (alpha << 24) | 0x4080AA; + drawCircle(graphics, cx, cy, r, color); + } + + // Hub body + drawCircle(graphics, cx, cy, hubRadius, 0xE0101820); + + // Hub border + int pulseAlpha = (int) (100 + 50 * Mth.sin(pulsePhase)); + int borderColor = (pulseAlpha << 24) | 0x4080AA; + for (int angle = 0; angle < 360; angle += 5) { + float rad = angle * Mth.DEG_TO_RAD; + int px = cx + (int) (Mth.cos(rad) * hubRadius); + int py = cy + (int) (Mth.sin(rad) * hubRadius); + graphics.fill(px, py, px + 1, py + 1, borderColor); + } + + // Hub icon (8 dots for modules) + var font = Minecraft.getInstance().font; + String icon = "\u2699"; // Gear icon + int textWidth = font.width(icon); + graphics.drawString(font, icon, cx - textWidth / 2, cy - font.lineHeight / 2, 0xFF4080AA, false); + } + + private void drawModuleSlots(GuiGraphics graphics, int cx, int cy, int maxRadius, int mouseX, int mouseY) { + int dotSize = 12; + + hoveredSlot = -1; + + for (int i = 0; i < MAX_MODULES; i++) { + // Get ring and position within ring + int[] pos = getSlotPosition(i); + int ringIndex = pos[0]; + int slotInRing = pos[1]; + + // Calculate position + int ringRadius = getRingRadius(ringIndex, maxRadius); + float angle = getCardinalAngle(slotInRing); + + int slotX = cx + (int) (Mth.cos(angle) * ringRadius); + int slotY = cy + (int) (Mth.sin(angle) * ringRadius); + + ModuleSlotData slot = moduleSlots.get(i); + + // Check hover + int dx = mouseX - slotX; + int dy = mouseY - slotY; + boolean hovered = dx * dx + dy * dy <= (dotSize + 2) * (dotSize + 2); + if (hovered) { + hoveredSlot = i; + } + + // Draw slot + drawModuleSlot(graphics, slotX, slotY, dotSize, slot, hovered, i == selectedSlot, ringIndex); + } + } + + private void drawModuleSlot(GuiGraphics graphics, int x, int y, int size, ModuleSlotData slot, + boolean hovered, boolean selected, int ringIndex) { + int halfSize = size / 2; + + // Determine colors - inner ring slightly different tint + int bgColor; + int borderColor; + int glowColor; + + if (slot.populated) { + if (slot.working) { + // Working - green pulse + int pulse = (int) (200 + 55 * Mth.sin(pulsePhase * 2)); + bgColor = 0xE0102010; + borderColor = (pulse << 24) | 0x44FF44; + glowColor = 0x4044FF44; + } else { + // Connected but idle - cyan (inner ring slightly more blue) + bgColor = ringIndex == 0 ? 0xE0101825 : 0xE0101820; + borderColor = ringIndex == 0 ? 0xFF5090BB : 0xFF4080AA; + glowColor = ringIndex == 0 ? 0x505090BB : 0x504080AA; + } + } else { + // Empty slot - more visible + bgColor = 0x90181820; + borderColor = 0x80606070; + glowColor = 0x00000000; + } + + // Hover/selected effects + if (selected) { + borderColor = 0xFFFFFFFF; + glowColor = 0x60FFFFFF; + } else if (hovered) { + borderColor = slot.populated ? 0xFFFFCC44 : 0x80AAAAAA; + glowColor = slot.populated ? 0x40FFCC44 : 0x20AAAAAA; + } + + // Draw glow + if (glowColor != 0) { + for (int r = halfSize + 5; r > halfSize; r--) { + int alpha = (glowColor >> 24) & 0xFF; + alpha = alpha * (halfSize + 5 - r) / 5; + int color = (alpha << 24) | (glowColor & 0x00FFFFFF); + drawCircle(graphics, x, y, r, color); + } + } + + // Draw slot background + drawCircle(graphics, x, y, halfSize, bgColor); + + // Draw border - solid circle + for (int angle = 0; angle < 360; angle += 10) { + float rad = angle * Mth.DEG_TO_RAD; + int px = x + (int) (Mth.cos(rad) * halfSize); + int py = y + (int) (Mth.sin(rad) * halfSize); + graphics.fill(px, py, px + 1, py + 1, borderColor); + } + + // Draw center indicator + if (!slot.populated) { + // Empty slot - small diamond shape + int dimColor = 0x60FFFFFF; + graphics.fill(x, y - 2, x + 1, y + 3, dimColor); + graphics.fill(x - 2, y, x + 3, y + 1, dimColor); + } else { + // Draw working indicator + if (slot.working) { + int indicatorPulse = (int) (255 * (0.5f + 0.5f * Mth.sin(pulsePhase * 3))); + graphics.fill(x - 2, y - 2, x + 3, y + 3, (indicatorPulse << 24) | 0x44FF44); + } else { + graphics.fill(x - 2, y - 2, x + 3, y + 3, 0xC04080AA); + } + } + } + + private void drawConnectingLines(GuiGraphics graphics, int cx, int cy, int maxRadius) { + int hubRadius = 18; + + for (int i = 0; i < MAX_MODULES; i++) { + ModuleSlotData slot = moduleSlots.get(i); + if (!slot.populated) continue; + + // Get ring and position + int[] pos = getSlotPosition(i); + int ringIndex = pos[0]; + int slotInRing = pos[1]; + + int ringRadius = getRingRadius(ringIndex, maxRadius); + float angle = getCardinalAngle(slotInRing); + + // Line from hub edge to slot + int startX = cx + (int) (Mth.cos(angle) * hubRadius); + int startY = cy + (int) (Mth.sin(angle) * hubRadius); + int endX = cx + (int) (Mth.cos(angle) * (ringRadius - 8)); + int endY = cy + (int) (Mth.sin(angle) * (ringRadius - 8)); + + int lineColor = slot.working ? 0xA044FF44 : 0x704080AA; + + // Draw dotted line + int segments = ringIndex == 0 ? 4 : 8; + for (int s = 0; s < segments; s += 2) { + float t1 = (float) s / segments; + float t2 = (float) (s + 1) / segments; + int x1 = (int) (startX + (endX - startX) * t1); + int y1 = (int) (startY + (endY - startY) * t1); + int x2 = (int) (startX + (endX - startX) * t2); + int y2 = (int) (startY + (endY - startY) * t2); + graphics.fill(Math.min(x1, x2), Math.min(y1, y2), + Math.max(x1, x2) + 1, Math.max(y1, y2) + 1, lineColor); + } + } + } + + private void drawCircle(GuiGraphics graphics, int cx, int cy, int radius, int color) { + if (radius <= 0) return; + for (int y = -radius; y <= radius; y++) { + int halfWidth = (int) Math.sqrt(radius * radius - y * y); + graphics.fill(cx - halfWidth, cy + y, cx + halfWidth + 1, cy + y + 1, color); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0 && hoveredSlot >= 0) { + ModuleSlotData slot = moduleSlots.get(hoveredSlot); + if (slot.populated) { + selectedSlot = hoveredSlot; + if (onModuleSelected != null) { + onModuleSelected.accept(hoveredSlot); + } + playButtonClickSound(); + return true; + } + } + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInForeground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInForeground(graphics, mouseX, mouseY, partialTicks); + + // Draw tooltip for hovered slot + if (hoveredSlot >= 0) { + ModuleSlotData slot = moduleSlots.get(hoveredSlot); + List tooltip = new ArrayList<>(); + + if (slot.populated) { + tooltip.add(Component.translatable(slot.moduleName)); + if (slot.working) { + tooltip.add(Component.literal("\u00A7aWorking")); + } else { + tooltip.add(Component.literal("\u00A77Idle")); + } + tooltip.add(Component.literal("\u00A78Click to configure")); + } else { + tooltip.add(Component.literal("\u00A78Empty Slot " + (hoveredSlot + 1))); + } + + graphics.renderTooltip(Minecraft.getInstance().font, tooltip, java.util.Optional.empty(), mouseX, mouseY); + } + } + + public void clearSelection() { + selectedSlot = -1; + } + + public int getSelectedSlot() { + return selectedSlot; + } + + private static class ModuleSlotData { + + boolean populated = false; + String moduleName = ""; + boolean working = false; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/ModuleToggleButton.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/ModuleToggleButton.java new file mode 100644 index 000000000..f3f5c6054 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/ModuleToggleButton.java @@ -0,0 +1,155 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.systems.RenderSystem; + +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class ModuleToggleButton extends Widget { + + private static final ResourceLocation GEAR_TEXTURE = ResourceLocation.fromNamespaceAndPath("gtceu", + "textures/item/material_sets/dull/gear_small.png"); + + private final Consumer onToggle; + private final Supplier stageSupplier; + private boolean showingModules = false; + private boolean hovered = false; + private float hoverProgress = 0f; + private float pulsePhase = 0f; + + public ModuleToggleButton(int x, int y, int width, int height, Consumer onToggle, + Supplier stageSupplier) { + super(x, y, width, height); + this.onToggle = onToggle; + this.stageSupplier = stageSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + pulsePhase += 0.1f; + + if (hovered && hoverProgress < 1f) { + hoverProgress = Math.min(1f, hoverProgress + 0.15f); + } else if (!hovered && hoverProgress > 0f) { + hoverProgress = Math.max(0f, hoverProgress - 0.1f); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + hovered = isMouseOverElement(mouseX, mouseY); + + int bgAlpha = (int) (0xC0 + 0x20 * hoverProgress); + int bgColor = (bgAlpha << 24) | 0x101820; + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + Stage stage = stageSupplier != null ? stageSupplier.get() : Stage.EMPTY; + int accentColor = getStageColor(stage); + int borderAlpha = (int) (0x60 + 0x40 * hoverProgress); + int borderColor = (borderAlpha << 24) | accentColor; + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + drawIcon(graphics, x, y, w, h); + + if (hoverProgress > 0) { + int glowAlpha = (int) (0x20 * hoverProgress); + int glowColor = (glowAlpha << 24) | accentColor; + DrawerHelper.drawBorder(graphics, x - 1, y - 1, w + 2, h + 2, glowColor, 1); + } + } + + private void drawIcon(GuiGraphics graphics, int x, int y, int w, int h) { + Stage stage = stageSupplier != null ? stageSupplier.get() : Stage.EMPTY; + int stageColor = getStageColor(stage); + float pulseAlpha = 0.8f + 0.2f * Mth.sin(pulsePhase); + + float r = ((stageColor >> 16) & 0xFF) / 255f; + float g = ((stageColor >> 8) & 0xFF) / 255f; + float b = (stageColor & 0xFF) / 255f; + + RenderSystem.enableBlend(); + RenderSystem.setShaderColor(r, g, b, pulseAlpha); + + int gearSize = Math.min(w, h) - 4; + int gearX = x + (w - gearSize) / 2; + int gearY = y + (h - gearSize) / 2; + graphics.blit(GEAR_TEXTURE, gearX, gearY, 0, 0, gearSize, gearSize, gearSize, gearSize); + + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + RenderSystem.disableBlend(); + } + + private int getStageColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0x404050; // Gray + case GROWING -> 0x6080FF; // Blue + case STAR -> 0xFFCC44; // Yellow/Gold + case SUPERSTAR -> 0xFF8844; // Orange + case BLACK_HOLE -> 0x8040FF; // Purple + case DEATH -> 0xFF2020; // Red + case DEATH_GRACEFUL -> 0x804040; // Dark red + }; + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0 && isMouseOverElement(mouseX, mouseY)) { + showingModules = !showingModules; + if (onToggle != null) { + onToggle.accept(showingModules); + } + playButtonClickSound(); + return true; + } + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInForeground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInForeground(graphics, mouseX, mouseY, partialTicks); + + if (hovered) { + String tooltipText = showingModules ? "cosmiccore.gui.stellar.show_star" : + "cosmiccore.gui.stellar.show_modules"; + graphics.renderTooltip(Minecraft.getInstance().font, + List.of(Component.translatable(tooltipText)), + java.util.Optional.empty(), mouseX, mouseY); + } + } + + public boolean isShowingModules() { + return showingModules; + } + + public void setShowingModules(boolean showing) { + this.showingModules = showing; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/OrbitalRingsWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/OrbitalRingsWidget.java new file mode 100644 index 000000000..51dc9a0a5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/OrbitalRingsWidget.java @@ -0,0 +1,287 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class OrbitalRingsWidget extends Widget { + + private final Supplier stageSupplier; + private final int centerX; + private final int centerY; + + private float rotationPhase = 0f; + private float wobblePhase = 0f; + private float pulsePhase = 0f; + + public OrbitalRingsWidget(int x, int y, int width, int height, Supplier stageSupplier) { + super(x, y, width, height); + this.stageSupplier = stageSupplier; + this.centerX = width / 2; + this.centerY = height / 2; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + Stage stage = stageSupplier.get(); + float rotSpeed = getRotationSpeed(stage); + + rotationPhase += rotSpeed; + wobblePhase += rotSpeed * 0.7f; + pulsePhase += 0.08f; + } + + private float getRotationSpeed(Stage stage) { + return switch (stage) { + case EMPTY -> 0.005f; + case GROWING -> 0.02f; + case STAR -> 0.015f; + case SUPERSTAR -> 0.03f; + case BLACK_HOLE -> 0.06f; + case DEATH -> 0.1f; + case DEATH_GRACEFUL -> 0.003f; + }; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int cx = x + centerX; + int cy = y + centerY; + + Stage stage = stageSupplier.get(); + int baseColor = getStageColor(stage); + + int ringCount = getRingCount(stage); + for (int ring = 0; ring < ringCount; ring++) { + drawOrbitalRing(graphics, cx, cy, ring, baseColor, stage); + } + + if (stage != Stage.EMPTY && stage != Stage.DEATH_GRACEFUL) { + drawOrbitalParticles(graphics, cx, cy, baseColor, stage); + } + + if (stage == Stage.BLACK_HOLE) { + drawAccretionDisk(graphics, cx, cy); + } + } + + private int getRingCount(Stage stage) { + return switch (stage) { + case EMPTY -> 1; + case GROWING -> 2; + case STAR -> 3; + case SUPERSTAR -> 4; + case BLACK_HOLE -> 5; + case DEATH -> 3; + case DEATH_GRACEFUL -> 2; + }; + } + + private void drawOrbitalRing(GuiGraphics graphics, int cx, int cy, int ringIndex, int baseColor, Stage stage) { + float baseRadius = 25 + ringIndex * 15; + float tilt = 0.3f + ringIndex * 0.1f; + float ringRotation = rotationPhase * (1f + ringIndex * 0.3f) + ringIndex * 1.2f; + float wobble = Mth.sin(wobblePhase + ringIndex * 0.8f) * 0.05f; + + float pulse = Mth.sin(pulsePhase + ringIndex * 0.5f) * 0.2f + 0.8f; + int alpha = (int) (0x40 * pulse); + + if (stage == Stage.DEATH) { + alpha = (int) (alpha * (0.5f + Math.random() * 0.5f)); + baseRadius += (float) (Math.random() - 0.5) * 5; + } + + int color = (alpha << 24) | (baseColor & 0x00FFFFFF); + + int segments = 60; + for (int i = 0; i < segments; i++) { + float angle = ringRotation + (i * Mth.TWO_PI / segments); + float nextAngle = ringRotation + ((i + 1) * Mth.TWO_PI / segments); + + float segmentBrightness = (Mth.sin(angle * 3 + pulsePhase) + 1f) * 0.3f + 0.4f; + int segmentAlpha = (int) (alpha * segmentBrightness); + int segmentColor = (segmentAlpha << 24) | (baseColor & 0x00FFFFFF); + + float x1 = cx + Mth.cos(angle) * baseRadius; + float y1 = cy + Mth.sin(angle) * baseRadius * (tilt + wobble); + float x2 = cx + Mth.cos(nextAngle) * baseRadius; + float y2 = cy + Mth.sin(nextAngle) * baseRadius * (tilt + wobble); + + drawLine(graphics, (int) x1, (int) y1, (int) x2, (int) y2, segmentColor); + } + + if (stage == Stage.STAR || stage == Stage.SUPERSTAR) { + int glowAlpha = alpha / 3; + int glowColor = (glowAlpha << 24) | (baseColor & 0x00FFFFFF); + float glowRadius = baseRadius + 2; + + for (int i = 0; i < segments; i += 2) { + float angle = ringRotation + (i * Mth.TWO_PI / segments); + float gx = cx + Mth.cos(angle) * glowRadius; + float gy = cy + Mth.sin(angle) * glowRadius * tilt; + graphics.fill((int) gx - 1, (int) gy - 1, (int) gx + 2, (int) gy + 2, glowColor); + } + } + } + + private void drawOrbitalParticles(GuiGraphics graphics, int cx, int cy, int baseColor, Stage stage) { + int particleCount = switch (stage) { + case GROWING -> 4; + case STAR -> 6; + case SUPERSTAR -> 10; + case BLACK_HOLE -> 15; + case DEATH -> 8; + default -> 2; + }; + + for (int i = 0; i < particleCount; i++) { + float particleOrbit = 20 + (i * 37) % 50; + float particleSpeed = 1f + (i % 3) * 0.5f; + float particleAngle = rotationPhase * particleSpeed + i * 0.9f; + float particleTilt = 0.2f + (i % 4) * 0.1f; + + float px = cx + Mth.cos(particleAngle) * particleOrbit; + float py = cy + Mth.sin(particleAngle) * particleOrbit * particleTilt; + + float brightness = Mth.sin(pulsePhase + i * 0.7f) * 0.4f + 0.6f; + int alpha = (int) (0xC0 * brightness); + + int particleColor; + if (stage == Stage.BLACK_HOLE) { + float hue = (particleAngle * 0.1f) % 1f; + particleColor = (alpha << 24) | hslToRgb(hue, 0.8f, 0.6f); + } else { + particleColor = (alpha << 24) | (baseColor & 0x00FFFFFF); + } + + int size = 1 + (i % 2); + graphics.fill((int) px - size, (int) py - size, (int) px + size + 1, (int) py + size + 1, particleColor); + + int trailLength = 3; + for (int t = 1; t <= trailLength; t++) { + float trailAngle = particleAngle - t * 0.15f; + float tx = cx + Mth.cos(trailAngle) * particleOrbit; + float ty = cy + Mth.sin(trailAngle) * particleOrbit * particleTilt; + int trailAlpha = alpha / (t + 1); + int trailColor = (trailAlpha << 24) | (baseColor & 0x00FFFFFF); + graphics.fill((int) tx, (int) ty, (int) tx + 1, (int) ty + 1, trailColor); + } + } + } + + private void drawAccretionDisk(GuiGraphics graphics, int cx, int cy) { + float diskRadius = 55; + float innerRadius = 20; + + int diskSegments = 120; + for (int i = 0; i < diskSegments; i++) { + float angle = rotationPhase * 0.3f + i * Mth.TWO_PI / diskSegments; + float radiusVariation = Mth.sin(angle * 8 + pulsePhase * 2) * 5; + float currentRadius = diskRadius + radiusVariation; + + float hue = ((angle + rotationPhase) * 0.15f) % 1f; + float brightness = 0.3f + Mth.sin(angle * 4 + pulsePhase) * 0.2f; + + for (float r = innerRadius; r < currentRadius; r += 3) { + float radialBrightness = 1f - (r - innerRadius) / (currentRadius - innerRadius); + int alpha = (int) (0x30 * radialBrightness * brightness); + int color = (alpha << 24) | hslToRgb(hue, 0.7f, 0.5f + radialBrightness * 0.3f); + + float dx = cx + Mth.cos(angle) * r; + float dy = cy + Mth.sin(angle) * r * 0.25f; + graphics.fill((int) dx, (int) dy, (int) dx + 2, (int) dy + 1, color); + } + } + } + + private void drawLine(GuiGraphics graphics, int x1, int y1, int x2, int y2, int color) { + int dx = Math.abs(x2 - x1); + int dy = Math.abs(y2 - y1); + int sx = x1 < x2 ? 1 : -1; + int sy = y1 < y2 ? 1 : -1; + int err = dx - dy; + + while (true) { + graphics.fill(x1, y1, x1 + 1, y1 + 1, color); + + if (x1 == x2 && y1 == y2) break; + int e2 = 2 * err; + if (e2 > -dy) { + err -= dy; + x1 += sx; + } + if (e2 < dx) { + err += dx; + y1 += sy; + } + } + } + + private int hslToRgb(float h, float s, float l) { + float c = (1 - Math.abs(2 * l - 1)) * s; + float x = c * (1 - Math.abs((h * 6) % 2 - 1)); + float m = l - c / 2; + + float r, g, b; + if (h < 1f / 6) { + r = c; + g = x; + b = 0; + } else if (h < 2f / 6) { + r = x; + g = c; + b = 0; + } else if (h < 3f / 6) { + r = 0; + g = c; + b = x; + } else if (h < 4f / 6) { + r = 0; + g = x; + b = c; + } else if (h < 5f / 6) { + r = x; + g = 0; + b = c; + } else { + r = c; + g = 0; + b = x; + } + + int ri = (int) ((r + m) * 255); + int gi = (int) ((g + m) * 255); + int bi = (int) ((b + m) * 255); + + return (ri << 16) | (gi << 8) | bi; + } + + private int getStageColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0x506080; + case GROWING -> 0x80A0FF; + case STAR -> 0xFFDD66; + case SUPERSTAR -> 0xFF9944; + case BLACK_HOLE -> 0xBB66FF; + case DEATH -> 0xFF4040; + case DEATH_GRACEFUL -> 0x806060; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PowerControlPopup.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PowerControlPopup.java new file mode 100644 index 000000000..2752985c3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PowerControlPopup.java @@ -0,0 +1,303 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.utils.GTUtil; + +import com.lowdragmc.lowdraglib.gui.texture.ColorBorderTexture; +import com.lowdragmc.lowdraglib.gui.texture.ColorRectTexture; +import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.TextFieldWidget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.Consumer; + +import javax.annotation.Nonnull; + +public class PowerControlPopup extends WidgetGroup { + + public static final int WIDTH = 150; + public static final int HEIGHT = 90; + private static final int TITLE_HEIGHT = 16; + private static final int FIELD_HEIGHT = 20; + + private final Runnable onClose; + private final Consumer onApply; + + private int maxParallel = 1; + private long voltagePerParallel = 32; + + private TextFieldWidget parallelField; + private TextFieldWidget voltageField; + + private boolean dragging = false; + private double lastDeltaX, lastDeltaY; + private float appearProgress = 0f; + + public PowerControlPopup(int x, int y, Runnable onClose, Consumer onApply) { + super(x, y, WIDTH, HEIGHT); + this.onClose = onClose; + this.onApply = onApply; + setVisible(false); + initFields(); + } + + private void initFields() { + int fieldX = 6; + int fieldWidth = WIDTH - 12; + int labelY = TITLE_HEIGHT + 4; + + parallelField = new TextFieldWidget(fieldX, labelY + 12, fieldWidth - 12, FIELD_HEIGHT - 4, + () -> String.valueOf(maxParallel), + this::onParallelChanged); + parallelField.setClientSideWidget(); + parallelField.setNumbersOnly(1, Integer.MAX_VALUE); + parallelField.setMaxStringLength(10); + parallelField.setBackground(new GuiTextureGroup( + new ColorRectTexture(0xE0101018), + new ColorBorderTexture(1, 0xFF404060))); + addWidget(parallelField); + + int voltageY = labelY + FIELD_HEIGHT + 16; + voltageField = new TextFieldWidget(fieldX, voltageY + 12, fieldWidth - 12, FIELD_HEIGHT - 4, + () -> String.valueOf(voltagePerParallel), + this::onVoltageChanged); + voltageField.setClientSideWidget(); + voltageField.setNumbersOnly(1L, Long.MAX_VALUE); + voltageField.setMaxStringLength(20); + voltageField.setBackground(new GuiTextureGroup( + new ColorRectTexture(0xE0101018), + new ColorBorderTexture(1, 0xFF404060))); + addWidget(voltageField); + } + + public void show(int parallel, long voltage) { + this.maxParallel = parallel; + this.voltagePerParallel = voltage; + this.appearProgress = 0f; + setVisible(true); + setActive(true); + + if (parallelField != null) { + parallelField.setCurrentString(String.valueOf(parallel)); + } + if (voltageField != null) { + voltageField.setCurrentString(String.valueOf(voltage)); + } + } + + public void hide() { + setVisible(false); + setActive(false); + } + + private void onParallelChanged(String text) { + try { + int value = Integer.parseInt(text); + maxParallel = Math.max(1, value); + applySettings(); + } catch (NumberFormatException ignored) {} + } + + private void onVoltageChanged(String text) { + try { + long value = Long.parseLong(text); + voltagePerParallel = Math.max(1, value); + applySettings(); + } catch (NumberFormatException ignored) {} + } + + private void applySettings() { + if (onApply != null) { + onApply.accept(new PowerSettings(maxParallel, voltagePerParallel)); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + if (isVisible() && appearProgress < 1f) { + appearProgress = Math.min(1f, appearProgress + 0.15f); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + if (!isVisible()) return; + + float alpha = appearProgress; + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + int bgAlpha = (int) (0xE8 * alpha); + int bgColor = (bgAlpha << 24) | 0x0c0c14; + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + int gridAlpha = (int) (0x08 * alpha); + int gridColor = (gridAlpha << 24) | 0xFFFFFF; + for (int gx = x + 8; gx < x + w; gx += 8) { + graphics.fill(gx, y, gx + 1, y + h, gridColor); + } + for (int gy = y + 8; gy < y + h; gy += 8) { + graphics.fill(x, gy, x + w, gy + 1, gridColor); + } + + int titleBgAlpha = (int) (0xD0 * alpha); + int titleBgColor = (titleBgAlpha << 24) | 0x101820; + DrawerHelper.drawSolidRect(graphics, x, y, w, TITLE_HEIGHT, titleBgColor); + + int borderAlpha = (int) (0x80 * alpha); + int borderColor = (borderAlpha << 24) | 0x4080FF; + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + graphics.fill(x + 1, y + TITLE_HEIGHT - 2, x + w - 1, y + TITLE_HEIGHT, borderColor); + + drawTitle(graphics, x, y, w, alpha); + drawLabels(graphics, x, y, alpha); + drawCloseButton(graphics, x + w - 14, y + 3, mouseX, mouseY, alpha); + drawTierIndicator(graphics, x, y, alpha); + + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + } + + private void drawTitle(GuiGraphics graphics, int x, int y, int w, float alpha) { + var font = Minecraft.getInstance().font; + String title = Component.translatable("cosmiccore.stellar.power.title").getString(); + int textColor = (int) (0xFF * alpha) << 24 | 0xFFFFFF; + graphics.drawString(font, title, x + 4, y + (TITLE_HEIGHT - font.lineHeight) / 2 + 1, textColor, false); + } + + private void drawLabels(GuiGraphics graphics, int x, int y, float alpha) { + var font = Minecraft.getInstance().font; + int labelColor = (int) (0xFF * alpha) << 24 | 0xA0A0B0; + + int labelY = y + TITLE_HEIGHT + 4; + graphics.drawString(font, Component.translatable("cosmiccore.stellar.power.max_parallel").getString(), x + 6, + labelY, labelColor, false); + + int voltageY = labelY + FIELD_HEIGHT + 16; + graphics.drawString(font, Component.translatable("cosmiccore.stellar.power.voltage_per_parallel").getString(), + x + 6, voltageY, labelColor, false); + } + + private void drawTierIndicator(GuiGraphics graphics, int x, int y, float alpha) { + var font = Minecraft.getInstance().font; + int tier = GTUtil.getTierByVoltage(voltagePerParallel); + String tierName = GTValues.VNF[Math.min(tier, GTValues.VNF.length - 1)]; + + int labelY = y + TITLE_HEIGHT + 4 + FIELD_HEIGHT + 16; + int badgeX = x + WIDTH - 6 - font.width(tierName) - 4; + + int tierColor = getTierColor(tier); + int badgeAlpha = (int) (0x80 * alpha); + int badgeBgColor = (badgeAlpha << 24) | (tierColor & 0x00FFFFFF); + + graphics.fill(badgeX - 2, labelY - 1, badgeX + font.width(tierName) + 2, labelY + font.lineHeight + 1, + badgeBgColor); + int textColor = (int) (0xFF * alpha) << 24 | 0xFFFFFF; + graphics.drawString(font, tierName, badgeX, labelY, textColor, false); + } + + private int getTierColor(int tier) { + return switch (tier) { + case 0 -> 0x808080; + case 1 -> 0xC0C0C0; + case 2 -> 0x00FFFF; + case 3 -> 0xFFFF00; + case 4 -> 0x0080FF; + case 5 -> 0x8000FF; + case 6 -> 0xFF0080; + case 7 -> 0xFF00FF; + case 8 -> 0x00FF00; + default -> 0xFF4040; + }; + } + + private void drawCloseButton(GuiGraphics graphics, int x, int y, int mouseX, int mouseY, float alpha) { + int size = 10; + boolean hovered = mouseX >= x && mouseX < x + size && mouseY >= y && mouseY < y + size; + + int bgColor = hovered ? (int) (0xC0 * alpha) << 24 | 0xFF4444 : (int) (0x60 * alpha) << 24 | 0x404050; + int fgColor = (int) (0xFF * alpha) << 24 | 0xFFFFFF; + + graphics.fill(x, y, x + size, y + size, bgColor); + graphics.fill(x + 2, y + 3, x + 4, y + 7, fgColor); + graphics.fill(x + 6, y + 3, x + 8, y + 7, fgColor); + graphics.fill(x + 3, y + 4, x + 7, y + 6, fgColor); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (!isVisible()) return false; + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + + int closeX = x + w - 14; + int closeY = y + 3; + if (mouseX >= closeX && mouseX < closeX + 10 && mouseY >= closeY && mouseY < closeY + 10) { + if (onClose != null) { + onClose.run(); + } + hide(); + playButtonClickSound(); + return true; + } + + if (mouseX >= x && mouseX < x + w && mouseY >= y && mouseY < y + TITLE_HEIGHT) { + dragging = true; + lastDeltaX = 0; + lastDeltaY = 0; + return true; + } + + if (isMouseOverElement(mouseX, mouseY)) { + return super.mouseClicked(mouseX, mouseY, button); + } + + return false; + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { + double dx = dragX + lastDeltaX; + double dy = dragY + lastDeltaY; + int intDx = (int) dx; + int intDy = (int) dy; + lastDeltaX = dx - intDx; + lastDeltaY = dy - intDy; + + if (dragging) { + addSelfPosition(intDx, intDy); + return true; + } + return super.mouseDragged(mouseX, mouseY, button, dragX, dragY); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (dragging) { + dragging = false; + lastDeltaX = 0; + lastDeltaY = 0; + return true; + } + return super.mouseReleased(mouseX, mouseY, button); + } + + public record PowerSettings(int maxParallel, long voltagePerParallel) {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PrestigeAnimationOverlay.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PrestigeAnimationOverlay.java new file mode 100644 index 000000000..33f1de318 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PrestigeAnimationOverlay.java @@ -0,0 +1,741 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class PrestigeAnimationOverlay extends Widget { + + private static final int UPDATE_ID_ANIMATION_STATE = 400; + + private static final int PHASE_DESTABILIZE = 50; + private static final int PHASE_COLLAPSE = 70; + private static final int PHASE_SINGULARITY = 15; + private static final int PHASE_SHOCKWAVE = 50; + private static final int PHASE_FADE = 15; + private static final int PHASE_TRANSCENDENCE = 20; + private static final int TOTAL_TICKS = PHASE_DESTABILIZE + PHASE_COLLAPSE + + PHASE_SINGULARITY + PHASE_SHOCKWAVE + PHASE_FADE + PHASE_TRANSCENDENCE; + + // Star position within the widget (based on StellarIrisWidget layout) + private static final int STAR_X = 100; + private static final int STAR_Y = 80; + + private final Supplier machineSupplier; + private final Runnable onAnimationComplete; + private final Runnable onShowPrestigeWindow; + private final Random random = new Random(); + + private StellarCoreWidget coreWidget; + private boolean active = false; + private int tick = 0; + private int pointsEarned = 0; + private int starColor = 0xFFCC44; + + private float starScale = 1f; + private float starAlpha = 1f; + private float shake = 0f; + private float shakeX = 0f; + private float shakeY = 0f; + private float distortion = 0f; + private float glitch = 0f; + + private final List tendrils = new ArrayList<>(); + private final List particles = new ArrayList<>(); + private final List shockwaves = new ArrayList<>(); + private final List lightning = new ArrayList<>(); + private final List debris = new ArrayList<>(); + + private int[] glitchOffsets = new int[12]; + private boolean[] scanlines = new boolean[30]; + + public PrestigeAnimationOverlay(int x, int y, int width, int height, + Supplier machineSupplier, + Runnable onAnimationComplete, + Runnable onShowPrestigeWindow) { + super(x, y, width, height); + this.machineSupplier = machineSupplier; + this.onAnimationComplete = onAnimationComplete; + this.onShowPrestigeWindow = onShowPrestigeWindow; + } + + public void setCoreWidget(StellarCoreWidget coreWidget) { + this.coreWidget = coreWidget; + } + + public void startAnimation(Stage currentStage, int starColor, int points) { + active = true; + tick = 0; + pointsEarned = points; + this.starColor = starColor != -1 ? starColor : 0xFFCC44; + + starScale = 1f; + starAlpha = 1f; + shake = 0f; + distortion = 0f; + glitch = 0f; + + tendrils.clear(); + particles.clear(); + shockwaves.clear(); + lightning.clear(); + debris.clear(); + + if (coreWidget != null) { + coreWidget.setPrestigeAnimating(true); + coreWidget.setPrestigeScale(1f); + coreWidget.setPrestigeAlpha(1f); + } + + randomizeGlitch(); + playSound(SoundEvents.WARDEN_HEARTBEAT, 0.5f, 0.8f); + playSound(SoundEvents.AMBIENT_CAVE.value(), 1.0f, 0.5f); + } + + private void randomizeGlitch() { + for (int i = 0; i < glitchOffsets.length; i++) { + glitchOffsets[i] = random.nextInt(30) - 15; + } + for (int i = 0; i < scanlines.length; i++) { + scanlines[i] = random.nextFloat() < 0.4f; + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + if (!active) return; + + tick++; + + if (shake > 0) { + shakeX = (random.nextFloat() - 0.5f) * 2 * shake; + shakeY = (random.nextFloat() - 0.5f) * 2 * shake; + } else { + shakeX = 0; + shakeY = 0; + } + + int t = tick; + if (t <= PHASE_DESTABILIZE) { + tickDestabilize(t); + } else if (t <= PHASE_DESTABILIZE + PHASE_COLLAPSE) { + tickCollapse(t - PHASE_DESTABILIZE); + } else if (t <= PHASE_DESTABILIZE + PHASE_COLLAPSE + PHASE_SINGULARITY) { + tickSingularity(t - PHASE_DESTABILIZE - PHASE_COLLAPSE); + } else if (t <= PHASE_DESTABILIZE + PHASE_COLLAPSE + PHASE_SINGULARITY + PHASE_SHOCKWAVE) { + tickShockwave(t - PHASE_DESTABILIZE - PHASE_COLLAPSE - PHASE_SINGULARITY); + } else if (t <= PHASE_DESTABILIZE + PHASE_COLLAPSE + PHASE_SINGULARITY + PHASE_SHOCKWAVE + PHASE_FADE) { + tickFade(t - PHASE_DESTABILIZE - PHASE_COLLAPSE - PHASE_SINGULARITY - PHASE_SHOCKWAVE); + } else if (t <= TOTAL_TICKS) { + tickTranscendence( + t - PHASE_DESTABILIZE - PHASE_COLLAPSE - PHASE_SINGULARITY - PHASE_SHOCKWAVE - PHASE_FADE); + } else { + finish(); + } + + tendrils.removeIf(p -> { + p.tick(); + return p.dead(); + }); + particles.removeIf(p -> { + p.tick(); + return p.dead(); + }); + shockwaves.removeIf(p -> { + p.tick(); + return p.dead(); + }); + lightning.removeIf(p -> { + p.tick(); + return p.dead(); + }); + debris.removeIf(p -> { + p.tick(); + return p.dead(); + }); + + if (coreWidget != null) { + coreWidget.setPrestigeScale(starScale); + coreWidget.setPrestigeAlpha(starAlpha); + } + + if (glitch > 0 && tick % 2 == 0) { + randomizeGlitch(); + } + } + + private void tickDestabilize(int t) { + float p = (float) t / PHASE_DESTABILIZE; + shake = p * 8f; + + float flicker = Mth.sin(t * 0.8f) * 0.15f + Mth.sin(t * 1.7f) * 0.1f + Mth.sin(t * 3.3f) * 0.05f; + starScale = 1f + flicker * (1f + p); + glitch = p * 0.8f; + + if (random.nextFloat() < p * 0.3f) spawnLightning(); + + if (t == 1) playSound(SoundEvents.BEACON_DEACTIVATE, 0.5f, 0.6f); + if (t == 20) playSound(SoundEvents.WARDEN_SONIC_CHARGE, 0.7f, 0.5f); + if (t == 40) playSound(SoundEvents.WARDEN_SONIC_CHARGE, 0.9f, 0.7f); + if (random.nextFloat() < 0.1f * p) { + playSound(SoundEvents.LIGHTNING_BOLT_THUNDER, 0.3f + p * 0.3f, 0.5f + random.nextFloat() * 0.5f); + } + } + + private void tickCollapse(int t) { + float p = (float) t / PHASE_COLLAPSE; + float eased = p * p * p; + + starScale = 1.2f * (1f - eased * 0.95f); + distortion = eased * 1.5f; + shake = 8f * (1f - eased * 0.5f) + eased * 15f * (1f - p); + glitch = 0.8f * (1f - eased); + + if (t % 3 == 0 && tendrils.size() < 20) spawnTendril(); + if (t % 2 == 0) { + for (int i = 0; i < 3; i++) spawnParticle(); + } + + if (t == 1) playSound(SoundEvents.WARDEN_SONIC_BOOM, 0.6f, 0.3f); + if (t == 30) playSound(SoundEvents.WARDEN_SONIC_CHARGE, 1.0f, 0.8f); + if (t == 60) playSound(SoundEvents.WARDEN_SONIC_CHARGE, 1.0f, 1.2f); + if (t % 10 == 0) playSound(SoundEvents.WARDEN_HEARTBEAT, 0.4f + p * 0.4f, 0.5f + p * 0.5f); + } + + private void tickSingularity(int t) { + float p = (float) t / PHASE_SINGULARITY; + starScale = 0.05f * (1f - p); + distortion = 1.5f * (1f - p * 0.5f); + shake = 20f * (1f - p); + + if (t == 1) { + playSound(SoundEvents.GENERIC_EXPLODE.value(), 1.0f, 0.3f); + playSound(SoundEvents.WARDEN_SONIC_BOOM, 1.0f, 0.5f); + playSound(SoundEvents.END_PORTAL_SPAWN, 0.8f, 0.5f); + } + } + + private void tickShockwave(int t) { + float p = (float) t / PHASE_SHOCKWAVE; + starScale = 0f; + starAlpha = 0f; + + if (t == 1) { + spawnShockwave(1.0f, 0xFFFFFFFF); + playSound(SoundEvents.DRAGON_FIREBALL_EXPLODE, 0.8f, 0.6f); + spawnDebris(40); + } + if (t == 8) spawnShockwave(0.8f, starColor | 0xFF000000); + if (t == 16) spawnShockwave(0.6f, 0xFF80A0FF); + if (t == 24) spawnShockwave(0.4f, 0xFF4060FF); + + shake = 12f * (1f - p); + distortion = 1.0f * (1f - p * p); + + if (t % 5 == 0 && t < 30) spawnDebris(5); + } + + private void tickFade(int t) { + float p = (float) t / PHASE_FADE; + starScale = 0f; + starAlpha = 0f; + distortion = 0f; + shake = 2f * (1f - p); + + if (t == 1) playSound(SoundEvents.SOUL_ESCAPE.value(), 0.8f, 0.5f); + } + + private void tickTranscendence(int t) { + shake = 0f; + distortion = 0f; + + if (t == 1) { + onShowPrestigeWindow.run(); + playSound(SoundEvents.UI_TOAST_CHALLENGE_COMPLETE, 1.0f, 1.0f); + playSound(SoundEvents.PLAYER_LEVELUP, 0.8f, 0.8f); + } + } + + private void finish() { + active = false; + if (coreWidget != null) coreWidget.setPrestigeAnimating(false); + onAnimationComplete.run(); + } + + private void spawnTendril() { + float angle = random.nextFloat() * Mth.TWO_PI; + float dist = 80 + random.nextFloat() * 60; + tendrils.add(new Tendril( + STAR_X + Mth.cos(angle) * dist, + STAR_Y + Mth.sin(angle) * dist, + STAR_X, STAR_Y, starColor)); + } + + private void spawnParticle() { + float angle = random.nextFloat() * Mth.TWO_PI; + float dist = 25 + random.nextFloat() * 50; + particles.add(new Particle( + STAR_X + Mth.cos(angle) * dist, + STAR_Y + Mth.sin(angle) * dist, + STAR_X, STAR_Y, starColor)); + } + + private void spawnShockwave(float intensity, int color) { + shockwaves.add(new Shockwave(STAR_X, STAR_Y, intensity, color)); + } + + private void spawnLightning() { + float a1 = random.nextFloat() * Mth.TWO_PI; + float a2 = a1 + Mth.PI * (0.3f + random.nextFloat() * 0.4f); + float dist = 35 + random.nextFloat() * 35; + lightning.add(new Lightning( + STAR_X + Mth.cos(a1) * dist, STAR_Y + Mth.sin(a1) * dist, + STAR_X + Mth.cos(a2) * dist, STAR_Y + Mth.sin(a2) * dist)); + } + + private void spawnDebris(int count) { + for (int i = 0; i < count; i++) { + float angle = random.nextFloat() * Mth.TWO_PI; + float speed = 3f + random.nextFloat() * 8f; + debris.add(new Debris(STAR_X, STAR_Y, angle, speed, starColor)); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInForeground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInForeground(graphics, mouseX, mouseY, partialTicks); + if (!active) return; + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + graphics.pose().pushPose(); + graphics.pose().translate(shakeX, shakeY, 0); + + if (distortion > 0) drawDistortion(graphics, x, y); + + for (Tendril t : tendrils) t.draw(graphics, x, y); + for (Particle p : particles) p.draw(graphics, x, y); + for (Lightning l : lightning) l.draw(graphics, x, y); + for (Shockwave s : shockwaves) s.draw(graphics, x, y); + for (Debris d : debris) d.draw(graphics, x, y); + + if (glitch > 0) drawGlitch(graphics, x, y, w, h); + drawVignette(graphics, x, y, w, h); + + graphics.pose().popPose(); + } + + private void drawDistortion(GuiGraphics graphics, int ox, int oy) { + int cx = ox + STAR_X; + int cy = oy + STAR_Y; + + for (int i = 0; i < 24; i++) { + float angle = i * Mth.TWO_PI / 24; + float outer = 100; + float inner = 15 * (1f - distortion * 0.8f); + + int x1 = cx + (int) (Mth.cos(angle) * outer); + int y1 = cy + (int) (Mth.sin(angle) * outer); + int x2 = cx + (int) (Mth.cos(angle) * inner); + int y2 = cy + (int) (Mth.sin(angle) * inner); + + int alpha = (int) (50 * distortion); + drawLine(graphics, x1, y1, x2, y2, (alpha << 24) | 0x8080FF); + } + + for (int ring = 0; ring < 5; ring++) { + float radius = (80 - ring * 14) * (1f - distortion * 0.3f * (5 - ring) / 5f); + int alpha = (int) (40 * distortion); + drawRing(graphics, cx, cy, (int) radius, (alpha << 24) | 0x6060C0); + } + } + + private void drawGlitch(GuiGraphics graphics, int x, int y, int w, int h) { + for (int i = 0; i < scanlines.length; i++) { + if (scanlines[i] && random.nextFloat() < glitch) { + int sy = y + (h * i / scanlines.length); + int sh = h / scanlines.length; + int off = glitchOffsets[i % glitchOffsets.length]; + int a = (int) (50 * glitch); + + graphics.fill(x + off - 3, sy, x + w + off - 3, sy + sh, (a << 24) | 0xFF0000); + graphics.fill(x - off + 3, sy, x + w - off + 3, sy + sh, (a << 24) | 0x00FFFF); + } + } + + if (random.nextFloat() < glitch * 0.4f) { + int a = (int) (80 * glitch * random.nextFloat()); + graphics.fill(x, y, x + w, y + h, (a << 24) | 0xFFFFFF); + } + + if (glitch > 0.3f) { + int count = (int) (100 * glitch); + for (int i = 0; i < count; i++) { + int nx = x + random.nextInt(w); + int ny = y + random.nextInt(h); + int size = 1 + random.nextInt(3); + int gray = random.nextInt(256); + int a = (int) (150 * glitch); + graphics.fill(nx, ny, nx + size, ny + size, (a << 24) | (gray << 16) | (gray << 8) | gray); + } + } + + for (int row = 0; row < h; row += 4) { + if (random.nextFloat() < glitch * 0.15f) { + int a = (int) (40 * glitch); + int off = random.nextInt(20) - 10; + graphics.fill(x + off, y + row, x + w + off, y + row + 2, (a << 24)); + } + } + } + + private void drawVignette(GuiGraphics graphics, int x, int y, int w, int h) { + float strength = 0.4f + shake * 0.02f + distortion * 0.2f; + int edgeAlpha = (int) (150 * strength); + int edgeSize = h / 4; + + for (int row = 0; row < edgeSize; row++) { + int a = (int) (edgeAlpha * (1f - (float) row / edgeSize)); + graphics.fill(x, y + row, x + w, y + row + 1, a << 24); + graphics.fill(x, y + h - 1 - row, x + w, y + h - row, a << 24); + } + + for (int col = 0; col < edgeSize; col++) { + int a = (int) (edgeAlpha * (1f - (float) col / edgeSize) * 0.5f); + graphics.fill(x + col, y, x + col + 1, y + h, a << 24); + graphics.fill(x + w - 1 - col, y, x + w - col, y + h, a << 24); + } + } + + private void drawLine(GuiGraphics g, int x1, int y1, int x2, int y2, int color) { + int dx = Math.abs(x2 - x1), dy = Math.abs(y2 - y1); + int sx = x1 < x2 ? 1 : -1, sy = y1 < y2 ? 1 : -1; + int err = dx - dy; + + while (true) { + g.fill(x1, y1, x1 + 1, y1 + 1, color); + if (x1 == x2 && y1 == y2) break; + int e2 = 2 * err; + if (e2 > -dy) { + err -= dy; + x1 += sx; + } + if (e2 < dx) { + err += dx; + y1 += sy; + } + } + } + + private void drawRing(GuiGraphics g, int cx, int cy, int radius, int color) { + for (int a = 0; a < 360; a += 4) { + float rad = a * Mth.DEG_TO_RAD; + int px = cx + (int) (Mth.cos(rad) * radius); + int py = cy + (int) (Mth.sin(rad) * radius); + g.fill(px, py, px + 1, py + 1, color); + } + } + + private void playSound(net.minecraft.sounds.SoundEvent sound, float volume, float pitch) { + Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(sound, pitch, volume)); + } + + // Particle classes + + private class Tendril { + + float sx, sy, ex, ey; + int color; + float[] offsets = new float[8]; + int age = 0; + + Tendril(float sx, float sy, float ex, float ey, int color) { + this.sx = sx; + this.sy = sy; + this.ex = ex; + this.ey = ey; + this.color = color; + for (int i = 0; i < offsets.length; i++) offsets[i] = (random.nextFloat() - 0.5f) * 20; + } + + void tick() { + age++; + for (int i = 0; i < offsets.length; i++) { + offsets[i] += (random.nextFloat() - 0.5f) * 4; + offsets[i] *= 0.9f; + } + } + + boolean dead() { + return age >= 40; + } + + void draw(GuiGraphics g, int ox, int oy) { + float alpha = (1f - age / 40f) * 0.8f; + int a = (int) (alpha * 255); + int c = (a << 24) | (color & 0xFFFFFF); + + for (int i = 0; i < offsets.length - 1; i++) { + float t1 = (float) i / offsets.length; + float t2 = (float) (i + 1) / offsets.length; + float x1 = Mth.lerp(t1, sx, ex) + offsets[i] * (1f - t1); + float y1 = Mth.lerp(t1, sy, ey) + offsets[i] * 0.5f * (1f - t1); + float x2 = Mth.lerp(t2, sx, ex) + offsets[i + 1] * (1f - t2); + float y2 = Mth.lerp(t2, sy, ey) + offsets[i + 1] * 0.5f * (1f - t2); + drawLine(g, ox + (int) x1, oy + (int) y1, ox + (int) x2, oy + (int) y2, c); + } + } + } + + private class Particle { + + float x, y, tx, ty, speed; + int color, size, age = 0; + + Particle(float x, float y, float tx, float ty, int color) { + this.x = x; + this.y = y; + this.tx = tx; + this.ty = ty; + this.color = color; + this.speed = 0.05f + random.nextFloat() * 0.1f; + this.size = 1 + random.nextInt(3); + } + + void tick() { + age++; + float dx = tx - x, dy = ty - y; + x += dx * speed; + y += dy * speed; + speed *= 1.1f; + } + + boolean dead() { + float dist = Mth.sqrt((tx - x) * (tx - x) + (ty - y) * (ty - y)); + return age >= 30 || dist < 3; + } + + void draw(GuiGraphics g, int ox, int oy) { + int a = (int) ((1f - age / 30f) * 200); + int c = (a << 24) | (color & 0xFFFFFF); + g.fill(ox + (int) x - size / 2, oy + (int) y - size / 2, + ox + (int) x + size / 2 + 1, oy + (int) y + size / 2 + 1, c); + } + } + + private class Shockwave { + + float cx, cy, radius = 0, intensity, speed = 8f; + int color; + + Shockwave(float cx, float cy, float intensity, int color) { + this.cx = cx; + this.cy = cy; + this.intensity = intensity; + this.color = color; + } + + void tick() { + radius += speed; + speed *= 0.98f; + } + + boolean dead() { + return radius >= 200; + } + + void draw(GuiGraphics g, int ox, int oy) { + float p = radius / 200f; + int a = (int) (intensity * (1f - p) * 255); + + for (int t = 0; t < 3; t++) { + int r = (int) radius - t * 2; + int ra = a - t * 30; + if (r > 0 && ra > 0) { + drawRing(g, ox + (int) cx, oy + (int) cy, r, (ra << 24) | (color & 0xFFFFFF)); + } + } + } + } + + private class Lightning { + + float x1, y1, x2, y2; + float[] offsets = new float[6]; + int age = 0; + + Lightning(float x1, float y1, float x2, float y2) { + this.x1 = x1; + this.y1 = y1; + this.x2 = x2; + this.y2 = y2; + regen(); + } + + void regen() { + for (int i = 0; i < offsets.length; i++) offsets[i] = (random.nextFloat() - 0.5f) * 15; + } + + void tick() { + age++; + if (age % 2 == 0) regen(); + } + + boolean dead() { + return age >= 8; + } + + void draw(GuiGraphics g, int ox, int oy) { + float alpha = 1f - age / 8f; + int a = (int) (alpha * 255); + int c = (a << 24) | 0xAADDFF; + int glow = ((a / 2) << 24) | 0x4488FF; + + int segs = offsets.length + 1; + for (int i = 0; i < segs; i++) { + float t1 = (float) i / segs, t2 = (float) (i + 1) / segs; + float px1 = Mth.lerp(t1, x1, x2), py1 = Mth.lerp(t1, y1, y2); + float px2 = Mth.lerp(t2, x1, x2), py2 = Mth.lerp(t2, y1, y2); + + if (i < offsets.length) { + float perpX = -(y2 - y1), perpY = (x2 - x1); + float len = Mth.sqrt(perpX * perpX + perpY * perpY); + if (len > 0) { + perpX /= len; + perpY /= len; + } + px1 += perpX * offsets[i]; + py1 += perpY * offsets[i]; + } + if (i + 1 < offsets.length) { + float perpX = -(y2 - y1), perpY = (x2 - x1); + float len = Mth.sqrt(perpX * perpX + perpY * perpY); + if (len > 0) { + perpX /= len; + perpY /= len; + } + px2 += perpX * offsets[i + 1]; + py2 += perpY * offsets[i + 1]; + } + + drawLine(g, ox + (int) px1 - 1, oy + (int) py1, ox + (int) px2 - 1, oy + (int) py2, glow); + drawLine(g, ox + (int) px1 + 1, oy + (int) py1, ox + (int) px2 + 1, oy + (int) py2, glow); + drawLine(g, ox + (int) px1, oy + (int) py1, ox + (int) px2, oy + (int) py2, c); + } + } + } + + private class Debris { + + float x, y, vx, vy; + int color, size, age = 0; + + Debris(float x, float y, float angle, float speed, int baseColor) { + this.x = x; + this.y = y; + this.vx = Mth.cos(angle) * speed; + this.vy = Mth.sin(angle) * speed; + int r = ((baseColor >> 16) & 0xFF) + random.nextInt(40) - 20; + int g = ((baseColor >> 8) & 0xFF) + random.nextInt(40) - 20; + int b = (baseColor & 0xFF) + random.nextInt(40) - 20; + this.color = (Mth.clamp(r, 0, 255) << 16) | (Mth.clamp(g, 0, 255) << 8) | Mth.clamp(b, 0, 255); + this.size = 1 + random.nextInt(4); + } + + void tick() { + age++; + x += vx; + y += vy; + vx *= 0.97f; + vy *= 0.97f; + vy += 0.05f; + } + + boolean dead() { + return age >= 60; + } + + void draw(GuiGraphics g, int ox, int oy) { + int a = (int) ((1f - age / 60f) * 200); + g.fill(ox + (int) x - size / 2, oy + (int) y - size / 2, + ox + (int) x + size / 2 + 1, oy + (int) y + size / 2 + 1, (a << 24) | color); + } + } + + // Public API + + public boolean isAnimationActive() { + return active; + } + + public int getAnimationTick() { + return tick; + } + + public int getPointsEarned() { + return pointsEarned; + } + + public float getStarScale() { + return starScale; + } + + public float getStarAlpha() { + return starAlpha; + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + + if (machine.isPrestigeAnimationActive() && !active) { + writeUpdateInfo(UPDATE_ID_ANIMATION_STATE, buf -> { + buf.writeBoolean(true); + buf.writeEnum(machine.getStage()); + buf.writeInt(machine.getCustomStarColor()); + buf.writeInt(machine.getLastPrestigePointsEarned()); + }); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, RegistryFriendlyByteBuf buffer) { + if (id == UPDATE_ID_ANIMATION_STATE) { + boolean shouldStart = buffer.readBoolean(); + if (shouldStart && !active) { + Stage stage = buffer.readEnum(Stage.class); + int color = buffer.readInt(); + int points = buffer.readInt(); + startAnimation(stage, color, points); + } + } else { + super.readUpdateInfo(id, buffer); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PrestigeIgnitionButton.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PrestigeIgnitionButton.java new file mode 100644 index 000000000..291ab4547 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PrestigeIgnitionButton.java @@ -0,0 +1,507 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.Random; +import java.util.function.BooleanSupplier; + +import javax.annotation.Nonnull; + +public class PrestigeIgnitionButton extends Widget { + + private final BooleanSupplier isPrestigeItemPresent; + private final BooleanSupplier hasActiveStar; + private final Runnable onPrestigeTriggered; + + private float warningScrollPhase = 0f; + private float glitchPhase = 0f; + private float hoverProgress = 0f; + private boolean wasHovered = false; + private int lastMouseX, lastMouseY; + + private int crackStage = 0; + private float crackAnimProgress = 0f; + private boolean isHolding = false; + private int holdTicks = 0; + private static final int HOLD_THRESHOLD = 25; + + private boolean isBreaking = false; + private float breakAnimProgress = 0f; + private float[] shardOffsets; + + private final Random scrambleRandom = new Random(); + private String currentScrambledText = ""; + private int scrambleUpdateCounter = 0; + private static final String SCRAMBLE_CHARS = "!@#$%^&*<>?/\\|=-+"; + + private static final int BG_COLOR_DARK = 0xFF1A0808; + private static final int BG_COLOR_MID = 0xFF2A1010; + private static final int BORDER_COLOR = 0xFFFF2020; + private static final int WARNING_STRIPE_1 = 0xFFCC0000; + private static final int WARNING_STRIPE_2 = 0xFF440000; + private static final int TEXT_COLOR = 0xFFFFFFFF; + private static final int WARNING_ICON_COLOR = 0xFFFFCC00; + + public PrestigeIgnitionButton(int x, int y, int width, int height, + BooleanSupplier isPrestigeItemPresent, + BooleanSupplier hasActiveStar, + Runnable onPrestigeTriggered) { + super(x, y, width, height); + this.isPrestigeItemPresent = isPrestigeItemPresent; + this.hasActiveStar = hasActiveStar; + this.onPrestigeTriggered = onPrestigeTriggered; + + shardOffsets = new float[12]; + for (int i = 0; i < shardOffsets.length; i++) { + shardOffsets[i] = (float) (Math.random() * 2 - 1); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + if (!isPrestigeItemPresent.getAsBoolean()) { + return; + } + + warningScrollPhase += 0.8f; + glitchPhase += 0.15f; + + boolean hovered = isMouseOverElement(lastMouseX, lastMouseY); + float targetHover = hovered ? 1f : 0f; + hoverProgress = Mth.lerp(0.15f, hoverProgress, targetHover); + + if (hovered && !wasHovered && !isBreaking) { + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK.value(), 0.8f, 0.2f)); + } + wasHovered = hovered; + + if (isHolding && !isBreaking && crackStage < 3) { + holdTicks++; + if (holdTicks >= HOLD_THRESHOLD) { + advanceCrackStage(); + holdTicks = 0; + } + } + + crackAnimProgress = Mth.lerp(0.1f, crackAnimProgress, 0f); + + if (isBreaking) { + breakAnimProgress += 0.05f; + if (breakAnimProgress >= 1f) { + onPrestigeTriggered.run(); + isBreaking = false; + breakAnimProgress = 0f; + crackStage = 0; + } + } + + scrambleUpdateCounter++; + if (scrambleUpdateCounter >= 3) { + scrambleUpdateCounter = 0; + updateScrambledText(); + } + } + + private void advanceCrackStage() { + crackStage++; + crackAnimProgress = 1f; + + float pitch = 0.6f + crackStage * 0.15f; + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.GLASS_BREAK, pitch, 0.8f)); + + if (crackStage == 1) { + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.STONE_BREAK, 0.5f, 0.5f)); + } else if (crackStage == 2) { + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.ANVIL_LAND, 0.3f, 0.3f)); + } else if (crackStage >= 3) { + isBreaking = true; + breakAnimProgress = 0f; + + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.GLASS_BREAK, 0.4f, 1.0f)); + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.GENERIC_EXPLODE.value(), 0.7f, 0.5f)); + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.TOTEM_USE, 1.2f, 0.8f)); + } + } + + private void updateScrambledText() { + StringBuilder sb = new StringBuilder(); + float glitchIntensity = 0.3f + crackStage * 0.2f; + String baseText = Component.translatable("cosmiccore.stellar.ignition.ignite").getString(); + + for (int i = 0; i < baseText.length(); i++) { + if (scrambleRandom.nextFloat() < glitchIntensity) { + sb.append(SCRAMBLE_CHARS.charAt(scrambleRandom.nextInt(SCRAMBLE_CHARS.length()))); + } else { + sb.append(baseText.charAt(i)); + } + } + currentScrambledText = sb.toString(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + lastMouseX = mouseX; + lastMouseY = mouseY; + + if (!isPrestigeItemPresent.getAsBoolean()) { + return; + } + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + boolean canActivate = hasActiveStar.getAsBoolean(); + + if (isBreaking) { + drawBreakingAnimation(graphics, x, y, w, h); + return; + } + + drawWarningBackground(graphics, x, y, w, h); + drawMainButton(graphics, x, y, w, h, canActivate); + drawCracks(graphics, x, y, w, h); + drawWarningIcons(graphics, x, y, w, h); + drawButtonText(graphics, x, y, w, h, canActivate); + + if (isHolding && crackStage < 3) { + drawHoldProgress(graphics, x, y, w, h); + } + } + + private void drawWarningBackground(GuiGraphics graphics, int x, int y, int w, int h) { + float pulse = Mth.sin(glitchPhase) * 0.3f + 0.7f; + int glowAlpha = (int) (40 * pulse * (1 + hoverProgress * 0.5f)); + int glowColor = (glowAlpha << 24) | (BORDER_COLOR & 0x00FFFFFF); + + for (int i = 3; i > 0; i--) { + DrawerHelper.drawSolidRect(graphics, x - i, y - i, w + i * 2, h + i * 2, glowColor); + } + + DrawerHelper.drawSolidRect(graphics, x, y, w, h, BG_COLOR_DARK); + } + + private void drawMainButton(GuiGraphics graphics, int x, int y, int w, int h, boolean canActivate) { + int stripeHeight = h; + int stripeWidth = 16; + float scrollOffset = warningScrollPhase % (stripeWidth * 2); + + graphics.enableScissor(x + 1, y + 1, x + w - 1, y + h - 1); + + for (int sx = (int) (-stripeWidth * 4 + scrollOffset); sx < w + stripeWidth * 2; sx += stripeWidth) { + int stripe1X = x + sx; + int stripe2X = x + sx + stripeWidth / 2; + + drawDiagonalStripe(graphics, stripe1X, y, stripeWidth / 2, h, WARNING_STRIPE_1); + drawDiagonalStripe(graphics, stripe2X, y, stripeWidth / 2, h, WARNING_STRIPE_2); + } + + graphics.disableScissor(); + + int centerPadding = 25; + int centerAlpha = canActivate ? 0xD0 : 0xE0; + int centerColor = (centerAlpha << 24) | (BG_COLOR_MID & 0x00FFFFFF); + DrawerHelper.drawSolidRect(graphics, x + centerPadding, y + 4, w - centerPadding * 2, h - 8, centerColor); + + int borderColor = canActivate ? BORDER_COLOR : 0xFF602020; + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + int innerBorderColor = canActivate ? 0xFF801010 : 0xFF401010; + DrawerHelper.drawBorder(graphics, x + 1, y + 1, w - 2, h - 2, innerBorderColor, 1); + + if (canActivate) { + float accentPulse = Mth.sin(glitchPhase * 2) * 0.5f + 0.5f; + int accentAlpha = (int) (150 + 100 * accentPulse); + int accentColor = (accentAlpha << 24) | (BORDER_COLOR & 0x00FFFFFF); + graphics.fill(x + 2, y + 2, x + w - 2, y + 3, accentColor); + graphics.fill(x + 2, y + h - 3, x + w - 2, y + h - 2, accentColor); + } + } + + private void drawDiagonalStripe(GuiGraphics graphics, int x, int y, int w, int h, int color) { + int skew = h / 3; + for (int row = 0; row < h; row++) { + int offset = (row * skew) / h; + graphics.fill(x + offset, y + row, x + offset + w, y + row + 1, color); + } + } + + private void drawCracks(GuiGraphics graphics, int x, int y, int w, int h) { + if (crackStage == 0) return; + + int crackColor = 0xFF000000; + int highlightColor = 0x60FFFFFF; + + int shakeX = 0, shakeY = 0; + if (crackAnimProgress > 0.5f) { + shakeX = (int) ((Math.random() - 0.5) * 4 * crackAnimProgress); + shakeY = (int) ((Math.random() - 0.5) * 4 * crackAnimProgress); + } + + int cx = x + w / 2 + shakeX; + int cy = y + h / 2 + shakeY; + + if (crackStage >= 1) { + drawCrackLine(graphics, x + 5, y + 3, cx - 10, cy - 5, crackColor); + drawCrackLine(graphics, x + 6, y + 4, cx - 9, cy - 4, highlightColor); + } + + if (crackStage >= 2) { + drawCrackLine(graphics, x + w - 5, y + h - 3, cx + 10, cy + 5, crackColor); + drawCrackLine(graphics, x + w - 6, y + h - 4, cx + 9, cy + 4, highlightColor); + + drawCrackLine(graphics, cx, cy, cx + 15, cy - 8, crackColor); + drawCrackLine(graphics, cx, cy, cx - 12, cy + 10, crackColor); + } + + if (crackStage >= 3) { + for (int i = 0; i < 8; i++) { + float angle = i * Mth.TWO_PI / 8; + int endX = cx + (int) (Mth.cos(angle) * 20); + int endY = cy + (int) (Mth.sin(angle) * 10); + drawCrackLine(graphics, cx, cy, endX, endY, crackColor); + } + } + } + + private void drawCrackLine(GuiGraphics graphics, int x1, int y1, int x2, int y2, int color) { + int dx = Math.abs(x2 - x1); + int dy = Math.abs(y2 - y1); + int sx = x1 < x2 ? 1 : -1; + int sy = y1 < y2 ? 1 : -1; + int err = dx - dy; + + int px = x1, py = y1; + int jitterCounter = 0; + + while (true) { + int jx = px + (jitterCounter % 3 == 0 ? (int) (Math.random() * 2 - 1) : 0); + int jy = py + (jitterCounter % 4 == 0 ? (int) (Math.random() * 2 - 1) : 0); + graphics.fill(jx, jy, jx + 1, jy + 1, color); + + if (px == x2 && py == y2) break; + + int e2 = 2 * err; + if (e2 > -dy) { + err -= dy; + px += sx; + } + if (e2 < dx) { + err += dx; + py += sy; + } + jitterCounter++; + } + } + + private void drawWarningIcons(GuiGraphics graphics, int x, int y, int w, int h) { + int iconSize = 12; + int iconY = y + (h - iconSize) / 2; + + drawWarningTriangle(graphics, x + 6, iconY, iconSize); + drawWarningTriangle(graphics, x + w - 6 - iconSize, iconY, iconSize); + } + + private void drawWarningTriangle(GuiGraphics graphics, int x, int y, int size) { + float flash = Mth.sin(glitchPhase * 3) * 0.3f + 0.7f; + int alpha = (int) (255 * flash); + int color = (alpha << 24) | (WARNING_ICON_COLOR & 0x00FFFFFF); + + int cx = x + size / 2; + for (int row = 0; row < size; row++) { + int halfWidth = (row * size) / (size * 2); + graphics.fill(cx - halfWidth, y + row, cx + halfWidth + 1, y + row + 1, color); + } + + var font = Minecraft.getInstance().font; + int exclamationWidth = font.width("!"); + graphics.drawString(font, "!", cx - exclamationWidth / 2, y + size / 3, 0xFF000000, false); + } + + private void drawButtonText(GuiGraphics graphics, int x, int y, int w, int h, boolean canActivate) { + var font = Minecraft.getInstance().font; + + String displayText; + int textColor; + + if (!canActivate) { + displayText = Component.translatable("cosmiccore.stellar.ignition.requires_star").getString(); + textColor = 0xFF804040; + } else if (crackStage >= 3) { + displayText = Component.translatable("cosmiccore.stellar.ignition.breaking").getString(); + textColor = 0xFFFFFFFF; + } else { + displayText = "[ " + currentScrambledText + " ]"; + textColor = TEXT_COLOR; + } + + int textW = font.width(displayText); + int textX = x + (w - textW) / 2; + int textY = y + (h - font.lineHeight) / 2; + + if (canActivate) { + graphics.drawString(font, displayText, textX + 1, textY + 1, 0xFF000000, false); + } + + graphics.drawString(font, displayText, textX, textY, textColor, false); + + if (canActivate && crackStage > 0) { + float glitchIntensity = crackStage * 0.3f + crackAnimProgress; + if (scrambleRandom.nextFloat() < glitchIntensity * 0.5f) { + int ghostAlpha = (int) (60 * glitchIntensity); + int ghostColor = (ghostAlpha << 24) | 0x00FFFF; + int offsetX = (int) ((Math.random() - 0.5) * 4); + graphics.drawString(font, displayText, textX + offsetX, textY, ghostColor, false); + } + } + } + + private void drawHoldProgress(GuiGraphics graphics, int x, int y, int w, int h) { + float progress = (float) holdTicks / HOLD_THRESHOLD; + + int barHeight = 3; + int barY = y + h - barHeight - 2; + int barW = (int) ((w - 4) * progress); + + graphics.fill(x + 2, barY, x + w - 2, barY + barHeight, 0x80000000); + + int r = (int) (255 * (0.8f + 0.2f * progress)); + int g = (int) (255 * (1f - progress * 0.7f)); + int fillColor = 0xFF000000 | (r << 16) | (g << 8); + graphics.fill(x + 2, barY, x + 2 + barW, barY + barHeight, fillColor); + + if (barW > 2) { + graphics.fill(x + 2 + barW - 1, barY, x + 2 + barW, barY + barHeight, 0xCCFFFFFF); + } + } + + private void drawBreakingAnimation(GuiGraphics graphics, int x, int y, int w, int h) { + int pieceW = w / 3; + int pieceH = h / 2; + + for (int i = 0; i < 6; i++) { + int row = i / 3; + int col = i % 3; + + float dx = shardOffsets[i * 2] * breakAnimProgress * 50; + float dy = shardOffsets[i * 2 + 1] * breakAnimProgress * 30 + breakAnimProgress * breakAnimProgress * 20; + + int px = x + col * pieceW + (int) dx; + int py = y + row * pieceH + (int) dy; + + int alpha = (int) (255 * (1f - breakAnimProgress)); + int color = (alpha << 24) | (BG_COLOR_MID & 0x00FFFFFF); + + graphics.fill(px, py, px + pieceW - 1, py + pieceH - 1, color); + + int borderAlpha = alpha / 2; + int borderColor = (borderAlpha << 24) | (BORDER_COLOR & 0x00FFFFFF); + DrawerHelper.drawBorder(graphics, px, py, pieceW - 1, pieceH - 1, borderColor, 1); + } + + for (int i = 0; i < 10; i++) { + float particleProgress = breakAnimProgress + i * 0.05f; + if (particleProgress > 1f) continue; + + float px = x + w / 2 + (float) Math.cos(i * 0.7) * particleProgress * 60; + float py = y + h / 2 + (float) Math.sin(i * 0.7) * particleProgress * 40 + + particleProgress * particleProgress * 30; + + int particleAlpha = (int) (200 * (1f - particleProgress)); + int particleColor = (particleAlpha << 24) | 0xFFAA00; + graphics.fill((int) px - 1, (int) py - 1, (int) px + 2, (int) py + 2, particleColor); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInForeground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInForeground(graphics, mouseX, mouseY, partialTicks); + + if (isBreaking && breakAnimProgress < 0.3f) { + int flashAlpha = (int) (150 * (1f - breakAnimProgress / 0.3f)); + graphics.fill(-1000, -1000, 2000, 2000, (flashAlpha << 24) | 0xFFFFFF); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (!isPrestigeItemPresent.getAsBoolean()) { + return false; + } + + if (!isMouseOverElement(mouseX, mouseY)) { + return false; + } + + if (button == 0 && hasActiveStar.getAsBoolean() && !isBreaking) { + isHolding = true; + holdTicks = 0; + + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.STONE_PRESSURE_PLATE_CLICK_ON, 0.8f, 0.6f)); + + return true; + } + + return false; + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (button == 0 && isHolding) { + isHolding = false; + holdTicks = 0; + + if (crackStage < 3 && !isBreaking) { + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.STONE_PRESSURE_PLATE_CLICK_OFF, 0.9f, 0.4f)); + } + + return true; + } + return false; + } + + public void reset() { + crackStage = 0; + crackAnimProgress = 0f; + isHolding = false; + holdTicks = 0; + isBreaking = false; + breakAnimProgress = 0f; + } + + public int getCrackStage() { + return crackStage; + } + + public boolean isBreaking() { + return isBreaking; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PrestigeWindow.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PrestigeWindow.java new file mode 100644 index 000000000..6f56c195c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/PrestigeWindow.java @@ -0,0 +1,384 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class PrestigeWindow extends Widget { + + private static final int UPDATE_ID_PRESTIGE_DATA = 410; + + private final Supplier machineSupplier; + private final Runnable onClose; + + private boolean visible = false; + private float fadeAlpha = 0f; + private float targetAlpha = 0f; + + private int totalPoints = 0; + private int earnedPoints = 0; + private int currentTier = 0; + private int previousTier = 0; + + private int animationTick = 0; + private float pointCounterDisplay = 0f; + private boolean showTierUp = false; + private int tierUpAnimTick = 0; + + private static final int BG_COLOR = 0xFF101020; + private static final int BORDER_COLOR = 0xFF4060A0; + private static final int ACCENT_COLOR = 0xFF80A0FF; + private static final int GOLD_COLOR = 0xFFFFCC44; + private static final int TEXT_COLOR = 0xFFCCCCDD; + private static final int TIER_COLORS[] = { + 0xFF808080, + 0xFF60A060, + 0xFF4080C0, + 0xFFA060C0, + 0xFFD08040, + 0xFFFFCC44, + }; + + public PrestigeWindow(int x, int y, int width, int height, + Supplier machineSupplier, + Runnable onClose) { + super(x, y, width, height); + this.machineSupplier = machineSupplier; + this.onClose = onClose; + } + + public void show(int earned, int total, int tier, int prevTier) { + this.earnedPoints = earned; + this.totalPoints = total; + this.currentTier = tier; + this.previousTier = prevTier; + this.visible = true; + this.targetAlpha = 1f; + this.animationTick = 0; + this.pointCounterDisplay = 0f; + this.showTierUp = tier > prevTier; + this.tierUpAnimTick = 0; + } + + public void hide() { + this.targetAlpha = 0f; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + if (fadeAlpha < targetAlpha) { + fadeAlpha = Math.min(fadeAlpha + 0.05f, targetAlpha); + } else if (fadeAlpha > targetAlpha) { + fadeAlpha = Math.max(fadeAlpha - 0.05f, targetAlpha); + if (fadeAlpha <= 0f) { + visible = false; + } + } + + if (!visible) return; + + animationTick++; + + if (animationTick > 20 && pointCounterDisplay < earnedPoints) { + float remaining = earnedPoints - pointCounterDisplay; + float speed = Math.max(1f, remaining * 0.15f); + pointCounterDisplay = Math.min(pointCounterDisplay + speed, earnedPoints); + } + + if (showTierUp && animationTick > 60) { + tierUpAnimTick++; + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + if (!visible && fadeAlpha <= 0f) return; + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + drawWindowBackground(graphics, x, y, w, h); + drawHeader(graphics, x, y, w); + drawPointsSection(graphics, x, y + 30, w); + drawTierSection(graphics, x, y + 80, w); + + if (showTierUp && tierUpAnimTick > 0) { + drawTierUpCelebration(graphics, x, y, w, h); + } + + drawCloseHint(graphics, x, y + h - 16, w); + } + + private void drawWindowBackground(GuiGraphics graphics, int x, int y, int w, int h) { + int bgAlpha = (int) (0xFF * fadeAlpha); + int bgColor = (bgAlpha << 24) | (BG_COLOR & 0x00FFFFFF); + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + int borderAlpha = (int) (0xFF * fadeAlpha); + int borderColor = (borderAlpha << 24) | (BORDER_COLOR & 0x00FFFFFF); + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 2); + + int glowAlpha = (int) (0x40 * fadeAlpha); + int glowColor = (glowAlpha << 24) | (ACCENT_COLOR & 0x00FFFFFF); + DrawerHelper.drawGradientRect(graphics, x + 2, y + 2, w - 4, 30, glowColor, 0x00000000, false); + } + + private void drawHeader(GuiGraphics graphics, int x, int y, int w) { + var font = Minecraft.getInstance().font; + + String title = Component.translatable("cosmiccore.stellar.prestige.title").getString(); + int titleColor = applyFade(GOLD_COLOR); + + int titleX = x + (w - font.width(title)) / 2; + int titleY = y + 8; + + graphics.drawString(font, title, titleX + 1, titleY + 1, applyFade(0xFF000000), false); + graphics.drawString(font, title, titleX, titleY, titleColor, false); + + int lineY = y + 24; + int lineAlpha = (int) (0x80 * fadeAlpha); + int lineColor = (lineAlpha << 24) | (ACCENT_COLOR & 0x00FFFFFF); + graphics.fill(x + 20, lineY, x + w - 20, lineY + 1, lineColor); + } + + private void drawPointsSection(GuiGraphics graphics, int x, int y, int w) { + var font = Minecraft.getInstance().font; + + String earnedLabel = Component.translatable("cosmiccore.stellar.prestige.points_earned").getString(); + int labelColor = applyFade(TEXT_COLOR); + int labelX = x + (w - font.width(earnedLabel)) / 2; + graphics.drawString(font, earnedLabel, labelX, y, labelColor, false); + + String pointsStr = "+" + (int) pointCounterDisplay; + int pointsColor = applyFade(GOLD_COLOR); + + float scale = 2.0f; + int pointsWidth = (int) (font.width(pointsStr) * scale); + int pointsX = x + (w - pointsWidth) / 2; + int pointsY = y + 12; + + graphics.pose().pushPose(); + graphics.pose().translate(pointsX, pointsY, 0); + graphics.pose().scale(scale, scale, 1f); + graphics.drawString(font, pointsStr, 0, 0, pointsColor, false); + graphics.pose().popPose(); + + String totalLabel = Component.translatable("cosmiccore.stellar.prestige.total_points", totalPoints).getString(); + int totalLabelX = x + (w - font.width(totalLabel)) / 2; + int totalY = y + 35; + graphics.drawString(font, totalLabel, totalLabelX, totalY, applyFade(TEXT_COLOR), false); + } + + private void drawTierSection(GuiGraphics graphics, int x, int y, int w) { + var font = Minecraft.getInstance().font; + + String tierLabel = Component.translatable("cosmiccore.stellar.prestige.current_tier").getString(); + int labelX = x + (w - font.width(tierLabel)) / 2; + graphics.drawString(font, tierLabel, labelX, y, applyFade(TEXT_COLOR), false); + + int tierColor = applyFade(getTierColor(currentTier)); + String tierStr = getTierName(currentTier); + + float scale = 1.5f; + int tierWidth = (int) (font.width(tierStr) * scale); + int tierX = x + (w - tierWidth) / 2; + int tierY = y + 12; + + graphics.pose().pushPose(); + graphics.pose().translate(tierX, tierY, 0); + graphics.pose().scale(scale, scale, 1f); + graphics.drawString(font, tierStr, 0, 0, tierColor, false); + graphics.pose().popPose(); + + if (currentTier < 5) { + int nextTierPoints = getPointsForTier(currentTier + 1); + int currentTierPoints = getPointsForTier(currentTier); + float progress = (float) (totalPoints - currentTierPoints) / (nextTierPoints - currentTierPoints); + progress = Mth.clamp(progress, 0f, 1f); + + int barY = y + 35; + int barW = w - 40; + int barH = 8; + int barX = x + 20; + + int barBgColor = applyFade(0xFF202030); + DrawerHelper.drawSolidRect(graphics, barX, barY, barW, barH, barBgColor); + + int fillW = (int) (barW * progress); + int fillColor = applyFade(getTierColor(currentTier + 1)); + if (fillW > 0) { + DrawerHelper.drawSolidRect(graphics, barX, barY, fillW, barH, fillColor); + } + + DrawerHelper.drawBorder(graphics, barX, barY, barW, barH, applyFade(0xFF404060), 1); + + String nextLabel = Component + .translatable("cosmiccore.stellar.prestige.next_tier", nextTierPoints, getTierName(currentTier + 1)) + .getString(); + int nextLabelX = x + (w - font.width(nextLabel)) / 2; + graphics.drawString(font, nextLabel, nextLabelX, barY + 10, applyFade(TEXT_COLOR), false); + } else { + String maxLabel = Component.translatable("cosmiccore.stellar.prestige.max_tier").getString(); + int maxLabelX = x + (w - font.width(maxLabel)) / 2; + graphics.drawString(font, maxLabel, maxLabelX, y + 35, applyFade(GOLD_COLOR), false); + } + } + + private void drawTierUpCelebration(GuiGraphics graphics, int x, int y, int w, int h) { + var font = Minecraft.getInstance().font; + + float animProgress = Math.min(1f, tierUpAnimTick / 30f); + float easeOut = 1f - (1f - animProgress) * (1f - animProgress); + + int bannerH = 40; + int bannerY = (int) (y - bannerH + easeOut * (h / 2 + bannerH / 2)); + + int bannerAlpha = (int) (0xF0 * easeOut * fadeAlpha); + int bannerColor = (bannerAlpha << 24) | (getTierColor(currentTier) & 0x00FFFFFF); + DrawerHelper.drawSolidRect(graphics, x + 10, bannerY, w - 20, bannerH, bannerColor); + + String tierUpText = Component.translatable("cosmiccore.stellar.prestige.tier_up").getString(); + String newTierText = getTierName(currentTier); + + int textAlpha = (int) (255 * easeOut * fadeAlpha); + int textColor = (textAlpha << 24) | 0xFFFFFF; + + float scale = 1.8f; + int tierUpWidth = (int) (font.width(tierUpText) * scale); + int tierUpX = x + (w - tierUpWidth) / 2; + + graphics.pose().pushPose(); + graphics.pose().translate(tierUpX, bannerY + 4, 0); + graphics.pose().scale(scale, scale, 1f); + graphics.drawString(font, tierUpText, 0, 0, textColor, false); + graphics.pose().popPose(); + + int newTierWidth = font.width(newTierText); + int newTierX = x + (w - newTierWidth) / 2; + graphics.drawString(font, newTierText, newTierX, bannerY + 26, textColor, false); + + if (tierUpAnimTick < 40) { + drawParticleBurst(graphics, x + w / 2, bannerY + bannerH / 2, tierUpAnimTick); + } + } + + private void drawParticleBurst(GuiGraphics graphics, int cx, int cy, int tick) { + int particleCount = 16; + float progress = tick / 40f; + + for (int i = 0; i < particleCount; i++) { + float angle = i * Mth.TWO_PI / particleCount; + float distance = progress * 80; + + int px = cx + (int) (Mth.cos(angle) * distance); + int py = cy + (int) (Mth.sin(angle) * distance * 0.5f); + + int alpha = (int) ((1f - progress) * 200 * fadeAlpha); + int color = (alpha << 24) | (GOLD_COLOR & 0x00FFFFFF); + + int size = (int) (3 * (1f - progress)); + if (size > 0) { + graphics.fill(px - size, py - size, px + size + 1, py + size + 1, color); + } + } + } + + private void drawCloseHint(GuiGraphics graphics, int x, int y, int w) { + var font = Minecraft.getInstance().font; + String hint = Component.translatable("cosmiccore.stellar.prestige.continue").getString(); + int hintX = x + (w - font.width(hint)) / 2; + graphics.drawString(font, hint, hintX, y, applyFade(0xFF808090), false); + } + + private int applyFade(int color) { + int a = (color >> 24) & 0xFF; + a = (int) (a * fadeAlpha); + return (a << 24) | (color & 0x00FFFFFF); + } + + private int getTierColor(int tier) { + if (tier < 0) tier = 0; + if (tier >= TIER_COLORS.length) tier = TIER_COLORS.length - 1; + return TIER_COLORS[tier]; + } + + private String getTierName(int tier) { + return switch (tier) { + case 0 -> Component.translatable("cosmiccore.stellar.prestige.tier.novice").getString(); + case 1 -> Component.translatable("cosmiccore.stellar.prestige.tier.apprentice").getString(); + case 2 -> Component.translatable("cosmiccore.stellar.prestige.tier.journeyman").getString(); + case 3 -> Component.translatable("cosmiccore.stellar.prestige.tier.expert").getString(); + case 4 -> Component.translatable("cosmiccore.stellar.prestige.tier.master").getString(); + case 5 -> Component.translatable("cosmiccore.stellar.prestige.tier.grandmaster").getString(); + default -> Component.translatable("cosmiccore.stellar.prestige.tier.unknown").getString(); + }; + } + + private int getPointsForTier(int tier) { + return switch (tier) { + case 1 -> 50; + case 2 -> 100; + case 3 -> 250; + case 4 -> 500; + case 5 -> 1000; + default -> 0; + }; + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (visible && fadeAlpha > 0.5f && animationTick > 40) { + hide(); + onClose.run(); + return true; + } + return false; + } + + public boolean isVisible() { + return visible || fadeAlpha > 0f; + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, RegistryFriendlyByteBuf buffer) { + if (id == UPDATE_ID_PRESTIGE_DATA) { + int earned = buffer.readInt(); + int total = buffer.readInt(); + int tier = buffer.readInt(); + int prevTier = buffer.readInt(); + show(earned, total, tier, prevTier); + } else { + super.readUpdateInfo(id, buffer); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StageContextPanel.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StageContextPanel.java new file mode 100644 index 000000000..fae805dd7 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StageContextPanel.java @@ -0,0 +1,261 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; + +import com.lowdragmc.lowdraglib.gui.texture.ColorBorderTexture; +import com.lowdragmc.lowdraglib.gui.texture.ColorRectTexture; +import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StageContextPanel extends WidgetGroup { + + private static final int UPDATE_ID_PRESTIGE_STATE = 100; + + private final Supplier machineSupplier; + private final StellarIrisWidget parentWidget; + + private IgnitionButtonWidget normalIgnitionButton; + private PrestigeIgnitionButton prestigeIgnitionButton; + + private boolean hasPrestigeItem = false; + private boolean hasActiveStar = false; + + public StageContextPanel(int x, int y, int width, int height, + Supplier machineSupplier, + StellarIrisWidget parentWidget) { + super(x, y, width, height); + this.machineSupplier = machineSupplier; + this.parentWidget = parentWidget; + initWidgets(); + } + + private void initWidgets() { + addWidget(new LabelWidget(5, 5, this::getStagePanelTitle)); + + addWidget(new FuelGaugeWidget(5, 22, getSize().width - 10, 30, parentWidget::getFuelLevel)); + + normalIgnitionButton = new IgnitionButtonWidget( + 5, 58, getSize().width - 10, 24, + parentWidget::canIgnite, + () -> !hasPrestigeItem && (getCurrentStage() == Stage.EMPTY || parentWidget.canIgnite()), + parentWidget::requestIgnition); + addWidget(normalIgnitionButton); + + prestigeIgnitionButton = new PrestigeIgnitionButton( + 5, 58, getSize().width - 10, 24, + () -> hasPrestigeItem, + () -> hasActiveStar, + this::onPrestigeTriggered); + addWidget(prestigeIgnitionButton); + + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine != null) { + SlotWidget starSeedSlot = new SlotWidget(machine.getInventory().storage, 0, 5, 88, true, true); + starSeedSlot.setBackground(new GuiTextureGroup( + new ColorRectTexture(0xC0101018), + new ColorBorderTexture(1, 0xFF505070)), GuiTextures.ATOMIC_OVERLAY_1); + addWidget(starSeedSlot); + addWidget(new LabelWidget(28, 92, + () -> Component.translatable("cosmiccore.stellar.slot.star_seed").getString()) + .setTextColor(0xFF808090)); + } + } + + private void onPrestigeTriggered() { + parentWidget.triggerPrestigeAnimation(); + } + + @Override + public void writeInitialData(RegistryFriendlyByteBuf buffer) { + super.writeInitialData(buffer); + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine != null) { + buffer.writeBoolean(machine.hasPrestigeItem()); + buffer.writeBoolean(machine.hasActiveStar()); + } else { + buffer.writeBoolean(false); + buffer.writeBoolean(false); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readInitialData(RegistryFriendlyByteBuf buffer) { + super.readInitialData(buffer); + hasPrestigeItem = buffer.readBoolean(); + hasActiveStar = buffer.readBoolean(); + updateButtonVisibility(); + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + + boolean newHasPrestigeItem = machine.hasPrestigeItem(); + boolean newHasActiveStar = machine.hasActiveStar(); + + if (newHasPrestigeItem != hasPrestigeItem || newHasActiveStar != hasActiveStar) { + hasPrestigeItem = newHasPrestigeItem; + hasActiveStar = newHasActiveStar; + writeUpdateInfo(UPDATE_ID_PRESTIGE_STATE, buf -> { + buf.writeBoolean(hasPrestigeItem); + buf.writeBoolean(hasActiveStar); + }); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, RegistryFriendlyByteBuf buffer) { + if (id == UPDATE_ID_PRESTIGE_STATE) { + hasPrestigeItem = buffer.readBoolean(); + hasActiveStar = buffer.readBoolean(); + updateButtonVisibility(); + + if (!hasPrestigeItem) { + prestigeIgnitionButton.reset(); + } + } else { + super.readUpdateInfo(id, buffer); + } + } + + @OnlyIn(Dist.CLIENT) + private void updateButtonVisibility() { + normalIgnitionButton.setVisible(!hasPrestigeItem); + normalIgnitionButton.setActive(!hasPrestigeItem); + prestigeIgnitionButton.setVisible(hasPrestigeItem); + prestigeIgnitionButton.setActive(hasPrestigeItem); + } + + private Stage getCurrentStage() { + IrisMultiblockMachine machine = machineSupplier.get(); + return machine != null ? machine.getStage() : Stage.EMPTY; + } + + private String getStagePanelTitle() { + return switch (getCurrentStage()) { + case EMPTY -> Component.translatable("cosmiccore.stellar.stage.initialization").getString(); + case GROWING -> Component.translatable("cosmiccore.stellar.stage.stellar_ignition").getString(); + case STAR -> Component.translatable("cosmiccore.stellar.stage.stellar_operations").getString(); + case SUPERSTAR -> Component.translatable("cosmiccore.stellar.stage.critical_mass").getString(); + case BLACK_HOLE -> Component.translatable("cosmiccore.stellar.stage.singularity_control").getString(); + case DEATH -> Component.translatable("cosmiccore.stellar.stage.emergency_protocols").getString(); + case DEATH_GRACEFUL -> Component.translatable("cosmiccore.stellar.stage.controlled_shutdown").getString(); + }; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + DrawerHelper.drawSolidRect(graphics, x, y, w, h, 0xCC0a0a14); + + int accentColor = getStageAccentColor(); + DrawerHelper.drawBorder(graphics, x, y, w, h, accentColor, 1); + graphics.fill(x + 1, y + 1, x + w - 1, y + 3, accentColor); + + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + drawStageInfo(graphics, x, y, w, h); + } + + private void drawStageInfo(GuiGraphics graphics, int x, int y, int w, int h) { + var font = Minecraft.getInstance().font; + int infoY = y + h - 35; + int textColor = 0xFF808090; + + switch (getCurrentStage()) { + case EMPTY -> { + graphics.drawString(font, Component.translatable("cosmiccore.stellar.context.empty_line1").getString(), + x + 5, infoY, textColor, false); + graphics.drawString(font, Component.translatable("cosmiccore.stellar.context.empty_line2").getString(), + x + 5, infoY + 10, textColor, false); + graphics.drawString(font, Component.translatable("cosmiccore.stellar.context.empty_line3").getString(), + x + 5, infoY + 20, textColor, false); + } + case GROWING -> { + graphics.drawString(font, + Component.translatable("cosmiccore.stellar.context.growing_line1").getString(), x + 5, infoY, + 0xFFAAAAFF, false); + graphics.drawString(font, + Component.translatable("cosmiccore.stellar.context.growing_line2").getString(), x + 5, + infoY + 10, 0xFFAAAAFF, false); + } + case STAR -> { + graphics.drawString(font, Component.translatable("cosmiccore.stellar.context.star_line1").getString(), + x + 5, infoY, 0xFFFFCC44, false); + graphics.drawString(font, Component.translatable("cosmiccore.stellar.context.star_line2").getString(), + x + 5, infoY + 10, textColor, false); + } + case SUPERSTAR -> { + graphics.drawString(font, + Component.translatable("cosmiccore.stellar.context.superstar_line1").getString(), x + 5, infoY, + 0xFFFF8844, false); + graphics.drawString(font, + Component.translatable("cosmiccore.stellar.context.superstar_line2").getString(), x + 5, + infoY + 10, 0xFFFF6622, false); + } + case BLACK_HOLE -> { + graphics.drawString(font, + Component.translatable("cosmiccore.stellar.context.blackhole_line1").getString(), x + 5, infoY, + 0xFFAA66FF, false); + graphics.drawString(font, + Component.translatable("cosmiccore.stellar.context.blackhole_line2").getString(), x + 5, + infoY + 10, 0xFF8844DD, false); + } + case DEATH -> { + if (parentWidget.getTickCounter() % 20 < 10) { + graphics.fill(x + 1, y + 1, x + w - 1, y + h - 1, 0x30FF0000); + } + graphics.drawString(font, Component.translatable("cosmiccore.stellar.context.death_line1").getString(), + x + 5, infoY, 0xFFFF0000, false); + graphics.drawString(font, Component.translatable("cosmiccore.stellar.context.death_line2").getString(), + x + 5, infoY + 10, 0xFFFF4444, false); + } + case DEATH_GRACEFUL -> { + graphics.drawString(font, + Component.translatable("cosmiccore.stellar.context.death_graceful_line1").getString(), x + 5, + infoY, 0xFF884444, false); + graphics.drawString(font, + Component.translatable("cosmiccore.stellar.context.death_graceful_line2").getString(), x + 5, + infoY + 10, textColor, false); + } + } + } + + private int getStageAccentColor() { + return switch (getCurrentStage()) { + case EMPTY -> 0xFF404060; + case GROWING -> 0xFF6080FF; + case STAR -> 0xFFFFCC44; + case SUPERSTAR -> 0xFFFF8844; + case BLACK_HOLE -> 0xFF8040FF; + case DEATH -> 0xFFFF2020; + case DEATH_GRACEFUL -> 0xFF804040; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StarColorButton.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StarColorButton.java new file mode 100644 index 000000000..7a8cc164f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StarColorButton.java @@ -0,0 +1,135 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.List; +import java.util.function.Consumer; +import java.util.function.IntSupplier; + +import javax.annotation.Nonnull; + +public class StarColorButton extends Widget { + + private final Consumer onToggle; + private final IntSupplier colorSupplier; + private boolean hovered = false; + private float hoverProgress = 0f; + private float pulsePhase = 0f; + + public StarColorButton(int x, int y, int width, int height, Consumer onToggle, IntSupplier colorSupplier) { + super(x, y, width, height); + this.onToggle = onToggle; + this.colorSupplier = colorSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + pulsePhase += 0.1f; + + if (hovered && hoverProgress < 1f) { + hoverProgress = Math.min(1f, hoverProgress + 0.15f); + } else if (!hovered && hoverProgress > 0f) { + hoverProgress = Math.max(0f, hoverProgress - 0.15f); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + hovered = isMouseOverElement(mouseX, mouseY); + + int bgAlpha = (int) (0xC0 + 0x20 * hoverProgress); + int bgColor = (bgAlpha << 24) | 0x101820; + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + int currentColor = colorSupplier != null ? colorSupplier.getAsInt() : -1; + int displayColor = currentColor == -1 ? 0xFFCC44 : currentColor; + + int borderAlpha = (int) (0x60 + 0x40 * hoverProgress); + int borderColor = (borderAlpha << 24) | displayColor; + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + drawColorIcon(graphics, x, y, w, h, displayColor, currentColor == -1); + + if (hoverProgress > 0) { + int glowAlpha = (int) (0x20 * hoverProgress); + int glowColor = (glowAlpha << 24) | displayColor; + DrawerHelper.drawBorder(graphics, x - 1, y - 1, w + 2, h + 2, glowColor, 1); + } + } + + private void drawColorIcon(GuiGraphics graphics, int x, int y, int w, int h, int color, boolean isDefault) { + int padding = 3; + int iconX = x + padding; + int iconY = y + padding; + int iconW = w - padding * 2; + int iconH = h - padding * 2; + + float pulseAlpha = 0.8f + 0.2f * Mth.sin(pulsePhase); + int alpha = (int) (0xFF * pulseAlpha); + + if (isDefault) { + int checkSize = 3; + for (int cy = 0; cy < iconH / checkSize; cy++) { + for (int cx = 0; cx < iconW / checkSize; cx++) { + int checkColor = ((cx + cy) % 2 == 0) ? 0xFF303030 : 0xFF505050; + int checkX = iconX + cx * checkSize; + int checkY = iconY + cy * checkSize; + int checkW = Math.min(checkSize, iconX + iconW - checkX); + int checkH = Math.min(checkSize, iconY + iconH - checkY); + graphics.fill(checkX, checkY, checkX + checkW, checkY + checkH, checkColor); + } + } + } + + graphics.fill(iconX, iconY, iconX + iconW, iconY + iconH, (alpha << 24) | color); + + int innerBorder = 0x40000000; + graphics.fill(iconX, iconY, iconX + iconW, iconY + 1, innerBorder); + graphics.fill(iconX, iconY, iconX + 1, iconY + iconH, innerBorder); + + if (isDefault) { + var font = Minecraft.getInstance().font; + int textColor = 0x80FFFFFF; + graphics.drawString(font, "D", iconX + iconW - 6, iconY + iconH - 8, textColor, false); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0 && isMouseOverElement(mouseX, mouseY)) { + if (onToggle != null) { + onToggle.accept(true); + } + playButtonClickSound(); + return true; + } + return false; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInForeground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + if (isMouseOverElement(mouseX, mouseY)) { + graphics.renderTooltip(Minecraft.getInstance().font, + List.of(Component.translatable("cosmiccore.gui.stellar.star_color")), + java.util.Optional.empty(), mouseX, mouseY); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StarColorPickerPopup.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StarColorPickerPopup.java new file mode 100644 index 000000000..ebbbc30d5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StarColorPickerPopup.java @@ -0,0 +1,462 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.lowdragmc.lowdraglib.gui.texture.ColorBorderTexture; +import com.lowdragmc.lowdraglib.gui.texture.ColorRectTexture; +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.TextFieldWidget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.IntConsumer; + +import javax.annotation.Nonnull; + +public class StarColorPickerPopup extends WidgetGroup { + + public static final int WIDTH = 160; + public static final int HEIGHT = 140; + private static final int TITLE_HEIGHT = 16; + private static final int PICKER_SIZE = 80; + private static final int HUE_BAR_WIDTH = 12; + + private final Runnable onClose; + private final IntConsumer onColorChanged; + + // Current color in HSB + private float hue = 0.15f; // Default yellow-ish + private float saturation = 0.8f; + private float brightness = 1.0f; + + // Current color as RGB + private int currentColor = 0xFFCC44; + + // Text field for hex input + private TextFieldWidget hexField; + + // Dragging state + private boolean draggingPicker = false; + private boolean draggingHue = false; + private boolean draggingTitle = false; + private double lastDeltaX, lastDeltaY; + + // Animation + private float appearProgress = 0f; + + public StarColorPickerPopup(int x, int y, Runnable onClose, IntConsumer onColorChanged) { + super(x, y, WIDTH, HEIGHT); + this.onClose = onClose; + this.onColorChanged = onColorChanged; + setVisible(false); + initWidgets(); + } + + private void initWidgets() { + // Hex input field at bottom + int fieldX = 6; + int fieldY = HEIGHT - 26; + int fieldWidth = WIDTH - 60; + + hexField = new TextFieldWidget(fieldX, fieldY, fieldWidth, 16, + this::getHexString, + this::onHexChanged); + hexField.setClientSideWidget(); + hexField.setMaxStringLength(7); // #RRGGBB + hexField.setBackground(new com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup( + new ColorRectTexture(0xE0101018), + new ColorBorderTexture(1, 0xFF404060))); + addWidget(hexField); + } + + public void show(int color) { + if (color == -1) { + // Default - use a nice yellow + currentColor = 0xFFCC44; + } else { + currentColor = color & 0xFFFFFF; + } + + // Convert to HSB + float[] hsb = rgbToHsb(currentColor); + hue = hsb[0]; + saturation = hsb[1]; + brightness = hsb[2]; + + appearProgress = 0f; + setVisible(true); + setActive(true); + + updateHexField(); + } + + public void hide() { + setVisible(false); + setActive(false); + } + + private String getHexString() { + return String.format("#%06X", currentColor & 0xFFFFFF); + } + + private void onHexChanged(String text) { + try { + String hex = text.startsWith("#") ? text.substring(1) : text; + if (hex.length() == 6) { + int color = Integer.parseInt(hex, 16); + setColor(color); + } + } catch (NumberFormatException ignored) {} + } + + private void setColor(int rgb) { + currentColor = rgb & 0xFFFFFF; + float[] hsb = rgbToHsb(currentColor); + hue = hsb[0]; + saturation = hsb[1]; + brightness = hsb[2]; + + if (onColorChanged != null) { + onColorChanged.accept(currentColor); + } + } + + private void updateFromHsb() { + currentColor = hsbToRgb(hue, saturation, brightness); + updateHexField(); + + if (onColorChanged != null) { + onColorChanged.accept(currentColor); + } + } + + private void updateHexField() { + if (hexField != null) { + hexField.setCurrentString(getHexString()); + } + } + + private void resetToDefault() { + if (onColorChanged != null) { + onColorChanged.accept(-1); // -1 signals default + } + hide(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + if (isVisible() && appearProgress < 1f) { + appearProgress = Math.min(1f, appearProgress + 0.15f); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + if (!isVisible()) return; + + float alpha = appearProgress; + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + // Background + int bgAlpha = (int) (0xE8 * alpha); + int bgColor = (bgAlpha << 24) | 0x0c0c14; + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + // Grid pattern + int gridAlpha = (int) (0x08 * alpha); + int gridColor = (gridAlpha << 24) | 0xFFFFFF; + for (int gx = x + 8; gx < x + w; gx += 8) { + graphics.fill(gx, y, gx + 1, y + h, gridColor); + } + for (int gy = y + 8; gy < y + h; gy += 8) { + graphics.fill(x, gy, x + w, gy + 1, gridColor); + } + + // Title bar + int titleBgAlpha = (int) (0xD0 * alpha); + int titleBgColor = (titleBgAlpha << 24) | 0x101820; + DrawerHelper.drawSolidRect(graphics, x, y, w, TITLE_HEIGHT, titleBgColor); + + // Border + int borderAlpha = (int) (0x80 * alpha); + int borderColor = (borderAlpha << 24) | 0x4080FF; + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + // Title bar accent + graphics.fill(x + 1, y + TITLE_HEIGHT - 2, x + w - 1, y + TITLE_HEIGHT, borderColor); + + // Draw title + drawTitle(graphics, x, y, w, alpha); + + // Draw color picker + drawColorPicker(graphics, x, y, mouseX, mouseY, alpha); + + // Draw close button + drawCloseButton(graphics, x + w - 14, y + 3, mouseX, mouseY, alpha); + + // Draw reset button + drawResetButton(graphics, x + w - 50, y + HEIGHT - 26, mouseX, mouseY, alpha); + + // Draw color preview + drawColorPreview(graphics, x, y, alpha); + + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + } + + private void drawTitle(GuiGraphics graphics, int x, int y, int w, float alpha) { + var font = Minecraft.getInstance().font; + String title = "Star Color"; + int textColor = (int) (0xFF * alpha) << 24 | 0xFFFFFF; + graphics.drawString(font, title, x + 4, y + (TITLE_HEIGHT - font.lineHeight) / 2 + 1, textColor, false); + } + + private void drawColorPicker(GuiGraphics graphics, int baseX, int baseY, int mouseX, int mouseY, float alpha) { + int pickerX = baseX + 6; + int pickerY = baseY + TITLE_HEIGHT + 4; + + // Draw saturation/brightness gradient + for (int py = 0; py < PICKER_SIZE; py++) { + for (int px = 0; px < PICKER_SIZE; px++) { + float s = (float) px / PICKER_SIZE; + float b = 1f - (float) py / PICKER_SIZE; + int color = hsbToRgb(hue, s, b); + int pixelAlpha = (int) (0xFF * alpha); + graphics.fill(pickerX + px, pickerY + py, pickerX + px + 1, pickerY + py + 1, + (pixelAlpha << 24) | color); + } + } + + // Border around picker + int pickerBorder = (int) (0x80 * alpha) << 24 | 0x606080; + DrawerHelper.drawBorder(graphics, pickerX, pickerY, PICKER_SIZE, PICKER_SIZE, pickerBorder, 1); + + // Draw crosshair at current position + int crossX = pickerX + (int) (saturation * PICKER_SIZE); + int crossY = pickerY + (int) ((1f - brightness) * PICKER_SIZE); + int crossColor = (int) (0xFF * alpha) << 24 | 0xFFFFFF; + graphics.fill(crossX - 4, crossY, crossX + 5, crossY + 1, crossColor); + graphics.fill(crossX, crossY - 4, crossX + 1, crossY + 5, crossColor); + + // Draw hue bar + int hueX = pickerX + PICKER_SIZE + 6; + for (int py = 0; py < PICKER_SIZE; py++) { + float h = (float) py / PICKER_SIZE; + int color = hsbToRgb(h, 1f, 1f); + int pixelAlpha = (int) (0xFF * alpha); + graphics.fill(hueX, pickerY + py, hueX + HUE_BAR_WIDTH, pickerY + py + 1, (pixelAlpha << 24) | color); + } + + // Border around hue bar + DrawerHelper.drawBorder(graphics, hueX, pickerY, HUE_BAR_WIDTH, PICKER_SIZE, pickerBorder, 1); + + // Draw hue indicator + int hueY = pickerY + (int) (hue * PICKER_SIZE); + graphics.fill(hueX - 2, hueY - 1, hueX + HUE_BAR_WIDTH + 2, hueY + 2, crossColor); + } + + private void drawColorPreview(GuiGraphics graphics, int baseX, int baseY, float alpha) { + int previewX = baseX + 6 + PICKER_SIZE + 6 + HUE_BAR_WIDTH + 8; + int previewY = baseY + TITLE_HEIGHT + 4; + int previewSize = 30; + + // Background checkerboard for transparency reference + int checkSize = 5; + for (int cy = 0; cy < previewSize / checkSize; cy++) { + for (int cx = 0; cx < previewSize / checkSize; cx++) { + int checkColor = ((cx + cy) % 2 == 0) ? 0xFF404040 : 0xFF808080; + graphics.fill(previewX + cx * checkSize, previewY + cy * checkSize, + previewX + (cx + 1) * checkSize, previewY + (cy + 1) * checkSize, checkColor); + } + } + + // Color preview + int previewAlpha = (int) (0xFF * alpha); + graphics.fill(previewX, previewY, previewX + previewSize, previewY + previewSize, + (previewAlpha << 24) | currentColor); + + // Border + int previewBorder = (int) (0x80 * alpha) << 24 | 0x606080; + DrawerHelper.drawBorder(graphics, previewX, previewY, previewSize, previewSize, previewBorder, 1); + + // Label + var font = Minecraft.getInstance().font; + int textColor = (int) (0xFF * alpha) << 24 | 0xA0A0B0; + graphics.drawString(font, "Preview", previewX, previewY + previewSize + 4, textColor, false); + } + + private void drawCloseButton(GuiGraphics graphics, int x, int y, int mouseX, int mouseY, float alpha) { + int size = 10; + boolean hovered = mouseX >= x && mouseX < x + size && mouseY >= y && mouseY < y + size; + + int bgColor = hovered ? (int) (0xC0 * alpha) << 24 | 0xFF4444 : (int) (0x60 * alpha) << 24 | 0x404050; + int fgColor = (int) (0xFF * alpha) << 24 | 0xFFFFFF; + + graphics.fill(x, y, x + size, y + size, bgColor); + + // X mark + graphics.fill(x + 2, y + 3, x + 4, y + 7, fgColor); + graphics.fill(x + 6, y + 3, x + 8, y + 7, fgColor); + graphics.fill(x + 3, y + 4, x + 7, y + 6, fgColor); + } + + private void drawResetButton(GuiGraphics graphics, int x, int y, int mouseX, int mouseY, float alpha) { + int bw = 44; + int bh = 16; + boolean hovered = mouseX >= x && mouseX < x + bw && mouseY >= y && mouseY < y + bh; + + int bgColor = hovered ? (int) (0xC0 * alpha) << 24 | 0x4080FF : (int) (0x80 * alpha) << 24 | 0x404060; + + graphics.fill(x, y, x + bw, y + bh, bgColor); + DrawerHelper.drawBorder(graphics, x, y, bw, bh, (int) (0x80 * alpha) << 24 | 0x606080, 1); + + var font = Minecraft.getInstance().font; + String text = "Reset"; + int textX = x + (bw - font.width(text)) / 2; + int textY = y + (bh - font.lineHeight) / 2; + int textColor = (int) (0xFF * alpha) << 24 | 0xFFFFFF; + graphics.drawString(font, text, textX, textY, textColor, false); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (!isVisible()) return false; + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + + // Check close button + int closeX = x + w - 14; + int closeY = y + 3; + if (mouseX >= closeX && mouseX < closeX + 10 && mouseY >= closeY && mouseY < closeY + 10) { + if (onClose != null) { + onClose.run(); + } + hide(); + playButtonClickSound(); + return true; + } + + // Check reset button + int resetX = x + w - 50; + int resetY = y + HEIGHT - 26; + if (mouseX >= resetX && mouseX < resetX + 44 && mouseY >= resetY && mouseY < resetY + 16) { + resetToDefault(); + playButtonClickSound(); + return true; + } + + // Check color picker area + int pickerX = x + 6; + int pickerY = y + TITLE_HEIGHT + 4; + if (mouseX >= pickerX && mouseX < pickerX + PICKER_SIZE && + mouseY >= pickerY && mouseY < pickerY + PICKER_SIZE) { + draggingPicker = true; + updatePickerFromMouse(mouseX, mouseY, pickerX, pickerY); + return true; + } + + // Check hue bar + int hueX = pickerX + PICKER_SIZE + 6; + if (mouseX >= hueX && mouseX < hueX + HUE_BAR_WIDTH && + mouseY >= pickerY && mouseY < pickerY + PICKER_SIZE) { + draggingHue = true; + updateHueFromMouse(mouseY, pickerY); + return true; + } + + // Check title bar for dragging + if (mouseX >= x && mouseX < x + w - 20 && mouseY >= y && mouseY < y + TITLE_HEIGHT) { + draggingTitle = true; + lastDeltaX = 0; + lastDeltaY = 0; + return true; + } + + // Click inside panel + if (isMouseOverElement(mouseX, mouseY)) { + return super.mouseClicked(mouseX, mouseY, button); + } + + return false; + } + + private void updatePickerFromMouse(double mouseX, double mouseY, int pickerX, int pickerY) { + saturation = Mth.clamp((float) (mouseX - pickerX) / PICKER_SIZE, 0f, 1f); + brightness = Mth.clamp(1f - (float) (mouseY - pickerY) / PICKER_SIZE, 0f, 1f); + updateFromHsb(); + } + + private void updateHueFromMouse(double mouseY, int pickerY) { + hue = Mth.clamp((float) (mouseY - pickerY) / PICKER_SIZE, 0f, 1f); + updateFromHsb(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { + if (draggingPicker) { + int pickerX = getPosition().x + 6; + int pickerY = getPosition().y + TITLE_HEIGHT + 4; + updatePickerFromMouse(mouseX, mouseY, pickerX, pickerY); + return true; + } + + if (draggingHue) { + int pickerY = getPosition().y + TITLE_HEIGHT + 4; + updateHueFromMouse(mouseY, pickerY); + return true; + } + + if (draggingTitle) { + double dx = dragX + lastDeltaX; + double dy = dragY + lastDeltaY; + int intDx = (int) dx; + int intDy = (int) dy; + lastDeltaX = dx - intDx; + lastDeltaY = dy - intDy; + addSelfPosition(intDx, intDy); + return true; + } + + return super.mouseDragged(mouseX, mouseY, button, dragX, dragY); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (draggingPicker || draggingHue || draggingTitle) { + draggingPicker = false; + draggingHue = false; + draggingTitle = false; + lastDeltaX = 0; + lastDeltaY = 0; + return true; + } + return super.mouseReleased(mouseX, mouseY, button); + } + + private static float[] rgbToHsb(int rgb) { + int r = (rgb >> 16) & 0xFF; + int g = (rgb >> 8) & 0xFF; + int b = rgb & 0xFF; + + float[] hsb = new float[3]; + java.awt.Color.RGBtoHSB(r, g, b, hsb); + return hsb; + } + + private static int hsbToRgb(float h, float s, float b) { + return java.awt.Color.HSBtoRGB(h, s, b) & 0xFFFFFF; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StarfieldBackgroundWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StarfieldBackgroundWidget.java new file mode 100644 index 000000000..a1309c67a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StarfieldBackgroundWidget.java @@ -0,0 +1,312 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StarfieldBackgroundWidget extends Widget { + + private final Supplier stageSupplier; + private final List stars = new ArrayList<>(); + private final List nebulae = new ArrayList<>(); + private final Random random = new Random(42); + + private float driftPhase = 0f; + private float nebulaPhase = 0f; + + private static class BackgroundStar { + + float x, y; + float baseX, baseY; + float size; + float twinkleSpeed; + float twinkleOffset; + int color; + float depth; + } + + private static class Nebula { + + float x, y; + float radius; + int color; + float pulseSpeed; + float pulseOffset; + } + + public StarfieldBackgroundWidget(int x, int y, int width, int height, Supplier stageSupplier) { + super(x, y, width, height); + this.stageSupplier = stageSupplier; + initStars(width, height); + initNebulae(width, height); + } + + private void initStars(int w, int h) { + int starCount = 80; + for (int i = 0; i < starCount; i++) { + BackgroundStar star = new BackgroundStar(); + star.baseX = random.nextFloat() * w; + star.baseY = random.nextFloat() * h; + star.x = star.baseX; + star.y = star.baseY; + star.size = 0.5f + random.nextFloat() * 1.5f; + star.twinkleSpeed = 0.02f + random.nextFloat() * 0.05f; + star.twinkleOffset = random.nextFloat() * Mth.TWO_PI; + star.depth = 0.3f + random.nextFloat() * 0.7f; + + float colorRand = random.nextFloat(); + if (colorRand < 0.6f) { + star.color = 0xFFFFFF; + } else if (colorRand < 0.75f) { + star.color = 0xFFDDAA; + } else if (colorRand < 0.85f) { + star.color = 0xAADDFF; + } else if (colorRand < 0.95f) { + star.color = 0xFFAAAA; + } else { + star.color = 0xAAFFAA; + } + + stars.add(star); + } + } + + private void initNebulae(int w, int h) { + int nebulaCount = 4; + int[] nebulaColors = { 0x4020A0, 0xA02040, 0x204080, 0x802060 }; + + for (int i = 0; i < nebulaCount; i++) { + Nebula nebula = new Nebula(); + nebula.x = random.nextFloat() * w; + nebula.y = random.nextFloat() * h; + nebula.radius = 30 + random.nextFloat() * 50; + nebula.color = nebulaColors[i % nebulaColors.length]; + nebula.pulseSpeed = 0.01f + random.nextFloat() * 0.02f; + nebula.pulseOffset = random.nextFloat() * Mth.TWO_PI; + nebulae.add(nebula); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + Stage stage = stageSupplier.get(); + float driftSpeed = getDriftSpeed(stage); + driftPhase += driftSpeed; + nebulaPhase += 0.02f; + + float driftX = Mth.sin(driftPhase * 0.3f) * 2f; + float driftY = Mth.cos(driftPhase * 0.2f) * 1.5f; + + for (BackgroundStar star : stars) { + star.x = star.baseX + driftX * star.depth; + star.y = star.baseY + driftY * star.depth; + } + } + + private float getDriftSpeed(Stage stage) { + return switch (stage) { + case EMPTY -> 0.01f; + case GROWING -> 0.02f; + case STAR -> 0.015f; + case SUPERSTAR -> 0.03f; + case BLACK_HOLE -> 0.05f; + case DEATH -> 0.08f; + case DEATH_GRACEFUL -> 0.005f; + }; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + Stage stage = stageSupplier.get(); + + drawDeepSpaceGradient(graphics, x, y, w, h, stage); + drawNebulae(graphics, x, y, w, h, stage); + drawStars(graphics, x, y, w, h, stage); + + if (stage == Stage.BLACK_HOLE) { + drawGravitationalDistortion(graphics, x, y, w, h); + } + } + + private void drawDeepSpaceGradient(GuiGraphics graphics, int x, int y, int w, int h, Stage stage) { + int topColor, bottomColor; + + switch (stage) { + case EMPTY -> { + topColor = 0xFF08080C; + bottomColor = 0xFF040406; + } + case GROWING -> { + topColor = 0xFF0A0A14; + bottomColor = 0xFF060610; + } + case STAR -> { + topColor = 0xFF100808; + bottomColor = 0xFF080404; + } + case SUPERSTAR -> { + topColor = 0xFF140808; + bottomColor = 0xFF0A0404; + } + case BLACK_HOLE -> { + topColor = 0xFF0C0410; + bottomColor = 0xFF040208; + } + case DEATH -> { + topColor = 0xFF140404; + bottomColor = 0xFF0A0202; + } + default -> { + topColor = 0xFF0A0808; + bottomColor = 0xFF050404; + } + } + + for (int row = 0; row < h; row++) { + float progress = (float) row / h; + int color = lerpColor(topColor, bottomColor, progress); + graphics.fill(x, y + row, x + w, y + row + 1, color); + } + } + + private void drawNebulae(GuiGraphics graphics, int x, int y, int w, int h, Stage stage) { + float intensity = switch (stage) { + case EMPTY -> 0.3f; + case GROWING -> 0.5f; + case STAR -> 0.6f; + case SUPERSTAR -> 0.8f; + case BLACK_HOLE -> 1.0f; + case DEATH -> 0.4f; + case DEATH_GRACEFUL -> 0.2f; + }; + + for (Nebula nebula : nebulae) { + float pulse = Mth.sin(nebulaPhase + nebula.pulseOffset) * 0.3f + 0.7f; + float radius = nebula.radius * pulse; + + int layers = 8; + for (int layer = layers; layer > 0; layer--) { + float layerProgress = (float) layer / layers; + float layerRadius = radius * layerProgress; + + int alpha = (int) (0x08 * intensity * (1f - layerProgress * 0.7f)); + int color = (alpha << 24) | (nebula.color & 0x00FFFFFF); + + int nx = x + (int) nebula.x; + int ny = y + (int) nebula.y; + int r = (int) layerRadius; + + for (int py = -r; py <= r; py++) { + int halfWidth = (int) Math.sqrt(r * r - py * py); + int drawY = ny + py; + if (drawY >= y && drawY < y + h) { + int x1 = Math.max(x, nx - halfWidth); + int x2 = Math.min(x + w, nx + halfWidth); + if (x1 < x2) { + graphics.fill(x1, drawY, x2, drawY + 1, color); + } + } + } + } + } + } + + private void drawStars(GuiGraphics graphics, int x, int y, int w, int h, Stage stage) { + float baseAlpha = switch (stage) { + case EMPTY -> 0.4f; + case GROWING -> 0.6f; + case STAR -> 0.8f; + case SUPERSTAR -> 0.7f; + case BLACK_HOLE -> 0.5f; + case DEATH -> 0.3f; + case DEATH_GRACEFUL -> 0.5f; + }; + + for (BackgroundStar star : stars) { + float twinkle = Mth.sin(driftPhase * star.twinkleSpeed * 60f + star.twinkleOffset); + float brightness = 0.6f + 0.4f * twinkle; + int alpha = (int) (0xFF * baseAlpha * brightness); + + int starX = x + (int) star.x; + int starY = y + (int) star.y; + + if (starX < x || starX >= x + w || starY < y || starY >= y + h) continue; + + int color = (alpha << 24) | (star.color & 0x00FFFFFF); + + if (star.size > 1.2f) { + graphics.fill(starX - 1, starY, starX + 2, starY + 1, color); + graphics.fill(starX, starY - 1, starX + 1, starY + 2, color); + } else { + graphics.fill(starX, starY, starX + 1, starY + 1, color); + } + + if (star.size > 1.5f && brightness > 0.8f) { + int glowAlpha = (int) (alpha * 0.3f); + int glowColor = (glowAlpha << 24) | (star.color & 0x00FFFFFF); + graphics.fill(starX - 1, starY - 1, starX + 2, starY + 2, glowColor); + } + } + } + + private void drawGravitationalDistortion(GuiGraphics graphics, int x, int y, int w, int h) { + int cx = x + w / 2; + int cy = y + h / 2; + + for (int ring = 0; ring < 5; ring++) { + float ringPhase = driftPhase * 0.5f + ring * 0.5f; + float ringRadius = 30 + ring * 20 + Mth.sin(ringPhase) * 5; + + int alpha = 0x15 - ring * 0x03; + int color = (alpha << 24) | 0x8040FF; + + int r = (int) ringRadius; + for (int angle = 0; angle < 360; angle += 4) { + float rad = angle * Mth.DEG_TO_RAD; + int px = cx + (int) (Mth.cos(rad) * r); + int py = cy + (int) (Mth.sin(rad) * r * 0.4f); + + if (px >= x && px < x + w && py >= y && py < y + h) { + graphics.fill(px, py, px + 1, py + 1, color); + } + } + } + } + + private int lerpColor(int c1, int c2, float t) { + int a1 = (c1 >> 24) & 0xFF, a2 = (c2 >> 24) & 0xFF; + int r1 = (c1 >> 16) & 0xFF, r2 = (c2 >> 16) & 0xFF; + int g1 = (c1 >> 8) & 0xFF, g2 = (c2 >> 8) & 0xFF; + int b1 = c1 & 0xFF, b2 = c2 & 0xFF; + + int a = (int) Mth.lerp(t, a1, a2); + int r = (int) Mth.lerp(t, r1, r2); + int g = (int) Mth.lerp(t, g1, g2); + int b = (int) Mth.lerp(t, b1, b2); + + return (a << 24) | (r << 16) | (g << 8) | b; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarBackgroundWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarBackgroundWidget.java new file mode 100644 index 000000000..1f594d73d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarBackgroundWidget.java @@ -0,0 +1,285 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +/** + * Full-screen background widget that provides unified visual styling + * for the entire Stellar Iris UI, including the inventory area. + */ +public class StellarBackgroundWidget extends Widget { + + private final Supplier stageSupplier; + private float animPhase = 0f; + + public StellarBackgroundWidget(int x, int y, int width, int height, Supplier stageSupplier) { + super(x, y, width, height); + this.stageSupplier = stageSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + animPhase += 0.02f; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + Stage stage = stageSupplier.get(); + + DrawerHelper.drawGradientRect(graphics, x, y, w, h, 0xFF0c0c12, 0xFF060608, false); + + drawGridPattern(graphics, x, y, w, h); + + drawSidePanels(graphics, x, y, w, h, stage); + + int accentColor = getStageAccentColor(stage, 0.4f); + drawCornerAccents(graphics, x, y, w, h, accentColor); + + int borderColor = getStageAccentColor(stage, 0.2f); + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + } + + private void drawGridPattern(GuiGraphics graphics, int x, int y, int w, int h) { + int gridColor = 0x08FFFFFF; + int spacing = 16; + + // Vertical lines + for (int gx = x + spacing; gx < x + w; gx += spacing) { + graphics.fill(gx, y, gx + 1, y + h, gridColor); + } + + // Horizontal lines + for (int gy = y + spacing; gy < y + h; gy += spacing) { + graphics.fill(x, gy, x + w, gy + 1, gridColor); + } + } + + private void drawCornerAccents(GuiGraphics graphics, int x, int y, int w, int h, int color) { + int len = 20; + int thickness = 2; + + // Top-left + graphics.fill(x, y, x + len, y + thickness, color); + graphics.fill(x, y, x + thickness, y + len, color); + + // Top-right + graphics.fill(x + w - len, y, x + w, y + thickness, color); + graphics.fill(x + w - thickness, y, x + w, y + len, color); + + // Bottom-left + graphics.fill(x, y + h - thickness, x + len, y + h, color); + graphics.fill(x, y + h - len, x + thickness, y + h, color); + + // Bottom-right + graphics.fill(x + w - len, y + h - thickness, x + w, y + h, color); + graphics.fill(x + w - thickness, y + h - len, x + w, y + h, color); + } + + private void drawSidePanels(GuiGraphics graphics, int x, int y, int w, int h, Stage stage) { + int invWidth = 162; + int invX = x + (w - invWidth) / 2; + + int leftPanelW = invX - x - 5; + if (leftPanelW > 10) { + drawTechPanel(graphics, x + 3, y + h - 85, leftPanelW, 80, stage, true); + } + + int rightPanelX = invX + invWidth + 5; + int rightPanelW = (x + w) - rightPanelX - 3; + if (rightPanelW > 10) { + drawStatsPanel(graphics, rightPanelX, y + h - 85, rightPanelW, 80, stage); + } + } + + private void drawStatsPanel(GuiGraphics graphics, int px, int py, int pw, int ph, Stage stage) { + DrawerHelper.drawSolidRect(graphics, px, py, pw, ph, 0x40000000); + + int borderColor = getStageAccentColor(stage, 0.2f); + DrawerHelper.drawBorder(graphics, px, py, pw, ph, borderColor, 1); + + int accentColor = getStageAccentColor(stage, 0.5f); + graphics.fill(px + 1, py + 1, px + pw - 1, py + 3, accentColor); + + var font = net.minecraft.client.Minecraft.getInstance().font; + int labelColor = 0xFF606080; + int valueColor = 0xFFCCCCCC; + + graphics.drawString(font, "STAR STATS", px + 4, py + 6, accentColor, false); + + float temp = getStageTemp(stage); + float mass = getStageMass(stage); + float output = getStageOutput(stage); + + int row1 = py + 20; + int row2 = py + 32; + int row3 = py + 44; + int row4 = py + 56; + + graphics.drawString(font, "TEMP:", px + 4, row1, labelColor, false); + graphics.drawString(font, formatTemp(temp), px + 35, row1, getTemperatureColor(temp), false); + + graphics.drawString(font, "MASS:", px + 4, row2, labelColor, false); + graphics.drawString(font, String.format("%.1f M\u2609", mass), px + 35, row2, valueColor, false); + + graphics.drawString(font, "OUT:", px + 4, row3, labelColor, false); + graphics.drawString(font, formatEnergy(output), px + 30, row3, valueColor, false); + + String status = getStatusString(stage); + graphics.drawString(font, status, px + 4, row4, getStatusColor(stage), false); + } + + private float getStageTemp(Stage stage) { + return switch (stage) { + case EMPTY -> 2.7f; + case GROWING -> 5_000_000f; + case STAR -> 15_000_000f; + case SUPERSTAR -> 100_000_000f; + case BLACK_HOLE -> Float.POSITIVE_INFINITY; + case DEATH -> 500_000_000f; + case DEATH_GRACEFUL -> 1_000_000f; + }; + } + + private float getStageMass(Stage stage) { + return switch (stage) { + case EMPTY -> 0f; + case GROWING -> 0.3f; + case STAR -> 1f; + case SUPERSTAR -> 8f; + case BLACK_HOLE -> 25f; + case DEATH -> 12f; + case DEATH_GRACEFUL -> 0.1f; + }; + } + + private float getStageOutput(Stage stage) { + return switch (stage) { + case EMPTY -> 0f; + case GROWING -> 1_000f; + case STAR -> 50_000f; + case SUPERSTAR -> 500_000f; + case BLACK_HOLE -> 10_000_000f; + case DEATH -> 100_000_000f; + case DEATH_GRACEFUL -> 500f; + }; + } + + private String formatTemp(float temp) { + if (Float.isInfinite(temp)) return "\u221E K"; + if (temp >= 1_000_000) return String.format("%.0fM K", temp / 1_000_000); + if (temp >= 1000) return String.format("%.0fk K", temp / 1000); + return String.format("%.1f K", temp); + } + + private String formatEnergy(float energy) { + if (energy >= 1_000_000) return String.format("%.1f PW", energy / 1_000_000); + if (energy >= 1000) return String.format("%.0f TW", energy / 1000); + return String.format("%.0f GW", energy); + } + + private int getTemperatureColor(float temp) { + if (temp >= 100_000_000) return 0xFFFF4444; + if (temp >= 10_000_000) return 0xFFFFAA44; + if (temp >= 1_000_000) return 0xFFFFFF44; + return 0xFFCCCCCC; + } + + private String getStatusString(Stage stage) { + return switch (stage) { + case EMPTY -> "DORMANT"; + case GROWING -> "IGNITING"; + case STAR -> "STABLE"; + case SUPERSTAR -> "CRITICAL"; + case BLACK_HOLE -> "CONTAINED"; + case DEATH -> "FAILURE"; + case DEATH_GRACEFUL -> "SHUTDOWN"; + }; + } + + private int getStatusColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0xFF606060; + case GROWING -> 0xFF66AAFF; + case STAR -> 0xFF66FF66; + case SUPERSTAR -> 0xFFFFAA44; + case BLACK_HOLE -> 0xFFAA66FF; + case DEATH -> 0xFFFF4444; + case DEATH_GRACEFUL -> 0xFF886666; + }; + } + + private void drawTechPanel(GuiGraphics graphics, int px, int py, int pw, int ph, Stage stage, boolean isLeft) { + // Panel background + DrawerHelper.drawSolidRect(graphics, px, py, pw, ph, 0x40000000); + + // Border + int borderColor = getStageAccentColor(stage, 0.2f); + DrawerHelper.drawBorder(graphics, px, py, pw, ph, borderColor, 1); + + // Accent line at top + int accentColor = getStageAccentColor(stage, 0.5f); + graphics.fill(px + 1, py + 1, px + pw - 1, py + 3, accentColor); + + // Animated scan line + float scanPos = (animPhase * 0.5f) % 1f; + int scanY = py + 5 + (int) ((ph - 10) * scanPos); + int scanColor = getStageAccentColor(stage, 0.15f); + graphics.fill(px + 2, scanY, px + pw - 2, scanY + 2, scanColor); + + // Tech decoration lines + int lineColor = 0x20FFFFFF; + int lineY = py + 15; + for (int i = 0; i < 5 && lineY + 10 < py + ph; i++) { + int lineW = (int) ((pw - 10) * (0.3f + 0.5f * Math.abs(Mth.sin(animPhase + i * 0.5f)))); + if (isLeft) { + graphics.fill(px + 5, lineY, px + 5 + lineW, lineY + 2, lineColor); + } else { + graphics.fill(px + pw - 5 - lineW, lineY, px + pw - 5, lineY + 2, lineColor); + } + lineY += 12; + } + + // Small blinking indicators + int indicatorY = py + ph - 15; + for (int i = 0; i < 3; i++) { + int ix = isLeft ? (px + 8 + i * 8) : (px + pw - 8 - i * 8 - 4); + boolean blink = ((int) (animPhase * 3 + i) % 3) == 0; + int indColor = blink ? getStageAccentColor(stage, 0.8f) : 0x30404050; + graphics.fill(ix, indicatorY, ix + 4, indicatorY + 4, indColor); + } + } + + private int getStageAccentColor(Stage stage, float alpha) { + int a = (int) (alpha * 255) << 24; + return switch (stage) { + case EMPTY -> a | 0x404060; + case GROWING -> a | 0x6080FF; + case STAR -> a | 0xFFCC44; + case SUPERSTAR -> a | 0xFF8844; + case BLACK_HOLE -> a | 0x8040FF; + case DEATH -> a | 0xFF2020; + case DEATH_GRACEFUL -> a | 0x804040; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarCommandConsoleWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarCommandConsoleWidget.java new file mode 100644 index 000000000..ccdcf0a74 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarCommandConsoleWidget.java @@ -0,0 +1,331 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StellarCommandConsoleWidget extends WidgetGroup { + + public static final int WIDTH = 360; + public static final int HEIGHT = 220; + + private final Supplier machineSupplier; + + private Stage lastSyncedStage = Stage.EMPTY; + private float fuelLevel = 0f; + private boolean canIgnite = false; + private boolean debugPrimed = false; + + private int tickCounter = 0; + + public StellarCommandConsoleWidget(Supplier machineSupplier) { + super(0, 0, WIDTH, HEIGHT); + this.machineSupplier = machineSupplier; + initWidgets(); + } + + private void initWidgets() { + addWidget(new StarfieldBackgroundWidget(0, 0, WIDTH, HEIGHT, this::getCurrentStage)); + + addWidget(new HolographicScanlineWidget(0, 0, WIDTH, HEIGHT, this::getCurrentStage)); + + addWidget(new EnergyConduitWidget(0, 0, WIDTH, HEIGHT, this::getCurrentStage)); + + int coreSize = 130; + int coreX = 20; + int coreY = 30; + addWidget(new StellarCoreWidget(coreX, coreY, coreSize, this::getCurrentStage)); + + addWidget(new OrbitalRingsWidget(coreX - 10, coreY - 10, coreSize + 20, coreSize + 20, this::getCurrentStage)); + + int telemetryX = coreX + coreSize + 25; + int telemetryW = WIDTH - telemetryX - 15; + int telemetryH = 130; + addWidget(new TelemetryPanelWidget(telemetryX, 25, telemetryW, telemetryH, + machineSupplier, this::getCurrentStage)); + + int controlY = 160; + int controlH = HEIGHT - controlY - 10; + addWidget(new ControlPanelWidget(telemetryX, controlY, telemetryW, controlH, + machineSupplier, this)); + + addWidget(new WarningOverlayWidget(0, 0, WIDTH, HEIGHT, this::getCurrentStage)); + + addWidget(new DebugPrimeButton(5, HEIGHT - 19, 50, 14, this::requestDebugPrime)); + } + + public Stage getCurrentStage() { + return lastSyncedStage; + } + + public float getFuelLevel() { + return fuelLevel; + } + + public boolean canIgnite() { + return canIgnite; + } + + public int getTickCounter() { + return tickCounter; + } + + public void requestDebugPrime() { + writeClientAction(3, buf -> {}); + } + + public void requestIgnition() { + writeClientAction(1, buf -> {}); + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + + Stage currentStage = machine.getStage(); + if (currentStage != lastSyncedStage) { + lastSyncedStage = currentStage; + writeUpdateInfo(203, buf -> buf.writeEnum(currentStage)); + } + + float newFuelLevel = calculateFuelLevel(machine); + if (Math.abs(newFuelLevel - fuelLevel) > 0.01f) { + fuelLevel = newFuelLevel; + writeUpdateInfo(204, buf -> buf.writeFloat(fuelLevel)); + } + + boolean newCanIgnite = checkIgnitionRequirements(machine); + if (newCanIgnite != canIgnite) { + canIgnite = newCanIgnite; + writeUpdateInfo(205, buf -> buf.writeBoolean(canIgnite)); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, RegistryFriendlyByteBuf buffer) { + if (id == 203) { + lastSyncedStage = buffer.readEnum(Stage.class); + } else if (id == 204) { + fuelLevel = buffer.readFloat(); + } else if (id == 205) { + canIgnite = buffer.readBoolean(); + } else { + super.readUpdateInfo(id, buffer); + } + } + + private float calculateFuelLevel(IrisMultiblockMachine machine) { + if (debugPrimed) return 1f; + + if (machine.getStage() == Stage.EMPTY) { + return machine.getInventory().getStackInSlot(0).isEmpty() ? 0f : 1f; + } + return switch (machine.getStage()) { + case EMPTY -> 0f; + case GROWING -> 0.5f; + case STAR, SUPERSTAR, BLACK_HOLE -> 1f; + case DEATH, DEATH_GRACEFUL -> 0.2f; + }; + } + + private boolean checkIgnitionRequirements(IrisMultiblockMachine machine) { + if (debugPrimed) return true; + if (machine.getStage() != Stage.EMPTY) return false; + if (machine.getInventory().getStackInSlot(0).isEmpty()) return false; + return fuelLevel >= 0.8f; + } + + @Override + public void handleClientAction(int id, RegistryFriendlyByteBuf buffer) { + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + + if (id == 1) { + if (canIgnite || debugPrimed) { + machine.setStarStage(); + debugPrimed = false; + } + } else if (id == 2) { + machine.setStarStage(); + } else if (id == 3) { + debugPrimed = true; + } else { + super.handleClientAction(id, buffer); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + tickCounter++; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + drawConsoleFrame(graphics, x, y, w, h); + + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + drawConsoleTitle(graphics, x, y, w); + } + + private void drawConsoleFrame(GuiGraphics graphics, int x, int y, int w, int h) { + int frameColor = getStageFrameColor(lastSyncedStage); + int frameGlow = (0x30 << 24) | (frameColor & 0x00FFFFFF); + + graphics.fill(x - 2, y - 2, x + w + 2, y, frameGlow); + graphics.fill(x - 2, y + h, x + w + 2, y + h + 2, frameGlow); + graphics.fill(x - 2, y, x, y + h, frameGlow); + graphics.fill(x + w, y, x + w + 2, y + h, frameGlow); + + int cornerLen = 15; + int cornerColor = (0xC0 << 24) | frameColor; + + graphics.fill(x, y, x + cornerLen, y + 2, cornerColor); + graphics.fill(x, y, x + 2, y + cornerLen, cornerColor); + + graphics.fill(x + w - cornerLen, y, x + w, y + 2, cornerColor); + graphics.fill(x + w - 2, y, x + w, y + cornerLen, cornerColor); + + graphics.fill(x, y + h - 2, x + cornerLen, y + h, cornerColor); + graphics.fill(x, y + h - cornerLen, x + 2, y + h, cornerColor); + + graphics.fill(x + w - cornerLen, y + h - 2, x + w, y + h, cornerColor); + graphics.fill(x + w - 2, y + h - cornerLen, x + w, y + h, cornerColor); + } + + private void drawConsoleTitle(GuiGraphics graphics, int x, int y, int w) { + var font = Minecraft.getInstance().font; + + String title = "STELLAR IRIS COMMAND CONSOLE"; + int titleW = font.width(title); + int titleX = x + (w - titleW) / 2; + int titleY = y + 8; + + int frameColor = getStageFrameColor(lastSyncedStage); + + int bgW = titleW + 20; + int bgX = x + (w - bgW) / 2; + graphics.fill(bgX, titleY - 3, bgX + bgW, titleY + 11, 0xE0080810); + + int borderColor = (0x80 << 24) | frameColor; + graphics.fill(bgX, titleY - 3, bgX + bgW, titleY - 2, borderColor); + graphics.fill(bgX, titleY + 10, bgX + bgW, titleY + 11, borderColor); + graphics.fill(bgX, titleY - 2, bgX + 1, titleY + 10, borderColor); + graphics.fill(bgX + bgW - 1, titleY - 2, bgX + bgW, titleY + 10, borderColor); + + int textColor = 0xFFFFFFFF; + if (lastSyncedStage == Stage.DEATH && (tickCounter / 5) % 2 == 0) { + textColor = 0xFFFF4444; + } + + graphics.drawString(font, title, titleX, titleY, textColor, true); + } + + private int getStageFrameColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0x506080; + case GROWING -> 0x6090FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF7722; + case BLACK_HOLE -> 0xAA55FF; + case DEATH -> 0xFF3030; + case DEATH_GRACEFUL -> 0x664040; + }; + } + + private static class ControlPanelWidget extends WidgetGroup { + + private final Supplier machineSupplier; + private final StellarCommandConsoleWidget parent; + + public ControlPanelWidget(int x, int y, int width, int height, + Supplier machineSupplier, + StellarCommandConsoleWidget parent) { + super(x, y, width, height); + this.machineSupplier = machineSupplier; + this.parent = parent; + initWidgets(); + } + + private void initWidgets() { + addWidget(new FuelGaugeWidget(5, 5, getSize().width - 75, 22, parent::getFuelLevel)); + + addWidget(new IgnitionButtonWidget( + 5, 30, getSize().width - 75, 22, + parent::canIgnite, + () -> parent.getCurrentStage() == Stage.EMPTY || parent.canIgnite(), + parent::requestIgnition)); + + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine != null) { + int slotX = getSize().width - 65; + SlotWidget starSeedSlot = new SlotWidget(machine.getInventory().storage, 0, slotX, 12, true, true); + starSeedSlot.setBackground(GuiTextures.SLOT, GuiTextures.ATOMIC_OVERLAY_1); + addWidget(starSeedSlot); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + DrawerHelper.drawSolidRect(graphics, x, y, w, h, 0xCC0a0a14); + + Stage stage = parent.getCurrentStage(); + int accentColor = getStageAccentColor(stage); + DrawerHelper.drawBorder(graphics, x, y, w, h, (0x80 << 24) | accentColor, 1); + graphics.fill(x + 1, y + 1, x + w - 1, y + 3, (0x60 << 24) | accentColor); + + var font = Minecraft.getInstance().font; + graphics.drawString(font, "IGNITION CONTROL", x + 5, y - 8, (0xA0 << 24) | accentColor, false); + + int slotX = x + w - 65; + graphics.drawString(font, "SEED", slotX + 8, y + 32, 0xFF606080, false); + + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + } + + private int getStageAccentColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0x506080; + case GROWING -> 0x6090FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF7722; + case BLACK_HOLE -> 0xAA55FF; + case DEATH -> 0xFF3030; + case DEATH_GRACEFUL -> 0x664040; + }; + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarConduitWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarConduitWidget.java new file mode 100644 index 000000000..e666c9131 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarConduitWidget.java @@ -0,0 +1,277 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StellarConduitWidget extends Widget { + + private final Supplier stageSupplier; + private final int coreX, coreY, coreSize; + private final int panelX, panelY, panelW, panelH; + + private final List pulses = new ArrayList<>(); + private float flowPhase = 0f; + + private static class EnergyPulse { + + float position; + float speed; + float intensity; + int pathIndex; + boolean alive = true; + } + + public StellarConduitWidget(int x, int y, int width, int height, + int coreX, int coreY, int coreSize, + int panelX, int panelY, int panelW, int panelH, + Supplier stageSupplier) { + super(x, y, width, height); + this.coreX = coreX; + this.coreY = coreY; + this.coreSize = coreSize; + this.panelX = panelX; + this.panelY = panelY; + this.panelW = panelW; + this.panelH = panelH; + this.stageSupplier = stageSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + Stage stage = stageSupplier.get(); + float speed = getFlowSpeed(stage); + flowPhase += speed; + + if (stage != Stage.EMPTY && stage != Stage.DEATH_GRACEFUL) { + if (Math.random() < speed * 3) { + spawnPulse(stage); + } + } + + pulses.removeIf(p -> !p.alive); + for (EnergyPulse pulse : pulses) { + pulse.position += pulse.speed; + if (pulse.position > 1f) { + pulse.alive = false; + } + } + } + + private void spawnPulse(Stage stage) { + if (pulses.size() > 15) return; + + EnergyPulse pulse = new EnergyPulse(); + pulse.position = 0f; + pulse.speed = 0.015f + (float) Math.random() * 0.02f; + pulse.intensity = 0.6f + (float) Math.random() * 0.4f; + pulse.pathIndex = (int) (Math.random() * 6); + + if (stage == Stage.DEATH) pulse.speed *= 2.5f; + else if (stage == Stage.BLACK_HOLE) pulse.speed *= 1.8f; + else if (stage == Stage.SUPERSTAR) pulse.speed *= 1.4f; + + pulses.add(pulse); + } + + private float getFlowSpeed(Stage stage) { + return switch (stage) { + case EMPTY -> 0.003f; + case GROWING -> 0.025f; + case STAR -> 0.018f; + case SUPERSTAR -> 0.035f; + case BLACK_HOLE -> 0.045f; + case DEATH -> 0.07f; + case DEATH_GRACEFUL -> 0.008f; + }; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + + Stage stage = stageSupplier.get(); + int color = getStageColor(stage); + + drawConduitPaths(graphics, x, y, color, stage); + drawFlowingEnergy(graphics, x, y, color, stage); + drawPulses(graphics, x, y, color); + drawJunctionNodes(graphics, x, y, color, stage); + } + + private void drawConduitPaths(GuiGraphics graphics, int ox, int oy, int color, Stage stage) { + int lineColor = 0x30000000 | (color & 0x00FFFFFF); + int glowColor = 0x15000000 | (color & 0x00FFFFFF); + + int cx = ox + coreX + coreSize / 2; + int cy = ox + coreY + coreSize / 2; + int coreRadius = coreSize / 2 + 5; + + int px = ox + panelX; + int py = oy + panelY; + int pw = panelW; + int ph = panelH; + + drawHorizontalConduit(graphics, cx + coreRadius, cy - 20, px - (cx + coreRadius), lineColor, glowColor); + drawHorizontalConduit(graphics, cx + coreRadius, cy + 20, px - (cx + coreRadius), lineColor, glowColor); + + drawVerticalConduit(graphics, px + pw / 2, py, oy + 5 - py, lineColor, glowColor); + drawVerticalConduit(graphics, px + pw / 2, py + ph, oy + getSize().height - 5 - (py + ph), lineColor, + glowColor); + + drawVerticalConduit(graphics, ox + coreX + coreSize / 2, oy + 5, coreY - 10, lineColor, glowColor); + drawVerticalConduit(graphics, ox + coreX + coreSize / 2, oy + coreY + coreSize + 5, + getSize().height - coreY - coreSize - 10, lineColor, glowColor); + } + + private void drawHorizontalConduit(GuiGraphics graphics, int x, int y, int length, int lineColor, int glowColor) { + if (length <= 0) return; + graphics.fill(x, y - 1, x + length, y + 2, glowColor); + graphics.fill(x, y, x + length, y + 1, lineColor); + } + + private void drawVerticalConduit(GuiGraphics graphics, int x, int y, int length, int lineColor, int glowColor) { + if (length <= 0) return; + graphics.fill(x - 1, y, x + 2, y + length, glowColor); + graphics.fill(x, y, x + 1, y + length, lineColor); + } + + private void drawFlowingEnergy(GuiGraphics graphics, int ox, int oy, int color, Stage stage) { + if (stage == Stage.EMPTY) return; + + int segments = 12; + float segmentSpacing = 1f / segments; + + int cx = ox + coreX + coreSize / 2; + int cy = oy + coreY + coreSize / 2; + int coreRadius = coreSize / 2 + 5; + int px = ox + panelX; + + for (int i = 0; i < segments; i++) { + float phase = (flowPhase + i * segmentSpacing) % 1f; + float brightness = Mth.sin(phase * Mth.PI); + if (brightness < 0.15f) continue; + + int alpha = (int) (0x80 * brightness); + int segColor = (alpha << 24) | (color & 0x00FFFFFF); + + int topConduitX = cx + coreRadius + (int) ((px - cx - coreRadius) * phase); + graphics.fill(topConduitX - 1, cy - 21, topConduitX + 2, cy - 19, segColor); + + int bottomConduitX = cx + coreRadius + (int) ((px - cx - coreRadius) * (1f - phase)); + graphics.fill(bottomConduitX - 1, cy + 19, bottomConduitX + 2, cy + 21, segColor); + } + } + + private void drawPulses(GuiGraphics graphics, int ox, int oy, int color) { + int cx = ox + coreX + coreSize / 2; + int cy = oy + coreY + coreSize / 2; + int coreRadius = coreSize / 2 + 5; + int px = ox + panelX; + int py = oy + panelY; + int pw = panelW; + int ph = panelH; + + for (EnergyPulse pulse : pulses) { + float brightness = pulse.intensity * (1f - pulse.position * 0.3f); + int alpha = (int) (0xDD * brightness); + int pulseColor = (alpha << 24) | (color & 0x00FFFFFF); + int coreColor = (alpha << 24) | 0xFFFFFF; + + int pulseX, pulseY; + + switch (pulse.pathIndex % 6) { + case 0 -> { + pulseX = cx + coreRadius + (int) ((px - cx - coreRadius) * pulse.position); + pulseY = cy - 20; + } + case 1 -> { + pulseX = cx + coreRadius + (int) ((px - cx - coreRadius) * pulse.position); + pulseY = cy + 20; + } + case 2 -> { + pulseX = px + pw / 2; + pulseY = py - (int) ((py - oy - 5) * pulse.position); + } + case 3 -> { + pulseX = px + pw / 2; + pulseY = py + ph + (int) ((oy + getSize().height - 5 - py - ph) * pulse.position); + } + case 4 -> { + pulseX = ox + coreX + coreSize / 2; + pulseY = oy + 5 + (int) ((coreY - 10) * pulse.position); + } + default -> { + pulseX = ox + coreX + coreSize / 2; + pulseY = oy + coreY + coreSize + 5 + + (int) ((getSize().height - coreY - coreSize - 10) * pulse.position); + } + } + + graphics.fill(pulseX - 2, pulseY - 2, pulseX + 3, pulseY + 3, pulseColor); + graphics.fill(pulseX - 1, pulseY - 1, pulseX + 2, pulseY + 2, coreColor); + } + } + + private void drawJunctionNodes(GuiGraphics graphics, int ox, int oy, int color, Stage stage) { + float pulse = Mth.sin(flowPhase * 4f) * 0.3f + 0.7f; + int nodeAlpha = (int) (0x90 * pulse); + int nodeColor = (nodeAlpha << 24) | (color & 0x00FFFFFF); + int nodeGlow = (nodeAlpha / 2 << 24) | (color & 0x00FFFFFF); + + int cx = ox + coreX + coreSize / 2; + int cy = oy + coreY + coreSize / 2; + int coreRadius = coreSize / 2 + 5; + int px = ox + panelX; + int py = oy + panelY; + int pw = panelW; + int ph = panelH; + + int[][] nodes = { + { cx + coreRadius, cy - 20 }, + { cx + coreRadius, cy + 20 }, + { px, cy - 20 }, + { px, cy + 20 }, + { px + pw / 2, py }, + { px + pw / 2, py + ph }, + { cx, oy + 5 }, + { cx, oy + getSize().height - 5 }, + }; + + for (int[] node : nodes) { + graphics.fill(node[0] - 3, node[1] - 3, node[0] + 4, node[1] + 4, nodeGlow); + graphics.fill(node[0] - 2, node[1] - 2, node[0] + 3, node[1] + 3, nodeColor); + graphics.fill(node[0] - 1, node[1] - 1, node[0] + 2, node[1] + 2, 0xDDFFFFFF); + } + } + + private int getStageColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0x506080; + case GROWING -> 0x6090FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF7722; + case BLACK_HOLE -> 0xAA55FF; + case DEATH -> 0xFF3030; + case DEATH_GRACEFUL -> 0x664040; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarCoreWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarCoreWidget.java new file mode 100644 index 000000000..abb9ec4af --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarCoreWidget.java @@ -0,0 +1,432 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StellarCoreWidget extends Widget { + + private final Supplier stageSupplier; + private final java.util.function.IntSupplier customColorSupplier; + + private float animPhase = 0f; + private float pulsePhase = 0f; + private float transitionProgress = 1f; + private Stage previousStage = Stage.EMPTY; + private Stage targetStage = Stage.EMPTY; + + private float prestigeScale = 1f; + private float prestigeAlpha = 1f; + private boolean prestigeAnimating = false; + + public StellarCoreWidget(int x, int y, int size, Supplier stageSupplier) { + this(x, y, size, stageSupplier, null); + } + + public StellarCoreWidget(int x, int y, int size, Supplier stageSupplier, + java.util.function.IntSupplier customColorSupplier) { + super(x, y, size, size); + this.stageSupplier = stageSupplier; + this.customColorSupplier = customColorSupplier; + } + + private int getCustomColor() { + return customColorSupplier != null ? customColorSupplier.getAsInt() : -1; + } + + public void setPrestigeScale(float scale) { + this.prestigeScale = Mth.clamp(scale, 0f, 1f); + } + + public void setPrestigeAlpha(float alpha) { + this.prestigeAlpha = Mth.clamp(alpha, 0f, 1f); + } + + public void setPrestigeAnimating(boolean animating) { + this.prestigeAnimating = animating; + if (!animating) { + this.prestigeScale = 1f; + this.prestigeAlpha = 1f; + } + } + + public boolean isPrestigeAnimating() { + return prestigeAnimating; + } + + public float getPrestigeScale() { + return prestigeScale; + } + + public float getPrestigeAlpha() { + return prestigeAlpha; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + animPhase += 0.03f; + pulsePhase += 0.08f; + + Stage current = stageSupplier.get(); + if (current != targetStage) { + previousStage = targetStage; + targetStage = current; + transitionProgress = 0f; + } + + if (transitionProgress < 1f) { + transitionProgress = Math.min(1f, transitionProgress + 0.02f); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + if (prestigeAnimating && prestigeAlpha <= 0f) { + return; + } + + int cx = getPosition().x + getSize().width / 2; + int cy = getPosition().y + getSize().height / 2; + int maxRadius = getSize().width / 2 - 5; + + if (prestigeAnimating) { + maxRadius = (int) (maxRadius * prestigeScale); + } + + Stage stage = stageSupplier.get(); + + drawVoidBackground(graphics, cx, cy, getSize().width / 2 - 5); + + switch (stage) { + case EMPTY -> drawEmptyCore(graphics, cx, cy, maxRadius); + case GROWING -> drawGrowingCore(graphics, cx, cy, maxRadius); + case STAR -> drawStarCore(graphics, cx, cy, maxRadius); + case SUPERSTAR -> drawSuperstarCore(graphics, cx, cy, maxRadius); + case BLACK_HOLE -> drawBlackHoleCore(graphics, cx, cy, maxRadius); + case DEATH, DEATH_GRACEFUL -> drawDeathCore(graphics, cx, cy, maxRadius, stage); + } + + if (!prestigeAnimating) { + drawStageLabel(graphics, cx, stage); + } + } + + private void drawVoidBackground(GuiGraphics graphics, int cx, int cy, int radius) { + for (int r = radius; r > 0; r -= 3) { + float progress = (float) r / radius; + int alpha = (int) (30 * progress); + int color = (alpha << 24) | 0x101020; + drawCircle(graphics, cx, cy, r, color); + } + } + + private void drawEmptyCore(GuiGraphics graphics, int cx, int cy, int radius) { + float pulse = 0.5f + 0.3f * Mth.sin(pulsePhase); + int alpha = (int) (pulse * 60); + + drawCircleRing(graphics, cx, cy, radius - 5, 2, (alpha << 24) | 0x404060); + + int innerRadius = radius / 3; + for (int r = innerRadius; r > 0; r -= 2) { + float glowProgress = (float) r / innerRadius; + int glowAlpha = (int) (20 * glowProgress * pulse); + drawCircle(graphics, cx, cy, r, (glowAlpha << 24) | 0x303050); + } + + drawCircle(graphics, cx, cy, 3, (int) (pulse * 100) << 24 | 0x505080); + } + + private void drawGrowingCore(GuiGraphics graphics, int cx, int cy, int radius) { + float pulse = 0.8f + 0.2f * Mth.sin(pulsePhase * 1.5f); + float grow = 0.3f + 0.4f * (Mth.sin(animPhase * 0.5f) * 0.5f + 0.5f); + + int coreRadius = (int) (radius * grow * pulse); + + for (int i = 0; i < 8; i++) { + float angle = animPhase * 2f + i * Mth.PI / 4f; + float dist = radius * 0.8f * (0.5f + 0.5f * Mth.sin(animPhase + i)); + int px = cx + (int) (Mth.cos(angle) * dist); + int py = cy + (int) (Mth.sin(angle) * dist); + int pAlpha = (int) (100 * (1f - dist / (radius * 0.8f))); + drawCircle(graphics, px, py, 2, (pAlpha << 24) | 0x6090FF); + } + + int[] colors = { 0x2040A0, 0x4060C0, 0x6080E0, 0x80A0FF }; + for (int layer = 0; layer < colors.length; layer++) { + int layerRadius = coreRadius - layer * 3; + if (layerRadius > 0) { + int alpha = 60 + layer * 30; + drawCircle(graphics, cx, cy, layerRadius, (alpha << 24) | colors[layer]); + } + } + + drawCircle(graphics, cx, cy, Math.max(3, coreRadius / 4), 0xDDFFFFFF); + } + + private void drawStarCore(GuiGraphics graphics, int cx, int cy, int radius) { + float pulse = 0.95f + 0.05f * Mth.sin(pulsePhase); + int coreRadius = (int) (radius * 0.7f * pulse); + + int customColor = getCustomColor(); + int baseColor = customColor != -1 ? customColor : 0xFFCC44; + + int[] colors = generateColorGradient(baseColor); + int coronaColor = blendTowardsWhite(baseColor, 0.3f); + + for (int r = coreRadius + 15; r > coreRadius; r -= 2) { + float glowProgress = (float) (r - coreRadius) / 15f; + int alpha = (int) ((1f - glowProgress) * 60); + drawCircle(graphics, cx, cy, r, (alpha << 24) | coronaColor); + } + + for (int layer = 0; layer < colors.length; layer++) { + int layerRadius = coreRadius - layer * (coreRadius / colors.length); + if (layerRadius > 0) { + int alpha = 180 + layer * 15; + alpha = Math.min(255, alpha); + drawCircle(graphics, cx, cy, layerRadius, (alpha << 24) | colors[layer]); + } + } + + int hotCenterRadius = coreRadius / 4; + drawCircle(graphics, cx, cy, hotCenterRadius, 0xEEFFFFFF); + + drawSolarFlares(graphics, cx, cy, coreRadius, coronaColor); + } + + private void drawSuperstarCore(GuiGraphics graphics, int cx, int cy, int radius) { + float pulse = 0.9f + 0.1f * Mth.sin(pulsePhase * 0.7f); + int coreRadius = (int) (radius * 0.85f * pulse); + + int customColor = getCustomColor(); + int baseColor = customColor != -1 ? shiftHue(customColor, 0.05f) : 0xFF7722; + + int[] colors = generateColorGradient(baseColor); + int coronaColor = darken(baseColor, 0.7f); + + for (int r = coreRadius + 20; r > coreRadius; r -= 2) { + float glowProgress = (float) (r - coreRadius) / 20f; + int alpha = (int) ((1f - glowProgress) * 80); + drawCircle(graphics, cx, cy, r, (alpha << 24) | coronaColor); + } + + for (int layer = 0; layer < colors.length; layer++) { + int layerRadius = coreRadius - layer * (coreRadius / colors.length); + if (layerRadius > 0) { + int alpha = 200 + layer * 11; + alpha = Math.min(255, alpha); + drawCircle(graphics, cx, cy, layerRadius, (alpha << 24) | colors[layer]); + } + } + + drawCircle(graphics, cx, cy, coreRadius / 3, 0xFFFFEECC); + + drawSolarFlares(graphics, cx, cy, coreRadius, coronaColor); + drawSolarFlares(graphics, cx, cy, coreRadius * 0.8f, blendTowardsWhite(baseColor, 0.5f)); + } + + private void drawBlackHoleCore(GuiGraphics graphics, int cx, int cy, int radius) { + int eventHorizonRadius = (int) (radius * 0.3f); + drawCircle(graphics, cx, cy, eventHorizonRadius, 0xFF000000); + + float diskPulse = 0.9f + 0.1f * Mth.sin(pulsePhase * 0.5f); + for (int i = 0; i < 360; i += 5) { + float angle = Mth.DEG_TO_RAD * i + animPhase; + float diskRadius = radius * 0.7f * diskPulse; + float variance = 0.1f * Mth.sin(angle * 3 + animPhase * 2); + diskRadius *= (1f + variance); + + int px = cx + (int) (Mth.cos(angle) * diskRadius); + int py = cy + (int) (Mth.sin(angle) * diskRadius * 0.3f); + + float colorPhase = (i / 360f + animPhase * 0.1f) % 1f; + int r = (int) (128 + 127 * Mth.sin(colorPhase * Mth.TWO_PI)); + int g = (int) (64 + 64 * Mth.sin(colorPhase * Mth.TWO_PI + 1)); + int b = (int) (180 + 75 * Mth.sin(colorPhase * Mth.TWO_PI + 2)); + int color = 0xAA000000 | (r << 16) | (g << 8) | b; + + drawCircle(graphics, px, py, 2, color); + } + + drawCircleRing(graphics, cx, cy, eventHorizonRadius + 3, 2, 0x60FFFFFF); + + for (int r = eventHorizonRadius; r > eventHorizonRadius - 10 && r > 0; r--) { + int alpha = (int) (40 * (1f - (float) (eventHorizonRadius - r) / 10f)); + drawCircle(graphics, cx, cy, r, (alpha << 24) | 0x6040A0); + } + } + + private void drawDeathCore(GuiGraphics graphics, int cx, int cy, int radius, Stage stage) { + boolean graceful = stage == Stage.DEATH_GRACEFUL; + + float pulse; + if (graceful) { + pulse = 0.3f + 0.2f * Mth.sin(pulsePhase * 0.3f); + } else { + pulse = 0.5f + 0.3f * Mth.sin(pulsePhase * 3f) + 0.2f * Mth.sin(pulsePhase * 7f + 1.3f) + + 0.1f * Mth.sin(pulsePhase * 11f + 2.7f); + pulse = Mth.clamp(pulse, 0.2f, 1.2f); + } + + int coreRadius = (int) (radius * 0.5f * pulse); + + int[] colors = graceful ? new int[] { 0x301010, 0x502020, 0x703030, 0x904040 } : + new int[] { 0x660000, 0xAA0000, 0xDD2200, 0xFF4400 }; + + for (int layer = 0; layer < colors.length; layer++) { + int layerRadius = coreRadius - layer * 3; + if (layerRadius > 0) { + int alpha = graceful ? (80 + layer * 20) : (150 + layer * 25); + alpha = Math.min(255, alpha); + drawCircle(graphics, cx, cy, layerRadius, (alpha << 24) | colors[layer]); + } + } + + if (!graceful && Math.random() < 0.1) { + int flickerRadius = coreRadius + (int) (Math.random() * 10); + drawCircle(graphics, cx, cy, flickerRadius, 0x40FF0000); + } + } + + private void drawSolarFlares(GuiGraphics graphics, int cx, int cy, float baseRadius, int color) { + int flareCount = 5; + for (int i = 0; i < flareCount; i++) { + float angle = animPhase * 0.5f + i * Mth.TWO_PI / flareCount; + float flareLength = 8 + 5 * Mth.sin(animPhase * 2 + i * 1.3f); + float dist = baseRadius + flareLength; + + int px = cx + (int) (Mth.cos(angle) * dist); + int py = cy + (int) (Mth.sin(angle) * dist); + + int alpha = (int) (80 + 40 * Mth.sin(animPhase * 3 + i)); + drawCircle(graphics, px, py, 3, (alpha << 24) | color); + } + } + + private void drawCircle(GuiGraphics graphics, int cx, int cy, int radius, int color) { + if (radius <= 0) return; + for (int y = -radius; y <= radius; y++) { + int halfWidth = (int) Math.sqrt(radius * radius - y * y); + graphics.fill(cx - halfWidth, cy + y, cx + halfWidth + 1, cy + y + 1, color); + } + } + + private void drawCircleRing(GuiGraphics graphics, int cx, int cy, int radius, int thickness, int color) { + for (int t = 0; t < thickness; t++) { + int r = radius - t; + if (r <= 0) continue; + for (int angle = 0; angle < 360; angle += 3) { + float rad = angle * Mth.DEG_TO_RAD; + int px = cx + (int) (Mth.cos(rad) * r); + int py = cy + (int) (Mth.sin(rad) * r); + graphics.fill(px, py, px + 1, py + 1, color); + } + } + } + + private void drawStageLabel(GuiGraphics graphics, int cx, Stage stage) { + String label = switch (stage) { + case EMPTY -> "DORMANT"; + case GROWING -> "IGNITING"; + case STAR -> "MAIN SEQUENCE"; + case SUPERSTAR -> "RED GIANT"; + case BLACK_HOLE -> "SINGULARITY"; + case DEATH -> "UNSTABLE"; + case DEATH_GRACEFUL -> "FADING"; + }; + + var font = Minecraft.getInstance().font; + int labelWidth = font.width(label); + int labelX = cx - labelWidth / 2; + int labelY = getPosition().y + getSize().height - 12; + + int textColor = getStageTextColor(stage); + graphics.drawString(font, label, labelX, labelY, textColor, false); + } + + private int getStageTextColor(Stage stage) { + int customColor = getCustomColor(); + if (customColor != -1 && (stage == Stage.STAR || stage == Stage.SUPERSTAR)) { + return 0xFF000000 | customColor; + } + + return switch (stage) { + case EMPTY -> 0xFF606080; + case GROWING -> 0xFF8090FF; + case STAR -> 0xFFFFCC44; + case SUPERSTAR -> 0xFFFF8844; + case BLACK_HOLE -> 0xFFAA66FF; + case DEATH -> 0xFFFF4444; + case DEATH_GRACEFUL -> 0xFF884444; + }; + } + + private int[] generateColorGradient(int baseColor) { + int[] gradient = new int[5]; + float[] hsb = rgbToHsb(baseColor); + + for (int i = 0; i < 5; i++) { + float brightness = 0.3f + (i * 0.175f); + float saturation = Math.max(0.2f, hsb[1] - (i * 0.1f)); + gradient[i] = hsbToRgb(hsb[0], saturation, Math.min(1f, brightness)); + } + + return gradient; + } + + private int blendTowardsWhite(int color, float factor) { + int r = (color >> 16) & 0xFF; + int g = (color >> 8) & 0xFF; + int b = color & 0xFF; + + r = (int) (r + (255 - r) * factor); + g = (int) (g + (255 - g) * factor); + b = (int) (b + (255 - b) * factor); + + return (r << 16) | (g << 8) | b; + } + + private int darken(int color, float factor) { + int r = (int) (((color >> 16) & 0xFF) * factor); + int g = (int) (((color >> 8) & 0xFF) * factor); + int b = (int) ((color & 0xFF) * factor); + + return (r << 16) | (g << 8) | b; + } + + private int shiftHue(int color, float shift) { + float[] hsb = rgbToHsb(color); + hsb[0] = (hsb[0] + shift) % 1f; + if (hsb[0] < 0) hsb[0] += 1f; + return hsbToRgb(hsb[0], hsb[1], hsb[2]); + } + + private static float[] rgbToHsb(int rgb) { + int r = (rgb >> 16) & 0xFF; + int g = (rgb >> 8) & 0xFF; + int b = rgb & 0xFF; + + float[] hsb = new float[3]; + java.awt.Color.RGBtoHSB(r, g, b, hsb); + return hsb; + } + + private static int hsbToRgb(float h, float s, float b) { + return java.awt.Color.HSBtoRGB(h, s, b) & 0xFFFFFF; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarFancyUIWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarFancyUIWidget.java new file mode 100644 index 000000000..fca876f96 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarFancyUIWidget.java @@ -0,0 +1,383 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; +import com.gregtechceu.gtceu.api.gui.fancy.IFancyUIProvider; + +import com.lowdragmc.lowdraglib.gui.texture.ColorBorderTexture; +import com.lowdragmc.lowdraglib.gui.texture.ColorRectTexture; +import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; +import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.SlotWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StellarFancyUIWidget extends FancyMachineUIWidget { + + private final Supplier stageSupplier; + private Stage lastStage = Stage.EMPTY; + + private static final int BG_COLOR = 0xE00a0a14; + private static final int BORDER_COLOR = 0xFF404060; + private static final int SLOT_BG_COLOR = 0xC0101018; + private static final int SLOT_BORDER_COLOR = 0xFF505070; + + public StellarFancyUIWidget(IFancyUIProvider mainPage, int width, int height, Supplier stageSupplier) { + super(mainPage, width, height); + this.stageSupplier = stageSupplier; + setBackground((IGuiTexture) null); + applyDarkTheme(); + } + + private void applyDarkTheme() { + IGuiTexture titleBarBg = new GuiTextureGroup( + new ColorRectTexture(BG_COLOR), + new ColorBorderTexture(1, BORDER_COLOR)); + + if (titleBar != null) { + titleBar.setBackground((IGuiTexture) null); + for (Widget widget : titleBar.widgets) { + if (widget instanceof WidgetGroup group) { + group.setBackground(titleBarBg); + } + } + } + + if (sideTabsWidget != null) { + sideTabsWidget.setBackground((IGuiTexture) null); + updateTabStyling(Stage.EMPTY); + } + + if (configuratorPanel != null) { + configuratorPanel.setVisible(false); + configuratorPanel.setActive(false); + } + + if (playerInventory != null) { + playerInventory.setBackground((IGuiTexture) null); + IGuiTexture darkSlot = new GuiTextureGroup( + new ColorRectTexture(SLOT_BG_COLOR), + new ColorBorderTexture(1, SLOT_BORDER_COLOR)); + for (Widget widget : playerInventory.widgets) { + if (widget instanceof SlotWidget slotWidget) { + slotWidget.setBackground(darkSlot); + } + } + } + } + + private void updateTabStyling(Stage stage) { + if (sideTabsWidget == null) return; + + int accentColor = getStageAccentColorFull(stage); + int accentColorDim = dimColor(accentColor, 0.6f); + + IGuiTexture tabNormal = new GuiTextureGroup( + new ColorRectTexture(0xA0080812), + new ColorBorderTexture(1, accentColorDim)); + IGuiTexture tabHover = new GuiTextureGroup( + new ColorRectTexture(0xC0151525), + new ColorBorderTexture(1, accentColor)); + IGuiTexture tabPressed = new GuiTextureGroup( + new ColorRectTexture(0xE0101020), + new ColorBorderTexture(1, accentColor)); + + sideTabsWidget.setTabTexture(tabNormal); + sideTabsWidget.setTabHoverTexture(tabHover); + sideTabsWidget.setTabPressedTexture(tabPressed); + } + + private int dimColor(int color, float factor) { + int a = (color >> 24) & 0xFF; + int r = (int) (((color >> 16) & 0xFF) * factor); + int g = (int) (((color >> 8) & 0xFF) * factor); + int b = (int) ((color & 0xFF) * factor); + return (a << 24) | (r << 16) | (g << 8) | b; + } + + @Override + public void initWidget() { + super.initWidget(); + if (playerInventory != null) { + IGuiTexture darkSlot = new GuiTextureGroup( + new ColorRectTexture(SLOT_BG_COLOR), + new ColorBorderTexture(1, SLOT_BORDER_COLOR)); + for (Widget widget : playerInventory.widgets) { + if (widget instanceof SlotWidget slotWidget) { + slotWidget.setBackground(darkSlot); + } + } + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + Stage currentStage = stageSupplier.get(); + if (currentStage != lastStage) { + lastStage = currentStage; + updateTabStyling(currentStage); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + drawFullBackground(graphics); + drawCustomOverlays(graphics); + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + drawTitleText(graphics); + } + + private void drawFullBackground(GuiGraphics graphics) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + Stage stage = stageSupplier.get(); + + DrawerHelper.drawGradientRect(graphics, x, y, w, h, 0xFF0c0c12, 0xFF060608, false); + drawGridPattern(graphics, x, y, w, h); + drawCornerAccents(graphics, x, y, w, h, getStageAccentColorFull(stage) & 0x66FFFFFF); + DrawerHelper.drawBorder(graphics, x, y, w, h, getStageAccentColorFull(stage) & 0x33FFFFFF, 1); + + if (playerInventory != null && playerInventory.isVisible()) { + drawSidePanels(graphics, x, y, w, h, stage); + } + } + + private void drawGridPattern(GuiGraphics graphics, int x, int y, int w, int h) { + int gridColor = 0x08FFFFFF; + int spacing = 16; + for (int gx = x + spacing; gx < x + w; gx += spacing) { + graphics.fill(gx, y, gx + 1, y + h, gridColor); + } + for (int gy = y + spacing; gy < y + h; gy += spacing) { + graphics.fill(x, gy, x + w, gy + 1, gridColor); + } + } + + private void drawCornerAccents(GuiGraphics graphics, int x, int y, int w, int h, int color) { + int len = 20; + int thickness = 2; + graphics.fill(x, y, x + len, y + thickness, color); + graphics.fill(x, y, x + thickness, y + len, color); + graphics.fill(x + w - len, y, x + w, y + thickness, color); + graphics.fill(x + w - thickness, y, x + w, y + len, color); + graphics.fill(x, y + h - thickness, x + len, y + h, color); + graphics.fill(x, y + h - len, x + thickness, y + h, color); + graphics.fill(x + w - len, y + h - thickness, x + w, y + h, color); + graphics.fill(x + w - thickness, y + h - len, x + w, y + h, color); + } + + private void drawSidePanels(GuiGraphics graphics, int x, int y, int w, int h, Stage stage) { + int invY = playerInventory.getPosition().y; + int invX = playerInventory.getPosition().x; + int invW = playerInventory.getSize().width; + int panelH = h - (invY - y) - 5; + + int leftPanelX = x + 3; + int leftPanelW = invX - leftPanelX - 3; + if (leftPanelW > 20) { + drawTechPanel(graphics, leftPanelX, invY, leftPanelW, panelH, stage); + } + + int rightPanelX = invX + invW + 3; + int rightPanelW = (x + w) - rightPanelX - 3; + if (rightPanelW > 20) { + drawStatsPanel(graphics, rightPanelX, invY, rightPanelW, panelH, stage); + } + } + + private void drawTechPanel(GuiGraphics graphics, int px, int py, int pw, int ph, Stage stage) { + DrawerHelper.drawSolidRect(graphics, px, py, pw, ph, 0x40000000); + int borderColor = getStageAccentColorFull(stage) & 0x33FFFFFF; + DrawerHelper.drawBorder(graphics, px, py, pw, ph, borderColor, 1); + int accentColor = getStageAccentColorFull(stage) & 0x80FFFFFF; + graphics.fill(px + 1, py + 1, px + pw - 1, py + 3, accentColor); + + int lineColor = 0x20FFFFFF; + int lineY = py + 15; + for (int i = 0; i < 5 && lineY + 10 < py + ph; i++) { + int lineW = (int) ((pw - 10) * (0.3f + 0.4f * ((System.currentTimeMillis() / 100 + i * 50) % 100) / 100f)); + graphics.fill(px + 5, lineY, px + 5 + lineW, lineY + 2, lineColor); + lineY += 12; + } + } + + private void drawStatsPanel(GuiGraphics graphics, int px, int py, int pw, int ph, Stage stage) { + DrawerHelper.drawSolidRect(graphics, px, py, pw, ph, 0x40000000); + int borderColor = getStageAccentColorFull(stage) & 0x33FFFFFF; + DrawerHelper.drawBorder(graphics, px, py, pw, ph, borderColor, 1); + int accentColor = getStageAccentColorFull(stage) & 0x80FFFFFF; + graphics.fill(px + 1, py + 1, px + pw - 1, py + 3, accentColor); + + var font = Minecraft.getInstance().font; + int labelColor = 0xFF606080; + int valueColor = 0xFFCCCCCC; + + graphics.drawString(font, "STAR STATS", px + 4, py + 6, accentColor | 0xFF000000, false); + + float temp = getStageTemp(stage); + float mass = getStageMass(stage); + float output = getStageOutput(stage); + + graphics.drawString(font, "TEMP:", px + 4, py + 20, labelColor, false); + graphics.drawString(font, formatTemp(temp), px + 35, py + 20, getTemperatureColor(temp), false); + graphics.drawString(font, "MASS:", px + 4, py + 32, labelColor, false); + graphics.drawString(font, String.format("%.1f M\u2609", mass), px + 35, py + 32, valueColor, false); + graphics.drawString(font, "OUT:", px + 4, py + 44, labelColor, false); + graphics.drawString(font, formatEnergy(output), px + 30, py + 44, valueColor, false); + graphics.drawString(font, getStatusString(stage), px + 4, py + 56, getStatusColor(stage), false); + } + + private float getStageTemp(Stage stage) { + return switch (stage) { + case EMPTY -> 2.7f; + case GROWING -> 5_000_000f; + case STAR -> 15_000_000f; + case SUPERSTAR -> 100_000_000f; + case BLACK_HOLE -> Float.POSITIVE_INFINITY; + case DEATH -> 500_000_000f; + case DEATH_GRACEFUL -> 1_000_000f; + }; + } + + private float getStageMass(Stage stage) { + return switch (stage) { + case EMPTY -> 0f; + case GROWING -> 0.3f; + case STAR -> 1f; + case SUPERSTAR -> 8f; + case BLACK_HOLE -> 25f; + case DEATH -> 12f; + case DEATH_GRACEFUL -> 0.1f; + }; + } + + private float getStageOutput(Stage stage) { + return switch (stage) { + case EMPTY -> 0f; + case GROWING -> 1_000f; + case STAR -> 50_000f; + case SUPERSTAR -> 500_000f; + case BLACK_HOLE -> 10_000_000f; + case DEATH -> 100_000_000f; + case DEATH_GRACEFUL -> 500f; + }; + } + + private String formatTemp(float temp) { + if (Float.isInfinite(temp)) return "\u221E K"; + if (temp >= 1_000_000) return String.format("%.0fM K", temp / 1_000_000); + if (temp >= 1000) return String.format("%.0fk K", temp / 1000); + return String.format("%.1f K", temp); + } + + private String formatEnergy(float energy) { + if (energy >= 1_000_000) return String.format("%.1f PW", energy / 1_000_000); + if (energy >= 1000) return String.format("%.0f TW", energy / 1000); + return String.format("%.0f GW", energy); + } + + private int getTemperatureColor(float temp) { + if (temp >= 100_000_000) return 0xFFFF4444; + if (temp >= 10_000_000) return 0xFFFFAA44; + if (temp >= 1_000_000) return 0xFFFFFF44; + return 0xFFCCCCCC; + } + + private String getStatusString(Stage stage) { + return switch (stage) { + case EMPTY -> "DORMANT"; + case GROWING -> "IGNITING"; + case STAR -> "STABLE"; + case SUPERSTAR -> "CRITICAL"; + case BLACK_HOLE -> "CONTAINED"; + case DEATH -> "FAILURE"; + case DEATH_GRACEFUL -> "SHUTDOWN"; + }; + } + + private int getStatusColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0xFF606060; + case GROWING -> 0xFF66AAFF; + case STAR -> 0xFF66FF66; + case SUPERSTAR -> 0xFFFFAA44; + case BLACK_HOLE -> 0xFFAA66FF; + case DEATH -> 0xFFFF4444; + case DEATH_GRACEFUL -> 0xFF886666; + }; + } + + private void drawTitleText(GuiGraphics graphics) { + if (titleBar == null || mainPage == null) return; + + var font = Minecraft.getInstance().font; + String title = mainPage.getTitle().getString(); + + int titleBarX = getPosition().x + 8; + int titleBarY = getPosition().y - 16; + int textAreaX = titleBarX + 18 + 16; + int textAreaY = titleBarY + 3; + int textAreaWidth = getSize().width - 16 - 18 - 18 - 16; + int textAreaHeight = 13; + + graphics.fill(textAreaX, textAreaY, textAreaX + textAreaWidth, textAreaY + textAreaHeight, BG_COLOR); + + int textWidth = font.width(title); + int centeredX = textAreaX + (textAreaWidth - textWidth) / 2; + int centeredY = textAreaY + (textAreaHeight - font.lineHeight) / 2; + graphics.drawString(font, title, centeredX, centeredY, 0xFFFFFFFF, true); + } + + private void drawCustomOverlays(GuiGraphics graphics) { + Stage stage = stageSupplier.get(); + int accentColor = getStageAccentColor(stage); + + if (playerInventory != null && playerInventory.isVisible()) { + int x = getPosition().x; + int w = getSize().width; + int invY = playerInventory.getPosition().y; + graphics.fill(x + 10, invY - 2, x + w - 10, invY - 1, accentColor); + } + } + + private int getStageAccentColor(Stage stage) { + int alpha = 0x60; + return (alpha << 24) | switch (stage) { + case EMPTY -> 0x404060; + case GROWING -> 0x6080FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF8844; + case BLACK_HOLE -> 0x8040FF; + case DEATH -> 0xFF2020; + case DEATH_GRACEFUL -> 0x804040; + }; + } + + private int getStageAccentColorFull(Stage stage) { + return 0xFF000000 | switch (stage) { + case EMPTY -> 0x404060; + case GROWING -> 0x6080FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF8844; + case BLACK_HOLE -> 0x8040FF; + case DEATH -> 0xFF2020; + case DEATH_GRACEFUL -> 0x804040; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarIrisWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarIrisWidget.java new file mode 100644 index 000000000..2cd97acdd --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarIrisWidget.java @@ -0,0 +1,728 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarIrisProvider; +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarModuleReceiver; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; +import com.ghostipedia.cosmiccore.client.gui.screen.StellarConvergenceScreen; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StellarIrisWidget extends WidgetGroup { + + public static final int WIDTH = 310; + public static final int HEIGHT = 160; + + private final Supplier machineSupplier; + + private Stage lastSyncedStage = Stage.EMPTY; + private boolean hasReceivedInitialSync = false; + private float fuelLevel = 0f; + private boolean canIgnite = false; + private int lastSyncedStarColor = -1; + + private StellarCoreWidget coreWidget; + private OrbitalRingsWidget orbitalRings; + private ModuleSelectorWidget moduleSelectorWidget; + private ModuleToggleButton moduleToggleButton; + private ModuleConfigPopout moduleConfigPopout; + private StageContextPanel contextPanel; + private StarColorButton starColorButton; + private StarColorPickerPopup starColorPicker; + private boolean showingColorPicker = false; + + private PrestigeAnimationOverlay prestigeAnimationOverlay; + private PrestigeWindow prestigeWindow; + private UpgradeTreeWidget upgradeTreeWidget; + private UpgradeTreeButton upgradeTreeButton; + private boolean prestigeAnimationTriggered = false; + private Stage stageBeforePrestige = Stage.EMPTY; + + private int tickCounter = 0; + private boolean debugPrimed = false; + private boolean showingModuleSelector = false; + + private int selectedModuleIndex = -1; + private String lastSyncedModuleName = ""; + private boolean lastSyncedModuleConnected = false; + private boolean lastSyncedModuleWorking = false; + private long lastSyncedModuleEnergy = 0; + private double lastSyncedModuleSpeed = 0; + private Stage lastSyncedModuleStage = Stage.EMPTY; + private int lastSyncedModuleParallel = 0; + private long lastSyncedModuleVoltage = 0; + private int lastSyncedIrisParallelLimit = 0; + private long lastSyncedMaxEUt = 0; + private int lastSyncedEffectiveParallel = 0; + private int lastSyncedOverclockTier = 0; + + public StellarIrisWidget(Supplier machineSupplier) { + super(0, 0, WIDTH, HEIGHT); + this.machineSupplier = machineSupplier; + initWidgets(); + } + + @Override + public void writeInitialData(RegistryFriendlyByteBuf buffer) { + super.writeInitialData(buffer); + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine != null) { + Stage serverStage = machine.getStage(); + // Debug: log what stage the SERVER is sending + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn( + "[StellarIrisWidget] SERVER writeInitialData: stage={}, color={}", + serverStage, machine.getCustomStarColor()); + buffer.writeEnum(serverStage); + buffer.writeInt(machine.getCustomStarColor()); + } else { + buffer.writeEnum(Stage.EMPTY); + buffer.writeInt(-1); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readInitialData(RegistryFriendlyByteBuf buffer) { + super.readInitialData(buffer); + lastSyncedStage = buffer.readEnum(Stage.class); + lastSyncedStarColor = buffer.readInt(); + hasReceivedInitialSync = true; + // Debug: log what stage the CLIENT received + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn( + "[StellarIrisWidget] CLIENT readInitialData: stage={}, color={}", + lastSyncedStage, lastSyncedStarColor); + } + + private void initWidgets() { + // Debug: verify the stage supplier returns EMPTY before sync + // Version marker: V3 - 2026-01-13 + Stage initialStage = getCurrentStage(); + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn( + "[StellarIrisWidget V3] initWidgets: getCurrentStage()={}, hasReceivedInitialSync={}", + initialStage, hasReceivedInitialSync); + + addWidget(new StarfieldBackgroundWidget(0, 0, WIDTH, HEIGHT, this::getCurrentStage)); + + int margin = 5; + int gap = 5; + + int coreSize = 130; + int panelWidth = 135; + + int panelX = WIDTH - margin - panelWidth; + int panelY = margin; + int panelH = HEIGHT - (margin * 2); + + int coreX = panelX - gap - coreSize; + int coreY = (HEIGHT - coreSize) / 2; + + orbitalRings = new OrbitalRingsWidget(coreX - 5, coreY - 5, coreSize + 10, coreSize + 10, + this::getCurrentStage); + addWidget(orbitalRings); + + coreWidget = new StellarCoreWidget(coreX, coreY, coreSize, this::getCurrentStage, this::getCurrentStarColor); + addWidget(coreWidget); + + int moduleSelectorSize = HEIGHT - margin * 2; + int moduleSelectorX = (WIDTH - moduleSelectorSize) / 2; + int moduleSelectorY = margin; + moduleSelectorWidget = new ModuleSelectorWidget(moduleSelectorX, moduleSelectorY, moduleSelectorSize, + machineSupplier, this::onModuleSelected); + moduleSelectorWidget.setVisible(false); + moduleSelectorWidget.setActive(false); + addWidget(moduleSelectorWidget); + + contextPanel = new StageContextPanel(panelX, panelY, panelWidth, panelH, machineSupplier, this); + addWidget(contextPanel); + + int popoutX = moduleSelectorX + moduleSelectorSize + 10; + int popoutY = moduleSelectorY + 20; + moduleConfigPopout = new ModuleConfigPopout(popoutX, popoutY, machineSupplier, this::onModulePopoutClosed); + moduleConfigPopout.setOnPowerSettingsChanged(this::onPowerSettingsChanged); + addWidget(moduleConfigPopout); + + initDebugButtons(); + initModuleToggle(); + initStarColorButton(); + initPrestigeWidgets(); + initUpgradeTreeWidgets(); + } + + private void initPrestigeWidgets() { + int windowW = 200; + int windowH = 160; + int windowX = (WIDTH - windowW) / 2; + int windowY = (HEIGHT - windowH) / 2; + + prestigeWindow = new PrestigeWindow(windowX, windowY, windowW, windowH, + machineSupplier, this::onPrestigeWindowClosed); + addWidget(prestigeWindow); + + prestigeAnimationOverlay = new PrestigeAnimationOverlay(0, 0, WIDTH, HEIGHT, + machineSupplier, this::onPrestigeAnimationComplete, this::onShowPrestigeWindow); + prestigeAnimationOverlay.setCoreWidget(coreWidget); + addWidget(prestigeAnimationOverlay); + } + + private void initUpgradeTreeWidgets() { + // Upgrade tree button - positioned next to other buttons + int btnSize = 18; + int btnX = 5 + 18 + 4 + 18 + 4; // After module toggle and color button + int btnY = HEIGHT - btnSize - 5; + + upgradeTreeButton = new UpgradeTreeButton(btnX, btnY, btnSize, btnSize, + this::onUpgradeTreeButtonClicked, machineSupplier); + addWidget(upgradeTreeButton); + + // Note: Widget is no longer used - we open a full screen instead + upgradeTreeWidget = null; + } + + @OnlyIn(Dist.CLIENT) + private void onUpgradeTreeButtonClicked(boolean ignored) { + // Open the full-screen upgrade tree + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine != null) { + StellarConvergenceScreen.open(machine); + } + } + + private void initDebugButtons() { + int btnWidth = 50; + int btnHeight = 14; + int btnX = 5; + int btnY = HEIGHT - btnHeight - 5 - 20; + + addWidget(new DebugPrimeButton(btnX, btnY, btnWidth, btnHeight, this::requestDebugPrime)); + } + + private void initModuleToggle() { + int btnSize = 18; + int btnX = 5; + int btnY = HEIGHT - btnSize - 5; + + moduleToggleButton = new ModuleToggleButton(btnX, btnY, btnSize, btnSize, this::onModuleToggle, + this::getCurrentStage); + addWidget(moduleToggleButton); + } + + private void initStarColorButton() { + int btnSize = 18; + int btnX = 5 + 18 + 4; + int btnY = HEIGHT - btnSize - 5; + + starColorButton = new StarColorButton(btnX, btnY, btnSize, btnSize, this::onColorButtonClicked, + this::getCurrentStarColor); + addWidget(starColorButton); + + int pickerX = btnX; + int pickerY = btnY - StarColorPickerPopup.HEIGHT - 5; + starColorPicker = new StarColorPickerPopup(pickerX, pickerY, this::hideColorPicker, this::onStarColorChanged); + addWidget(starColorPicker); + } + + private void onColorButtonClicked(boolean ignored) { + if (showingColorPicker) { + hideColorPicker(); + } else { + showColorPicker(); + } + } + + private void showColorPicker() { + showingColorPicker = true; + starColorPicker.show(lastSyncedStarColor); + } + + private void hideColorPicker() { + showingColorPicker = false; + starColorPicker.hide(); + } + + private void onStarColorChanged(int newColor) { + writeClientAction(6, buf -> buf.writeInt(newColor)); + } + + public int getCurrentStarColor() { + return lastSyncedStarColor; + } + + private void onModuleToggle(boolean showModules) { + showingModuleSelector = showModules; + + coreWidget.setVisible(!showModules); + coreWidget.setActive(!showModules); + orbitalRings.setVisible(!showModules); + orbitalRings.setActive(!showModules); + contextPanel.setVisible(!showModules); + contextPanel.setActive(!showModules); + + moduleSelectorWidget.setVisible(showModules); + moduleSelectorWidget.setActive(showModules); + + if (!showModules) { + moduleConfigPopout.hide(); + moduleSelectorWidget.clearSelection(); + writeClientAction(4, buf -> buf.writeInt(-1)); + } + } + + private void onModuleSelected(int moduleIndex) { + this.selectedModuleIndex = moduleIndex; + moduleConfigPopout.showForModule(moduleIndex); + writeClientAction(4, buf -> buf.writeInt(moduleIndex)); + } + + private void onModulePopoutClosed() { + moduleSelectorWidget.clearSelection(); + } + + private void onPowerSettingsChanged(int maxParallel, long voltagePerParallel) { + if (selectedModuleIndex < 0) return; + + writeClientAction(5, buf -> { + buf.writeInt(selectedModuleIndex); + buf.writeInt(maxParallel); + buf.writeLong(voltagePerParallel); + }); + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] CLIENT sending power settings: module={}, parallel={}, voltage={}", + selectedModuleIndex, maxParallel, voltagePerParallel); + } + + public void requestDebugPrime() { + writeClientAction(3, buf -> {}); + } + + public Stage getCurrentStage() { + // Before we receive initial sync, return EMPTY as safe default + // The client-side machine may have corrupted stage data before sync completes + if (!hasReceivedInitialSync) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER + .warn("[StellarIrisWidget] getCurrentStage: No initial sync yet, returning EMPTY"); + return Stage.EMPTY; + } + // Safety check: if lastSyncedStage is somehow null, return EMPTY + if (lastSyncedStage == null) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER + .warn("[StellarIrisWidget] getCurrentStage: lastSyncedStage is null, returning EMPTY"); + return Stage.EMPTY; + } + // Debug: log non-empty/non-star stages + if (lastSyncedStage != Stage.EMPTY && lastSyncedStage != Stage.STAR) { + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn("[StellarIrisWidget] getCurrentStage: returning {}", + lastSyncedStage); + } + return lastSyncedStage; + } + + public float getFuelLevel() { + return fuelLevel; + } + + public boolean canIgnite() { + return canIgnite; + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + + Stage currentStage = machine.getStage(); + if (currentStage != lastSyncedStage) { + lastSyncedStage = currentStage; + writeUpdateInfo(301, buf -> buf.writeEnum(currentStage)); + } + + float newFuelLevel = calculateFuelLevel(machine); + if (Math.abs(newFuelLevel - fuelLevel) > 0.01f) { + fuelLevel = newFuelLevel; + writeUpdateInfo(302, buf -> buf.writeFloat(fuelLevel)); + } + + boolean newCanIgnite = checkIgnitionRequirements(machine); + if (newCanIgnite != canIgnite) { + canIgnite = newCanIgnite; + writeUpdateInfo(303, buf -> buf.writeBoolean(canIgnite)); + } + + int newStarColor = machine.getCustomStarColor(); + if (newStarColor != lastSyncedStarColor) { + lastSyncedStarColor = newStarColor; + writeUpdateInfo(306, buf -> buf.writeInt(newStarColor)); + } + + syncSelectedModuleData(machine); + } + + private void syncSelectedModuleData(IrisMultiblockMachine machine) { + if (selectedModuleIndex < 0) return; + + List modules = new ArrayList<>(machine.getConnectedModules()); + if (selectedModuleIndex >= modules.size()) { + selectedModuleIndex = -1; + writeUpdateInfo(305, buf -> {}); + return; + } + + IStellarModuleReceiver receiver = modules.get(selectedModuleIndex); + + String newName = ""; + boolean newConnected = false; + boolean newWorking = false; + long newEnergy = 0; + double newSpeed = 0; + Stage newStage = Stage.EMPTY; + int newParallel = 1; + long newVoltage = 32; + int newIrisLimit = 1; + long newMaxEUt = 0; + int newEffectiveParallel = 1; + int newOverclockTier = 0; + + if (receiver instanceof StellarBaseModule module) { + newName = module.getBlockState().getBlock().getDescriptionId(); + IStellarIrisProvider iris = module.getStellarIris(); + if (iris == null) { + iris = machine; // Use Iris as fallback + } + + newConnected = iris != null && iris.isFormed(); + newWorking = module.getRecipeLogic().isWorking(); + newEnergy = module.getEnergyConsumedPerTick(); + + newParallel = module.getConfiguredMaxParallel(); + newVoltage = module.getConfiguredVoltagePerParallel(); + newIrisLimit = module.getIrisParallelLimit(); + + newMaxEUt = module.getMaxEUt(); + newEffectiveParallel = module.getEffectiveParallelLimit(); + newOverclockTier = module.getOverclockTier(); + + if (iris != null && iris.canProcess()) { + newSpeed = iris.getSpeedBonus(); + newStage = iris.getStage(); + } + } + + boolean changed = !newName.equals(lastSyncedModuleName) || newConnected != lastSyncedModuleConnected || + newWorking != lastSyncedModuleWorking || newEnergy != lastSyncedModuleEnergy || + newSpeed != lastSyncedModuleSpeed || newStage != lastSyncedModuleStage || + newParallel != lastSyncedModuleParallel || newVoltage != lastSyncedModuleVoltage || + newIrisLimit != lastSyncedIrisParallelLimit || newMaxEUt != lastSyncedMaxEUt || + newEffectiveParallel != lastSyncedEffectiveParallel || newOverclockTier != lastSyncedOverclockTier; + + if (changed) { + lastSyncedModuleName = newName; + lastSyncedModuleConnected = newConnected; + lastSyncedModuleWorking = newWorking; + lastSyncedModuleEnergy = newEnergy; + lastSyncedModuleSpeed = newSpeed; + lastSyncedModuleStage = newStage; + lastSyncedModuleParallel = newParallel; + lastSyncedModuleVoltage = newVoltage; + lastSyncedIrisParallelLimit = newIrisLimit; + lastSyncedMaxEUt = newMaxEUt; + lastSyncedEffectiveParallel = newEffectiveParallel; + lastSyncedOverclockTier = newOverclockTier; + + final String syncName = newName; + final boolean syncConnected = newConnected; + final boolean syncWorking = newWorking; + final long syncEnergy = newEnergy; + final double syncSpeed = newSpeed; + final Stage syncStage = newStage; + final int syncParallel = newParallel; + final long syncVoltage = newVoltage; + final int syncIrisLimit = newIrisLimit; + final long syncMaxEUt = newMaxEUt; + final int syncEffectiveParallel = newEffectiveParallel; + final int syncOverclockTier = newOverclockTier; + + writeUpdateInfo(304, buf -> { + buf.writeUtf(syncName); + buf.writeBoolean(syncConnected); + buf.writeBoolean(syncWorking); + buf.writeLong(syncEnergy); + buf.writeDouble(syncSpeed); + buf.writeEnum(syncStage); + buf.writeInt(syncParallel); + buf.writeLong(syncVoltage); + buf.writeInt(syncIrisLimit); + buf.writeLong(syncMaxEUt); + buf.writeInt(syncEffectiveParallel); + buf.writeInt(syncOverclockTier); + }); + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] Syncing module data: name={}, connected={}, parallel={}, voltage={}, maxEUt={}, tier={}", + syncName, syncConnected, syncParallel, syncVoltage, syncMaxEUt, syncOverclockTier); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, RegistryFriendlyByteBuf buffer) { + // Debug: log ALL update info calls to trace unexpected stage changes + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn( + "[StellarIrisWidget] readUpdateInfo: id={}, buffer remaining={}", + id, buffer.readableBytes()); + + if (id == 301) { + Stage newStage = buffer.readEnum(Stage.class); + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.warn( + "[StellarIrisWidget] readUpdateInfo(301): stage change {} -> {}", + lastSyncedStage, newStage); + lastSyncedStage = newStage; + } else if (id == 302) { + fuelLevel = buffer.readFloat(); + } else if (id == 303) { + canIgnite = buffer.readBoolean(); + } else if (id == 304) { + String name = buffer.readUtf(); + boolean connected = buffer.readBoolean(); + boolean working = buffer.readBoolean(); + long energy = buffer.readLong(); + double speed = buffer.readDouble(); + Stage stage = buffer.readEnum(Stage.class); + int parallel = buffer.readInt(); + long voltage = buffer.readLong(); + int irisLimit = buffer.readInt(); + long maxEUt = buffer.readLong(); + int effectiveParallel = buffer.readInt(); + int overclockTier = buffer.readInt(); + + // Update popout with synced data + moduleConfigPopout.updateModuleData(name, connected, working, energy, speed, stage, + parallel, voltage, irisLimit, maxEUt, effectiveParallel, overclockTier); + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] CLIENT readUpdateInfo: module name={}, parallel={}, voltage={}, maxEUt={}, tier={}", + name, parallel, voltage, maxEUt, overclockTier); + } else if (id == 305) { + moduleConfigPopout.hide(); + moduleSelectorWidget.clearSelection(); + } else if (id == 306) { + lastSyncedStarColor = buffer.readInt(); + } else { + super.readUpdateInfo(id, buffer); + } + } + + private float calculateFuelLevel(IrisMultiblockMachine machine) { + if (debugPrimed) { + return 1f; + } + + if (machine.getStage() == Stage.EMPTY) { + return machine.getInventory().getStackInSlot(0).isEmpty() ? 0f : 1f; + } + return switch (machine.getStage()) { + case EMPTY -> 0f; + case GROWING -> 0.5f; + case STAR, SUPERSTAR, BLACK_HOLE -> 1f; + case DEATH, DEATH_GRACEFUL -> 0.2f; + }; + } + + private boolean checkIgnitionRequirements(IrisMultiblockMachine machine) { + if (debugPrimed) { + return true; + } + if (machine.getStage() != Stage.EMPTY) return false; + if (machine.getInventory().getStackInSlot(0).isEmpty()) return false; + return fuelLevel >= 0.8f; + } + + public void debugPrime() { + debugPrimed = true; + } + + public void requestIgnition() { + writeClientAction(1, buf -> {}); + } + + public void requestStageAdvance() { + writeClientAction(2, buf -> {}); + } + + public void triggerPrestigeAnimation() { + if (prestigeAnimationTriggered) return; + + prestigeAnimationTriggered = true; + stageBeforePrestige = lastSyncedStage; + + prestigeAnimationOverlay.startAnimation(stageBeforePrestige, lastSyncedStarColor, 50); + writeClientAction(7, buf -> {}); + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] Prestige animation triggered! Stage before: {}", stageBeforePrestige); + } + + private void onPrestigeAnimationComplete() { + writeClientAction(8, buf -> {}); + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] Prestige animation complete, requesting completion from server"); + } + + private void onShowPrestigeWindow() { + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine != null) { + int earned = machine.getLastPrestigePointsEarned(); + int total = machine.getSpendablePoints() + earned; + int tier = machine.getPrestigeTier(); + int prevTier = tier; + + prestigeWindow.show(earned, total, tier, prevTier); + } else { + prestigeWindow.show(50, 50, 1, 0); + } + } + + private void onPrestigeWindowClosed() { + prestigeAnimationTriggered = false; + stageBeforePrestige = Stage.EMPTY; + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] Prestige window closed"); + } + + @Override + public void handleClientAction(int id, RegistryFriendlyByteBuf buffer) { + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + + if (id == 1) { + if (canIgnite || debugPrimed) { + machine.setStarStage(); + debugPrimed = false; + } + } else if (id == 2) { + machine.setStarStage(); + } else if (id == 3) { + debugPrimed = true; + } else if (id == 4) { + int newSelectedModule = buffer.readInt(); + this.selectedModuleIndex = newSelectedModule; + this.lastSyncedModuleName = ""; + this.lastSyncedModuleConnected = false; + this.lastSyncedModuleWorking = false; + this.lastSyncedModuleEnergy = -1; + this.lastSyncedModuleSpeed = -1; + this.lastSyncedModuleStage = null; + this.lastSyncedModuleParallel = -1; + this.lastSyncedModuleVoltage = -1; + this.lastSyncedIrisParallelLimit = -1; + this.lastSyncedMaxEUt = -1; + this.lastSyncedEffectiveParallel = -1; + this.lastSyncedOverclockTier = -1; + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] handleClientAction: module selection = {}", newSelectedModule); + } else if (id == 5) { + int moduleIndex = buffer.readInt(); + int newParallel = buffer.readInt(); + long newVoltage = buffer.readLong(); + + List modules = new ArrayList<>(machine.getConnectedModules()); + if (moduleIndex >= 0 && moduleIndex < modules.size()) { + IStellarModuleReceiver receiver = modules.get(moduleIndex); + if (receiver instanceof StellarBaseModule stellarModule) { + stellarModule.setConfiguredMaxParallel(newParallel); + stellarModule.setConfiguredVoltagePerParallel(newVoltage); + + stellarModule.markAsChanged(); + + this.lastSyncedModuleParallel = -1; + this.lastSyncedModuleVoltage = -1; + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] SERVER updated module {} power: parallel={}, voltage={}", + moduleIndex, newParallel, newVoltage); + } + } + } else if (id == 6) { + int newColor = buffer.readInt(); + machine.setCustomStarColor(newColor); + machine.markAsChanged(); + lastSyncedStarColor = newColor - 1; + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] SERVER updated star color: {}", + newColor == -1 ? "default" : String.format("#%06X", newColor)); + } else if (id == 7) { + machine.triggerPrestige(); + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] SERVER prestige triggered"); + } else if (id == 8) { + machine.completePrestige(); + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarIrisWidget] SERVER prestige completed. Points: {}, Tier: {}", + machine.getSpendablePoints(), machine.getPrestigeTier()); + } else { + super.handleClientAction(id, buffer); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + tickCounter++; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + int borderColor = getStageAccentColor(lastSyncedStage, 0.4f); + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + if (lastSyncedStage != Stage.EMPTY) { + int glowColor = getStageAccentColor(lastSyncedStage, 0.15f); + DrawerHelper.drawGradientRect(graphics, x + 1, y + 1, w - 2, 20, glowColor, 0x00000000, false); + } + + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + } + + private int getStageAccentColor(Stage stage, float alpha) { + int a = (int) (alpha * 255) << 24; + return switch (stage) { + case EMPTY -> a | 0x404050; + case GROWING -> a | 0x6080FF; + case STAR -> a | 0xFFCC44; + case SUPERSTAR -> a | 0xFF8844; + case BLACK_HOLE -> a | 0x8040FF; + case DEATH -> a | 0xFF2020; + case DEATH_GRACEFUL -> a | 0x804040; + }; + } + + public int getTickCounter() { + return tickCounter; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarModuleContentWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarModuleContentWidget.java new file mode 100644 index 000000000..debbb0659 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarModuleContentWidget.java @@ -0,0 +1,480 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarIrisProvider; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; + +import com.gregtechceu.gtceu.api.GTValues; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.BiConsumer; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StellarModuleContentWidget extends WidgetGroup { + + public static final int WIDTH = 186; + public static final int HEIGHT = 100; + + private static final int GEAR_BUTTON_SIZE = 20; + private static final ResourceLocation GEAR_TEXTURE = ResourceLocation.fromNamespaceAndPath("gtceu", + "textures/item/material_sets/dull/gear_small.png"); + + private final Supplier moduleSupplier; + + private boolean isConnected = false; + private boolean canProcess = false; + private boolean isWorking = false; + private Stage irisStage = Stage.EMPTY; + + private long maxEUt = 0; + private long currentEUt = 0; + private int effectiveParallel = 1; + private int configuredParallel = 1; + private int overclockTier = 0; + private double speedBonus = 1.0; + private int irisParallelLimit = 1; + private boolean wirelessAvailable = false; + private boolean powerFailure = false; + private long configuredVoltage = 32; + + private PowerControlPopup powerPopup; + private boolean showingPowerPopup = false; + private BiConsumer onPowerSettingsChanged; + + public StellarModuleContentWidget(Supplier moduleSupplier) { + super(0, 0, WIDTH, HEIGHT); + this.moduleSupplier = moduleSupplier; + initPowerPopup(); + } + + private void initPowerPopup() { + powerPopup = new PowerControlPopup(WIDTH + 4, 0, this::hidePowerPopup, this::onPowerSettingsApplied); + addWidget(powerPopup); + } + + public void setOnPowerSettingsChanged(BiConsumer callback) { + this.onPowerSettingsChanged = callback; + } + + private void showPowerPopup() { + showingPowerPopup = true; + powerPopup.show(configuredParallel, configuredVoltage); + } + + private void hidePowerPopup() { + showingPowerPopup = false; + powerPopup.hide(); + } + + private void onPowerSettingsApplied(PowerControlPopup.PowerSettings settings) { + this.configuredParallel = settings.maxParallel(); + this.configuredVoltage = settings.voltagePerParallel(); + + if (onPowerSettingsChanged != null) { + onPowerSettingsChanged.accept(configuredParallel, configuredVoltage); + } + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + StellarBaseModule module = moduleSupplier.get(); + if (module == null) return; + + IStellarIrisProvider iris = module.getStellarIris(); + boolean newConnected = iris != null && iris.isFormed(); + boolean newCanProcess = newConnected && iris.canProcess(); + boolean newWorking = module.getRecipeLogic() != null && module.getRecipeLogic().isWorking(); + Stage newStage = iris != null ? iris.getStage() : Stage.EMPTY; + + long newMaxEUt = module.getMaxEUt(); + long newCurrentEUt = module.getEnergyConsumedPerTick(); + int newEffectiveParallel = module.getEffectiveParallelLimit(); + int newConfiguredParallel = module.getConfiguredMaxParallel(); + int newOverclockTier = module.getOverclockTier(); + double newSpeedBonus = (iris != null && iris.canProcess()) ? iris.getSpeedBonus() : 1.0; + int newIrisLimit = module.getIrisParallelLimit(); + boolean newWirelessAvailable = module.isWirelessEnergyAvailable(); + boolean newPowerFailure = module.isPowerFailure(); + long newConfiguredVoltage = module.getConfiguredVoltagePerParallel(); + + if (newConnected != isConnected || newCanProcess != canProcess || newWorking != isWorking || + newStage != irisStage || newMaxEUt != maxEUt || newCurrentEUt != currentEUt || + newEffectiveParallel != effectiveParallel || newConfiguredParallel != configuredParallel || + newOverclockTier != overclockTier || newSpeedBonus != speedBonus || + newIrisLimit != irisParallelLimit || newWirelessAvailable != wirelessAvailable || + newPowerFailure != powerFailure || newConfiguredVoltage != configuredVoltage) { + + isConnected = newConnected; + canProcess = newCanProcess; + isWorking = newWorking; + irisStage = newStage; + maxEUt = newMaxEUt; + currentEUt = newCurrentEUt; + effectiveParallel = newEffectiveParallel; + configuredParallel = newConfiguredParallel; + overclockTier = newOverclockTier; + speedBonus = newSpeedBonus; + irisParallelLimit = newIrisLimit; + wirelessAvailable = newWirelessAvailable; + powerFailure = newPowerFailure; + configuredVoltage = newConfiguredVoltage; + + writeUpdateInfo(202, buf -> { + buf.writeBoolean(isConnected); + buf.writeBoolean(canProcess); + buf.writeBoolean(isWorking); + buf.writeEnum(irisStage); + buf.writeLong(maxEUt); + buf.writeLong(currentEUt); + buf.writeInt(effectiveParallel); + buf.writeInt(configuredParallel); + buf.writeInt(overclockTier); + buf.writeDouble(speedBonus); + buf.writeInt(irisParallelLimit); + buf.writeBoolean(wirelessAvailable); + buf.writeBoolean(powerFailure); + buf.writeLong(configuredVoltage); + }); + } + } + + @Override + public void writeInitialData(RegistryFriendlyByteBuf buffer) { + super.writeInitialData(buffer); + StellarBaseModule module = moduleSupplier.get(); + if (module != null) { + IStellarIrisProvider iris = module.getStellarIris(); + buffer.writeBoolean(iris != null && iris.isFormed()); + buffer.writeBoolean(iris != null && iris.isFormed() && iris.canProcess()); + buffer.writeBoolean(module.getRecipeLogic() != null && module.getRecipeLogic().isWorking()); + buffer.writeEnum(iris != null ? iris.getStage() : Stage.EMPTY); + buffer.writeLong(module.getMaxEUt()); + buffer.writeLong(module.getEnergyConsumedPerTick()); + buffer.writeInt(module.getEffectiveParallelLimit()); + buffer.writeInt(module.getConfiguredMaxParallel()); + buffer.writeInt(module.getOverclockTier()); + buffer.writeDouble((iris != null && iris.canProcess()) ? iris.getSpeedBonus() : 1.0); + buffer.writeInt(module.getIrisParallelLimit()); + buffer.writeBoolean(module.isWirelessEnergyAvailable()); + buffer.writeBoolean(module.isPowerFailure()); + buffer.writeLong(module.getConfiguredVoltagePerParallel()); + } else { + buffer.writeBoolean(false); + buffer.writeBoolean(false); + buffer.writeBoolean(false); + buffer.writeEnum(Stage.EMPTY); + buffer.writeLong(0); + buffer.writeLong(0); + buffer.writeInt(1); + buffer.writeInt(1); + buffer.writeInt(0); + buffer.writeDouble(1.0); + buffer.writeInt(1); + buffer.writeBoolean(false); + buffer.writeBoolean(false); + buffer.writeLong(32); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readInitialData(RegistryFriendlyByteBuf buffer) { + super.readInitialData(buffer); + isConnected = buffer.readBoolean(); + canProcess = buffer.readBoolean(); + isWorking = buffer.readBoolean(); + irisStage = buffer.readEnum(Stage.class); + maxEUt = buffer.readLong(); + currentEUt = buffer.readLong(); + effectiveParallel = buffer.readInt(); + configuredParallel = buffer.readInt(); + overclockTier = buffer.readInt(); + speedBonus = buffer.readDouble(); + irisParallelLimit = buffer.readInt(); + wirelessAvailable = buffer.readBoolean(); + powerFailure = buffer.readBoolean(); + configuredVoltage = buffer.readLong(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, RegistryFriendlyByteBuf buffer) { + if (id == 202) { + isConnected = buffer.readBoolean(); + canProcess = buffer.readBoolean(); + isWorking = buffer.readBoolean(); + irisStage = buffer.readEnum(Stage.class); + maxEUt = buffer.readLong(); + currentEUt = buffer.readLong(); + effectiveParallel = buffer.readInt(); + configuredParallel = buffer.readInt(); + overclockTier = buffer.readInt(); + speedBonus = buffer.readDouble(); + irisParallelLimit = buffer.readInt(); + wirelessAvailable = buffer.readBoolean(); + powerFailure = buffer.readBoolean(); + configuredVoltage = buffer.readLong(); + } else { + super.readUpdateInfo(id, buffer); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + DrawerHelper.drawGradientRect(graphics, x, y, w, h, 0xE00c0c14, 0xE0080810, false); + + int gridColor = 0x08FFFFFF; + for (int gx = x + 16; gx < x + w; gx += 16) { + graphics.fill(gx, y, gx + 1, y + h, gridColor); + } + for (int gy = y + 16; gy < y + h; gy += 16) { + graphics.fill(x, gy, x + w, gy + 1, gridColor); + } + + int accentColor = getAccentColor(); + DrawerHelper.drawBorder(graphics, x, y, w, h, accentColor & 0x60FFFFFF, 1); + + int cornerLen = 12; + int cornerColor = accentColor & 0x80FFFFFF; + graphics.fill(x, y, x + cornerLen, y + 2, cornerColor); + graphics.fill(x, y, x + 2, y + cornerLen, cornerColor); + graphics.fill(x + w - cornerLen, y, x + w, y + 2, cornerColor); + graphics.fill(x + w - 2, y, x + w, y + cornerLen, cornerColor); + + drawContent(graphics, x + 6, y + 6, w - 12 - GEAR_BUTTON_SIZE - 4); + drawGearButton(graphics, x + w - GEAR_BUTTON_SIZE - 4, y + h - GEAR_BUTTON_SIZE - 4, mouseX, mouseY); + + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + } + + @OnlyIn(Dist.CLIENT) + private void drawContent(GuiGraphics graphics, int x, int y, int contentWidth) { + var font = Minecraft.getInstance().font; + int labelColor = 0xFF808090; + int valueColor = 0xFFDDDDDD; + int accentColor = 0xFF80C0FF; + + int lineHeight = 11; + int valueX = x + 70; + int currentY = y; + + String statusValue; + int statusColor; + if (powerFailure) { + statusValue = Component.translatable("cosmiccore.stellar.module.status.power_fail").getString(); + statusColor = 0xFFFF4444; + } else if (!wirelessAvailable) { + statusValue = Component.translatable("cosmiccore.stellar.module.status.no_wireless").getString(); + statusColor = 0xFFFF5555; + } else if (isWorking) { + statusValue = Component.translatable("cosmiccore.stellar.module.status.processing").getString(); + statusColor = 0xFF44FF44; + } else if (isConnected && canProcess) { + statusValue = Component.translatable("cosmiccore.stellar.module.status.ready").getString(); + statusColor = 0xFF6090CC; + } else if (isConnected) { + statusValue = Component.translatable("cosmiccore.stellar.module.status.iris_inactive").getString(); + statusColor = 0xFFCC8844; + } else { + statusValue = Component.translatable("cosmiccore.stellar.module.status.disconnected").getString(); + statusColor = 0xFFFF5555; + } + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.status").getString(), x, currentY, + labelColor, false); + graphics.drawString(font, statusValue, valueX, currentY, statusColor, false); + currentY += lineHeight; + + int sepColor = 0x304080FF; + graphics.fill(x, currentY, x + contentWidth, currentY + 1, sepColor); + currentY += 4; + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.max_eut").getString(), x, currentY, + labelColor, false); + String maxEUtStr = formatEnergy(maxEUt); + graphics.drawString(font, maxEUtStr, valueX, currentY, valueColor, false); + + String tierName = overclockTier < GTValues.VNF.length ? GTValues.VNF[overclockTier] : "MAX"; + int tierColor = getTierColor(overclockTier); + int badgeX = x + contentWidth - font.width(tierName) - 4; + graphics.fill(badgeX - 2, currentY - 1, badgeX + font.width(tierName) + 2, currentY + font.lineHeight, + 0x90000000 | (tierColor & 0x00333333)); + graphics.drawString(font, tierName, badgeX, currentY, 0xFF000000 | tierColor, false); + currentY += lineHeight; + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.parallel").getString(), x, currentY, + labelColor, false); + String parallelStr = effectiveParallel + "x"; + if (effectiveParallel < configuredParallel) { + parallelStr = Component + .translatable("cosmiccore.stellar.module.parallel_max", effectiveParallel, configuredParallel) + .getString(); + } + graphics.drawString(font, parallelStr, valueX, currentY, accentColor, false); + currentY += lineHeight; + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.current").getString(), x, currentY, + labelColor, false); + if (currentEUt > 0) { + String currentEUStr = formatEnergy(currentEUt); + graphics.drawString(font, currentEUStr, valueX, currentY, 0xFFFFCC44, false); + } else { + graphics.drawString(font, "---", valueX, currentY, 0x80606060, false); + } + currentY += lineHeight; + + graphics.fill(x, currentY, x + contentWidth, currentY + 1, sepColor); + currentY += 4; + + if (isConnected && canProcess) { + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.speed_bonus").getString(), x, + currentY, labelColor, false); + String speedStr = String.format("%.1fx", speedBonus); + int speedColor = speedBonus > 1.0 ? 0xFF66FF66 : 0xFFCCCCCC; + graphics.drawString(font, speedStr, valueX, currentY, speedColor, false); + currentY += lineHeight; + + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.iris_limit").getString(), x, + currentY, labelColor, false); + graphics.drawString(font, irisParallelLimit + "x", valueX, currentY, valueColor, false); + } else if (isConnected) { + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.stage").getString(), x, + currentY, labelColor, false); + int stageColor = getStageTextColor(irisStage); + graphics.drawString(font, irisStage.toString(), valueX, currentY, stageColor, false); + currentY += lineHeight; + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.waiting_iris").getString(), x, + currentY, 0x80AAAAAA, false); + } else { + graphics.drawString(font, Component.translatable("cosmiccore.stellar.module.not_linked").getString(), x, + currentY, 0x80808080, false); + } + } + + @OnlyIn(Dist.CLIENT) + private void drawGearButton(GuiGraphics graphics, int btnX, int btnY, int mouseX, int mouseY) { + boolean hovered = mouseX >= btnX && mouseX < btnX + GEAR_BUTTON_SIZE && + mouseY >= btnY && mouseY < btnY + GEAR_BUTTON_SIZE; + + int bgColor = hovered ? 0xC04080FF : 0x80404060; + graphics.fill(btnX, btnY, btnX + GEAR_BUTTON_SIZE, btnY + GEAR_BUTTON_SIZE, bgColor); + + int borderColor = hovered ? 0xFF6090FF : 0xFF505070; + DrawerHelper.drawBorder(graphics, btnX, btnY, GEAR_BUTTON_SIZE, GEAR_BUTTON_SIZE, borderColor, 1); + + int gearSize = GEAR_BUTTON_SIZE - 4; + int gearX = btnX + 2; + int gearY = btnY + 2; + graphics.blit(GEAR_TEXTURE, gearX, gearY, 0, 0, gearSize, gearSize, gearSize, gearSize); + } + + private int getGearButtonX() { + return getPosition().x + WIDTH - GEAR_BUTTON_SIZE - 4; + } + + private int getGearButtonY() { + return getPosition().y + HEIGHT - GEAR_BUTTON_SIZE - 4; + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (showingPowerPopup && powerPopup.isVisible()) { + if (powerPopup.mouseClicked(mouseX, mouseY, button)) { + return true; + } + if (!powerPopup.isMouseOverElement(mouseX, mouseY)) { + hidePowerPopup(); + return true; + } + } + + int btnX = getGearButtonX(); + int btnY = getGearButtonY(); + if (mouseX >= btnX && mouseX < btnX + GEAR_BUTTON_SIZE && + mouseY >= btnY && mouseY < btnY + GEAR_BUTTON_SIZE) { + if (showingPowerPopup) { + hidePowerPopup(); + } else { + showPowerPopup(); + } + playButtonClickSound(); + return true; + } + + return super.mouseClicked(mouseX, mouseY, button); + } + + private String formatEnergy(long eu) { + if (eu >= 1_000_000_000) return String.format("%.1fG EU/t", eu / 1_000_000_000.0); + if (eu >= 1_000_000) return String.format("%.1fM EU/t", eu / 1_000_000.0); + if (eu >= 1000) return String.format("%.1fk EU/t", eu / 1000.0); + return String.format("%d EU/t", eu); + } + + private int getTierColor(int tier) { + return switch (tier) { + case 0 -> 0x808080; + case 1 -> 0xC0C0C0; + case 2 -> 0x00FFFF; + case 3 -> 0xFFFF00; + case 4 -> 0x0080FF; + case 5 -> 0x8000FF; + case 6 -> 0xFF0080; + case 7 -> 0xFF00FF; + case 8 -> 0x00FF00; + default -> 0xFF4040; + }; + } + + private int getStageTextColor(Stage stage) { + return 0xFF000000 | switch (stage) { + case EMPTY -> 0x606060; + case GROWING -> 0x66AAFF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF8844; + case BLACK_HOLE -> 0xAA66FF; + case DEATH -> 0xFF4444; + case DEATH_GRACEFUL -> 0x886666; + }; + } + + private int getAccentColor() { + if (isConnected && canProcess) { + return getStageAccentColor(irisStage); + } + return 0xFF4080AA; + } + + private int getStageAccentColor(Stage stage) { + return 0xFF000000 | switch (stage) { + case EMPTY -> 0x404060; + case GROWING -> 0x6080FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF8844; + case BLACK_HOLE -> 0x8040FF; + case DEATH -> 0xFF2020; + case DEATH_GRACEFUL -> 0x804040; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarModuleUIWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarModuleUIWidget.java new file mode 100644 index 000000000..e7a0fbe45 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/StellarModuleUIWidget.java @@ -0,0 +1,501 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.feature.IStellarIrisProvider; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; + +import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; +import com.gregtechceu.gtceu.api.gui.fancy.IFancyUIProvider; + +import com.lowdragmc.lowdraglib.gui.texture.ColorBorderTexture; +import com.lowdragmc.lowdraglib.gui.texture.ColorRectTexture; +import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; +import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.SlotWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class StellarModuleUIWidget extends FancyMachineUIWidget { + + private final Supplier moduleSupplier; + + private static final int BG_COLOR = 0xE00a0a14; + private static final int BORDER_COLOR = 0xFF404060; + private static final int SLOT_BG_COLOR = 0xC0101018; + private static final int SLOT_BORDER_COLOR = 0xFF505070; + private static final int MODULE_ACCENT = 0xFF4080AA; + private static final int MODULE_ACCENT_DIM = 0xFF305070; + + private int syncedMaxParallel = 1; + private long syncedVoltage = 32; + private int syncedIrisParallelLimit = 1; + private StellarModuleContentWidget contentWidget; + + public StellarModuleUIWidget(IFancyUIProvider mainPage, int width, int height, + Supplier moduleSupplier) { + super(mainPage, width, height); + this.moduleSupplier = moduleSupplier; + setBackground((IGuiTexture) null); + applyDarkTheme(); + } + + private void onPowerSettingsChanged(int maxParallel, long voltage) { + writeClientAction(1, buf -> { + buf.writeInt(maxParallel); + buf.writeLong(voltage); + }); + } + + @Override + public void handleClientAction(int id, RegistryFriendlyByteBuf buffer) { + if (id == 1) { + int newParallel = buffer.readInt(); + long newVoltage = buffer.readLong(); + + StellarBaseModule module = moduleSupplier.get(); + if (module != null) { + module.setConfiguredMaxParallel(newParallel); + module.setConfiguredVoltagePerParallel(newVoltage); + + // Mark dirty so it saves + module.markAsChanged(); + + com.ghostipedia.cosmiccore.CosmicCore.LOGGER.info( + "[StellarModuleUI] SERVER received power settings: parallel={}, voltage={}", + newParallel, newVoltage); + } + } else { + super.handleClientAction(id, buffer); + } + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + StellarBaseModule module = moduleSupplier.get(); + if (module != null) { + int currentParallel = module.getConfiguredMaxParallel(); + long currentVoltage = module.getConfiguredVoltagePerParallel(); + int currentIrisLimit = module.getIrisParallelLimit(); + if (currentParallel != syncedMaxParallel || + currentVoltage != syncedVoltage || + currentIrisLimit != syncedIrisParallelLimit) { + syncedMaxParallel = currentParallel; + syncedVoltage = currentVoltage; + syncedIrisParallelLimit = currentIrisLimit; + writeUpdateInfo(201, buf -> { + buf.writeInt(syncedMaxParallel); + buf.writeLong(syncedVoltage); + buf.writeInt(syncedIrisParallelLimit); + }); + } + } + } + + @Override + public void writeInitialData(RegistryFriendlyByteBuf buffer) { + super.writeInitialData(buffer); + + StellarBaseModule module = moduleSupplier.get(); + if (module != null) { + buffer.writeInt(module.getConfiguredMaxParallel()); + buffer.writeLong(module.getConfiguredVoltagePerParallel()); + buffer.writeInt(module.getIrisParallelLimit()); + } else { + buffer.writeInt(1); + buffer.writeLong(32L); + buffer.writeInt(1); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readInitialData(RegistryFriendlyByteBuf buffer) { + super.readInitialData(buffer); + syncedMaxParallel = buffer.readInt(); + syncedVoltage = buffer.readLong(); + syncedIrisParallelLimit = buffer.readInt(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, RegistryFriendlyByteBuf buffer) { + if (id == 201) { + syncedMaxParallel = buffer.readInt(); + syncedVoltage = buffer.readLong(); + syncedIrisParallelLimit = buffer.readInt(); + } else { + super.readUpdateInfo(id, buffer); + } + } + + private void applyDarkTheme() { + IGuiTexture titleBarBg = new GuiTextureGroup( + new ColorRectTexture(BG_COLOR), + new ColorBorderTexture(1, BORDER_COLOR)); + + if (titleBar != null) { + titleBar.setBackground((IGuiTexture) null); + for (Widget widget : titleBar.widgets) { + if (widget instanceof WidgetGroup group) { + group.setBackground(titleBarBg); + } + } + } + + if (sideTabsWidget != null) { + sideTabsWidget.setBackground((IGuiTexture) null); + updateTabStyling(); + } + + if (configuratorPanel != null) { + configuratorPanel.setVisible(false); + configuratorPanel.setActive(false); + } + + if (playerInventory != null) { + playerInventory.setBackground((IGuiTexture) null); + IGuiTexture darkSlot = new GuiTextureGroup( + new ColorRectTexture(SLOT_BG_COLOR), + new ColorBorderTexture(1, SLOT_BORDER_COLOR)); + for (Widget widget : playerInventory.widgets) { + if (widget instanceof SlotWidget slotWidget) { + slotWidget.setBackground(darkSlot); + } + } + } + } + + private void updateTabStyling() { + if (sideTabsWidget == null) return; + + int accentColor = getAccentColor(); + int accentColorDim = dimColor(accentColor, 0.6f); + + IGuiTexture tabNormal = new GuiTextureGroup( + new ColorRectTexture(0xA0080812), + new ColorBorderTexture(1, accentColorDim)); + IGuiTexture tabHover = new GuiTextureGroup( + new ColorRectTexture(0xC0151525), + new ColorBorderTexture(1, accentColor)); + IGuiTexture tabPressed = new GuiTextureGroup( + new ColorRectTexture(0xE0101020), + new ColorBorderTexture(1, accentColor)); + + sideTabsWidget.setTabTexture(tabNormal); + sideTabsWidget.setTabHoverTexture(tabHover); + sideTabsWidget.setTabPressedTexture(tabPressed); + } + + private int dimColor(int color, float factor) { + int a = (color >> 24) & 0xFF; + int r = (int) (((color >> 16) & 0xFF) * factor); + int g = (int) (((color >> 8) & 0xFF) * factor); + int b = (int) ((color & 0xFF) * factor); + return (a << 24) | (r << 16) | (g << 8) | b; + } + + @Override + public void initWidget() { + super.initWidget(); + if (playerInventory != null) { + IGuiTexture darkSlot = new GuiTextureGroup( + new ColorRectTexture(SLOT_BG_COLOR), + new ColorBorderTexture(1, SLOT_BORDER_COLOR)); + for (Widget widget : playerInventory.widgets) { + if (widget instanceof SlotWidget slotWidget) { + slotWidget.setBackground(darkSlot); + } + } + } + + // Find and wire up the content widget for power settings callback + findContentWidget(this); + if (contentWidget != null) { + contentWidget.setOnPowerSettingsChanged(this::onPowerSettingsChanged); + } + } + + private void findContentWidget(WidgetGroup group) { + for (Widget widget : group.widgets) { + if (widget instanceof StellarModuleContentWidget smcw) { + contentWidget = smcw; + return; + } + if (widget instanceof WidgetGroup wg) { + findContentWidget(wg); + if (contentWidget != null) return; + } + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + drawFullBackground(graphics); + drawCustomOverlays(graphics); + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + drawTitleText(graphics); + } + + private void drawFullBackground(GuiGraphics graphics) { + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + // Dark gradient background + DrawerHelper.drawGradientRect(graphics, x, y, w, h, 0xFF0c0c12, 0xFF060608, false); + + // Subtle grid pattern + drawGridPattern(graphics, x, y, w, h); + + // Corner accents + int accentColor = getAccentColor(); + drawCornerAccents(graphics, x, y, w, h, accentColor & 0x66FFFFFF); + + // Border + DrawerHelper.drawBorder(graphics, x, y, w, h, accentColor & 0x33FFFFFF, 1); + + // Side panels if inventory is visible + if (playerInventory != null && playerInventory.isVisible()) { + drawSidePanels(graphics, x, y, w, h); + } + } + + private void drawGridPattern(GuiGraphics graphics, int x, int y, int w, int h) { + int gridColor = 0x08FFFFFF; + int spacing = 16; + for (int gx = x + spacing; gx < x + w; gx += spacing) { + graphics.fill(gx, y, gx + 1, y + h, gridColor); + } + for (int gy = y + spacing; gy < y + h; gy += spacing) { + graphics.fill(x, gy, x + w, gy + 1, gridColor); + } + } + + private void drawCornerAccents(GuiGraphics graphics, int x, int y, int w, int h, int color) { + int len = 20; + int thickness = 2; + // Top-left + graphics.fill(x, y, x + len, y + thickness, color); + graphics.fill(x, y, x + thickness, y + len, color); + // Top-right + graphics.fill(x + w - len, y, x + w, y + thickness, color); + graphics.fill(x + w - thickness, y, x + w, y + len, color); + // Bottom-left + graphics.fill(x, y + h - thickness, x + len, y + h, color); + graphics.fill(x, y + h - len, x + thickness, y + h, color); + // Bottom-right + graphics.fill(x + w - len, y + h - thickness, x + w, y + h, color); + graphics.fill(x + w - thickness, y + h - len, x + w, y + h, color); + } + + private void drawSidePanels(GuiGraphics graphics, int x, int y, int w, int h) { + int invY = playerInventory.getPosition().y; + int invX = playerInventory.getPosition().x; + int invW = playerInventory.getSize().width; + int panelH = h - (invY - y) - 5; + + // Left panel - connection status + int leftPanelX = x + 3; + int leftPanelW = invX - leftPanelX - 3; + if (leftPanelW > 20) { + drawConnectionPanel(graphics, leftPanelX, invY, leftPanelW, panelH); + } + + // Right panel - stats + int rightPanelX = invX + invW + 3; + int rightPanelW = (x + w) - rightPanelX - 3; + if (rightPanelW > 20) { + drawStatsPanel(graphics, rightPanelX, invY, rightPanelW, panelH); + } + } + + private void drawConnectionPanel(GuiGraphics graphics, int px, int py, int pw, int ph) { + DrawerHelper.drawSolidRect(graphics, px, py, pw, ph, 0x40000000); + int borderColor = getAccentColor() & 0x33FFFFFF; + DrawerHelper.drawBorder(graphics, px, py, pw, ph, borderColor, 1); + int accentColor = getAccentColor() & 0x80FFFFFF; + graphics.fill(px + 1, py + 1, px + pw - 1, py + 3, accentColor); + + var font = Minecraft.getInstance().font; + StellarBaseModule module = moduleSupplier.get(); + + if (module != null) { + IStellarIrisProvider iris = module.getStellarIris(); + boolean connected = iris != null && iris.isFormed(); + boolean canProcess = connected && iris.canProcess(); + + String statusText = connected ? (canProcess ? "LINKED" : "WAITING") : "OFFLINE"; + int statusColor = connected ? (canProcess ? 0xFF66FF66 : 0xFFFFAA44) : 0xFFFF4444; + + graphics.drawString(font, "IRIS LINK", px + 4, py + 6, accentColor | 0xFF000000, false); + graphics.drawString(font, statusText, px + 4, py + 18, statusColor, false); + + // Animated connection indicator + if (connected) { + int pulseAlpha = (int) (128 + 64 * Math.sin(System.currentTimeMillis() / 200.0)); + int pulseColor = (pulseAlpha << 24) | (statusColor & 0x00FFFFFF); + int indicatorY = py + 30; + int indicatorW = (int) ((pw - 10) * (0.5f + 0.5f * Math.sin(System.currentTimeMillis() / 500.0))); + graphics.fill(px + 5, indicatorY, px + 5 + Math.max(5, indicatorW), indicatorY + 2, pulseColor); + } + } + } + + private void drawStatsPanel(GuiGraphics graphics, int px, int py, int pw, int ph) { + DrawerHelper.drawSolidRect(graphics, px, py, pw, ph, 0x40000000); + int borderColor = getAccentColor() & 0x33FFFFFF; + DrawerHelper.drawBorder(graphics, px, py, pw, ph, borderColor, 1); + int accentColor = getAccentColor() & 0x80FFFFFF; + graphics.fill(px + 1, py + 1, px + pw - 1, py + 3, accentColor); + + var font = Minecraft.getInstance().font; + int labelColor = 0xFF606080; + int valueColor = 0xFFCCCCCC; + + graphics.drawString(font, "MODULE", px + 4, py + 6, accentColor | 0xFF000000, false); + + StellarBaseModule module = moduleSupplier.get(); + if (module != null) { + IStellarIrisProvider iris = module.getStellarIris(); + + // Energy usage + long euPerTick = module.getEnergyConsumedPerTick(); + graphics.drawString(font, "EU/t:", px + 4, py + 20, labelColor, false); + graphics.drawString(font, formatEnergy(euPerTick), px + 30, py + 20, valueColor, false); + + // Iris bonuses (if connected) + if (iris != null && iris.canProcess()) { + graphics.drawString(font, "SPEED:", px + 4, py + 32, labelColor, false); + graphics.drawString(font, String.format("%.1fx", iris.getSpeedBonus()), px + 38, py + 32, 0xFF66FF66, + false); + + graphics.drawString(font, "STAGE:", px + 4, py + 44, labelColor, false); + Stage stage = iris.getStage(); + graphics.drawString(font, getShortStageName(stage), px + 38, py + 44, getStageColor(stage), false); + } else { + graphics.drawString(font, "---", px + 4, py + 32, 0xFF404040, false); + } + } + } + + private String formatEnergy(long eu) { + if (eu >= 1_000_000_000) return String.format("%.1fG", eu / 1_000_000_000.0); + if (eu >= 1_000_000) return String.format("%.1fM", eu / 1_000_000.0); + if (eu >= 1000) return String.format("%.1fk", eu / 1000.0); + return String.format("%d", eu); + } + + private String getShortStageName(Stage stage) { + return switch (stage) { + case EMPTY -> "NONE"; + case GROWING -> "GROW"; + case STAR -> "STAR"; + case SUPERSTAR -> "SUPER"; + case BLACK_HOLE -> "B.HOLE"; + case DEATH -> "DEATH"; + case DEATH_GRACEFUL -> "FADE"; + }; + } + + private int getStageColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0xFF606060; + case GROWING -> 0xFF66AAFF; + case STAR -> 0xFFFFCC44; + case SUPERSTAR -> 0xFFFF8844; + case BLACK_HOLE -> 0xFFAA66FF; + case DEATH -> 0xFFFF4444; + case DEATH_GRACEFUL -> 0xFF886666; + }; + } + + private void drawTitleText(GuiGraphics graphics) { + if (titleBar == null || mainPage == null) return; + + var font = Minecraft.getInstance().font; + String title = mainPage.getTitle().getString(); + + int titleBarX = getPosition().x + 8; + int titleBarY = getPosition().y - 16; + int textAreaX = titleBarX + 18 + 16; + int textAreaY = titleBarY + 3; + int textAreaWidth = getSize().width - 16 - 18 - 18 - 16; + int textAreaHeight = 13; + + graphics.fill(textAreaX, textAreaY, textAreaX + textAreaWidth, textAreaY + textAreaHeight, BG_COLOR); + + int textWidth = font.width(title); + int maxWidth = textAreaWidth - 4; + if (textWidth > maxWidth) { + String ellipsis = "..."; + int ellipsisWidth = font.width(ellipsis); + while (textWidth + ellipsisWidth > maxWidth && title.length() > 1) { + title = title.substring(0, title.length() - 1); + textWidth = font.width(title); + } + title = title + ellipsis; + textWidth = font.width(title); + } + + int centeredX = textAreaX + (textAreaWidth - textWidth) / 2; + int centeredY = textAreaY + (textAreaHeight - font.lineHeight) / 2; + + graphics.enableScissor(textAreaX, textAreaY, textAreaX + textAreaWidth, textAreaY + textAreaHeight); + graphics.drawString(font, title, centeredX, centeredY, 0xFFFFFFFF, true); + graphics.disableScissor(); + } + + private void drawCustomOverlays(GuiGraphics graphics) { + int accentColor = getAccentColor() & 0x60FFFFFF; + + if (playerInventory != null && playerInventory.isVisible()) { + int x = getPosition().x; + int w = getSize().width; + int invY = playerInventory.getPosition().y; + graphics.fill(x + 10, invY - 2, x + w - 10, invY - 1, accentColor); + } + } + + private int getAccentColor() { + StellarBaseModule module = moduleSupplier.get(); + if (module != null) { + IStellarIrisProvider iris = module.getStellarIris(); + if (iris != null && iris.isFormed() && iris.canProcess()) { + return getStageAccentColor(iris.getStage()); + } + } + return MODULE_ACCENT; + } + + private int getStageAccentColor(Stage stage) { + return 0xFF000000 | switch (stage) { + case EMPTY -> 0x404060; + case GROWING -> 0x6080FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF8844; + case BLACK_HOLE -> 0x8040FF; + case DEATH -> 0xFF2020; + case DEATH_GRACEFUL -> 0x804040; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/TelemetryPanelWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/TelemetryPanelWidget.java new file mode 100644 index 000000000..e3fbc2358 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/TelemetryPanelWidget.java @@ -0,0 +1,379 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class TelemetryPanelWidget extends Widget { + + private final Supplier machineSupplier; + private final Supplier stageSupplier; + + private final List logLines = new ArrayList<>(); + private float scrollOffset = 0f; + private float dataUpdateTimer = 0f; + private float glitchPhase = 0f; + + private float displayedTemp = 0f; + private float displayedPressure = 0f; + private float displayedMass = 0f; + private float displayedEnergy = 0f; + + public TelemetryPanelWidget(int x, int y, int width, int height, + Supplier machineSupplier, + Supplier stageSupplier) { + super(x, y, width, height); + this.machineSupplier = machineSupplier; + this.stageSupplier = stageSupplier; + initLogLines(); + } + + private void initLogLines() { + logLines.add("[SYS] Stellar Iris v3.7.2 initialized"); + logLines.add("[SYS] Containment field generators online"); + logLines.add("[SYS] Plasma injectors standby"); + logLines.add("[SYS] Gravitational stabilizers active"); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + Stage stage = stageSupplier.get(); + scrollOffset += 0.02f; + dataUpdateTimer += 1f; + glitchPhase += 0.1f; + + updateDisplayedValues(stage); + + if (dataUpdateTimer > 60f) { + dataUpdateTimer = 0f; + addLogLine(stage); + } + } + + private void updateDisplayedValues(Stage stage) { + float targetTemp = getTemperature(stage); + float targetPressure = getPressure(stage); + float targetMass = getMass(stage); + float targetEnergy = getEnergy(stage); + + float lerpSpeed = 0.05f; + displayedTemp = Mth.lerp(lerpSpeed, displayedTemp, targetTemp); + displayedPressure = Mth.lerp(lerpSpeed, displayedPressure, targetPressure); + displayedMass = Mth.lerp(lerpSpeed, displayedMass, targetMass); + displayedEnergy = Mth.lerp(lerpSpeed, displayedEnergy, targetEnergy); + + if (stage == Stage.DEATH) { + displayedTemp += (float) (Math.random() - 0.5) * 1000; + displayedPressure += (float) (Math.random() - 0.5) * 50; + } + } + + private float getTemperature(Stage stage) { + return switch (stage) { + case EMPTY -> 2.7f; + case GROWING -> 5_000_000f; + case STAR -> 15_000_000f; + case SUPERSTAR -> 100_000_000f; + case BLACK_HOLE -> Float.POSITIVE_INFINITY; + case DEATH -> 500_000_000f; + case DEATH_GRACEFUL -> 1_000_000f; + }; + } + + private float getPressure(Stage stage) { + return switch (stage) { + case EMPTY -> 0f; + case GROWING -> 150f; + case STAR -> 250f; + case SUPERSTAR -> 450f; + case BLACK_HOLE -> 999f; + case DEATH -> 800f; + case DEATH_GRACEFUL -> 50f; + }; + } + + private float getMass(Stage stage) { + return switch (stage) { + case EMPTY -> 0f; + case GROWING -> 0.3f; + case STAR -> 1f; + case SUPERSTAR -> 8f; + case BLACK_HOLE -> 25f; + case DEATH -> 12f; + case DEATH_GRACEFUL -> 0.1f; + }; + } + + private float getEnergy(Stage stage) { + return switch (stage) { + case EMPTY -> 0f; + case GROWING -> 1_000f; + case STAR -> 50_000f; + case SUPERSTAR -> 500_000f; + case BLACK_HOLE -> 10_000_000f; + case DEATH -> 100_000_000f; + case DEATH_GRACEFUL -> 500f; + }; + } + + private void addLogLine(Stage stage) { + String newLine = generateLogLine(stage); + logLines.add(newLine); + if (logLines.size() > 50) { + logLines.remove(0); + } + } + + private String generateLogLine(Stage stage) { + long tick = System.currentTimeMillis() / 50; + String timestamp = String.format("[%04d]", tick % 10000); + + return switch (stage) { + case EMPTY -> timestamp + " [IDLE] Awaiting ignition sequence"; + case GROWING -> { + String[] msgs = { + " [CORE] Fusion rate increasing", + " [FUEL] Hydrogen consumption nominal", + " [TEMP] Core temperature rising", + " [STAB] Plasma containment stable" + }; + yield timestamp + msgs[(int) (tick % msgs.length)]; + } + case STAR -> { + String[] msgs = { + " [CORE] Main sequence fusion active", + " [OUT] Energy output: " + (int) displayedEnergy + " TW", + " [FUEL] Helium ash accumulating", + " [STAB] All systems nominal" + }; + yield timestamp + msgs[(int) (tick % msgs.length)]; + } + case SUPERSTAR -> { + String[] msgs = { + " [WARN] Core pressure critical", + " [WARN] Mass exceeding safe limits", + " [ALERT] Collapse threshold approaching", + " [CORE] Heavy element fusion detected" + }; + yield timestamp + msgs[(int) (tick % msgs.length)]; + } + case BLACK_HOLE -> { + String[] msgs = { + " [SING] Event horizon stable", + " [GRAV] Hawking radiation detected", + " [CONT] Exotic matter containment active", + " [DATA] Spacetime curvature nominal" + }; + yield timestamp + msgs[(int) (tick % msgs.length)]; + } + case DEATH -> { + String[] msgs = { + " [CRIT] CONTAINMENT FAILURE", + " [CRIT] EMERGENCY PROTOCOLS ACTIVE", + " [CRIT] EVACUATE IMMEDIATELY", + " [CRIT] SYSTEM FAILURE IMMINENT" + }; + yield timestamp + msgs[(int) (tick % msgs.length)]; + } + case DEATH_GRACEFUL -> timestamp + " [SHUT] Controlled shutdown in progress"; + }; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + Stage stage = stageSupplier.get(); + int accentColor = getStageColor(stage); + + DrawerHelper.drawSolidRect(graphics, x, y, w, h, 0xDD080810); + DrawerHelper.drawBorder(graphics, x, y, w, h, (0x80 << 24) | accentColor, 1); + + graphics.fill(x + 1, y + 1, x + w - 1, y + 3, (0x60 << 24) | accentColor); + + int dataHeight = 50; + drawDataReadouts(graphics, x + 5, y + 8, w - 10, dataHeight, stage, accentColor); + + int logY = y + 8 + dataHeight + 5; + int logH = h - dataHeight - 18; + drawLogPanel(graphics, x + 5, logY, w - 10, logH, stage, accentColor); + } + + private void drawDataReadouts(GuiGraphics graphics, int x, int y, int w, int h, Stage stage, int accentColor) { + var font = Minecraft.getInstance().font; + + graphics.fill(x, y, x + w, y + h, 0x40000000); + DrawerHelper.drawBorder(graphics, x, y, w, h, (0x40 << 24) | accentColor, 1); + + int col1 = x + 5; + int col2 = x + w / 2 + 5; + int row1 = y + 5; + int row2 = y + 15; + int row3 = y + 25; + int row4 = y + 35; + + int labelColor = 0xFF606080; + int valueColor = 0xFFCCCCCC; + + graphics.drawString(font, "CORE TEMP:", col1, row1, labelColor, false); + graphics.drawString(font, formatTemperature(displayedTemp), col1 + 60, row1, getTemperatureColor(displayedTemp), + false); + + graphics.drawString(font, "PRESSURE:", col1, row2, labelColor, false); + graphics.drawString(font, String.format("%.1f GPa", displayedPressure), col1 + 60, row2, valueColor, false); + + graphics.drawString(font, "MASS:", col2, row1, labelColor, false); + graphics.drawString(font, String.format("%.2f M\u2609", displayedMass), col2 + 35, row1, valueColor, false); + + graphics.drawString(font, "OUTPUT:", col2, row2, labelColor, false); + graphics.drawString(font, formatEnergy(displayedEnergy), col2 + 45, row2, valueColor, false); + + String status = getStatusString(stage); + int statusColor = getStatusColor(stage); + graphics.drawString(font, "STATUS:", col1, row3, labelColor, false); + + if (stage == Stage.DEATH && ((int) (glitchPhase * 2) % 3 == 0)) { + int glitchOffset = (int) ((Math.random() - 0.5) * 4); + graphics.drawString(font, status, col1 + 45 + glitchOffset, row3, statusColor, false); + } else { + graphics.drawString(font, status, col1 + 45, row3, statusColor, false); + } + + String stageLabel = "PHASE: " + stage.name().replace("_", " "); + graphics.drawString(font, stageLabel, col1, row4, (0xC0 << 24) | accentColor, false); + } + + private void drawLogPanel(GuiGraphics graphics, int x, int y, int w, int h, Stage stage, int accentColor) { + var font = Minecraft.getInstance().font; + + graphics.fill(x, y, x + w, y + h, 0x60000000); + DrawerHelper.drawBorder(graphics, x, y, w, h, (0x30 << 24) | accentColor, 1); + + graphics.drawString(font, "SYSTEM LOG", x + 3, y + 2, (0x80 << 24) | accentColor, false); + + int logStartY = y + 12; + int logHeight = h - 14; + int lineHeight = 9; + int visibleLines = logHeight / lineHeight; + + graphics.enableScissor(x + 2, logStartY, x + w - 2, y + h - 2); + + int startIndex = Math.max(0, logLines.size() - visibleLines); + for (int i = startIndex; i < logLines.size(); i++) { + int lineY = logStartY + (i - startIndex) * lineHeight; + String line = logLines.get(i); + + int lineColor; + if (line.contains("[CRIT]")) { + lineColor = 0xFFFF4444; + } else if (line.contains("[WARN]") || line.contains("[ALERT]")) { + lineColor = 0xFFFFAA44; + } else if (line.contains("[SYS]")) { + lineColor = 0xFF44AAFF; + } else { + lineColor = 0xFF888888; + } + + if (stage == Stage.DEATH && line.contains("[CRIT]")) { + if ((int) (glitchPhase * 3) % 2 == 0) { + int glitchX = (int) ((Math.random() - 0.5) * 3); + graphics.drawString(font, line, x + 3 + glitchX, lineY, lineColor, false); + } + } else { + graphics.drawString(font, line, x + 3, lineY, lineColor, false); + } + } + + graphics.disableScissor(); + } + + private String formatTemperature(float temp) { + if (Float.isInfinite(temp)) { + return "\u221E K"; + } else if (temp >= 1_000_000_000) { + return String.format("%.1f GK", temp / 1_000_000_000); + } else if (temp >= 1_000_000) { + return String.format("%.1f MK", temp / 1_000_000); + } else if (temp >= 1000) { + return String.format("%.1f kK", temp / 1000); + } else { + return String.format("%.1f K", temp); + } + } + + private String formatEnergy(float energy) { + if (energy >= 1_000_000) { + return String.format("%.1f PW", energy / 1_000_000); + } else if (energy >= 1000) { + return String.format("%.1f TW", energy / 1000); + } else { + return String.format("%.0f GW", energy); + } + } + + private int getTemperatureColor(float temp) { + if (temp >= 100_000_000) return 0xFFFF4444; + if (temp >= 10_000_000) return 0xFFFFAA44; + if (temp >= 1_000_000) return 0xFFFFFF44; + return 0xFFCCCCCC; + } + + private String getStatusString(Stage stage) { + return switch (stage) { + case EMPTY -> "DORMANT"; + case GROWING -> "IGNITING"; + case STAR -> "STABLE"; + case SUPERSTAR -> "CRITICAL"; + case BLACK_HOLE -> "CONTAINED"; + case DEATH -> "FAILURE"; + case DEATH_GRACEFUL -> "SHUTDOWN"; + }; + } + + private int getStatusColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0xFF606060; + case GROWING -> 0xFF66AAFF; + case STAR -> 0xFF66FF66; + case SUPERSTAR -> 0xFFFFAA44; + case BLACK_HOLE -> 0xFFAA66FF; + case DEATH -> 0xFFFF4444; + case DEATH_GRACEFUL -> 0xFF886666; + }; + } + + private int getStageColor(Stage stage) { + return switch (stage) { + case EMPTY -> 0x405060; + case GROWING -> 0x6090FF; + case STAR -> 0xFFCC44; + case SUPERSTAR -> 0xFF7722; + case BLACK_HOLE -> 0xAA55FF; + case DEATH -> 0xFF3030; + case DEATH_GRACEFUL -> 0x664040; + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/UpgradeTreeButton.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/UpgradeTreeButton.java new file mode 100644 index 000000000..a5fd6bf5a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/UpgradeTreeButton.java @@ -0,0 +1,108 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.sounds.SoundEvents; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class UpgradeTreeButton extends Widget { + + private static final int BG_COLOR = 0xFF202030; + private static final int BORDER_COLOR = 0xFF404060; + private static final int HOVER_COLOR = 0xFF303050; + private static final int ACCENT_COLOR = 0xFFFFCC44; + + private final Consumer onClick; + private final Supplier machineSupplier; + private boolean hovered = false; + private float pulsePhase = 0f; + + public UpgradeTreeButton(int x, int y, int width, int height, + Consumer onClick, + Supplier machineSupplier) { + super(x, y, width, height); + this.onClick = onClick; + this.machineSupplier = machineSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + pulsePhase += 0.1f; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + hovered = isMouseOverElement(mouseX, mouseY); + + // Background + int bgColor = hovered ? HOVER_COLOR : BG_COLOR; + DrawerHelper.drawSolidRect(graphics, x, y, w, h, bgColor); + + // Border - pulse if has spendable points + int borderColor = BORDER_COLOR; + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine != null && machine.getSpendablePoints() > 0) { + float pulse = (float) (Math.sin(pulsePhase) * 0.5 + 0.5); + int r = (int) (((ACCENT_COLOR >> 16) & 0xFF) * pulse + ((BORDER_COLOR >> 16) & 0xFF) * (1 - pulse)); + int g = (int) (((ACCENT_COLOR >> 8) & 0xFF) * pulse + ((BORDER_COLOR >> 8) & 0xFF) * (1 - pulse)); + int b = (int) ((ACCENT_COLOR & 0xFF) * pulse + (BORDER_COLOR & 0xFF) * (1 - pulse)); + borderColor = 0xFF000000 | (r << 16) | (g << 8) | b; + } + DrawerHelper.drawBorder(graphics, x, y, w, h, borderColor, 1); + + // Draw upgrade tree icon (stylized star with branches) + var font = Minecraft.getInstance().font; + int iconColor = hovered ? 0xFFFFFFFF : 0xFFAAAAAA; + + // Simple "UP" text or star symbol + String icon = "\u2726"; // Star symbol + int iconX = x + (w - font.width(icon)) / 2; + int iconY = y + (h - 8) / 2; + graphics.drawString(font, icon, iconX, iconY, iconColor, false); + + // Draw point count badge if has points + if (machine != null && machine.getSpendablePoints() > 0) { + String points = String.valueOf(machine.getSpendablePoints()); + int badgeW = font.width(points) + 4; + int badgeX = x + w - badgeW + 2; + int badgeY = y - 2; + + DrawerHelper.drawSolidRect(graphics, badgeX, badgeY, badgeW, 8, ACCENT_COLOR); + graphics.drawString(font, points, badgeX + 2, badgeY, 0xFF000000, false); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0 && isMouseOverElement(mouseX, mouseY)) { + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK.value(), 1.0f, 0.8f)); + onClick.accept(true); + return true; + } + return super.mouseClicked(mouseX, mouseY, button); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/UpgradeTreeWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/UpgradeTreeWidget.java new file mode 100644 index 000000000..b373ee369 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/UpgradeTreeWidget.java @@ -0,0 +1,689 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarIrisUpgrade; + +import com.lowdragmc.lowdraglib.gui.util.DrawerHelper; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.*; +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +/** + * Clean, performant upgrade tree widget. + * Displays 4 branches in a vertical layout with clear visual hierarchy. + */ +public class UpgradeTreeWidget extends Widget { + + private static final int UPDATE_ID_SYNC = 420; + private static final int CLIENT_ACTION_UNLOCK = 1; + private static final int CLIENT_ACTION_RESPEC = 2; + + // Clean color palette + private static final int BG_COLOR = 0xF0101018; + private static final int HEADER_COLOR = 0xFF181820; + private static final int BORDER_COLOR = 0xFF3A3A50; + private static final int BORDER_ACCENT = 0xFF5A5A80; + + private static final int[] BRANCH_COLORS = { + 0xFFFF6644, // IGNITION - orange + 0xFF44AAFF, // FUSION - blue + 0xFFAA44FF, // COLLAPSE - purple + 0xFF44FFAA, // VOID - teal + 0xFFFFCC44 // ULTIMATE - gold + }; + + private static final String[] BRANCH_NAMES = { "IGNITION", "FUSION", "COLLAPSE", "VOID" }; + + private final Supplier machineSupplier; + private final Runnable onClose; + + private boolean visible = false; + private float fadeAlpha = 0f; + private int animTick = 0; + + // Cached data + private Set unlockedUpgrades = EnumSet.noneOf(StellarIrisUpgrade.class); + private int spendablePoints = 0; + private int tier = 0; + private int ascensionLevel = 0; + + // UI state + private StellarIrisUpgrade hoveredUpgrade = null; + private boolean showRespecConfirm = false; + private int unlockFlashTick = 0; + private StellarIrisUpgrade lastUnlocked = null; + + // Precomputed node positions + private final Map nodePositions = new HashMap<>(); + + public UpgradeTreeWidget(int x, int y, int width, int height, + Supplier machineSupplier, + Runnable onClose) { + super(x, y, width, height); + this.machineSupplier = machineSupplier; + this.onClose = onClose; + calculateNodePositions(); + } + + private void calculateNodePositions() { + int w = getSize().width; + int h = getSize().height; + + // Layout: 4 branches side by side, rows going down + // Each branch gets ~1/4 of the width + int branchWidth = w / 4; + int startY = 35; // Below header + int rowHeight = 24; + int nodeSize = 9; + + for (StellarIrisUpgrade upgrade : StellarIrisUpgrade.values()) { + int branchIdx = upgrade.getBranch().ordinal(); + int branchCenterX = branchWidth / 2 + branchIdx * branchWidth; + int row = upgrade.getRow(); + + // Get all upgrades in same row/branch for horizontal layout + List sameRowBranch = new ArrayList<>(); + for (StellarIrisUpgrade u : StellarIrisUpgrade.values()) { + if (u.getBranch() == upgrade.getBranch() && u.getRow() == row) { + sameRowBranch.add(u); + } + } + sameRowBranch.sort(Comparator.comparingInt(Enum::ordinal)); + + int col = sameRowBranch.indexOf(upgrade); + int colCount = sameRowBranch.size(); + int spacing = 22; + int offsetX = (colCount == 1) ? 0 : (int) ((col - (colCount - 1) / 2.0f) * spacing); + + int nx = branchCenterX + offsetX; + int ny = startY + (row - 1) * rowHeight; + + nodePositions.put(upgrade, new int[] { nx, ny }); + } + } + + public void show() { + visible = true; + animTick = 0; + syncFromMachine(); + } + + public void hide() { + visible = false; + showRespecConfirm = false; + } + + public boolean isVisible() { + return visible; + } + + private void syncFromMachine() { + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine != null) { + Set machineUpgrades = machine.getUnlockedUpgrades(); + if (machineUpgrades.isEmpty()) { + unlockedUpgrades = EnumSet.noneOf(StellarIrisUpgrade.class); + } else { + unlockedUpgrades = EnumSet.copyOf(machineUpgrades); + } + spendablePoints = machine.getSpendablePoints(); + tier = machine.getPrestigeTier(); + ascensionLevel = machine.getAscensionLevel(); + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + if (visible) { + fadeAlpha = Math.min(fadeAlpha + 0.15f, 1f); + animTick++; + } else { + fadeAlpha = Math.max(fadeAlpha - 0.2f, 0f); + } + + if (unlockFlashTick > 0) unlockFlashTick--; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + if (fadeAlpha <= 0f) return; + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + // Push pose for z-ordering - draw on top of everything + graphics.pose().pushPose(); + graphics.pose().translate(0, 0, 400); + + // Solid opaque background - ensures we cover the main UI + int bgAlpha = (int) (240 * fadeAlpha); + graphics.fill(x, y, x + w, y + h, (bgAlpha << 24) | 0x0C0C14); + + // Header bar + drawHeader(graphics, x, y, w); + + // Update hovered + updateHovered(mouseX, mouseY, x, y); + + // Branch separators and labels + drawBranchSections(graphics, x, y, w, h); + + // Draw connections + drawConnections(graphics, x, y); + + // Draw nodes + for (StellarIrisUpgrade upgrade : StellarIrisUpgrade.values()) { + drawNode(graphics, x, y, upgrade, mouseX, mouseY); + } + + // Footer with controls hint + drawFooter(graphics, x, y + h - 14, w); + + // Draw tooltip last (on top) + if (hoveredUpgrade != null && !showRespecConfirm) { + drawTooltip(graphics, mouseX, mouseY); + } + + // Respec confirmation overlay + if (showRespecConfirm) { + drawRespecConfirm(graphics, x, y, w, h); + } + + // Border + int borderAlpha = (int) (255 * fadeAlpha); + DrawerHelper.drawBorder(graphics, x, y, w, h, (borderAlpha << 24) | 0x4A4A60, 1); + + graphics.pose().popPose(); + } + + private void drawHeader(GuiGraphics graphics, int x, int y, int w) { + var font = Minecraft.getInstance().font; + int alpha = (int) (255 * fadeAlpha); + + // Header background + graphics.fill(x, y, x + w, y + 20, (alpha << 24) | 0x14141C); + graphics.fill(x, y + 19, x + w, y + 20, ((int) (alpha * 0.5) << 24) | 0x4A4A60); + + // Title + String title = "STELLAR CONVERGENCE"; + graphics.drawString(font, title, x + 8, y + 6, (alpha << 24) | 0xE0E0F0, false); + + // Points display + String points = "\u2726 " + spendablePoints; + int pointsW = font.width(points); + int pointsColor = spendablePoints > 0 ? 0xFFCC44 : 0x808090; + graphics.drawString(font, points, x + w - pointsW - 8, y + 6, (alpha << 24) | pointsColor, false); + + // Tier/Ascension indicator + String tierStr = "T" + tier; + if (ascensionLevel > 0) { + tierStr = "\u2605".repeat(Math.min(ascensionLevel, 5)) + " " + tierStr; + } + int tierW = font.width(tierStr); + graphics.drawString(font, tierStr, x + (w - tierW) / 2, y + 6, (alpha << 24) | 0x909090, false); + } + + private void drawBranchSections(GuiGraphics graphics, int x, int y, int w, int h) { + var font = Minecraft.getInstance().font; + int alpha = (int) (255 * fadeAlpha); + int branchWidth = w / 4; + + for (int i = 0; i < 4; i++) { + int bx = x + i * branchWidth; + + // Vertical separator (except first) + if (i > 0) { + int sepAlpha = (int) (80 * fadeAlpha); + graphics.fill(bx, y + 22, bx + 1, y + h - 30, (sepAlpha << 24) | 0x404060); + } + + // Branch label + String name = BRANCH_NAMES[i]; + int labelX = bx + (branchWidth - font.width(name)) / 2; + int labelAlpha = (int) (200 * fadeAlpha); + int labelColor = BRANCH_COLORS[i]; + graphics.drawString(font, name, labelX, y + 24, (labelAlpha << 24) | (labelColor & 0xFFFFFF), false); + } + + // Ultimate label at bottom + String ultLabel = "ASCENSION"; + int ultX = x + (w - font.width(ultLabel)) / 2; + int ultAlpha = (int) (180 * fadeAlpha); + graphics.drawString(font, ultLabel, ultX, y + h - 40, (ultAlpha << 24) | 0xFFCC44, false); + } + + private void drawFooter(GuiGraphics graphics, int x, int y, int w) { + var font = Minecraft.getInstance().font; + int alpha = (int) (150 * fadeAlpha); + String hint = "[ESC] Close [R] Respec"; + int hintW = font.width(hint); + graphics.drawString(font, hint, x + (w - hintW) / 2, y, (alpha << 24) | 0x606070, false); + } + + private void updateHovered(int mouseX, int mouseY, int ox, int oy) { + hoveredUpgrade = null; + for (Map.Entry entry : nodePositions.entrySet()) { + int[] pos = entry.getValue(); + int nx = ox + pos[0]; + int ny = oy + pos[1]; + int size = getNodeSize(entry.getKey()); + + if (mouseX >= nx - size && mouseX <= nx + size && + mouseY >= ny - size && mouseY <= ny + size) { + hoveredUpgrade = entry.getKey(); + break; + } + } + } + + private int getNodeSize(StellarIrisUpgrade upgrade) { + if (upgrade.isCapstone()) return 10; + return 8; + } + + private void drawConnections(GuiGraphics graphics, int ox, int oy) { + for (StellarIrisUpgrade upgrade : StellarIrisUpgrade.values()) { + int[] pos = nodePositions.get(upgrade); + if (pos == null) continue; + + for (StellarIrisUpgrade prereq : upgrade.getPrerequisites()) { + int[] prereqPos = nodePositions.get(prereq); + if (prereqPos == null) continue; + + int x1 = ox + prereqPos[0]; + int y1 = oy + prereqPos[1]; + int x2 = ox + pos[0]; + int y2 = oy + pos[1]; + + boolean owned = unlockedUpgrades.contains(prereq) && unlockedUpgrades.contains(upgrade); + boolean prereqOwned = unlockedUpgrades.contains(prereq); + + int lineAlpha; + int lineColor; + + if (owned) { + lineAlpha = (int) (200 * fadeAlpha); + lineColor = BRANCH_COLORS[upgrade.getBranch().ordinal()]; + } else if (prereqOwned) { + lineAlpha = (int) (100 * fadeAlpha); + lineColor = 0x606080; + } else { + lineAlpha = (int) (40 * fadeAlpha); + lineColor = 0x303040; + } + + drawLine(graphics, x1, y1, x2, y2, (lineAlpha << 24) | (lineColor & 0xFFFFFF)); + } + } + } + + private void drawNode(GuiGraphics graphics, int ox, int oy, StellarIrisUpgrade upgrade, int mouseX, int mouseY) { + int[] pos = nodePositions.get(upgrade); + if (pos == null) return; + + int nx = ox + pos[0]; + int ny = oy + pos[1]; + int size = getNodeSize(upgrade); + + boolean owned = unlockedUpgrades.contains(upgrade); + boolean available = !owned && upgrade.canUnlock(unlockedUpgrades, tier) && spendablePoints >= upgrade.getCost(); + boolean tierLocked = tier < upgrade.getRequiredTier(); + boolean isHovered = upgrade == hoveredUpgrade; + boolean justUnlocked = upgrade == lastUnlocked && unlockFlashTick > 0; + + int branchColor = BRANCH_COLORS[upgrade.getBranch().ordinal()]; + int alpha = (int) (255 * fadeAlpha); + + // Flash effect + if (justUnlocked) { + float flash = unlockFlashTick / 15f; + int flashAlpha = (int) (150 * flash * fadeAlpha); + int flashSize = size + (int) (8 * flash); + graphics.fill(nx - flashSize, ny - flashSize, nx + flashSize, ny + flashSize, + (flashAlpha << 24) | 0xFFFFFF); + } + + // Node background + int bgColor; + if (owned) { + bgColor = darken(branchColor, 80); + } else if (available) { + bgColor = darken(branchColor, 140); + } else if (tierLocked) { + bgColor = 0x18181E; + } else { + bgColor = 0x202028; + } + graphics.fill(nx - size, ny - size, nx + size, ny + size, (alpha << 24) | bgColor); + + // Border + int borderColor; + if (owned) { + borderColor = branchColor; + } else if (available) { + // Pulsing border for available + float pulse = (float) (Math.sin(animTick * 0.15) * 0.3 + 0.7); + int r = (int) (((branchColor >> 16) & 0xFF) * pulse); + int g = (int) (((branchColor >> 8) & 0xFF) * pulse); + int b = (int) ((branchColor & 0xFF) * pulse); + borderColor = (r << 16) | (g << 8) | b; + } else { + borderColor = 0x404050; + } + DrawerHelper.drawBorder(graphics, nx - size, ny - size, size * 2, size * 2, + (alpha << 24) | borderColor, 1); + + // Node content + var font = Minecraft.getInstance().font; + if (owned) { + // Checkmark + graphics.drawString(font, "\u2713", nx - 3, ny - 4, (alpha << 24) | 0xFFFFFF, false); + } else if (tierLocked) { + // Lock indicator + String lock = "T" + upgrade.getRequiredTier(); + graphics.drawString(font, lock, nx - font.width(lock) / 2, ny - 3, + (alpha << 24) | 0x505060, false); + } else { + // Cost + String cost = String.valueOf(upgrade.getCost()); + int costColor = available ? 0xFFCC44 : 0x606070; + graphics.drawString(font, cost, nx - font.width(cost) / 2, ny - 3, + (alpha << 24) | costColor, false); + } + + // Hover highlight + if (isHovered) { + int hoverAlpha = (int) (50 * fadeAlpha); + graphics.fill(nx - size + 1, ny - size + 1, nx + size - 1, ny + size - 1, + (hoverAlpha << 24) | 0xFFFFFF); + } + } + + private void drawTooltip(GuiGraphics graphics, int mx, int my) { + if (hoveredUpgrade == null) return; + + var font = Minecraft.getInstance().font; + + String name = Component.translatable(hoveredUpgrade.getTranslationKey()).getString(); + String desc = Component.translatable(hoveredUpgrade.getDescriptionKey()).getString(); + String cost = "Cost: " + hoveredUpgrade.getCost(); + String tierReq = "Requires Tier " + hoveredUpgrade.getRequiredTier(); + + boolean owned = unlockedUpgrades.contains(hoveredUpgrade); + boolean available = !owned && hoveredUpgrade.canUnlock(unlockedUpgrades, tier); + boolean canAfford = spendablePoints >= hoveredUpgrade.getCost(); + + int tw = Math.max(font.width(name), Math.max(font.width(desc), 100)) + 16; + int th = 52; + int tx = mx + 10; + int ty = my - th - 5; + + // Keep tooltip on screen + if (tx + tw > getPosition().x + getSize().width - 5) tx = mx - tw - 10; + if (ty < getPosition().y + 20) ty = my + 15; + + int alpha = (int) (255 * fadeAlpha); + int branchColor = BRANCH_COLORS[hoveredUpgrade.getBranch().ordinal()]; + + // Background + graphics.fill(tx, ty, tx + tw, ty + th, (alpha << 24) | 0x08080C); + + // Top accent bar + graphics.fill(tx, ty, tx + tw, ty + 2, (alpha << 24) | branchColor); + + // Border + DrawerHelper.drawBorder(graphics, tx, ty, tw, th, (alpha << 24) | 0x404060, 1); + + int textY = ty + 6; + + // Name + graphics.drawString(font, name, tx + 6, textY, (alpha << 24) | 0xFFFFFF, false); + textY += 11; + + // Description + graphics.drawString(font, desc, tx + 6, textY, (alpha << 24) | 0x9090A0, false); + textY += 12; + + // Cost + int costColor = canAfford ? 0xFFCC44 : 0xFF5544; + graphics.drawString(font, cost, tx + 6, textY, (alpha << 24) | costColor, false); + textY += 10; + + // Tier req + int tierColor = tier >= hoveredUpgrade.getRequiredTier() ? 0x707080 : 0xFF5544; + graphics.drawString(font, tierReq, tx + 6, textY, (alpha << 24) | tierColor, false); + + // Status indicator + if (owned) { + graphics.drawString(font, "OWNED", tx + tw - font.width("OWNED") - 6, ty + 6, + (alpha << 24) | 0x44FF44, false); + } else if (available && canAfford) { + graphics.drawString(font, "Click!", tx + tw - font.width("Click!") - 6, ty + 6, + (alpha << 24) | 0x88FF88, false); + } + } + + private void drawRespecConfirm(GuiGraphics graphics, int x, int y, int w, int h) { + var font = Minecraft.getInstance().font; + int alpha = (int) (255 * fadeAlpha); + + // Dim background + graphics.fill(x, y, x + w, y + h, ((int) (180 * fadeAlpha) << 24) | 0x000000); + + // Dialog box + int bw = 160; + int bh = 60; + int bx = x + (w - bw) / 2; + int by = y + (h - bh) / 2; + + graphics.fill(bx, by, bx + bw, by + bh, (alpha << 24) | 0x101018); + DrawerHelper.drawBorder(graphics, bx, by, bw, bh, (alpha << 24) | 0xFF4444, 2); + + // Title + String title = "Reset Upgrades?"; + graphics.drawString(font, title, bx + (bw - font.width(title)) / 2, by + 10, + (alpha << 24) | 0xFFFFFF, false); + + // Refund amount + int refund = 0; + for (StellarIrisUpgrade u : unlockedUpgrades) { + refund += u.getCost(); + } + String refundStr = "Refund: " + refund + " pts"; + graphics.drawString(font, refundStr, bx + (bw - font.width(refundStr)) / 2, by + 24, + (alpha << 24) | 0xFFCC44, false); + + // Buttons hint + graphics.drawString(font, "[Y] Yes", bx + 20, by + bh - 16, (alpha << 24) | 0x88FF88, false); + graphics.drawString(font, "[N] No", bx + bw - 50, by + bh - 16, (alpha << 24) | 0xFF8888, false); + } + + private void drawLine(GuiGraphics g, int x1, int y1, int x2, int y2, int color) { + int dx = Math.abs(x2 - x1), dy = Math.abs(y2 - y1); + int sx = x1 < x2 ? 1 : -1, sy = y1 < y2 ? 1 : -1; + int err = dx - dy; + + while (true) { + g.fill(x1, y1, x1 + 1, y1 + 1, color); + if (x1 == x2 && y1 == y2) break; + int e2 = 2 * err; + if (e2 > -dy) { + err -= dy; + x1 += sx; + } + if (e2 < dx) { + err += dx; + y1 += sy; + } + } + } + + private int darken(int color, int amount) { + int r = Math.max(0, ((color >> 16) & 0xFF) - amount); + int g = Math.max(0, ((color >> 8) & 0xFF) - amount); + int b = Math.max(0, (color & 0xFF) - amount); + return (r << 16) | (g << 8) | b; + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (!visible || fadeAlpha < 0.5f) return false; + + if (showRespecConfirm) return true; + + if (button == 0 && hoveredUpgrade != null) { + boolean owned = unlockedUpgrades.contains(hoveredUpgrade); + boolean available = !owned && hoveredUpgrade.canUnlock(unlockedUpgrades, tier); + boolean canAfford = spendablePoints >= hoveredUpgrade.getCost(); + + if (available && canAfford) { + writeClientAction(CLIENT_ACTION_UNLOCK, buf -> buf.writeEnum(hoveredUpgrade)); + + // Optimistic update + unlockedUpgrades.add(hoveredUpgrade); + spendablePoints -= hoveredUpgrade.getCost(); + lastUnlocked = hoveredUpgrade; + unlockFlashTick = 15; + + playSound(SoundEvents.EXPERIENCE_ORB_PICKUP, 1.0f, 1.2f); + return true; + } + } + + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + @OnlyIn(Dist.CLIENT) + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (!visible) return false; + + if (keyCode == 256) { // ESC + if (showRespecConfirm) { + showRespecConfirm = false; + } else { + onClose.run(); + } + return true; + } + + if (keyCode == 82 && !showRespecConfirm) { // R + showRespecConfirm = true; + return true; + } + + if (keyCode == 89 && showRespecConfirm) { // Y + writeClientAction(CLIENT_ACTION_RESPEC, buf -> {}); + showRespecConfirm = false; + playSound(SoundEvents.GLASS_BREAK, 0.8f, 0.8f); + + int refund = 0; + for (StellarIrisUpgrade u : unlockedUpgrades) { + refund += u.getCost(); + } + unlockedUpgrades.clear(); + spendablePoints += refund; + return true; + } + + if (keyCode == 78 && showRespecConfirm) { // N + showRespecConfirm = false; + return true; + } + + return super.keyPressed(keyCode, scanCode, modifiers); + } + + @Override + public void handleClientAction(int id, RegistryFriendlyByteBuf buffer) { + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + + if (id == CLIENT_ACTION_UNLOCK) { + StellarIrisUpgrade upgrade = buffer.readEnum(StellarIrisUpgrade.class); + machine.tryUnlockUpgrade(upgrade); + } + // Respec is no longer supported - upgrades are permanent + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + IrisMultiblockMachine machine = machineSupplier.get(); + if (machine == null) return; + + Set currentUpgrades = machine.getUnlockedUpgrades(); + int currentPoints = machine.getSpendablePoints(); + int currentTier = machine.getPrestigeTier(); + int currentAscension = machine.getAscensionLevel(); + + if (!currentUpgrades.equals(unlockedUpgrades) || + currentPoints != spendablePoints || + currentTier != tier || + currentAscension != ascensionLevel) { + + writeUpdateInfo(UPDATE_ID_SYNC, buf -> { + buf.writeInt(currentPoints); + buf.writeInt(currentTier); + buf.writeInt(currentAscension); + buf.writeInt(currentUpgrades.size()); + for (StellarIrisUpgrade u : currentUpgrades) { + buf.writeEnum(u); + } + }); + + if (currentUpgrades.isEmpty()) { + unlockedUpgrades = EnumSet.noneOf(StellarIrisUpgrade.class); + } else { + unlockedUpgrades = EnumSet.copyOf(currentUpgrades); + } + spendablePoints = currentPoints; + tier = currentTier; + ascensionLevel = currentAscension; + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void readUpdateInfo(int id, RegistryFriendlyByteBuf buffer) { + if (id == UPDATE_ID_SYNC) { + spendablePoints = buffer.readInt(); + tier = buffer.readInt(); + ascensionLevel = buffer.readInt(); + + int count = buffer.readInt(); + unlockedUpgrades = EnumSet.noneOf(StellarIrisUpgrade.class); + for (int i = 0; i < count; i++) { + unlockedUpgrades.add(buffer.readEnum(StellarIrisUpgrade.class)); + } + } else { + super.readUpdateInfo(id, buffer); + } + } + + private void playSound(net.minecraft.sounds.SoundEvent sound, float volume, float pitch) { + Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(sound, pitch, volume)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/WarningOverlayWidget.java b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/WarningOverlayWidget.java new file mode 100644 index 000000000..4f6e3a3c0 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/gui/widget/stellar/WarningOverlayWidget.java @@ -0,0 +1,253 @@ +package com.ghostipedia.cosmiccore.client.gui.widget.stellar; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine.Stage; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.util.Mth; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.function.Supplier; + +import javax.annotation.Nonnull; + +public class WarningOverlayWidget extends Widget { + + private final Supplier stageSupplier; + + private float warningPhase = 0f; + private float alertFlash = 0f; + private float textGlitch = 0f; + + public WarningOverlayWidget(int x, int y, int width, int height, Supplier stageSupplier) { + super(x, y, width, height); + this.stageSupplier = stageSupplier; + } + + @Override + @OnlyIn(Dist.CLIENT) + public void updateScreen() { + super.updateScreen(); + + Stage stage = stageSupplier.get(); + warningPhase += 0.1f; + + if (stage == Stage.DEATH) { + alertFlash += 0.3f; + textGlitch = (float) Math.random() * 0.5f; + } else if (stage == Stage.SUPERSTAR || stage == Stage.BLACK_HOLE) { + alertFlash += 0.15f; + textGlitch *= 0.9f; + } else { + alertFlash *= 0.9f; + textGlitch *= 0.8f; + } + } + + @Override + @OnlyIn(Dist.CLIENT) + public void drawInBackground(@Nonnull GuiGraphics graphics, int mouseX, int mouseY, float partialTicks) { + super.drawInBackground(graphics, mouseX, mouseY, partialTicks); + + Stage stage = stageSupplier.get(); + + if (stage == Stage.EMPTY || stage == Stage.GROWING || stage == Stage.STAR) { + return; + } + + int x = getPosition().x; + int y = getPosition().y; + int w = getSize().width; + int h = getSize().height; + + switch (stage) { + case SUPERSTAR -> drawSuperstarWarning(graphics, x, y, w, h); + case BLACK_HOLE -> drawBlackHoleWarning(graphics, x, y, w, h); + case DEATH -> drawCriticalAlert(graphics, x, y, w, h); + case DEATH_GRACEFUL -> drawShutdownNotice(graphics, x, y, w, h); + } + } + + private void drawSuperstarWarning(GuiGraphics graphics, int x, int y, int w, int h) { + float pulse = Mth.sin(warningPhase) * 0.5f + 0.5f; + + int bannerAlpha = (int) (0x40 * pulse); + int bannerColor = (bannerAlpha << 24) | 0xFF8800; + + int bannerY = y + 5; + int bannerH = 16; + graphics.fill(x, bannerY, x + w, bannerY + bannerH, bannerColor); + + int borderColor = (0x80 << 24) | 0xFF6600; + graphics.fill(x, bannerY, x + w, bannerY + 1, borderColor); + graphics.fill(x, bannerY + bannerH - 1, x + w, bannerY + bannerH, borderColor); + + var font = Minecraft.getInstance().font; + String warning = "!! CRITICAL MASS APPROACHING !!"; + int textWidth = font.width(warning); + + float scroll = (warningPhase * 2f) % (textWidth + w); + int textX = x + w - (int) scroll; + + graphics.enableScissor(x, bannerY, x + w, bannerY + bannerH); + graphics.drawString(font, warning, textX, bannerY + 4, 0xFFFFCC00, false); + graphics.drawString(font, warning, textX + textWidth + 50, bannerY + 4, 0xFFFFCC00, false); + graphics.disableScissor(); + + drawHazardStripes(graphics, x, bannerY + bannerH + 2, w, 3, 0xFFFF8800, 0xFF442200); + } + + private void drawBlackHoleWarning(GuiGraphics graphics, int x, int y, int w, int h) { + float pulse = Mth.sin(warningPhase * 0.7f) * 0.5f + 0.5f; + + int topBannerY = y + 5; + int bottomBannerY = y + h - 21; + int bannerH = 16; + + int bannerAlpha = (int) (0x50 * pulse); + int bannerColor = (bannerAlpha << 24) | 0x8040FF; + + graphics.fill(x, topBannerY, x + w, topBannerY + bannerH, bannerColor); + graphics.fill(x, bottomBannerY, x + w, bottomBannerY + bannerH, bannerColor); + + int borderColor = (0xA0 << 24) | 0x6020DD; + graphics.fill(x, topBannerY, x + w, topBannerY + 1, borderColor); + graphics.fill(x, topBannerY + bannerH - 1, x + w, topBannerY + bannerH, borderColor); + graphics.fill(x, bottomBannerY, x + w, bottomBannerY + 1, borderColor); + graphics.fill(x, bottomBannerY + bannerH - 1, x + w, bottomBannerY + bannerH, borderColor); + + var font = Minecraft.getInstance().font; + + String topText = ">> SINGULARITY CONTAINMENT ACTIVE <<"; + int topTextW = font.width(topText); + graphics.drawString(font, topText, x + (w - topTextW) / 2, topBannerY + 4, 0xFFCC99FF, false); + + String bottomText = "GRAVITATIONAL ANOMALY DETECTED"; + int bottomTextW = font.width(bottomText); + int glitchOffset = (int) (textGlitch * 3); + graphics.drawString(font, bottomText, x + (w - bottomTextW) / 2 + glitchOffset, bottomBannerY + 4, 0xFFAA77FF, + false); + + drawCornerBrackets(graphics, x + 10, topBannerY - 5, w - 20, bannerH + 10, 0xAA8040FF); + } + + private void drawCriticalAlert(GuiGraphics graphics, int x, int y, int w, int h) { + float flash = Mth.sin(alertFlash) * 0.5f + 0.5f; + + int screenFlashAlpha = (int) (0x20 * flash); + graphics.fill(x, y, x + w, y + h, (screenFlashAlpha << 24) | 0xFF0000); + + int topY = y + 5; + int bottomY = y + h - 25; + int bannerH = 20; + + int bannerAlpha = (int) (0x60 + 0x40 * flash); + int bannerColor = (bannerAlpha << 24) | 0xCC0000; + + graphics.fill(x, topY, x + w, topY + bannerH, bannerColor); + graphics.fill(x, bottomY, x + w, bottomY + bannerH, bannerColor); + + drawHazardStripes(graphics, x, topY - 4, w, 4, 0xFFFF0000, 0xFF440000); + drawHazardStripes(graphics, x, topY + bannerH, w, 4, 0xFFFF0000, 0xFF440000); + drawHazardStripes(graphics, x, bottomY - 4, w, 4, 0xFFFF0000, 0xFF440000); + drawHazardStripes(graphics, x, bottomY + bannerH, w, 4, 0xFFFF0000, 0xFF440000); + + var font = Minecraft.getInstance().font; + + String criticalText = "!!! CRITICAL FAILURE !!!"; + int textW = font.width(criticalText); + int glitchX = (int) ((Math.random() - 0.5) * textGlitch * 10); + int glitchY = (int) ((Math.random() - 0.5) * textGlitch * 4); + + int textColor = flash > 0.5f ? 0xFFFFFFFF : 0xFFFF4444; + graphics.drawString(font, criticalText, x + (w - textW) / 2 + glitchX, topY + 6 + glitchY, textColor, false); + + if (textGlitch > 0.2f) { + int ghostAlpha = (int) (0x40 * textGlitch); + int ghostColor = (ghostAlpha << 24) | 0x00FFFF; + graphics.drawString(font, criticalText, x + (w - textW) / 2 + glitchX + 2, topY + 6 + glitchY, ghostColor, + false); + } + + String evacuateText = "EVACUATE IMMEDIATELY"; + int evacW = font.width(evacuateText); + graphics.drawString(font, evacuateText, x + (w - evacW) / 2, bottomY + 6, 0xFFFFAAAA, false); + + drawWarningTriangles(graphics, x + 15, topY + 3, 14); + drawWarningTriangles(graphics, x + w - 29, topY + 3, 14); + } + + private void drawShutdownNotice(GuiGraphics graphics, int x, int y, int w, int h) { + float fade = Mth.sin(warningPhase * 0.3f) * 0.3f + 0.7f; + + int bannerY = y + h / 2 - 12; + int bannerH = 24; + + int bannerAlpha = (int) (0x50 * fade); + int bannerColor = (bannerAlpha << 24) | 0x604040; + graphics.fill(x + 20, bannerY, x + w - 20, bannerY + bannerH, bannerColor); + + int borderColor = (0x60 << 24) | 0x804040; + graphics.fill(x + 20, bannerY, x + w - 20, bannerY + 1, borderColor); + graphics.fill(x + 20, bannerY + bannerH - 1, x + w - 20, bannerY + bannerH, borderColor); + graphics.fill(x + 20, bannerY, x + 21, bannerY + bannerH, borderColor); + graphics.fill(x + w - 21, bannerY, x + w - 20, bannerY + bannerH, borderColor); + + var font = Minecraft.getInstance().font; + String text = "CONTROLLED SHUTDOWN IN PROGRESS"; + int textW = font.width(text); + int textColor = (int) (0xFF * fade) << 24 | 0x999999; + graphics.drawString(font, text, x + (w - textW) / 2, bannerY + 8, textColor, false); + + int dotsVisible = ((int) (warningPhase * 2)) % 4; + StringBuilder dots = new StringBuilder(); + for (int i = 0; i < dotsVisible; i++) dots.append("."); + graphics.drawString(font, dots.toString(), x + (w + textW) / 2 + 2, bannerY + 8, textColor, false); + } + + private void drawHazardStripes(GuiGraphics graphics, int x, int y, int w, int h, int color1, int color2) { + int stripeWidth = 8; + float offset = (warningPhase * 20) % (stripeWidth * 2); + + graphics.enableScissor(x, y, x + w, y + h); + for (int sx = x - stripeWidth * 2 + (int) offset; sx < x + w + stripeWidth; sx += stripeWidth * 2) { + graphics.fill(sx, y, sx + stripeWidth, y + h, color1); + graphics.fill(sx + stripeWidth, y, sx + stripeWidth * 2, y + h, color2); + } + graphics.disableScissor(); + } + + private void drawCornerBrackets(GuiGraphics graphics, int x, int y, int w, int h, int color) { + int len = 8; + int thickness = 2; + + graphics.fill(x, y, x + len, y + thickness, color); + graphics.fill(x, y, x + thickness, y + len, color); + + graphics.fill(x + w - len, y, x + w, y + thickness, color); + graphics.fill(x + w - thickness, y, x + w, y + len, color); + + graphics.fill(x, y + h - thickness, x + len, y + h, color); + graphics.fill(x, y + h - len, x + thickness, y + h, color); + + graphics.fill(x + w - len, y + h - thickness, x + w, y + h, color); + graphics.fill(x + w - thickness, y + h - len, x + w, y + h, color); + } + + private void drawWarningTriangles(GuiGraphics graphics, int x, int y, int size) { + int color = 0xFFFFCC00; + + for (int row = 0; row < size; row++) { + int halfWidth = row * size / (size * 2); + int cx = x + size / 2; + int drawY = y + row; + graphics.fill(cx - halfWidth, drawY, cx + halfWidth + 1, drawY + 1, color); + } + + var font = Minecraft.getInstance().font; + graphics.drawString(font, "!", x + size / 2 - 2, y + size / 3, 0xFF000000, false); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/keybind/BootsKeybinds.java b/src/main/java/com/ghostipedia/cosmiccore/client/keybind/BootsKeybinds.java new file mode 100644 index 000000000..4df983404 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/keybind/BootsKeybinds.java @@ -0,0 +1,141 @@ +package com.ghostipedia.cosmiccore.client.keybind; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.item.armor.boots.ICosmicBoots; +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.network.packet.BootsControlPacket; + +import com.gregtechceu.gtceu.api.item.armor.ArmorComponentItem; + +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.client.event.InputEvent; +import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; +import net.neoforged.neoforge.client.settings.KeyConflictContext; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; + +import com.mojang.blaze3d.platform.InputConstants; +import org.lwjgl.glfw.GLFW; + +/** + * Keybind handler for CosmicCore boots. + * Provides controls for speed/jump modifiers, step assist, and inertia cancellation. + */ +@OnlyIn(Dist.CLIENT) +public class BootsKeybinds { + + public static final String CATEGORY = "key.categories.cosmiccore.boots"; + + // Keybinds + public static KeyMapping SPEED_INCREASE; + public static KeyMapping SPEED_DECREASE; + public static KeyMapping JUMP_INCREASE; + public static KeyMapping JUMP_DECREASE; + public static KeyMapping TOGGLE_STEP_ASSIST; + public static KeyMapping TOGGLE_INERTIA; + + /** + * Register all boot keybinds. + */ + public static void registerKeyMappings(RegisterKeyMappingsEvent event) { + SPEED_INCREASE = new KeyMapping( + "key.cosmiccore.boots.speed_increase", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_KP_ADD, + CATEGORY); + event.register(SPEED_INCREASE); + + SPEED_DECREASE = new KeyMapping( + "key.cosmiccore.boots.speed_decrease", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_KP_SUBTRACT, + CATEGORY); + event.register(SPEED_DECREASE); + + JUMP_INCREASE = new KeyMapping( + "key.cosmiccore.boots.jump_increase", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_KP_MULTIPLY, + CATEGORY); + event.register(JUMP_INCREASE); + + JUMP_DECREASE = new KeyMapping( + "key.cosmiccore.boots.jump_decrease", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_KP_DIVIDE, + CATEGORY); + event.register(JUMP_DECREASE); + + TOGGLE_STEP_ASSIST = new KeyMapping( + "key.cosmiccore.boots.toggle_step", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_UNKNOWN, + CATEGORY); + event.register(TOGGLE_STEP_ASSIST); + + TOGGLE_INERTIA = new KeyMapping( + "key.cosmiccore.boots.toggle_inertia", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_UNKNOWN, + CATEGORY); + event.register(TOGGLE_INERTIA); + } + + /** + * Event handler for boot keybinds. + */ + @EventBusSubscriber(modid = CosmicCore.MOD_ID, bus = EventBusSubscriber.Bus.GAME, value = Dist.CLIENT) + public static class KeyHandler { + + @SubscribeEvent + public static void onKeyInput(InputEvent.Key event) { + if (event.getAction() != GLFW.GLFW_PRESS) return; + + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + if (player == null || mc.screen != null) return; + + // Check if player is wearing cosmic boots + ItemStack boots = player.getItemBySlot(EquipmentSlot.FEET); + if (!isCosmicBoots(boots)) return; + + // Handle keybinds + if (SPEED_INCREASE != null && SPEED_INCREASE.matches(event.getKey(), event.getScanCode())) { + CCoreNetwork.sendToServer(new BootsControlPacket(BootsControlPacket.Action.SPEED_INCREASE)); + } else if (SPEED_DECREASE != null && SPEED_DECREASE.matches(event.getKey(), event.getScanCode())) { + CCoreNetwork.sendToServer(new BootsControlPacket(BootsControlPacket.Action.SPEED_DECREASE)); + } else if (JUMP_INCREASE != null && JUMP_INCREASE.matches(event.getKey(), event.getScanCode())) { + CCoreNetwork.sendToServer(new BootsControlPacket(BootsControlPacket.Action.JUMP_INCREASE)); + } else if (JUMP_DECREASE != null && JUMP_DECREASE.matches(event.getKey(), event.getScanCode())) { + CCoreNetwork.sendToServer(new BootsControlPacket(BootsControlPacket.Action.JUMP_DECREASE)); + } else if (TOGGLE_STEP_ASSIST != null && + TOGGLE_STEP_ASSIST.matches(event.getKey(), event.getScanCode())) { + CCoreNetwork.sendToServer(new BootsControlPacket(BootsControlPacket.Action.TOGGLE_STEP)); + } else + if (TOGGLE_INERTIA != null && TOGGLE_INERTIA.matches(event.getKey(), event.getScanCode())) { + CCoreNetwork.sendToServer(new BootsControlPacket(BootsControlPacket.Action.TOGGLE_INERTIA)); + } + } + + /** + * Check if the item is a CosmicCore boots item. + */ + private static boolean isCosmicBoots(ItemStack stack) { + if (stack.isEmpty()) return false; + if (!(stack.getItem() instanceof ArmorComponentItem armorItem)) return false; + return armorItem.getArmorLogic() instanceof ICosmicBoots; + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/keybind/QuakeMovementKeybinds.java b/src/main/java/com/ghostipedia/cosmiccore/client/keybind/QuakeMovementKeybinds.java new file mode 100644 index 000000000..8a6f3223a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/keybind/QuakeMovementKeybinds.java @@ -0,0 +1,82 @@ +package com.ghostipedia.cosmiccore.client.keybind; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.CelesteDashHandler; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.QuakeMovementHandler; +import com.ghostipedia.cosmiccore.common.reflection.network.DashPacket; + +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.player.Player; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.client.event.ClientTickEvent; +import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; +import net.neoforged.neoforge.client.settings.KeyConflictContext; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; + +import com.mojang.blaze3d.platform.InputConstants; +import org.lwjgl.glfw.GLFW; + +@OnlyIn(Dist.CLIENT) +public class QuakeMovementKeybinds { + + public static final String CATEGORY = "key.categories.cosmiccore.movement"; + public static KeyMapping DASH; + + public static void registerKeyMappings(RegisterKeyMappingsEvent event) { + DASH = new KeyMapping( + "key.cosmiccore.movement.dash", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_LEFT_ALT, + CATEGORY); + event.register(DASH); + } + + public static boolean isDashKeyDown() { + if (DASH == null) return false; + Minecraft mc = Minecraft.getInstance(); + long window = mc.getWindow().getWindow(); + return InputConstants.isKeyDown(window, DASH.getKey().getValue()); + } + + @EventBusSubscriber(modid = CosmicCore.MOD_ID, bus = EventBusSubscriber.Bus.GAME, value = Dist.CLIENT) + public static class KeyHandler { + + private static boolean wasKeyDown = false; + + @SubscribeEvent + public static void onClientTick(ClientTickEvent.Post event) { + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + if (player == null || mc.screen != null) { + wasKeyDown = false; + return; + } + + if (!QuakeMovementHandler.getClientHasQuakeMovement()) { + wasKeyDown = false; + return; + } + + boolean isKeyDown = isDashKeyDown(); + if (isKeyDown && !wasKeyDown) { + if (CelesteDashHandler.tryDash(player)) { + CCoreNetwork.sendToServer(new DashPacket( + player.getXRot(), + player.getYRot(), + player.zza, + player.xxa)); + } + } + wasKeyDown = isKeyDown; + + while (DASH != null && DASH.consumeClick()) { + // Consumed + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/keybind/SoulSuperKeybind.java b/src/main/java/com/ghostipedia/cosmiccore/client/keybind/SoulSuperKeybind.java new file mode 100644 index 000000000..9fd413182 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/keybind/SoulSuperKeybind.java @@ -0,0 +1,56 @@ +package com.ghostipedia.cosmiccore.client.keybind; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.reflection.network.SoulSuperPacket; + +import net.minecraft.client.KeyMapping; +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.player.Player; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.neoforge.client.event.ClientTickEvent; +import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent; +import net.neoforged.neoforge.client.settings.KeyConflictContext; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; + +import com.mojang.blaze3d.platform.InputConstants; +import org.lwjgl.glfw.GLFW; + +@EventBusSubscriber(modid = CosmicCore.MOD_ID, bus = EventBusSubscriber.Bus.GAME, value = Dist.CLIENT) +public class SoulSuperKeybind { + + public static final String CATEGORY = "key.categories.cosmiccore.reflection"; + public static KeyMapping SUPER_KEY; + private static boolean wasKeyDown = false; + + public static void registerKeyMappings(RegisterKeyMappingsEvent event) { + SUPER_KEY = new KeyMapping( + "key.cosmiccore.reflection.super", + KeyConflictContext.IN_GAME, + InputConstants.Type.KEYSYM, + GLFW.GLFW_KEY_V, + CATEGORY); + event.register(SUPER_KEY); + } + + @SubscribeEvent + public static void onClientTick(ClientTickEvent.Post event) { + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + if (player == null || mc.screen != null) { + wasKeyDown = false; + return; + } + + boolean isKeyDown = SUPER_KEY != null && SUPER_KEY.isDown(); + if (isKeyDown && !wasKeyDown) { + CCoreNetwork.sendToServer(new SoulSuperPacket()); + } + wasKeyDown = isKeyDown; + + while (SUPER_KEY != null && SUPER_KEY.consumeClick()) { + // Consumed + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/BackgroundRenderer.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/BackgroundRenderer.java new file mode 100644 index 000000000..cb5187354 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/BackgroundRenderer.java @@ -0,0 +1,102 @@ +package com.ghostipedia.cosmiccore.client.renderer; + +import com.ghostipedia.cosmiccore.client.CosmicCoreClient; + +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.ShaderInstance; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import org.joml.Matrix4f; + +@OnlyIn(Dist.CLIENT) +public class BackgroundRenderer { + + public enum BackgroundType { + VOID, // Mystical ethereal void + GALAXY // Deep space galaxy with nebulae + } + + public static void render(PoseStack poseStack, BackgroundType type, float fadeAlpha, + int screenWidth, int screenHeight) { + Matrix4f matrix = poseStack.last().pose(); + + // Black overlay first so world fades to black during transitions + int blackAlpha = (int) (fadeAlpha * 255); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.setShader(GameRenderer::getPositionColorShader); + + BufferBuilder blackBuffer = Tesselator.getInstance().begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + blackBuffer.addVertex(matrix, 0, screenHeight, 0).setColor(0, 0, 0, blackAlpha); + blackBuffer.addVertex(matrix, screenWidth, screenHeight, 0).setColor(0, 0, 0, blackAlpha); + blackBuffer.addVertex(matrix, screenWidth, 0, 0).setColor(0, 0, 0, blackAlpha); + blackBuffer.addVertex(matrix, 0, 0, 0).setColor(0, 0, 0, blackAlpha); + BufferUploader.drawWithShader(blackBuffer.buildOrThrow()); + + ShaderInstance shader = type == BackgroundType.VOID ? CosmicCoreClient.getVoidBgShader() : + CosmicCoreClient.getGalaxyBgShader(); + + if (shader == null) { + RenderSystem.disableBlend(); + return; + } + + if (fadeAlpha < 0.01f) { + RenderSystem.disableBlend(); + return; + } + + RenderSystem.setShader(() -> shader); + + if (shader.GAME_TIME != null) { + shader.GAME_TIME.set(RenderSystem.getShaderGameTime()); + } + if (shader.SCREEN_SIZE != null) { + shader.SCREEN_SIZE.set((float) screenWidth, (float) screenHeight); + } + + setUniformSafe(shader, "Intensity", fadeAlpha); + + BufferBuilder buffer = Tesselator.getInstance().begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + buffer.addVertex(matrix, 0, screenHeight, 0).setUv(0, 1); + buffer.addVertex(matrix, screenWidth, screenHeight, 0).setUv(1, 1); + buffer.addVertex(matrix, screenWidth, 0, 0).setUv(1, 0); + buffer.addVertex(matrix, 0, 0, 0).setUv(0, 0); + BufferUploader.drawWithShader(buffer.buildOrThrow()); + + RenderSystem.disableBlend(); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + } + + private static void renderFallback(PoseStack poseStack, int screenWidth, int screenHeight) { + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.setShader(GameRenderer::getPositionColorShader); + + Matrix4f matrix = poseStack.last().pose(); + + BufferBuilder buffer = Tesselator.getInstance().begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + buffer.addVertex(matrix, 0, screenHeight, 0).setColor(0, 0, 0, 255); + buffer.addVertex(matrix, screenWidth, screenHeight, 0).setColor(0, 0, 0, 255); + buffer.addVertex(matrix, screenWidth, 0, 0).setColor(0, 0, 0, 255); + buffer.addVertex(matrix, 0, 0, 0).setColor(0, 0, 0, 255); + BufferUploader.drawWithShader(buffer.buildOrThrow()); + + RenderSystem.disableBlend(); + } + + private static void setUniformSafe(ShaderInstance shader, String name, float value) { + var uniform = shader.getUniform(name); + if (uniform != null) { + uniform.set(value); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/ChainRenderer.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/ChainRenderer.java new file mode 100644 index 000000000..ddff167b5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/ChainRenderer.java @@ -0,0 +1,305 @@ +package com.ghostipedia.cosmiccore.client.renderer; + +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import org.joml.Matrix4f; + +import java.util.ArrayList; +import java.util.List; + +@OnlyIn(Dist.CLIENT) +public class ChainRenderer { + + private static final int SEGMENTS = 8; + private static final float GRAVITY = 0.35f; + private static final float DAMPENING = 0.96f; + private static final int CONSTRAINT_ITERATIONS = 6; + private static final float MOUSE_INFLUENCE_RADIUS = 20.0f; + private static final float MOUSE_PUSH_STRENGTH = 2.0f; + private static final int BASE_LINK_SIZE = 14; + + private static final ResourceLocation CHAIN_TEXTURE = ResourceLocation.fromNamespaceAndPath("minecraft", + "textures/item/chain.png"); + + private final List chains = new ArrayList<>(); + + public void clear() { + chains.clear(); + } + + public void addChain(float shellX, float shellY, float pinX, float pinY, int[] color) { + chains.add(new Chain(shellX, shellY, pinX, pinY, color)); + } + + public int getChainCount() { + return chains.size(); + } + + public Chain getChain(int index) { + return chains.get(index); + } + + public void tick(float mouseX, float mouseY) { + for (Chain chain : chains) { + chain.simulate(mouseX, mouseY); + } + } + + public void updateAnchors(int chainIndex, float shellX, float shellY, float pinX, float pinY) { + if (chainIndex < 0 || chainIndex >= chains.size()) return; + Chain chain = chains.get(chainIndex); + + float dShellX = shellX - chain.points[0].x; + float dShellY = shellY - chain.points[0].y; + float dPinX = pinX - chain.points[SEGMENTS - 1].x; + float dPinY = pinY - chain.points[SEGMENTS - 1].y; + + for (int i = 1; i < SEGMENTS - 1; i++) { + float t = (float) i / (SEGMENTS - 1); + float dx = dShellX * (1 - t) + dPinX * t; + float dy = dShellY * (1 - t) + dPinY * t; + chain.points[i].x += dx; + chain.points[i].y += dy; + chain.points[i].prevX += dx; + chain.points[i].prevY += dy; + } + + chain.points[0].x = shellX; + chain.points[0].y = shellY; + chain.points[0].prevX = shellX; + chain.points[0].prevY = shellY; + chain.points[SEGMENTS - 1].x = pinX; + chain.points[SEGMENTS - 1].y = pinY; + chain.points[SEGMENTS - 1].prevX = pinX; + chain.points[SEGMENTS - 1].prevY = pinY; + chain.recalcRestLength(); + } + + public void render(GuiGraphics graphics, float fadeAlpha, float mouseX, float mouseY, float partialTick) { + if (chains.isEmpty() || fadeAlpha <= 0.01f) return; + + for (Chain chain : chains) { + chain.hovered = chain.isNearMouse(mouseX, mouseY, 10.0f); + } + + graphics.flush(); + Matrix4f matrix = graphics.pose().last().pose(); + + RenderSystem.setShaderTexture(0, CHAIN_TEXTURE); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.disableDepthTest(); + + for (Chain chain : chains) { + float alpha = fadeAlpha * (chain.hovered ? 0.85f : 0.55f); + if (alpha <= 0.01f) continue; + + RenderSystem.setShaderColor(chain.color[0] / 255f, chain.color[1] / 255f, + chain.color[2] / 255f, alpha); + + BufferBuilder buffer = Tesselator.getInstance().begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + emitChainQuads(buffer, matrix, chain, partialTick); + BufferUploader.drawWithShader(buffer.buildOrThrow()); + } + + RenderSystem.enableDepthTest(); + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + } + + private void emitChainQuads(BufferBuilder buffer, Matrix4f matrix, Chain chain, float partialTick) { + for (int i = 0; i < SEGMENTS - 1; i++) { + float ax = lerp(chain.points[i].prevX, chain.points[i].x, partialTick); + float ay = lerp(chain.points[i].prevY, chain.points[i].y, partialTick); + float bx = lerp(chain.points[i + 1].prevX, chain.points[i + 1].x, partialTick); + float by = lerp(chain.points[i + 1].prevY, chain.points[i + 1].y, partialTick); + + float midX = (ax + bx) * 0.5f; + float midY = (ay + by) * 0.5f; + float dx = bx - ax; + float dy = by - ay; + float segDist = (float) Math.sqrt(dx * dx + dy * dy); + + float hs = Math.max(BASE_LINK_SIZE, segDist * 1.15f) * 0.5f; + + float angle = (float) Math.atan2(dy, dx) + (float) (Math.PI / 2); + float cos = (float) Math.cos(angle); + float sin = (float) Math.sin(angle); + + float c00x = -hs * cos + hs * sin, c00y = -hs * sin - hs * cos; + float c01x = -hs * cos - hs * sin, c01y = -hs * sin + hs * cos; + float c11x = hs * cos - hs * sin, c11y = hs * sin + hs * cos; + float c10x = hs * cos + hs * sin, c10y = hs * sin - hs * cos; + + buffer.addVertex(matrix, midX + c00x, midY + c00y, 0).setUv(0, 0); + buffer.addVertex(matrix, midX + c01x, midY + c01y, 0).setUv(0, 1); + buffer.addVertex(matrix, midX + c11x, midY + c11y, 0).setUv(1, 1); + buffer.addVertex(matrix, midX + c10x, midY + c10y, 0).setUv(1, 0); + } + } + + private static float lerp(float a, float b, float t) { + return a + (b - a) * t; + } + + public int getHoveredChain(float mouseX, float mouseY, float threshold) { + for (int i = 0; i < chains.size(); i++) { + if (chains.get(i).isNearMouse(mouseX, mouseY, threshold)) { + return i; + } + } + return -1; + } + + public static class Chain { + + final Point[] points; + final int[] color; + private boolean hovered = false; + private float restLength; + + Chain(float shellX, float shellY, float pinX, float pinY, int[] color) { + this.color = color; + this.points = new Point[SEGMENTS]; + + float totalDist = (float) Math.sqrt( + (pinX - shellX) * (pinX - shellX) + (pinY - shellY) * (pinY - shellY)); + + for (int i = 0; i < SEGMENTS; i++) { + float t = (float) i / (SEGMENTS - 1); + float x = shellX + (pinX - shellX) * t; + float y = shellY + (pinY - shellY) * t; + float sag = (float) Math.sin(t * Math.PI) * totalDist * 0.15f; + y += sag; + points[i] = new Point(x, y); + } + recalcRestLength(); + } + + private void recalcRestLength() { + float dx = points[SEGMENTS - 1].x - points[0].x; + float dy = points[SEGMENTS - 1].y - points[0].y; + float dist = (float) Math.sqrt(dx * dx + dy * dy); + restLength = dist * 1.3f / (SEGMENTS - 1); + } + + void simulate(float mouseX, float mouseY) { + float shellX = points[0].x; + float shellY = points[0].y; + float pinX = points[SEGMENTS - 1].x; + float pinY = points[SEGMENTS - 1].y; + + for (int i = 1; i < SEGMENTS - 1; i++) { + Point p = points[i]; + float vx = (p.x - p.prevX) * DAMPENING; + float vy = (p.y - p.prevY) * DAMPENING; + + p.prevX = p.x; + p.prevY = p.y; + + p.x += vx; + p.y += vy + GRAVITY; + + float dx = p.x - mouseX; + float dy = p.y - mouseY; + float distSq = dx * dx + dy * dy; + float radiusSq = MOUSE_INFLUENCE_RADIUS * MOUSE_INFLUENCE_RADIUS; + + if (distSq < radiusSq && distSq > 0.01f) { + float dist = (float) Math.sqrt(distSq); + float force = (1.0f - dist / MOUSE_INFLUENCE_RADIUS) * MOUSE_PUSH_STRENGTH; + p.x += (dx / dist) * force; + p.y += (dy / dist) * force; + } + } + + float rest = restLength; + for (int iter = 0; iter < CONSTRAINT_ITERATIONS; iter++) { + for (int i = 0; i < SEGMENTS - 1; i++) { + Point a = points[i]; + Point b = points[i + 1]; + + float dx = b.x - a.x; + float dy = b.y - a.y; + float dist = (float) Math.sqrt(dx * dx + dy * dy); + if (dist < 0.001f) continue; + + float diff = (rest - dist) / dist; + float offsetX = dx * diff * 0.5f; + float offsetY = dy * diff * 0.5f; + + if (i > 0) { + a.x -= offsetX; + a.y -= offsetY; + } + if (i + 1 < SEGMENTS - 1) { + b.x += offsetX; + b.y += offsetY; + } + } + } + + points[0].x = shellX; + points[0].y = shellY; + points[SEGMENTS - 1].x = pinX; + points[SEGMENTS - 1].y = pinY; + } + + public boolean isHovered() { + return hovered; + } + + boolean isNearMouse(float mouseX, float mouseY, float threshold) { + float thresholdSq = threshold * threshold; + for (int i = 0; i < SEGMENTS - 1; i++) { + float distSq = pointToSegmentDistSq(mouseX, mouseY, + points[i].x, points[i].y, + points[i + 1].x, points[i + 1].y); + if (distSq < thresholdSq) return true; + } + return false; + } + + private float pointToSegmentDistSq(float px, float py, float ax, float ay, float bx, float by) { + float dx = bx - ax; + float dy = by - ay; + float lenSq = dx * dx + dy * dy; + + if (lenSq < 0.001f) { + float ex = px - ax; + float ey = py - ay; + return ex * ex + ey * ey; + } + + float t = Math.max(0, Math.min(1, ((px - ax) * dx + (py - ay) * dy) / lenSq)); + float projX = ax + t * dx; + float projY = ay + t * dy; + float ex = px - projX; + float ey = py - projY; + return ex * ex + ey * ey; + } + } + + static class Point { + + float x, y; + float prevX, prevY; + + Point(float x, float y) { + this.x = x; + this.y = y; + this.prevX = x; + this.prevY = y; + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/CosmicCoreRenderTypes.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/CosmicCoreRenderTypes.java new file mode 100644 index 000000000..1b8faa86b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/CosmicCoreRenderTypes.java @@ -0,0 +1,46 @@ +package com.ghostipedia.cosmiccore.client.renderer; + +import com.ghostipedia.cosmiccore.client.CosmicCoreClient; + +import net.minecraft.client.renderer.RenderType; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.VertexFormat; + +@OnlyIn(Dist.CLIENT) +public class CosmicCoreRenderTypes extends RenderType { + + protected static final ShaderStateShard NEBULAE_SHADER = new ShaderStateShard(CosmicCoreClient::getNebulaeShader); + protected static final ShaderStateShard SOUL_AURA_SHADER = new ShaderStateShard( + CosmicCoreClient::getSoulAuraShader); + + private static final RenderType NEBULAE = RenderType.create("nebulae", + DefaultVertexFormat.POSITION, VertexFormat.Mode.QUADS, 256, false, false, + RenderType.CompositeState.builder() + .setShaderState(NEBULAE_SHADER) + .createCompositeState(false)); + + private static final RenderType SOUL_AURA = RenderType.create("soul_aura", + DefaultVertexFormat.POSITION_TEX, VertexFormat.Mode.QUADS, 256, false, false, + RenderType.CompositeState.builder() + .setShaderState(SOUL_AURA_SHADER) + .setTransparencyState(TRANSLUCENT_TRANSPARENCY) + .setWriteMaskState(COLOR_WRITE) + .createCompositeState(false)); + + private CosmicCoreRenderTypes(String name, VertexFormat format, VertexFormat.Mode mode, int bufferSize, + boolean affectsCrumbling, boolean sortOnUpload, Runnable setupState, + Runnable clearState) { + super(name, format, mode, bufferSize, affectsCrumbling, sortOnUpload, setupState, clearState); + } + + public static RenderType nebulae() { + return NEBULAE; + } + + public static RenderType soulAura() { + return SOUL_AURA; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/DelegatingVertexConsumer.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/DelegatingVertexConsumer.java new file mode 100644 index 000000000..d2250dc7d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/DelegatingVertexConsumer.java @@ -0,0 +1,58 @@ +package com.ghostipedia.cosmiccore.client.renderer; + +import net.minecraft.client.renderer.texture.TextureAtlasSprite; + +import com.mojang.blaze3d.vertex.VertexConsumer; +import org.jetbrains.annotations.NotNull; + +public abstract class DelegatingVertexConsumer implements ISpriteAwareVertexConsumer { + + protected final VertexConsumer delegate; + + protected DelegatingVertexConsumer(VertexConsumer delegate) { + this.delegate = delegate; + } + + public void sprite(TextureAtlasSprite sprite) { + VertexConsumer var3 = this.delegate; + if (var3 instanceof ISpriteAwareVertexConsumer spriteConsumer) { + spriteConsumer.sprite(sprite); + } + } + + @Override + public @NotNull VertexConsumer addVertex(float x, float y, float z) { + this.delegate.addVertex(x, y, z); + return this; + } + + @Override + public @NotNull VertexConsumer setColor(int r, int g, int b, int a) { + this.delegate.setColor(r, g, b, a); + return this; + } + + @Override + public @NotNull VertexConsumer setUv(float u, float v) { + this.delegate.setUv(u, v); + return this; + } + + @Override + public @NotNull VertexConsumer setUv1(int u, int v) { + this.delegate.setUv1(u, v); + return this; + } + + @Override + public @NotNull VertexConsumer setUv2(int u, int v) { + this.delegate.setUv2(u, v); + return this; + } + + @Override + public @NotNull VertexConsumer setNormal(float x, float y, float z) { + this.delegate.setNormal(x, y, z); + return this; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/ISpriteAwareVertexConsumer.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/ISpriteAwareVertexConsumer.java new file mode 100644 index 000000000..3036cdf4b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/ISpriteAwareVertexConsumer.java @@ -0,0 +1,10 @@ +package com.ghostipedia.cosmiccore.client.renderer; + +import net.minecraft.client.renderer.texture.TextureAtlasSprite; + +import com.mojang.blaze3d.vertex.VertexConsumer; + +public interface ISpriteAwareVertexConsumer extends VertexConsumer { + + void sprite(TextureAtlasSprite var1); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/RingUpgradePreviewRenderer.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/RingUpgradePreviewRenderer.java new file mode 100644 index 000000000..1023802bc --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/RingUpgradePreviewRenderer.java @@ -0,0 +1,323 @@ +package com.ghostipedia.cosmiccore.client.renderer; + +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.StarLadderResearchHubPatterns; + +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemBlockRenderTypes; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.BlockRenderDispatcher; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; + +import java.util.*; + +public class RingUpgradePreviewRenderer { + + private static final Map ACTIVE_PREVIEWS = new HashMap<>(); + private static final RandomSource RANDOM = RandomSource.create(); + + // Cached delta maps: position relative to controller -> block to place + private static Map DELTA_NOTHING_TO_T0; + private static Map DELTA_T0_TO_T1; + private static Map DELTA_T1_TO_T2; + private static Map DELTA_T2_TO_T3; + private static Map DELTA_T3_TO_T4; + + // Block mapping for unified character scheme + private static Map CHAR_TO_BLOCK; + + private record PreviewData(BlockPos controllerPos, Map deltaBlocks) {} + + static { + initializeBlockMapping(); + computeDeltas(); + } + + private static void initializeBlockMapping() { + CHAR_TO_BLOCK = new HashMap<>(); + CHAR_TO_BLOCK.put('A', CosmicBlocks.SUPERHEAVY_STEEL_CASING.get()); + CHAR_TO_BLOCK.put('B', CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.get()); + CHAR_TO_BLOCK.put('C', CosmicBlocks.SOMARUST_CASING.get()); + CHAR_TO_BLOCK.put('D', CosmicBlocks.SOUL_MUTED_CASING.get()); + CHAR_TO_BLOCK.put('E', CosmicBlocks.BICHROMAL_NEVRAMITE_CASING.get()); + CHAR_TO_BLOCK.put('F', CosmicBlocks.OSCILLATING_GILDED_PTHANTERUM_CASING.get()); + CHAR_TO_BLOCK.put('G', CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.get()); + CHAR_TO_BLOCK.put('H', CosmicBlocks.ROYAL_ICHORIUM_CASING.get()); + CHAR_TO_BLOCK.put('I', CosmicBlocks.MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get()); + CHAR_TO_BLOCK.put('J', CosmicBlocks.ULTRA_POWERED_CASING.get()); + } + + private static void computeDeltas() { + // Parse each tier's pattern + Map t0Blocks = parsePatternRelativeToController(StarLadderResearchHubPatterns.TIER_0, + "T0"); + Map t1Blocks = parsePatternRelativeToController(StarLadderResearchHubPatterns.TIER_1, + "T1"); + Map t2Blocks = parsePatternRelativeToController(StarLadderResearchHubPatterns.TIER_2, + "T2"); + Map t3Blocks = parsePatternRelativeToController(StarLadderResearchHubPatterns.TIER_3, + "T3"); + + // Compute deltas between consecutive tiers + // Delta from nothing (controller-only) to T0 is just all T0 blocks + DELTA_NOTHING_TO_T0 = computeDelta(new HashMap<>(), t0Blocks); + DELTA_T0_TO_T1 = computeDelta(t0Blocks, t1Blocks); + DELTA_T1_TO_T2 = computeDelta(t1Blocks, t2Blocks); + DELTA_T2_TO_T3 = computeDelta(t2Blocks, t3Blocks); + // T4 not yet available + DELTA_T3_TO_T4 = new HashMap<>(); + } + + private static Map parsePatternRelativeToController(String[] patternData, String tierName) { + if (patternData == null || patternData.length == 0) return new HashMap<>(); + + List> aisles = new ArrayList<>(); + for (String aisleStr : patternData) { + if (aisleStr.contains("|")) { + aisles.add(Arrays.asList(aisleStr.split("\\|", -1))); + } + } + if (aisles.isEmpty()) return new HashMap<>(); + + // Find controller position (marked with '#') + BlockPos controllerPos = null; + outer: + for (int z = 0; z < aisles.size(); z++) { + List aisle = aisles.get(z); + for (int y = 0; y < aisle.size(); y++) { + String layer = aisle.get(y); + for (int x = 0; x < layer.length(); x++) { + if (layer.charAt(x) == '#') { + controllerPos = new BlockPos(x, y, z); + break outer; + } + } + } + } + if (controllerPos == null) return new HashMap<>(); + + // Extract all blocks relative to controller + Map blocks = new HashMap<>(); + int cx = controllerPos.getX(), cy = controllerPos.getY(), cz = controllerPos.getZ(); + + for (int z = 0; z < aisles.size(); z++) { + List aisle = aisles.get(z); + for (int y = 0; y < aisle.size(); y++) { + String layer = aisle.get(y); + for (int x = 0; x < layer.length(); x++) { + char ch = layer.charAt(x); + if (ch != ' ' && ch != '@' && ch != '#') { + blocks.put(new BlockPos(x - cx, y - cy, z - cz), ch); + } + } + } + } + return blocks; + } + + private static Map computeDelta(Map prevTier, + Map nextTier) { + Map delta = new HashMap<>(); + + for (Map.Entry entry : nextTier.entrySet()) { + BlockPos pos = entry.getKey(); + char ch = entry.getValue(); + + // Block is new if it wasn't in previous tier or was a different type + if (!prevTier.containsKey(pos) || !prevTier.get(pos).equals(ch)) { + Block block = CHAR_TO_BLOCK.get(ch); + if (block != null) { + delta.put(pos, block); + } + } + } + + return delta; + } + + public static void enablePreview(BlockPos controllerPos, Direction facing, int currentTier) { + if (currentTier >= 3) return; // T3 is max currently (T4 not available) + + Map delta = getDeltaForTier(currentTier); + if (delta == null || delta.isEmpty()) return; + + // Rotate delta positions based on controller facing + Map rotatedDelta = new HashMap<>(); + for (Map.Entry entry : delta.entrySet()) { + BlockPos relPos = entry.getKey(); + BlockPos rotated = rotateOffset(relPos.getX(), relPos.getY(), relPos.getZ(), facing); + BlockPos worldPos = controllerPos.offset(rotated); + rotatedDelta.put(worldPos, entry.getValue()); + } + + ACTIVE_PREVIEWS.put(controllerPos, new PreviewData(controllerPos, rotatedDelta)); + } + + public static void disablePreview(BlockPos controllerPos) { + ACTIVE_PREVIEWS.remove(controllerPos); + } + + public static void updatePreview(BlockPos controllerPos, Direction facing, int newTier) { + if (ACTIVE_PREVIEWS.containsKey(controllerPos)) { + disablePreview(controllerPos); + enablePreview(controllerPos, facing, newTier); + } + } + + public static void clearAllPreviews() { + ACTIVE_PREVIEWS.clear(); + } + + private static Map getDeltaForTier(int currentTier) { + return switch (currentTier) { + case -1 -> DELTA_NOTHING_TO_T0; + case 0 -> DELTA_T0_TO_T1; + case 1 -> DELTA_T1_TO_T2; + case 2 -> DELTA_T2_TO_T3; + case 3 -> DELTA_T3_TO_T4; + default -> null; + }; + } + + private static BlockPos rotateOffset(int x, int y, int z, Direction facing) { + // Maps pattern coords to world coords based on GTCEu's setActualRelativeOffset + return switch (facing) { + case NORTH -> new BlockPos(-x, y, -z); + case SOUTH -> new BlockPos(x, y, z); + case EAST -> new BlockPos(z, y, -x); + case WEST -> new BlockPos(-z, y, x); + default -> new BlockPos(x, y, z); + }; + } + + public static void renderPreviews(PoseStack poseStack, Camera camera) { + if (ACTIVE_PREVIEWS.isEmpty()) return; + + var mc = Minecraft.getInstance(); + if (mc.level == null) return; + + Vec3 camPos = camera.getPosition(); + BlockRenderDispatcher dispatcher = mc.getBlockRenderer(); + Tesselator tesselator = Tesselator.getInstance(); + BufferBuilder buffer = null; + + poseStack.pushPose(); + poseStack.translate(-camPos.x, -camPos.y, -camPos.z); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.enableDepthTest(); + + for (PreviewData preview : ACTIVE_PREVIEWS.values()) { + if (!mc.level.isLoaded(preview.controllerPos)) continue; + + for (Map.Entry entry : preview.deltaBlocks.entrySet()) { + BlockPos pos = entry.getKey(); + Block block = entry.getValue(); + + // Only render ghost blocks where there's air + if (!mc.level.isEmptyBlock(pos)) continue; + + BlockState state = block.defaultBlockState(); + renderGhostBlock(poseStack, dispatcher, buffer, tesselator, pos, state); + } + } + + RenderSystem.disableBlend(); + poseStack.popPose(); + } + + private static void renderGhostBlock(PoseStack poseStack, BlockRenderDispatcher dispatcher, + BufferBuilder buffer, Tesselator tesselator, + BlockPos pos, BlockState state) { + poseStack.pushPose(); + poseStack.translate(pos.getX(), pos.getY(), pos.getZ()); + poseStack.translate(0.5, 0.5, 0.5); + poseStack.scale(0.8f, 0.8f, 0.8f); + poseStack.translate(-0.5, -0.5, -0.5); + + for (RenderType renderType : RenderType.chunkBufferLayers()) { + if (!ItemBlockRenderTypes.getRenderLayers(state).contains(renderType)) continue; + renderType.setupRenderState(); + buffer = tesselator.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK); + dispatcher.renderBatched(state, pos, Minecraft.getInstance().level, poseStack, buffer, false, RANDOM); + BufferUploader.drawWithShader(buffer.buildOrThrow()); + renderType.clearRenderState(); + } + poseStack.popPose(); + } + + public static int getDeltaBlockCount(int currentTier) { + Map delta = getDeltaForTier(currentTier); + return delta != null ? delta.size() : 0; + } + + public static Map getDeltaBlockCounts(int currentTier) { + Map delta = getDeltaForTier(currentTier); + if (delta == null) return new HashMap<>(); + + Map counts = new HashMap<>(); + for (Block block : delta.values()) { + counts.merge(block, 1, Integer::sum); + } + return counts; + } + + public static Block getRingBlock(int tier) { + Map delta = getDeltaForTier(tier - 1); + if (delta == null || delta.isEmpty()) return null; + + Map counts = new HashMap<>(); + for (Block block : delta.values()) { + counts.merge(block, 1, Integer::sum); + } + return counts.entrySet().stream() + .max(Map.Entry.comparingByValue()) + .map(Map.Entry::getKey) + .orElse(null); + } + + public static int getRingBlockCount(int tier) { + Map delta = getDeltaForTier(tier - 1); + return delta != null ? delta.size() : 0; + } + + public static Set calculateRingPositions(BlockPos controllerPos, Direction facing, int targetTier) { + Map delta = getDeltaForTier(targetTier - 1); + if (delta == null || delta.isEmpty()) return new HashSet<>(); + + Set positions = new HashSet<>(); + for (BlockPos relPos : delta.keySet()) { + BlockPos rotated = rotateOffset(relPos.getX(), relPos.getY(), relPos.getZ(), facing); + positions.add(controllerPos.offset(rotated)); + } + return positions; + } + + public static Map calculateRingPositionsWithBlocks(BlockPos controllerPos, Direction facing, + int targetTier) { + Map delta = getDeltaForTier(targetTier - 1); + if (delta == null || delta.isEmpty()) return new HashMap<>(); + + Map positions = new HashMap<>(); + for (Map.Entry entry : delta.entrySet()) { + BlockPos relPos = entry.getKey(); + BlockPos rotated = rotateOffset(relPos.getX(), relPos.getY(), relPos.getZ(), facing); + positions.put(controllerPos.offset(rotated), entry.getValue()); + } + return positions; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/SoulAuraRenderer.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/SoulAuraRenderer.java new file mode 100644 index 000000000..9fa00c41a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/SoulAuraRenderer.java @@ -0,0 +1,109 @@ +package com.ghostipedia.cosmiccore.client.renderer; + +import com.ghostipedia.cosmiccore.client.CosmicCoreClient; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionConstants; + +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.ShaderInstance; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import org.joml.Matrix4f; + +@OnlyIn(Dist.CLIENT) +public class SoulAuraRenderer { + + public static void render(PoseStack poseStack, int centerX, int centerY, int radius, + int erosion, float intensity, int screenWidth, int screenHeight) { + ShaderInstance shader = CosmicCoreClient.getSoulAuraShader(); + if (shader == null) return; + + float[] color = getAuraColor(erosion); + + float normalizedCenterX = (float) centerX / screenWidth; + float normalizedCenterY = (float) centerY / screenHeight; + float normalizedRadius = (float) radius / Math.min(screenWidth, screenHeight); + + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.setShader(() -> shader); + + if (shader.GAME_TIME != null) { + shader.GAME_TIME.set(RenderSystem.getShaderGameTime()); + } + if (shader.SCREEN_SIZE != null) { + shader.SCREEN_SIZE.set((float) screenWidth, (float) screenHeight); + } + + setUniformSafe(shader, "Center", normalizedCenterX, normalizedCenterY); + setUniformSafe(shader, "BaseColor", color[0], color[1], color[2]); + setUniformSafe(shader, "Intensity", intensity); + setUniformSafe(shader, "Radius", normalizedRadius); + + int auraSize = (int) (radius * 3.0f); + int x1 = centerX - auraSize; + int y1 = centerY - auraSize; + int x2 = centerX + auraSize; + int y2 = centerY + auraSize; + + float u1 = (float) x1 / screenWidth; + float v1 = (float) y1 / screenHeight; + float u2 = (float) x2 / screenWidth; + float v2 = (float) y2 / screenHeight; + + Matrix4f matrix = poseStack.last().pose(); + + BufferBuilder buffer = Tesselator.getInstance().begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + buffer.addVertex(matrix, x1, y2, 0).setUv(u1, v2); + buffer.addVertex(matrix, x2, y2, 0).setUv(u2, v2); + buffer.addVertex(matrix, x2, y1, 0).setUv(u2, v1); + buffer.addVertex(matrix, x1, y1, 0).setUv(u1, v1); + BufferUploader.drawWithShader(buffer.buildOrThrow()); + + RenderSystem.disableBlend(); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + } + + // Aura colors are complementary to soul orb colors + private static float[] getAuraColor(int erosion) { + int tier = ReflectionConstants.getSoulColorTier(erosion); + + return switch (tier) { + case 0 -> new float[] { 1.0f, 0.85f, 0.45f }; + case 1 -> new float[] { 1.0f, 0.60f, 0.30f }; + case 2 -> new float[] { 0.70f, 0.90f, 0.30f }; + case 3 -> new float[] { 0.30f, 0.85f, 0.50f }; + case 4 -> new float[] { 0.25f, 0.75f, 0.75f }; + case 5 -> new float[] { 0.15f, 0.45f, 0.45f }; + default -> new float[] { 0.10f, 0.25f, 0.25f }; + }; + } + + private static void setUniformSafe(ShaderInstance shader, String name, float value) { + var uniform = shader.getUniform(name); + if (uniform != null) { + uniform.set(value); + } + } + + private static void setUniformSafe(ShaderInstance shader, String name, float x, float y) { + var uniform = shader.getUniform(name); + if (uniform != null) { + uniform.set(x, y); + } + } + + private static void setUniformSafe(ShaderInstance shader, String name, float x, float y, float z) { + var uniform = shader.getUniform(name); + if (uniform != null) { + uniform.set(x, y, z); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/SoulCoreRenderer.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/SoulCoreRenderer.java new file mode 100644 index 000000000..1795312cb --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/SoulCoreRenderer.java @@ -0,0 +1,32 @@ +package com.ghostipedia.cosmiccore.client.renderer; + +import com.ghostipedia.cosmiccore.client.CosmicCoreClient; + +import net.minecraft.client.renderer.ShaderInstance; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.vertex.PoseStack; + +@OnlyIn(Dist.CLIENT) +public class SoulCoreRenderer { + + public static void render(PoseStack poseStack, int centerX, int centerY, int radius, + int erosion, float intensity, int screenWidth, int screenHeight) { + ShaderInstance shader = CosmicCoreClient.getSoulCoreShader(); + if (shader == null) return; + + float normalizedErosion = SoulShaderHelper.getNormalizedErosion(erosion); + float normalizedCenterX = (float) centerX / screenWidth; + float normalizedCenterY = (float) centerY / screenHeight; + float normalizedRadius = (float) radius / Math.min(screenWidth, screenHeight); + + SoulShaderHelper.setupShader(shader, screenWidth, screenHeight, + normalizedCenterX, normalizedCenterY, + SoulShaderHelper.getCoreColor(erosion), SoulShaderHelper.getShellColor(erosion), + intensity, normalizedRadius, normalizedErosion); + + int drawSize = (int) (radius * (2.5f + normalizedErosion * 1.0f)); + SoulShaderHelper.drawQuad(poseStack, centerX, centerY, drawSize, screenWidth, screenHeight); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/SoulShaderHelper.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/SoulShaderHelper.java new file mode 100644 index 000000000..267e3352e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/SoulShaderHelper.java @@ -0,0 +1,111 @@ +package com.ghostipedia.cosmiccore.client.renderer; + +import com.ghostipedia.cosmiccore.common.reflection.ReflectionConstants; + +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.ShaderInstance; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.BufferBuilder; +import com.mojang.blaze3d.vertex.BufferUploader; +import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.Tesselator; +import com.mojang.blaze3d.vertex.VertexFormat; +import org.joml.Matrix4f; + +@OnlyIn(Dist.CLIENT) +public final class SoulShaderHelper { + + public static float getNormalizedErosion(int erosion) { + return Math.min(1.0f, erosion / 1000.0f); + } + + public static float[] getCoreColor(int erosion) { + int tier = ReflectionConstants.getSoulColorTier(erosion); + return switch (tier) { + case 0 -> new float[] { 1.0f, 0.95f, 0.80f }; + case 1 -> new float[] { 0.85f, 0.90f, 1.0f }; + case 2 -> new float[] { 0.70f, 0.55f, 1.0f }; + case 3 -> new float[] { 0.90f, 0.30f, 0.60f }; + case 4 -> new float[] { 0.80f, 0.15f, 0.15f }; + case 5 -> new float[] { 0.50f, 0.05f, 0.10f }; + default -> new float[] { 0.20f, 0.02f, 0.15f }; + }; + } + + public static float[] getShellColor(int erosion) { + int tier = ReflectionConstants.getSoulColorTier(erosion); + return switch (tier) { + case 0 -> new float[] { 0.88f, 0.88f, 0.94f }; + case 1 -> new float[] { 0.75f, 0.80f, 0.92f }; + case 2 -> new float[] { 0.60f, 0.55f, 0.80f }; + case 3 -> new float[] { 0.55f, 0.35f, 0.55f }; + case 4 -> new float[] { 0.40f, 0.20f, 0.25f }; + case 5 -> new float[] { 0.25f, 0.12f, 0.15f }; + default -> new float[] { 0.12f, 0.06f, 0.10f }; + }; + } + + public static void setupShader(ShaderInstance shader, int screenWidth, int screenHeight, + float centerX, float centerY, float[] coreColor, float[] shellColor, + float intensity, float radius, float erosion) { + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.setShader(() -> shader); + + if (shader.GAME_TIME != null) shader.GAME_TIME.set(RenderSystem.getShaderGameTime()); + if (shader.SCREEN_SIZE != null) shader.SCREEN_SIZE.set((float) screenWidth, (float) screenHeight); + + setUniform(shader, "Center", centerX, centerY); + setUniform(shader, "CoreColor", coreColor[0], coreColor[1], coreColor[2]); + setUniform(shader, "ShellColor", shellColor[0], shellColor[1], shellColor[2]); + setUniform(shader, "Intensity", intensity); + setUniform(shader, "Radius", radius); + setUniform(shader, "Erosion", erosion); + } + + public static void drawQuad(PoseStack poseStack, int centerX, int centerY, int drawSize, + int screenWidth, int screenHeight) { + int x1 = centerX - drawSize; + int y1 = centerY - drawSize; + int x2 = centerX + drawSize; + int y2 = centerY + drawSize; + + float u1 = (float) x1 / screenWidth; + float v1 = (float) y1 / screenHeight; + float u2 = (float) x2 / screenWidth; + float v2 = (float) y2 / screenHeight; + + Matrix4f matrix = poseStack.last().pose(); + + BufferBuilder buffer = Tesselator.getInstance().begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + buffer.addVertex(matrix, x1, y2, 0).setUv(u1, v2); + buffer.addVertex(matrix, x2, y2, 0).setUv(u2, v2); + buffer.addVertex(matrix, x2, y1, 0).setUv(u2, v1); + buffer.addVertex(matrix, x1, y1, 0).setUv(u1, v1); + BufferUploader.drawWithShader(buffer.buildOrThrow()); + + RenderSystem.disableBlend(); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + } + + public static void setUniform(ShaderInstance shader, String name, float value) { + var uniform = shader.getUniform(name); + if (uniform != null) uniform.set(value); + } + + public static void setUniform(ShaderInstance shader, String name, float x, float y) { + var uniform = shader.getUniform(name); + if (uniform != null) uniform.set(x, y); + } + + public static void setUniform(ShaderInstance shader, String name, float x, float y, float z) { + var uniform = shader.getUniform(name); + if (uniform != null) uniform.set(x, y, z); + } + + private SoulShaderHelper() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/SoulThreadsRenderer.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/SoulThreadsRenderer.java new file mode 100644 index 000000000..92fcc5aa4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/SoulThreadsRenderer.java @@ -0,0 +1,34 @@ +package com.ghostipedia.cosmiccore.client.renderer; + +import com.ghostipedia.cosmiccore.client.CosmicCoreClient; + +import net.minecraft.client.renderer.ShaderInstance; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.vertex.PoseStack; + +@OnlyIn(Dist.CLIENT) +public class SoulThreadsRenderer { + + public static void render(PoseStack poseStack, int centerX, int centerY, int radius, + int erosion, float intensity, int screenWidth, int screenHeight) { + ShaderInstance shader = CosmicCoreClient.getSoulThreadsShader(); + if (shader == null) return; + + float normalizedErosion = SoulShaderHelper.getNormalizedErosion(erosion); + if (normalizedErosion < 0.01f) return; + + float normalizedCenterX = (float) centerX / screenWidth; + float normalizedCenterY = (float) centerY / screenHeight; + float normalizedRadius = (float) radius / Math.min(screenWidth, screenHeight); + + SoulShaderHelper.setupShader(shader, screenWidth, screenHeight, + normalizedCenterX, normalizedCenterY, + SoulShaderHelper.getCoreColor(erosion), SoulShaderHelper.getShellColor(erosion), + intensity, normalizedRadius, normalizedErosion); + + int drawSize = (int) (radius * 3.5f); + SoulShaderHelper.drawQuad(poseStack, centerX, centerY, drawSize, screenWidth, screenHeight); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/StructureBoundingBox.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/StructureBoundingBox.java new file mode 100644 index 000000000..7df07d4fe --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/StructureBoundingBox.java @@ -0,0 +1,159 @@ +package com.ghostipedia.cosmiccore.client.renderer; + +import com.ghostipedia.cosmiccore.api.data.DebugBlockPattern; +import com.ghostipedia.cosmiccore.common.item.behavior.StructureWriteBehavior; + +import com.lowdragmc.lowdraglib.client.utils.RenderBufferUtils; + +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.phys.Vec3; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; +import org.joml.Matrix4f; + +import static com.ghostipedia.cosmiccore.common.item.behavior.StructureWriteBehavior.getDir; + +public class StructureBoundingBox { + + public static void renderStructureSelect(PoseStack poseStack, Camera camera) { + var mc = Minecraft.getInstance(); + var level = mc.level; + var player = mc.player; + if (level == null || player == null) return; + + ItemStack held = player.getMainHandItem(); + if (StructureWriteBehavior.isItemStructureWriter(held)) { + BlockPos[] poses = StructureWriteBehavior.getPos(held); + if (poses == null) return; + Vec3 pos = camera.getPosition(); + + poseStack.pushPose(); + poseStack.translate(-pos.x, -pos.y, -pos.z); + + RenderSystem.disableDepthTest(); + RenderSystem.enableBlend(); + RenderSystem.disableCull(); + RenderSystem.blendFunc( + GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + Tesselator tesselator = Tesselator.getInstance(); + BufferBuilder buffer; + + buffer = tesselator.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_COLOR); + RenderSystem.setShader(GameRenderer::getPositionColorShader); + + RenderBufferUtils.renderCubeFace( + poseStack, + buffer, + poses[0].getX(), + poses[0].getY(), + poses[0].getZ(), + poses[1].getX() + 1, + poses[1].getY() + 1, + poses[1].getZ() + 1, + 0.85f, + 0.85f, + 1f, + 0.25f, + true); + + BufferUploader.drawWithShader(buffer.buildOrThrow()); + + buffer = tesselator.begin(VertexFormat.Mode.LINES, DefaultVertexFormat.POSITION_COLOR_NORMAL); + RenderSystem.setShader(GameRenderer::getRendertypeLinesShader); + RenderSystem.lineWidth(3); + + RenderBufferUtils.drawCubeFrame( + poseStack, + buffer, + poses[0].getX(), + poses[0].getY(), + poses[0].getZ(), + poses[1].getX() + 1, + poses[1].getY() + 1, + poses[1].getZ() + 1, + 1f, + 1f, + 1f, + 0.5f); + + BufferUploader.drawWithShader(buffer.buildOrThrow()); + + buffer = tesselator.begin(VertexFormat.Mode.LINES, DefaultVertexFormat.POSITION_COLOR_NORMAL); + RenderSystem.setShader(GameRenderer::getRendertypeLinesShader); + RenderSystem.lineWidth(12); + + var direction = getDir(player.getMainHandItem()); + var dirs = DebugBlockPattern.getDir(direction); + var cSign = dirs[0].global.getAxis(); + var sSign = dirs[1].global.getAxis(); + var aSign = dirs[2].global.getAxis(); + // I Dislike this + PoseStack.Pose last = poseStack.last(); + Matrix4f mat4 = last.pose(); + // cSign + buffer.addVertex(mat4, poses[0].getX(), poses[0].getY(), poses[0].getZ()).setColor(1f, 0f, 0f, 0.75f) + .setNormal(last, + cSign == Direction.Axis.X ? 1 : 0, + cSign == Direction.Axis.Y ? 1 : 0, + cSign == Direction.Axis.Z ? 1 : 0) + ; + buffer.addVertex(mat4, + cSign == Direction.Axis.X ? poses[0].getX() + 1.5f : poses[0].getX(), + cSign == Direction.Axis.Y ? poses[0].getY() + 1.5f : poses[0].getY(), + cSign == Direction.Axis.Z ? poses[0].getZ() + 1.5f : poses[0].getZ()) + .setColor(1f, 0f, 0f, 0.75f) + .setNormal(last, + cSign == Direction.Axis.X ? 1 : 0, + cSign == Direction.Axis.Y ? 1 : 0, + cSign == Direction.Axis.Z ? 1 : 0) + ; + // sSign + buffer.addVertex(mat4, poses[0].getX(), poses[0].getY(), poses[0].getZ()).setColor(0f, 1f, 0f, 0.75f) + .setNormal(last, + sSign == Direction.Axis.X ? 1 : 0, + sSign == Direction.Axis.Y ? 1 : 0, + sSign == Direction.Axis.Z ? 1 : 0) + ; + buffer.addVertex(mat4, + sSign == Direction.Axis.X ? poses[0].getX() + 1.5f : poses[0].getX(), + sSign == Direction.Axis.Y ? poses[0].getY() + 1.5f : poses[0].getY(), + sSign == Direction.Axis.Z ? poses[0].getZ() + 1.5f : poses[0].getZ()) + .setColor(0f, 1f, 0f, 0.75f) + .setNormal(last, + sSign == Direction.Axis.X ? 1 : 0, + sSign == Direction.Axis.Y ? 1 : 0, + sSign == Direction.Axis.Z ? 1 : 0) + ; + // aSign + buffer.addVertex(mat4, poses[0].getX(), poses[0].getY(), poses[0].getZ()).setColor(0f, 0f, 1f, 0.75f) + .setNormal(last, + aSign == Direction.Axis.X ? 1 : 0, + aSign == Direction.Axis.Y ? 1 : 0, + aSign == Direction.Axis.Z ? 1 : 0) + ; + buffer.addVertex(mat4, + aSign == Direction.Axis.X ? poses[0].getX() + 1.5f : poses[0].getX(), + aSign == Direction.Axis.Y ? poses[0].getY() + 1.5f : poses[0].getY(), + aSign == Direction.Axis.Z ? poses[0].getZ() + 1.5f : poses[0].getZ()) + .setColor(0f, 0f, 1f, 0.75f) + .setNormal(last, + aSign == Direction.Axis.X ? 1 : 0, + aSign == Direction.Axis.Y ? 1 : 0, + aSign == Direction.Axis.Z ? 1 : 0) + ; + BufferUploader.drawWithShader(buffer.buildOrThrow()); + + RenderSystem.enableCull(); + RenderSystem.disableBlend(); + RenderSystem.enableDepthTest(); + poseStack.popPose(); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/block/NebulaeCoilRenderer.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/block/NebulaeCoilRenderer.java new file mode 100644 index 000000000..ee112662f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/block/NebulaeCoilRenderer.java @@ -0,0 +1,87 @@ +package com.ghostipedia.cosmiccore.client.renderer.block; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.client.renderer.CosmicCoreRenderTypes; +import com.ghostipedia.cosmiccore.common.blockentity.CosmicCoilBlockEntity; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; + +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; +import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; +import net.minecraft.client.renderer.texture.OverlayTexture; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import org.jetbrains.annotations.NotNull; +import org.joml.Matrix4f; + +public class NebulaeCoilRenderer implements BlockEntityRenderer { + + public static final ResourceLocation NEBULAE_LOCATION = CosmicCore.id("textures/entity/nebulae.png"); + + // Small offset to prevent Z-fighting with the block model + private static final float OFFSET = 0.001F; + private static final float MIN = OFFSET; + private static final float MAX = 1.0F - OFFSET; + + public NebulaeCoilRenderer(BlockEntityRendererProvider.Context context) {} + + @Override + public void render(CosmicCoilBlockEntity blockEntity, float partialTick, @NotNull PoseStack poseStack, + @NotNull MultiBufferSource buffer, int packedLight, int packedOverlay) { + BlockState state = blockEntity.getBlockState(); + if (!state.getValue(GTBlockStateProperties.ACTIVE)) return; + + poseStack.pushPose(); + PoseStack.Pose last = poseStack.last(); + Matrix4f pose = last.pose(); + + // TODO(cosmiccore-42.14): restore the Oculus/Iris shader-animated nebulae path once Iris is on the 1.21 classpath. + VertexConsumer consumer = buffer.getBuffer(CosmicCoreRenderTypes.nebulae()); + + this.renderFace(blockEntity, pose, consumer, + MIN, MAX, MIN, MAX, MAX, MAX, MAX, MAX, + Direction.SOUTH); + this.renderFace(blockEntity, pose, consumer, + MIN, MAX, MAX, MIN, MIN, MIN, MIN, MIN, + Direction.NORTH); + this.renderFace(blockEntity, pose, consumer, + MAX, MAX, MAX, MIN, MIN, MAX, MAX, MIN, + Direction.EAST); + this.renderFace(blockEntity, pose, consumer, + MIN, MIN, MIN, MAX, MIN, MAX, MAX, MIN, + Direction.WEST); + this.renderFace(blockEntity, pose, consumer, + MIN, MAX, MIN, MIN, MIN, MIN, MAX, MAX, + Direction.DOWN); + this.renderFace(blockEntity, pose, consumer, + MIN, MAX, MAX, MAX, MAX, MAX, MIN, MIN, + Direction.UP); + + poseStack.popPose(); + } + + private void renderFace(BlockEntity blockEntity, Matrix4f pose, VertexConsumer consumer, + float x0, float x1, + float y0, float y1, + float z0, float z1, float z2, float z3, + Direction direction) { + if (Block.shouldRenderFace(blockEntity.getBlockState(), blockEntity.getLevel(), blockEntity.getBlockPos(), + direction, blockEntity.getBlockPos().relative(direction))) { + consumer.addVertex(pose, x0, y0, z0); + consumer.addVertex(pose, x1, y0, z1); + consumer.addVertex(pose, x1, y1, z2); + consumer.addVertex(pose, x0, y1, z3); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/item/CosmicCoreItemRendererProvider.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/item/CosmicCoreItemRendererProvider.java new file mode 100644 index 000000000..3b68b0ba5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/item/CosmicCoreItemRendererProvider.java @@ -0,0 +1,12 @@ +package com.ghostipedia.cosmiccore.client.renderer.item; + +import com.gregtechceu.gtceu.api.item.component.ICustomRenderer; + +import com.lowdragmc.lowdraglib.client.renderer.IItemRendererProvider; + +import net.minecraft.world.item.ItemStack; + +public interface CosmicCoreItemRendererProvider extends IItemRendererProvider { + + ICustomRenderer getRenderInfo(ItemStack itemStack); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/item/HaloItemRenderer.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/item/HaloItemRenderer.java new file mode 100644 index 000000000..ed07ef570 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/item/HaloItemRenderer.java @@ -0,0 +1,170 @@ +package com.ghostipedia.cosmiccore.client.renderer.item; + +import com.ghostipedia.cosmiccore.client.gui.AlphaOverrideVertexConsumer; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTValues; + +import com.lowdragmc.lowdraglib.Platform; +import com.lowdragmc.lowdraglib.client.model.ModelFactory; +import com.lowdragmc.lowdraglib.client.renderer.IRenderer; +import com.lowdragmc.lowdraglib.utils.ColorUtils; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.ItemBlockRenderTypes; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.*; +import org.joml.Matrix4f; + +import java.util.HashSet; +import java.util.Set; +import java.util.function.Consumer; +import java.util.function.Supplier; + +import static com.ghostipedia.cosmiccore.client.renderer.utility.CosmicCoreRenderUtils.bindBlockAtlas; + +public class HaloItemRenderer extends WrappedItemRenderer implements IRenderer { + + private final Set textures = new HashSet<>(); + + int haloSize; + Supplier haloColor; + ResourceLocation haloTexture; + boolean shouldDrawHalo; + boolean shouldDrawPulse; + + public static HaloItemRenderer create(int size, int color, ResourceLocation texture, boolean drawHalo, + boolean drawPulse) { + return create(size, () -> color, texture, drawHalo, drawPulse); + } + + public static HaloItemRenderer create(int size, Supplier color, ResourceLocation texture, boolean drawHalo, + boolean drawPulse) { + return GTCEu.isClientSide() ? new HaloItemRenderer(size, color, texture, drawHalo, drawPulse) : null; + } + + private HaloItemRenderer(int size, Supplier color, ResourceLocation texture, boolean drawHalo, + boolean drawPulse) { + this.haloSize = size; + this.haloColor = color; + this.haloTexture = texture; + this.shouldDrawHalo = drawHalo; + this.shouldDrawPulse = drawPulse; + + if (Platform.isClient()) { + addTexture(haloTexture); + registerEvent(); + } + } + + @OnlyIn(Dist.CLIENT) + public void addTexture(ResourceLocation resourceLocation) { + textures.add(resourceLocation); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void renderItem(ItemStack stack, ItemDisplayContext transformType, boolean leftHand, PoseStack poseStack, + MultiBufferSource buffer, int combinedLight, int combinedOverlay, BakedModel model) { + model = getVanillaModel(stack, null, null); + if (transformType == ItemDisplayContext.GUI) { + Tesselator tess = Tesselator.getInstance(); + BufferBuilder buf; + buf = tess.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.POSITION_TEX); + + poseStack.pushPose(); + RenderSystem.enableBlend(); + RenderSystem.disableDepthTest(); + RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, + GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + + poseStack.translate(-0.5F, -0.5F, -0.5F); + + if (shouldDrawHalo) { + int colour = haloColor.get(); + float r = ColorUtils.red(colour); + float g = ColorUtils.green(colour); + float b = ColorUtils.blue(colour); + float a = ColorUtils.alpha(colour); + + RenderSystem.setShaderColor(r, g, b, a); + RenderSystem.setShader(GameRenderer::getPositionTexShader); + TextureAtlasSprite sprite = ModelFactory.getBlockSprite(haloTexture); + bindBlockAtlas(); + float spread = haloSize / 16F; + float min = 0F - spread; + float max = 1F + spread; + + float minU = sprite.getU0(); + float maxU = sprite.getU1(); + float minV = sprite.getV0(); + float maxV = sprite.getV1(); + + Matrix4f pos = poseStack.last().pose(); + buf.addVertex(pos, max, max, 0).setUv(maxU, minV); + buf.addVertex(pos, min, max, 0).setUv(minU, minV); + buf.addVertex(pos, min, min, 0).setUv(minU, maxV); + buf.addVertex(pos, max, min, 0).setUv(maxU, maxV); + BufferUploader.drawWithShader(buf.buildOrThrow()); + + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + poseStack.popPose(); + } + vanillaRender(stack, transformType, leftHand, poseStack, buffer, combinedLight, combinedOverlay, model); + + if (shouldDrawPulse) { + poseStack.pushPose(); + poseStack.translate(-0.5F, -0.5F, -0.5F); + float scale = GTValues.RNG.nextFloat() * 0.15F + 0.95F; + double trans = (1 - scale) / 2; + poseStack.translate(trans, trans, 0); + poseStack.scale(scale, scale, 1.0001F); + + renderAlpha(stack, transformType, leftHand, poseStack, buffer, combinedLight, combinedOverlay, + model, 0.6F); + + poseStack.popPose(); + } + RenderSystem.enableDepthTest(); + RenderSystem.disableBlend(); + } else { + vanillaRender(stack, transformType, leftHand, poseStack, buffer, combinedLight, combinedOverlay, model); + } + } + + @OnlyIn(Dist.CLIENT) + public static void renderAlpha(ItemStack stack, ItemDisplayContext modelTransformationMode, boolean leftHanded, + PoseStack matrices, MultiBufferSource buffer, int light, int overlay, + BakedModel model, float alphaOverride) { + if (stack.isEmpty()) return; + model.getTransforms().getTransform(modelTransformationMode).apply(leftHanded, matrices); + RenderType renderType = ItemBlockRenderTypes.getRenderType(stack, true); + VertexConsumer vertexConsumer = ItemRenderer.getFoilBufferDirect(buffer, renderType, true, stack.hasFoil()); + + Minecraft.getInstance().getItemRenderer() + .renderModelLists(model, stack, light, overlay, matrices, + new AlphaOverrideVertexConsumer(vertexConsumer, alphaOverride)); + } + + @Override + @OnlyIn(Dist.CLIENT) + public void onPrepareTextureAtlas(ResourceLocation atlasName, Consumer register) { + if (atlasName.equals(InventoryMenu.BLOCK_ATLAS)) { + textures.forEach(register); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/item/LensRender.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/item/LensRender.java new file mode 100644 index 000000000..a18fe34c8 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/item/LensRender.java @@ -0,0 +1,67 @@ +package com.ghostipedia.cosmiccore.client.renderer.item; + +import com.gregtechceu.gtceu.api.GTValues; + +import com.lowdragmc.lowdraglib.client.renderer.IItemRendererProvider; +import com.lowdragmc.lowdraglib.client.renderer.IRenderer; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.ItemModelShaper; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.vertex.PoseStack; + +public class LensRender implements IRenderer { + + public static final LensRender INSTANCE = new LensRender(); + + @Override + @OnlyIn(Dist.CLIENT) + public void renderItem(ItemStack stack, ItemDisplayContext transformType, boolean leftHand, PoseStack poseStack, + MultiBufferSource buffer, int combinedLight, int combinedOverlay, BakedModel model) { + poseStack.pushPose(); + if (transformType == ItemDisplayContext.GUI) { + float scalefactor = GTValues.RNG.nextFloat() * 0.2F + 0.95F; + poseStack.scale(scalefactor, scalefactor, 1F); + } + + vanillaRender(stack, transformType, leftHand, poseStack, buffer, combinedLight, combinedOverlay, model); + poseStack.popPose(); + } + + public static void vanillaRender(ItemStack stack, ItemDisplayContext transformType, boolean leftHand, + PoseStack poseStack, MultiBufferSource buffer, int combinedLight, + int combinedOverlay, BakedModel model) { + IItemRendererProvider.disabled.set(true); + Minecraft.getInstance().getItemRenderer().render(stack, transformType, leftHand, poseStack, buffer, + combinedLight, combinedOverlay, getVanillaModel(stack, null, null)); + IItemRendererProvider.disabled.set(false); + } + + public static ItemRenderer getItemRenderer() { + return Minecraft.getInstance().getItemRenderer(); + } + + public static BakedModel getVanillaModel(ItemStack stack, ClientLevel level, LivingEntity entity) { + ItemModelShaper shaper = getItemRenderer().getItemModelShaper(); + BakedModel model = shaper.getItemModel(stack.getItem()); + if (model != null) { + BakedModel bakedmodel = model.getOverrides().resolve(model, stack, level, entity, 0); + if (bakedmodel != null) return bakedmodel; + } + return shaper.getModelManager().getMissingModel(); + } +} +// TODO ; I hate math, also make this a helper class rather than dumping all the same functions into here every time! +// Avarita Pulse Effect? float scalefactor = (float)(Math.sin((Minecraft.getInstance().getDeltaFrameTime() % 360) / 5.F +// * 180 / Math.PI) + 1)/2.F; +// Rotate poseStack.mulPose(new Quaternionf().fromAxisAngleDeg(0f, 0.75f, 0.12f, (System.currentTimeMillis() / 15) % +// 360)); diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/item/RadianceItemRenderer.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/item/RadianceItemRenderer.java new file mode 100644 index 000000000..48afd2677 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/item/RadianceItemRenderer.java @@ -0,0 +1,67 @@ +package com.ghostipedia.cosmiccore.client.renderer.item; + +import com.lowdragmc.lowdraglib.client.renderer.IItemRendererProvider; +import com.lowdragmc.lowdraglib.client.renderer.IRenderer; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.ItemModelShaper; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.vertex.PoseStack; +import org.joml.Quaternionf; + +public class RadianceItemRenderer implements IRenderer { + + public static final RadianceItemRenderer INSTANCE = new RadianceItemRenderer(); + + @Override + @OnlyIn(Dist.CLIENT) + public void renderItem(ItemStack stack, ItemDisplayContext transformType, boolean leftHand, PoseStack poseStack, + MultiBufferSource buffer, int combinedLight, int combinedOverlay, BakedModel model) { + poseStack.pushPose(); + if (transformType == ItemDisplayContext.GUI) { + poseStack.scale(1.4F, 1.4F, 1F); + poseStack.mulPose( + new Quaternionf().fromAxisAngleDeg(0.0f, 0.0f, 0.3f, (System.currentTimeMillis() / 25) % 360)); + } + + vanillaRender(stack, transformType, leftHand, poseStack, buffer, combinedLight, combinedOverlay, model); + poseStack.popPose(); + } + + public static void vanillaRender(ItemStack stack, ItemDisplayContext transformType, boolean leftHand, + PoseStack poseStack, MultiBufferSource buffer, int combinedLight, + int combinedOverlay, BakedModel model) { + IItemRendererProvider.disabled.set(true); + Minecraft.getInstance().getItemRenderer().render(stack, transformType, leftHand, poseStack, buffer, + combinedLight, combinedOverlay, getVanillaModel(stack, null, null)); + IItemRendererProvider.disabled.set(false); + } + + public static ItemRenderer getItemRenderer() { + return Minecraft.getInstance().getItemRenderer(); + } + + public static BakedModel getVanillaModel(ItemStack stack, ClientLevel level, LivingEntity entity) { + ItemModelShaper shaper = getItemRenderer().getItemModelShaper(); + BakedModel model = shaper.getItemModel(stack.getItem()); + if (model != null) { + BakedModel bakedmodel = model.getOverrides().resolve(model, stack, level, entity, 0); + if (bakedmodel != null) return bakedmodel; + } + return shaper.getModelManager().getMissingModel(); + } +} +// TODO ; I hate math, also make this a helper class rather than dumping all the same functions into here every time! +// Avarita Pulse Effect? float scalefactor = (float)(Math.sin((Minecraft.getInstance().getDeltaFrameTime() % 360) / 5.F +// * 180 / Math.PI) + 1)/2.F; +// Rotate poseStack.mulPose(new Quaternionf().fromAxisAngleDeg(0f, 0.75f, 0.12f, (System.currentTimeMillis() / 15) % +// 360)); diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/item/WrappedItemRenderer.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/item/WrappedItemRenderer.java new file mode 100644 index 000000000..40c958351 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/item/WrappedItemRenderer.java @@ -0,0 +1,46 @@ +package com.ghostipedia.cosmiccore.client.renderer.item; + +import com.lowdragmc.lowdraglib.client.renderer.IItemRendererProvider; +import com.lowdragmc.lowdraglib.client.renderer.IRenderer; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.ItemModelShaper; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.entity.ItemRenderer; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.vertex.PoseStack; + +public abstract class WrappedItemRenderer implements IRenderer { + + @OnlyIn(Dist.CLIENT) + public static void vanillaRender(ItemStack stack, ItemDisplayContext transformType, boolean leftHand, + PoseStack poseStack, MultiBufferSource buffer, int combinedLight, + int combinedOverlay, BakedModel model) { + IItemRendererProvider.disabled.set(true); + Minecraft.getInstance().getItemRenderer().render(stack, transformType, leftHand, poseStack, buffer, + combinedLight, combinedOverlay, model); + IItemRendererProvider.disabled.set(false); + } + + public static ItemRenderer getItemRenderer() { + return Minecraft.getInstance().getItemRenderer(); + } + + @OnlyIn(Dist.CLIENT) + public static BakedModel getVanillaModel(ItemStack stack, ClientLevel level, LivingEntity entity) { + ItemModelShaper shaper = getItemRenderer().getItemModelShaper(); + BakedModel model = shaper.getItemModel(stack.getItem()); + if (model != null) { + BakedModel bakedmodel = model.getOverrides().resolve(model, stack, level, entity, 0); + if (bakedmodel != null) return bakedmodel; + } + return shaper.getModelManager().getMissingModel(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/BioVatRender.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/BioVatRender.java new file mode 100644 index 000000000..4859fc67b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/BioVatRender.java @@ -0,0 +1,222 @@ +package com.ghostipedia.cosmiccore.client.renderer.machine; + +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; +import com.gregtechceu.gtceu.client.util.RenderBufferHelper; +import com.gregtechceu.gtceu.client.util.RenderUtil; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.phys.AABB; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.client.extensions.common.IClientFluidTypeExtensions; +import net.neoforged.neoforge.client.model.data.ModelData; +import net.neoforged.neoforge.fluids.FluidStack; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.serialization.MapCodec; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class BioVatRender extends DynamicRender { + + // spotless:off + public static final BioVatRender INSTANCE = new BioVatRender(); + public static final MapCodec CODEC = MapCodec.unit(INSTANCE); + public static final DynamicRenderType TYPE = new DynamicRenderType<>(BioVatRender.CODEC); + //spotless:on + + private final List RENDER_FACES = List.of(new RelativeDirection[] { + RelativeDirection.FRONT, + RelativeDirection.BACK, + RelativeDirection.LEFT, + RelativeDirection.RIGHT, + RelativeDirection.UP + }); + + private @Nullable Fluid cachedFluid; + private @Nullable ResourceLocation cachedRecipe; + + @Override + public DynamicRenderType getType() { + return TYPE; + } + + @Override + public @NotNull List getRenderQuads(@Nullable WorkableElectricMultiblockMachine machine, + @Nullable BlockAndTintGetter level, @Nullable BlockPos pos, + @Nullable BlockState blockState, @Nullable Direction side, + RandomSource rand, @NotNull ModelData modelData, + @Nullable RenderType renderType) { + return super.getRenderQuads(machine, level, pos, blockState, side, rand, modelData, renderType); + } + + @Override + public boolean shouldRenderOffScreen(WorkableElectricMultiblockMachine machine) { + return true; + } + + @Override + public boolean shouldRender(WorkableElectricMultiblockMachine machine, Vec3 cameraPos) { + return true; + } + + @Override + public int getViewDistance() { + return 256; + } + + @Override + public AABB getRenderBoundingBox(WorkableElectricMultiblockMachine machine) { + return super.getRenderBoundingBox(machine); + } + + @Override + public void render(WorkableElectricMultiblockMachine machine, float partialTick, PoseStack poseStack, + MultiBufferSource buffer, int packedLight, int packedOverlay) { + if (!machine.isFormed()) { + return; + } + + // caches the fluid for use (HEAVILY INSPIRED FROM FLUID RENDERS INSIDE GTCEU + + float totalTick = (Minecraft.getInstance().player.tickCount + partialTick); + + var pose = poseStack.last().pose(); + + GTRecipe lastRecipe = machine.getRecipeLogic().getLastRecipe(); + if (lastRecipe == null) { + cachedRecipe = null; + cachedFluid = null; + } else if (machine.self().getOffsetTimer() % 20 == 0 || lastRecipe.id != cachedRecipe) { + cachedRecipe = lastRecipe.id; + if (machine.isActive()) { + cachedFluid = RenderUtil.getRecipeFluidToRender(lastRecipe); + } else { + cachedFluid = null; + } + } + if (cachedFluid == null) { + return; + } + + poseStack.pushPose(); + + Direction front = machine.getFrontFacing(); + Direction upwards = machine.getUpwardsFacing(); + boolean flipped = machine.isFlipped(); + + Vec3i up = RelativeDirection.UP.getRelative(front, upwards, flipped).getNormal(); + Vec3i back = RelativeDirection.BACK.getRelative(front, upwards, flipped).getNormal(); + Direction.Axis leftAxis = RelativeDirection.LEFT.getRelative(front, upwards, flipped).getAxis(); + + float x0ffset = 0, y0ffset = 0, zOffset = 0; + + for (Direction.Axis axis : Direction.Axis.VALUES) { + int upOffset = up.get(axis); + int backOffset = back.get(axis); + + float offset = upOffset * (1f + (upOffset * 0.5f)) + + backOffset * (2f + (backOffset * 0.5f)); + switch (axis) { + case X -> x0ffset = offset; + case Y -> y0ffset = offset; + case Z -> zOffset = offset; + } + } + + poseStack.translate( + x0ffset + (leftAxis == Direction.Axis.X ? 0.5f : 0.0f), + y0ffset + (leftAxis == Direction.Axis.Y ? 0.5f : 0.0f), + zOffset + (leftAxis == Direction.Axis.Z ? 0.5f : 0.0f)); + + FluidStack fluidStack = new FluidStack(cachedFluid, 1); + var sprite = Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS) + .apply(IClientFluidTypeExtensions.of(cachedFluid).getStillTexture(fluidStack)); + + var flowingSprite = Minecraft.getInstance().getTextureAtlas(TextureAtlas.LOCATION_BLOCKS) + .apply(IClientFluidTypeExtensions.of(cachedFluid).getFlowingTexture(fluidStack)); + VertexConsumer consumer = buffer.getBuffer(Sheets.cutoutBlockSheet()); + + IClientFluidTypeExtensions fluidExt = IClientFluidTypeExtensions.of(cachedFluid); + int color = fluidExt.getTintColor(fluidStack); + + // please + bacVatRender(poseStack, consumer, poseStack.last(), color, LightTexture.FULL_BRIGHT, sprite, flowingSprite); + poseStack.popPose(); + } + + public static void bacVatRender(PoseStack poseStack, VertexConsumer buffer, PoseStack.Pose pose, + int color, int light, + TextureAtlasSprite top, TextureAtlasSprite sides) { + float minX = -1.5f; + float minY = -1f; + float minZ = -1.5f; + float maxX = 1.5f; + float maxY = 1f; + float maxZ = 1.5f; + + for (Direction direction : Direction.values()) { + if (direction == Direction.DOWN) continue; + + TextureAtlasSprite sprite = switch (direction) { + case UP -> top; + case NORTH, EAST, WEST, SOUTH -> sides; + default -> null; + }; + + if (sprite == null) continue; + + float uMin = sprite.getU0(), uMax = sprite.getU1(); + float vMin = sprite.getV0(), vMax = sprite.getV1(); + + switch (direction) { + case UP -> RenderBufferHelper.renderCubeFace(buffer, pose, color, light, Direction.UP, + minX, maxY, minZ, uMin, vMax, + minX, maxY, maxZ, uMax, vMax, + maxX, maxY, maxZ, uMax, vMin, + maxX, maxY, minZ, uMin, vMin); + case NORTH -> RenderBufferHelper.renderCubeFace(buffer, pose, color, light, Direction.NORTH, + minX, minY, minZ, uMin, vMax, + minX, maxY, minZ, uMax, vMax, + maxX, maxY, minZ, uMax, vMin, + maxX, minY, minZ, uMin, vMin); + case SOUTH -> RenderBufferHelper.renderCubeFace(buffer, pose, color, light, Direction.SOUTH, + minX, minY, maxZ, uMin, vMax, + maxX, minY, maxZ, uMax, vMax, + maxX, maxY, maxZ, uMax, vMin, + minX, maxY, maxZ, uMin, vMin); + case WEST -> RenderBufferHelper.renderCubeFace(buffer, pose, color, light, Direction.WEST, + minX, minY, minZ, uMin, vMax, + minX, minY, maxZ, uMax, vMax, + minX, maxY, maxZ, uMax, vMin, + minX, maxY, minZ, uMin, vMin); + case EAST -> RenderBufferHelper.renderCubeFace(buffer, pose, color, light, Direction.EAST, + maxX, minY, minZ, uMin, vMax, + maxX, maxY, minZ, uMax, vMax, + maxX, maxY, maxZ, uMax, vMin, + maxX, minY, maxZ, uMin, vMin); + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/ConceptIncineratorRender.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/ConceptIncineratorRender.java new file mode 100644 index 000000000..a80affed1 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/ConceptIncineratorRender.java @@ -0,0 +1,278 @@ +package com.ghostipedia.cosmiccore.client.renderer.machine; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.VoraxReactorMachine; + +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; +import com.gregtechceu.gtceu.client.util.ModelUtils; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.AABB; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.client.model.data.ModelData; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.serialization.MapCodec; +import org.joml.Quaternionf; + +import java.util.List; + +import static com.ghostipedia.cosmiccore.client.renderer.machine.StarBallastRender.random; + +public class ConceptIncineratorRender extends + DynamicRender { + + public static final ConceptIncineratorRender INSTANCE = new ConceptIncineratorRender(); + public static final MapCodec CODEC = MapCodec.unit(ConceptIncineratorRender.INSTANCE); + public static final DynamicRenderType TYPE = new DynamicRenderType<>( + ConceptIncineratorRender.CODEC); + + public static final ResourceLocation IRIS_MODEL_CORE = CosmicCore.id("block/iris/iris_sphere"); + public static final ResourceLocation IRIS_MODEL_RING = CosmicCore.id("block/iris/iris_ring"); + public static final ResourceLocation IRIS_MODEL_RING_WHITE = CosmicCore.id("block/iris/iris_ring_white"); + public static final ResourceLocation STAR_CORE = CosmicCore.id("block/iris/star_sphere"); + public static final ResourceLocation STAR_CORE_MIDDLE = CosmicCore.id("block/iris/star_sphere_inner"); + public static final ResourceLocation STAR_CORE_OUTER = CosmicCore.id("block/iris/star_sphere_outer"); + + private static BakedModel irisCoreModel = null; + private static BakedModel irisRingModel = null; + private static BakedModel irisSmallRingModel = null; + private static BakedModel irisLowStarModel = null; + private static BakedModel irisMidStarModel = null; + private static BakedModel irisOuterStarModel = null; + + private ConceptIncineratorRender() { + ModelUtils.registerBakeEventListener(true, event -> { + irisCoreModel = event.getModels().get(IRIS_MODEL_CORE); + irisRingModel = event.getModels().get(IRIS_MODEL_RING); + irisSmallRingModel = event.getModels().get(IRIS_MODEL_RING_WHITE); + irisLowStarModel = event.getModels().get(STAR_CORE); + irisMidStarModel = event.getModels().get(STAR_CORE_MIDDLE); + irisOuterStarModel = event.getModels().get(STAR_CORE_OUTER); + }); + } + + @Override + public DynamicRenderType getType() { + return TYPE; + } + + @Override + public void render(WorkableElectricMultiblockMachine machine, float partialTick, PoseStack poseStack, + MultiBufferSource buffer, + int packedLight, int packedOverlay) { + if (!machine.isFormed()) return; + + float totalTick = (Minecraft.getInstance().player.tickCount + partialTick); + + // move the things:tm: to render at the center of the multiblock + Direction front = machine.getFrontFacing(); + Direction upwards = machine.getUpwardsFacing(); + boolean flipped = machine.isFlipped(); + Direction up = RelativeDirection.UP.getRelative(front, upwards, flipped); + Direction back = RelativeDirection.BACK.getRelative(front, upwards, flipped); + Direction.Axis leftAxis = RelativeDirection.LEFT.getRelative(front, upwards, flipped).getAxis(); + + // translate to the absolute center of the multiblock + float x0ffset = 0, y0ffset = 0, z0ffset = 0; + + for (Direction.Axis axis : Direction.Axis.VALUES) { + int upOffset = up.getNormal().get(axis); + int backOffset = back.getNormal().get(axis); + + float offset = upOffset * (4.0f + (upOffset * 0.5f)) + + backOffset * (5.0f + (backOffset * 0.5f)); + switch (axis) { + case X -> x0ffset = offset; + case Y -> y0ffset = offset; + case Z -> z0ffset = offset; + } + } + poseStack.translate( + x0ffset + (leftAxis == Direction.Axis.X ? 0.5f : 0.0f), + y0ffset + (leftAxis == Direction.Axis.Y ? 0.5f : 0.0f), + z0ffset + (leftAxis == Direction.Axis.Z ? 0.5f : 0.0f)); + poseStack.pushPose(); + float percent = 0; + if (machine instanceof VoraxReactorMachine voraxReactorMachine) { + percent = clamp((voraxReactorMachine.getContagionStrength() / 50000f) / 4.5f, 0F, 1F); + } else { + percent = 0; + } + + float scale = heartBeatEffect(0.5f, 1.0f, partialTick, percent); + poseStack.scale(scale, scale, scale); + poseStack.mulPose(new Quaternionf().rotateAxis(totalTick * Mth.TWO_PI / 80, 0, 1, 0)); + VertexConsumer consumer = buffer.getBuffer(Sheets.translucentCullBlockSheet()); + + renderBallA(poseStack, consumer, packedLight, packedOverlay, percent); + + poseStack.scale(scale * -2, scale * -2, scale * -2); + + consumer = buffer.getBuffer(Sheets.cutoutBlockSheet()); + renderBallC(poseStack, consumer, packedLight, packedOverlay, percent); + + poseStack.popPose(); + } + + @Override + public int getViewDistance() { + return 512; + } + + private float bpmFiltered = 50f; + private float beatPhase01 = 0f; + private float percentFiltered = 0f; + private float prevTSec = Float.NaN; + + private static float smoothstep01(float x) { + x = Mth.clamp(x, 0f, 1f); + return x * x * (3f - 2f * x); + } + + float biExp(float x, float center, float rise, float decay) { + if (x < center) return 0f; + float u = x - center; + return (float) (Math.exp(-u / decay) - Math.exp(-u / rise)); + } + + public float heartBeatEffect(float min, float max, float partialTick, float percent) { + float totalTick = (Minecraft.getInstance().player.tickCount + partialTick); + float tSec = totalTick / 20.0f; + + float dt; + if (Float.isNaN(prevTSec)) { + dt = 0f; + } else { + dt = tSec - prevTSec; + if (dt < 0f) dt = 0f; + if (dt > 0.2f) dt = 0.2f; + } + prevTSec = tSec; + + { + float tauP = 0.25f; + float alphaP = 1f - (float) Math.exp(-(dt <= 0f ? 0f : dt) / tauP); + percentFiltered += (percent - percentFiltered) * alphaP; + } + + float eased = smoothstep01(percentFiltered); + float targetBpm = Mth.lerp(eased, 50f, 180f); + + float tauB = 0.35f; + float alphaB = 1f - (float) Math.exp(-(dt <= 0f ? 0f : dt) / tauB); + float bpmSmoothed = bpmFiltered + (targetBpm - bpmFiltered) * alphaB; + + float maxDeltaPerSec = 60f; + float maxStep = maxDeltaPerSec * dt; + float delta = Mth.clamp(bpmSmoothed - bpmFiltered, -maxStep, maxStep); + bpmFiltered += delta; + + float bpm = Mth.clamp(bpmFiltered, 30f, 180f); + float period = 60f / bpm; + + if (dt > 0f) { + beatPhase01 += dt / period; + beatPhase01 -= (int) beatPhase01; + } + + float tInBeat = beatPhase01 * period; + + float c1 = 0.04f, c2 = 0.24f; + + float riseFrac = 0.02f, decayFrac1 = 0.18f, decayFrac2 = 0.20f; + float p1 = biExp(tInBeat, c1 * period, riseFrac * period, decayFrac1 * period); + float p2 = 0.6f * biExp(tInBeat, c2 * period, riseFrac * period, decayFrac2 * period); + + float heartbeat = (p1 + p2) * 1.25f; + heartbeat = Mth.clamp(heartbeat, 0f, 1f); + + return Mth.lerp(heartbeat, min, max); + } + + @Override + public boolean shouldRenderOffScreen(WorkableElectricMultiblockMachine machine) { + return true; + } + + @Override + public AABB getRenderBoundingBox(WorkableElectricMultiblockMachine machine) { + return new AABB(machine.getBlockPos()).inflate(getViewDistance(), 16, getViewDistance()); + } + + @OnlyIn(Dist.CLIENT) + public void renderBallA(PoseStack poseStack, VertexConsumer consumer, int packedLight, int packedOverlay, + float percent) { + PoseStack.Pose pose = poseStack.last(); + List quads = irisCoreModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(pose, quad, 0.016F + (percent / 4), 0.094F, 0.125F, 1, packedLight, packedOverlay); + } + } + + @OnlyIn(Dist.CLIENT) + public void renderBallB(PoseStack poseStack, VertexConsumer consumer, int packedLight, int packedOverlay) { + PoseStack.Pose pose = poseStack.last(); + List quads = irisCoreModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(pose, quad, 0.1f, 0.1f, 0.1f, 1f, packedLight, packedOverlay); + } + } + + @OnlyIn(Dist.CLIENT) + public void renderBallC(PoseStack poseStack, VertexConsumer consumer, int packedLight, int packedOverlay, + float percent) { + PoseStack.Pose pose = poseStack.last(); + List quads = irisCoreModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(pose, quad, 0.2f + percent, 0.2f, 0.7f + -percent, 1, packedLight, packedOverlay); + } + } + + public void renderRing(PoseStack poseStack, VertexConsumer consumer, int packedLight, int packedOverlay) { + poseStack.pushPose(); + poseStack.scale(2.0f, 2.0f, 2.0f); + List quads = irisRingModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(poseStack.last(), quad, 1f, 1f, 1f, 1f, packedLight, packedOverlay); + } + + poseStack.popPose(); + } + + public void renderRingSmall(PoseStack poseStack, VertexConsumer consumer, + float totalTick, int packedLight, int packedOverlay) { + poseStack.pushPose(); + poseStack.translate(2f, 2.0f, 2.0f); + + float min = 0.5f; + float max = 2.0f; + float amplitude = (max - min) / 2.0f; + float offset = min + amplitude; + float scale = (float) Math.sin(totalTick * 0.1f) * amplitude + offset; + poseStack.scale(scale, scale, scale); + poseStack.mulPose(new Quaternionf().rotateAxis(totalTick * Mth.TWO_PI / 20, 0, 1, 0)); + List quads = irisSmallRingModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(poseStack.last(), quad, 1f, 1f, 1f, 1f, packedLight, packedOverlay); + } + + poseStack.popPose(); + } + + public static float clamp(float v, float min, float max) { + return Math.max(min, Math.min(v, max)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/CosmicDynamicRenderHelpers.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/CosmicDynamicRenderHelpers.java new file mode 100644 index 000000000..72853bc16 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/CosmicDynamicRenderHelpers.java @@ -0,0 +1,56 @@ +package com.ghostipedia.cosmiccore.client.renderer.machine; + +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; + +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; + +public class CosmicDynamicRenderHelpers { + + public static DynamicRender getHemophagicTransfuserRender() { + return HemophagicTransfuserRender.INSTANCE; + } + + public static DynamicRender getSpiritCrucibleRender() { + return SpiritCrucibleRender.INSTANCE; + } + + public static DynamicRender getStellarIrisRender() { + return StellarIrisRender.INSTANCE; + } + + public static DynamicRender getConceptIncinerator() { + return ConceptIncineratorRender.INSTANCE; + } + + public static DynamicRender getRenderTesterHelper() { + return RenderTesterHelper.INSTANCE; + } + + public static DynamicRender getStarBallastRender() { + return StarBallastRender.INSTANCE; + } + + public static DynamicRender createHellfireFoundryPartRender() { + return new HellFireFoundryPartRender(CosmicBlocks.HIGHLY_CONDUCTIVE_FISSION_CASING.getDefaultState()); + } + + public static DynamicRender createCryoChamberPartRender() { + return new HellFireFoundryPartRender(CosmicBlocks.CRYOGENIC_CASING.getDefaultState()); + } + + public static DynamicRender getSufferingChamberRenderer() { + return SufferingChamberRenderer.INSTANCE; + } + + public static DynamicRender getWelderArmsRenderer() { + return WelderArmRender.INSTANCE; + } + + public static DynamicRender getBioVatRenderer() { + return BioVatRender.INSTANCE; + } + + public static DynamicRender getStarLadderRender() { + return StarLadderRender.INSTANCE; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/HellFireFoundryPartRender.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/HellFireFoundryPartRender.java new file mode 100644 index 000000000..6cd633b99 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/HellFireFoundryPartRender.java @@ -0,0 +1,100 @@ +package com.ghostipedia.cosmiccore.client.renderer.machine; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.part.SoulHatchPartMachine; + +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.client.model.machine.IControllerModelRenderer; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; +import com.gregtechceu.gtceu.client.util.ModelUtils; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.BlockModelShaper; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.client.model.data.ModelData; + +import com.klikli_dev.occultism.registry.OccultismBlocks; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class HellFireFoundryPartRender extends + DynamicRender + implements IControllerModelRenderer { + + // spotless:off + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + BlockState.CODEC.fieldOf("casing_block").forGetter(HellFireFoundryPartRender::getCasing) + ).apply(instance, HellFireFoundryPartRender::new)); + public static final DynamicRenderType TYPE = new DynamicRenderType<>(CODEC); + // spotless:on + + private final BlockState iesniumBlock; + private final BlockState casing; + private BakedModel iesniumBlockModel; + private BakedModel casingModel; + + public BlockState getCasing() { + return casing; + } + + public HellFireFoundryPartRender(BlockState casing) { + this.iesniumBlock = OccultismBlocks.IESNIUM_BLOCK.get().defaultBlockState(); + this.casing = casing; + ModelUtils.registerBakeEventListener(true, event -> { + this.iesniumBlockModel = event.getModels().get(BlockModelShaper.stateToModelLocation(this.iesniumBlock)); + this.casingModel = event.getModels().get(BlockModelShaper.stateToModelLocation(this.casing)); + }); + } + + @Override + public DynamicRenderType getType() { + return TYPE; + } + + @Override + public void renderPartModel(List quads, MultiblockControllerMachine controller, + IMultiPart part, Direction frontFacing, @Nullable Direction side, + RandomSource rand, ModelData modelData, @Nullable RenderType renderType) { + BlockPos partPos = part.self().getBlockPos(); + MultiblockControllerMachine machine = controller; + BakedModel model = part instanceof SoulHatchPartMachine ? iesniumBlockModel : casingModel; + emitQuads(quads, model, machine.getLevel(), partPos, casing, side, rand, modelData, renderType); + } + + private static void emitQuads(List quads, @Nullable BakedModel model, + BlockAndTintGetter level, BlockPos pos, BlockState state, + @Nullable Direction side, RandomSource rand, + ModelData modelData, @Nullable RenderType renderType) { + if (model == null) return; + modelData = model.getModelData(level, pos, state, modelData); + quads.addAll(model.getQuads(state, side, rand, modelData, renderType)); + } + + @Override + public void render(WorkableElectricMultiblockMachine machine, float partialTick, PoseStack poseStack, + MultiBufferSource buffer, int packedLight, int packedOverlay) {} + + @Override + public boolean shouldRender(WorkableElectricMultiblockMachine machine, Vec3 cameraPos) { + return false; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/HemophagicTransfuserRender.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/HemophagicTransfuserRender.java new file mode 100644 index 000000000..53256d429 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/HemophagicTransfuserRender.java @@ -0,0 +1,204 @@ +package com.ghostipedia.cosmiccore.client.renderer.machine; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; +import com.gregtechceu.gtceu.client.util.ModelUtils; +import com.gregtechceu.gtceu.client.util.RenderBufferHelper; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.Util; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.AABB; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.serialization.MapCodec; +import org.joml.Quaternionf; + +import java.util.function.BiFunction; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class HemophagicTransfuserRender extends + DynamicRender { + + public static final HemophagicTransfuserRender INSTANCE = new HemophagicTransfuserRender(); + public static final MapCodec CODEC = MapCodec.unit(INSTANCE); + public static final DynamicRenderType TYPE = new DynamicRenderType<>( + HemophagicTransfuserRender.CODEC); + + private static final BiFunction renderBoundCache = Util.memoize((front, upwards) -> { + Direction up = RelativeDirection.UP.getRelative(front, upwards, false); + Direction back = RelativeDirection.BACK.getRelative(front, upwards, false); + Direction left = RelativeDirection.LEFT.getRelative(front, upwards, false); + + // offset from the controller to the inner cube (scaled up by 1 in all directions) + // values are from the multi pattern + BlockPos.MutableBlockPos minPos = new BlockPos.MutableBlockPos() + .move(left, 3).move(up, 1).move(back, 2); + BlockPos.MutableBlockPos maxPos = new BlockPos.MutableBlockPos() + .move(left, -3).move(up, 7).move(back, 8); + + return AABB.encapsulatingFullBlocks(minPos, maxPos); + }); + + public static final ResourceLocation BLOOD_CUBE_TEXTURE = CosmicCore.id("block/iris/blood_cube"); + + private static TextureAtlasSprite bloodCubeSprite = null; + private static boolean isEventListenerRegistered = false; + + @SuppressWarnings("deprecation") + private HemophagicTransfuserRender() { + if (!isEventListenerRegistered) { + ModelUtils.registerAtlasStitchedEventListener(true, TextureAtlas.LOCATION_BLOCKS, event -> { + bloodCubeSprite = event.getAtlas().getSprite(BLOOD_CUBE_TEXTURE); + }); + isEventListenerRegistered = true; + } + } + + @Override + public DynamicRenderType getType() { + return TYPE; + } + + @Override + public int getViewDistance() { + return 256; + } + + @Override + public AABB getRenderBoundingBox(WorkableElectricMultiblockMachine multi) { + if (multi.isFormed()) { + AABB bounds = renderBoundCache.apply(multi.getFrontFacing(), multi.getUpwardsFacing()); + return bounds.move(multi.getBlockPos()); + } + return super.getRenderBoundingBox(multi); + } + + @Override + public boolean shouldRenderOffScreen(WorkableElectricMultiblockMachine machine) { + return true; + } + + @Override + public void render(WorkableElectricMultiblockMachine machine, float partialTick, PoseStack poseStack, + MultiBufferSource buffer, int packedLight, int packedOverlay) { + if (!machine.isFormed()) { + return; + } + float totalTick = (Minecraft.getInstance().player.tickCount + partialTick); + + poseStack.pushPose(); + + // move the things:tm: to render at the center of the multiblock + Direction front = machine.getFrontFacing(); + Direction upwards = machine.getUpwardsFacing(); + boolean flipped = machine.isFlipped(); + Direction up = RelativeDirection.UP.getRelative(front, upwards, flipped); + Direction back = RelativeDirection.BACK.getRelative(front, upwards, flipped); + Direction.Axis leftAxis = RelativeDirection.LEFT.getRelative(front, upwards, flipped).getAxis(); + + // translate to the absolute center of the multiblock + float x0ffset = 0, y0ffset = 0, z0ffset = 0; + + for (Direction.Axis axis : Direction.Axis.VALUES) { + int upOffset = up.getNormal().get(axis); + int backOffset = back.getNormal().get(axis); + + float offset = upOffset * (4.0f + (upOffset * 0.5f)) + + backOffset * (5.0f + (backOffset * 0.5f)); + switch (axis) { + case X -> x0ffset = offset; + case Y -> y0ffset = offset; + case Z -> z0ffset = offset; + } + } + poseStack.translate( + x0ffset + (leftAxis == Direction.Axis.X ? 0.5f : 0.0f), + y0ffset + (leftAxis == Direction.Axis.Y ? 0.5f : 0.0f), + z0ffset + (leftAxis == Direction.Axis.Z ? 0.5f : 0.0f)); + + renderBloodCube(poseStack, buffer, totalTick); + + if (machine.isActive()) { + renderRings(up.getAxis(), totalTick, poseStack, buffer); + } + + poseStack.popPose(); + } + + @OnlyIn(Dist.CLIENT) + public void renderBloodCube(PoseStack poseStack, MultiBufferSource bufferSource, float totalTick) { + poseStack.pushPose(); + // rotate around center + Quaternionf rot = new Quaternionf() + .rotateXYZ(Mth.sin(totalTick / 20), + Mth.sin(totalTick / 30), + Mth.cos(Mth.HALF_PI + totalTick / 60)) + .rotateXYZ(55f * Mth.DEG_TO_RAD, 30f * Mth.DEG_TO_RAD, 0); + poseStack.mulPose(rot); + + // draw cube quads + var consumer = bufferSource.getBuffer(Sheets.translucentCullBlockSheet()); + RenderBufferHelper.renderCube(consumer, poseStack.last(), 0xffffffff, + LightTexture.FULL_BRIGHT, bloodCubeSprite, + -1, -1, -1, 1, 1, 1); + + poseStack.popPose(); + } + + @OnlyIn(Dist.CLIENT) + private void renderRings(Direction.Axis upAxis, float totalTick, PoseStack poseStack, MultiBufferSource buffer) { + VertexConsumer consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + + float xRot = totalTick / 20; + float zRot = Mth.HALF_PI + totalTick / 60; + float yRot = totalTick / 30; + float sinX = Mth.sin(xRot), cosX = Mth.cos(xRot); + float sinY = Mth.sin(yRot), cosY = Mth.cos(yRot); + float sinZ = Mth.sin(zRot), cosZ = Mth.cos(zRot); + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateXYZ(sinX, cosY, sinZ)); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 2f, 0.1F, 10, 36, + 0.5F, 0, 0, 1, upAxis); + poseStack.popPose(); + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateXYZ(cosX, sinY, sinZ)); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 1.8f, 0.1F, 10, 36, + 0.4F, 0f, 0, 1, upAxis); + poseStack.popPose(); + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateZ(cosZ)); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 1.6f, 0.1F, 10, 36, + 0.6F, 0, 0, 1, upAxis); + poseStack.popPose(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/RenderTesterHelper.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/RenderTesterHelper.java new file mode 100644 index 000000000..c3a585dbb --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/RenderTesterHelper.java @@ -0,0 +1,470 @@ +package com.ghostipedia.cosmiccore.client.renderer.machine; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; +import com.gregtechceu.gtceu.client.util.ModelUtils; +import com.gregtechceu.gtceu.client.util.RenderBufferHelper; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.Util; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.AABB; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.serialization.MapCodec; +import org.jetbrains.annotations.NotNull; +import org.joml.Matrix4f; +import org.joml.Quaternionf; + +import java.util.HashSet; +import java.util.function.BiFunction; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class RenderTesterHelper extends + DynamicRender { + + public static final RenderTesterHelper INSTANCE = new RenderTesterHelper(); + public static final MapCodec CODEC = MapCodec.unit(INSTANCE); + public static final DynamicRenderType TYPE = new DynamicRenderType<>( + RenderTesterHelper.CODEC); + + private static final BiFunction renderBoundCache = Util.memoize((front, upwards) -> { + Direction up = RelativeDirection.UP.getRelative(front, upwards, false); + Direction back = RelativeDirection.BACK.getRelative(front, upwards, false); + Direction left = RelativeDirection.LEFT.getRelative(front, upwards, false); + + // offset from the controller to the inner cube (scaled up by 1 in all directions) + // values are from the multi pattern + BlockPos.MutableBlockPos minPos = new BlockPos.MutableBlockPos() + .move(left, 3).move(up, 1).move(back, 2); + BlockPos.MutableBlockPos maxPos = new BlockPos.MutableBlockPos() + .move(left, -3).move(up, 7).move(back, 8); + + return AABB.encapsulatingFullBlocks(minPos, maxPos); + }); + + public static final ResourceLocation BLOOD_CUBE_TEXTURE = CosmicCore.id("block/iris/blood_cube"); + + private static TextureAtlasSprite bloodCubeSprite = null; + private static boolean isEventListenerRegistered = false; + + @SuppressWarnings("deprecation") + private RenderTesterHelper() { + if (!isEventListenerRegistered) { + ModelUtils.registerAtlasStitchedEventListener(true, TextureAtlas.LOCATION_BLOCKS, event -> { + bloodCubeSprite = event.getAtlas().getSprite(BLOOD_CUBE_TEXTURE); + }); + isEventListenerRegistered = true; + } + } + + @Override + public DynamicRenderType getType() { + return TYPE; + } + + @Override + public int getViewDistance() { + return 256; + } + + @Override + public AABB getRenderBoundingBox(WorkableElectricMultiblockMachine multi) { + return new AABB(multi.getBlockPos()).inflate(getViewDistance(), 16, getViewDistance()); + } + + @Override + public boolean shouldRenderOffScreen(WorkableElectricMultiblockMachine machine) { + return true; + } + + @Override + public void render(WorkableElectricMultiblockMachine machine, float partialTick, PoseStack poseStack, + MultiBufferSource buffer, int packedLight, int packedOverlay) { + if (!machine.isFormed()) { + return; + } + float totalTick = (Minecraft.getInstance().player.tickCount + partialTick); + + poseStack.pushPose(); + + // move the things:tm: to render at the center of the multiblock + Direction front = machine.getFrontFacing(); + Direction upwards = machine.getUpwardsFacing(); + boolean flipped = machine.isFlipped(); + Direction up = RelativeDirection.UP.getRelative(front, upwards, flipped); + Direction back = RelativeDirection.BACK.getRelative(front, upwards, flipped); + Direction.Axis leftAxis = RelativeDirection.LEFT.getRelative(front, upwards, flipped).getAxis(); + + float x0ffset = 0, y0ffset = 2.5f, z0ffset = 0; + + if (front.getAxis() == Direction.Axis.X) { + if (front.getAxisDirection() == Direction.AxisDirection.POSITIVE) { + x0ffset = -6.5f; + z0ffset = 0.5f; + } else { + x0ffset = 7.5f; + z0ffset = 0.5f; + } + } + + if (front.getAxis() == Direction.Axis.Z) { + if (front.getAxisDirection() == Direction.AxisDirection.POSITIVE) { + z0ffset = -7.5f; + x0ffset = 0.5f; + } else { + z0ffset = 7.5f; + x0ffset = 0.5f; + } + } + poseStack.translate(x0ffset, y0ffset, z0ffset); + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateAxis(totalTick * Mth.TWO_PI / 160f, 0, 1, 0)); + float radius = 2.0f; + float height = 15.0f; + int sides = 48; + int segments = 4; + float r = 0.85f, g = 0.9f, b = 1.0f, a = 1f; + + VertexConsumer consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + Matrix4f mat = poseStack.last().pose(); + + float dA = Mth.TWO_PI / sides; + float dh = height / segments; + float halfH = height * 0.5f; + + poseStack.popPose(); + poseStack.translate(0, 10, 0); + Quaternionf rot = new Quaternionf() + .rotateXYZ(Mth.sin(totalTick / 20), + Mth.sin(totalTick / 30), + Mth.cos(Mth.HALF_PI + totalTick / 60)) + .rotateXYZ(55f * Mth.DEG_TO_RAD, 30f * Mth.DEG_TO_RAD, 0); + poseStack.mulPose(rot); + renderWireDodecahedronThick( + poseStack, buffer, + 1.0f, + 0.12f, + 0.4f, 0.9f, 1.0f, 0.85f); + consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + + Quaternionf frot = new Quaternionf() + .rotateXYZ(Mth.sin(totalTick / 30), + Mth.sin(totalTick / 60), + Mth.cos(Mth.HALF_PI + totalTick / 40)) + .rotateXYZ(55f * Mth.DEG_TO_RAD, 30f * Mth.DEG_TO_RAD, 0); + poseStack.mulPose(frot); + renderSolidSphere(poseStack, buffer, + 0f, 0f, 0f, + 1.5f, + 48, 24, + /* r,g,b,a */ 0.2f, 0.3f, 1.0f, 1f); + renderWireDodecahedronThick( + poseStack, buffer, + 1.5f, + 0.12f, + 0.4f, 0.9f, 1.0f, 0.85f); + poseStack.popPose(); + } + + private static void renderWireDodecahedron(PoseStack poseStack, MultiBufferSource buffer, + float scale, int sidesColorRGBA, float alpha) { + float r = ((sidesColorRGBA >> 16) & 0xFF) / 255f; + float g = ((sidesColorRGBA >> 8) & 0xFF) / 255f; + float b = ((sidesColorRGBA) & 0xFF) / 255f; + + final float phi = (1f + (float) Math.sqrt(5.0)) * 0.5f; + final float inv = 1f / phi; + + // build vertex list! Wahoo! + final float[][] V = new float[20][3]; + int idx = 0; + for (int sx = -1; sx <= 1; sx += 2) + for (int sy = -1; sy <= 1; sy += 2) + for (int sz = -1; sz <= 1; sz += 2) + V[idx++] = new float[] { sx, sy, sz }; + + for (int s1 = -1; s1 <= 1; s1 += 2) + for (int s2 = -1; s2 <= 1; s2 += 2) { + V[idx++] = new float[] { 0f, s1 * inv, s2 * phi }; + V[idx++] = new float[] { s1 * inv, s2 * phi, 0f }; + V[idx++] = new float[] { s1 * phi, 0f, s2 * inv }; + } + + for (int i = 0; i < 20; i++) { + V[i][0] *= scale; + V[i][1] *= scale; + V[i][2] *= scale; + } + + float edge2 = Float.POSITIVE_INFINITY; + for (int i = 0; i < 20; i++) + for (int j = i + 1; j < 20; j++) { + float dx = V[i][0] - V[j][0], dy = V[i][1] - V[j][1], dz = V[i][2] - V[j][2]; + float d2 = dx * dx + dy * dy + dz * dz; + if (d2 > 1e-6f && d2 < edge2) edge2 = d2; + } + final float eps = edge2 * 1.0015f; + + PoseStack.Pose pose = poseStack.last(); + Matrix4f mat = pose.pose(); + VertexConsumer vc = buffer.getBuffer(net.minecraft.client.renderer.RenderType.lines()); + + for (int i = 0; i < 20; i++) + for (int j = i + 1; j < 20; j++) { + float dx = V[i][0] - V[j][0], dy = V[i][1] - V[j][1], dz = V[i][2] - V[j][2]; + float d2 = dx * dx + dy * dy + dz * dz; + if (d2 <= eps) { + float len = (float) Math.sqrt(d2); + float nx = dx / len, ny = dy / len, nz = dz / len; + + vc.addVertex(mat, V[i][0], V[i][1], V[i][2]) + .setColor(r, g, b, alpha).setNormal(pose, nx, ny, nz); + vc.addVertex(mat, V[j][0], V[j][1], V[j][2]) + .setColor(r, g, b, alpha).setNormal(pose, nx, ny, nz); + } + } + } + + private static void renderWireDodecahedronThick(PoseStack poseStack, MultiBufferSource buffer, + float scale, float thickness, + float r, float g, float b, float a) { + final float phi = (1f + (float) Math.sqrt(5.0)) * 0.5f; + final float inv = 1f / phi; + + final float[][] V = new float[20][3]; + int idx = 0; + for (int sx = -1; sx <= 1; sx += 2) + for (int sy = -1; sy <= 1; sy += 2) + for (int sz = -1; sz <= 1; sz += 2) + V[idx++] = new float[] { sx, sy, sz }; + + for (int s1 = -1; s1 <= 1; s1 += 2) + for (int s2 = -1; s2 <= 1; s2 += 2) { + V[idx++] = new float[] { 0f, s1 * inv, s2 * phi }; + V[idx++] = new float[] { s1 * inv, s2 * phi, 0f }; + V[idx++] = new float[] { s1 * phi, 0f, s2 * inv }; + } + + for (int i = 0; i < 20; i++) { + V[i][0] *= scale; + V[i][1] *= scale; + V[i][2] *= scale; + } + + HashSet edges = new java.util.HashSet<>(64); + for (int i = 0; i < 20; i++) { + int[] ns = getInts(V, i); + for (int j : ns) { + int low = Math.min(i, j); + int high = Math.max(i, j); + long key = ((long) low << 32) | (high & 0xFFFFFFFFL); + edges.add(key); + } + } + VertexConsumer vertexConsumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + final Matrix4f mat = poseStack.last().pose(); + + var cam = Minecraft.getInstance().gameRenderer.getMainCamera(); + var v3 = cam.getLookVector(); + float vx = (float) v3.x, vy = (float) v3.y, vz = (float) v3.z; + float vlen = (float) Math.sqrt(vx * vx + vy * vy + vz * vz); + if (vlen > 0f) { + vx /= vlen; + vy /= vlen; + vz /= vlen; + } + + final float EPS = 1e-6f; + for (long key : edges) { + vertexConsumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + int i0 = (int) (key >>> 32); + int i1 = (int) (key & 0xFFFFFFFFL); + + float x0 = V[i0][0], y0 = V[i0][1], z0 = V[i0][2]; + float x1 = V[i1][0], y1 = V[i1][1], z1 = V[i1][2]; + + float dx = x1 - x0, dy = y1 - y0, dz = z1 - z0; + float L2 = dx * dx + dy * dy + dz * dz; + if (L2 < EPS) continue; + float L = (float) Math.sqrt(L2); + float ex = dx / L, ey = dy / L, ez = dz / L; + float nx = ey * vz - ez * vy; + float ny = ez * vx - ex * vz; + float nz = ex * vy - ey * vx; + float n2 = nx * nx + ny * ny + nz * nz; + if (n2 < EPS) { + float upx = 0f, upy = 1f, upz = 0f; + nx = ey * upz - ez * upy; + ny = ez * upx - ex * upz; + nz = ex * upy - ey * upx; + n2 = nx * nx + ny * ny + nz * nz; + if (n2 < EPS) { + nx = 1f; + ny = 0f; + nz = 0f; + n2 = 1f; + } + } + float s = (0.5f * thickness) / (float) Math.sqrt(n2); + float ox = nx * s, oy = ny * s, oz = nz * s; + float ax = x0 - ox, ay = y0 - oy, az = z0 - oz; + float bx = x0 + ox, by = y0 + oy, bz = z0 + oz; + float cx = x1 + ox, cy = y1 + oy, cz = z1 + oz; + float dxq = x1 - ox, dyq = y1 - oy, dzq = z1 - oz; + + // Tri 1: A,B,C + vertexConsumer.addVertex(mat, ax, ay, az).setColor(r, g, b, a); + vertexConsumer.addVertex(mat, bx, by, bz).setColor(r, g, b, a); + vertexConsumer.addVertex(mat, cx, cy, cz).setColor(r, g, b, a); + + // Tri 2: A,C,D + vertexConsumer.addVertex(mat, ax, ay, az).setColor(r, g, b, a); + vertexConsumer.addVertex(mat, cx, cy, cz).setColor(r, g, b, a); + vertexConsumer.addVertex(mat, dxq, dyq, dzq).setColor(r, g, b, a); + } + } + + private static int @NotNull [] getInts(float[][] V, int i) { + int n1 = -1, n2 = -1, n3 = -1; + float d1 = Float.POSITIVE_INFINITY, d2 = Float.POSITIVE_INFINITY, d3 = Float.POSITIVE_INFINITY; + + float xi = V[i][0], yi = V[i][1], zi = V[i][2]; + for (int j = 0; j < 20; j++) if (j != i) { + float dx = xi - V[j][0], dy = yi - V[j][1], dz = zi - V[j][2]; + float d = dx * dx + dy * dy + dz * dz; + if (d < d1) { + d3 = d2; + n3 = n2; + d2 = d1; + n2 = n1; + d1 = d; + n1 = j; + } else if (d < d2) { + d3 = d2; + n3 = n2; + d2 = d; + n2 = j; + } else if (d < d3) { + d3 = d; + n3 = j; + } + } + int[] ns = { n1, n2, n3 }; + return ns; + } + + public static void renderSolidSphere(PoseStack poseStack, MultiBufferSource buffer, + float cx, float cy, float cz, + float radius, int slices, int stacks, + float r, float g, float b, float a) { + Matrix4f mat = poseStack.last().pose(); + VertexConsumer vc = buffer.getBuffer(GTRenderTypes.getLightRing()); + + float dPhi = (float) (Mth.TWO_PI / Math.max(3, slices)); + float dTheta = (float) (Math.PI / Math.max(2, stacks)); + + for (int i = 0; i < stacks; i++) { + float th0 = i * dTheta; + float th1 = (i + 1) * dTheta; + float sin0 = Mth.sin(th0), cos0 = Mth.cos(th0); + float sin1 = Mth.sin(th1), cos1 = Mth.cos(th1); + + // one triangle strip per latitude band; <= closes seam + for (int j = 0; j <= slices; j++) { + float ph = j * dPhi; + float cosp = Mth.cos(ph), sinp = Mth.sin(ph); + + // band top (th0) + float x0 = cx + radius * sin0 * cosp; + float y0 = cy + radius * cos0; + float z0 = cz + radius * sin0 * sinp; + + // band bottom (th1) + float x1 = cx + radius * sin1 * cosp; + float y1 = cy + radius * cos1; + float z1 = cz + radius * sin1 * sinp; + + // order chosen for typical backface cull; swap if it looks inside-out + vc.addVertex(mat, x0, y0, z0).setColor(r, g, b, a); + vc.addVertex(mat, x1, y1, z1).setColor(r, g, b, a); + } + } + } + + @OnlyIn(Dist.CLIENT) + public void renderBloodCube(PoseStack poseStack, MultiBufferSource bufferSource, float totalTick) { + poseStack.pushPose(); + // rotate around center + Quaternionf rot = new Quaternionf() + .rotateXYZ(Mth.sin(totalTick / 20), + Mth.sin(totalTick / 30), + Mth.cos(Mth.HALF_PI + totalTick / 60)) + .rotateXYZ(55f * Mth.DEG_TO_RAD, 30f * Mth.DEG_TO_RAD, 0); + poseStack.mulPose(rot); + + // draw cube quads + var consumer = bufferSource.getBuffer(Sheets.translucentCullBlockSheet()); + RenderBufferHelper.renderCube(consumer, poseStack.last(), 0xffffffff, + LightTexture.FULL_BRIGHT, bloodCubeSprite, + -1, -1, -1, 1, 1, 1); + + poseStack.popPose(); + } + + @OnlyIn(Dist.CLIENT) + private void renderRings(Direction.Axis upAxis, float totalTick, PoseStack poseStack, MultiBufferSource buffer) { + VertexConsumer consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + + float xRot = totalTick / 20; + float zRot = Mth.HALF_PI + totalTick / 60; + float yRot = totalTick / 30; + float sinX = Mth.sin(xRot), cosX = Mth.cos(xRot); + float sinY = Mth.sin(yRot), cosY = Mth.cos(yRot); + float sinZ = Mth.sin(zRot), cosZ = Mth.cos(zRot); + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateXYZ(sinX, cosY, sinZ)); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 2f, 0.1F, 10, 36, + 0.5F, 0, 0, 1, upAxis); + poseStack.popPose(); + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateXYZ(cosX, sinY, sinZ)); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 1.8f, 0.1F, 10, 36, + 0.4F, 0f, 0, 1, upAxis); + poseStack.popPose(); + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateZ(cosZ)); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 1.6f, 0.1F, 10, 36, + 0.6F, 0, 0, 1, upAxis); + poseStack.popPose(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/SpiritCrucibleRender.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/SpiritCrucibleRender.java new file mode 100644 index 000000000..1e23647c2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/SpiritCrucibleRender.java @@ -0,0 +1,245 @@ +package com.ghostipedia.cosmiccore.client.renderer.machine; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; +import com.gregtechceu.gtceu.client.util.ModelUtils; +import com.gregtechceu.gtceu.client.util.RenderBufferHelper; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.AABB; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.client.model.data.ModelData; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.serialization.MapCodec; +import org.joml.Quaternionf; + +import java.util.EnumSet; +import java.util.List; + +import static com.ghostipedia.cosmiccore.client.renderer.machine.StarBallastRender.random; + +public class SpiritCrucibleRender extends DynamicRender { + + public static final SpiritCrucibleRender INSTANCE = new SpiritCrucibleRender(); + public static final MapCodec CODEC = MapCodec.unit(SpiritCrucibleRender.INSTANCE); + public static final DynamicRenderType TYPE = new DynamicRenderType<>( + SpiritCrucibleRender.CODEC); + + @Override + public DynamicRenderType getType() { + return TYPE; + } + + public static final ResourceLocation IRIS_MODEL_CORE = CosmicCore.id("block/iris/iris_sphere"); + private static BakedModel irisCoreModel = null; + + public static final ResourceLocation VOID_SWIRL = CosmicCore.id("block/iris/void_swirl"); + private static TextureAtlasSprite swirlSprite = null; + + public static final ResourceLocation VOID_BLANK = CosmicCore.id("block/iris/the_hole"); + private static TextureAtlasSprite blankVoidSprite = null; + + private SpiritCrucibleRender() { + ModelUtils.registerBakeEventListener(true, event -> { + irisCoreModel = event.getModels().get(IRIS_MODEL_CORE); + + }); + ModelUtils.registerAtlasStitchedEventListener(true, TextureAtlas.LOCATION_BLOCKS, event -> { + swirlSprite = event.getAtlas().getSprite(VOID_SWIRL); + blankVoidSprite = event.getAtlas().getSprite(VOID_BLANK); + }); + } + + @Override + public void render(WorkableElectricMultiblockMachine machine, float partialTick, PoseStack poseStack, + MultiBufferSource buffer, int packedLight, int packedOverlay) { + if (!machine.isFormed()) { + return; + } + float totalTick = (Minecraft.getInstance().player.tickCount + partialTick); + VertexConsumer consumer = buffer.getBuffer(Sheets.translucentCullBlockSheet()); + // move the things:tm: to render at the center of the multiblock + Direction front = machine.getFrontFacing(); + Direction upwards = machine.getUpwardsFacing(); + boolean flipped = machine.isFlipped(); + Direction up = RelativeDirection.UP.getRelative(front, upwards, flipped); + Direction back = RelativeDirection.BACK.getRelative(front, upwards, flipped); + Direction.Axis leftAxis = RelativeDirection.LEFT.getRelative(front, upwards, flipped).getAxis(); + + // translate to the absolute center of the multiblock + float x0ffset = 0, y0ffset = 0, z0ffset = 0; + + for (Direction.Axis axis : Direction.Axis.VALUES) { + int upOffset = up.getNormal().get(axis); + int backOffset = back.getNormal().get(axis); + + float offset = upOffset * (8.0f + (upOffset * 0.5f)) + + backOffset * (4.0f + (backOffset * 0.5f)); + switch (axis) { + case X -> x0ffset = offset; + case Y -> y0ffset = offset; + case Z -> z0ffset = offset; + } + } + poseStack.translate( + x0ffset + (leftAxis == Direction.Axis.X ? 0.5f : 0.0f), + y0ffset + (leftAxis == Direction.Axis.Y ? 0.5f : 0.0f), + z0ffset + (leftAxis == Direction.Axis.Z ? 0.5f : 0.0f)); + poseStack.pushPose(); + + renderRings(up.getAxis(), totalTick, poseStack, buffer); + renderSwirl(machine, partialTick, poseStack, buffer, packedLight, packedOverlay); + poseStack.popPose(); + + poseStack.pushPose(); + poseStack.translate(0, -6, 0); + Quaternionf rot = new Quaternionf() + .rotateY(totalTick / -2); + poseStack.mulPose(rot); + poseStack.popPose(); + + float min = 0.5f; + float max = 1.0f; + float amplitude = (max - min) / 2.0f; + float offset = min + amplitude; + float scale = (float) Math.sin(totalTick * 0.1f) * amplitude + offset; + poseStack.scale(scale, scale, scale); + poseStack.mulPose(new Quaternionf().rotateAxis(totalTick * Mth.TWO_PI / 80, 0, 1, 0)); + poseStack.pushPose(); + renderBallA(poseStack, consumer, packedLight, packedOverlay); + poseStack.popPose(); + + max = 0.7f; + amplitude = (max - min) / 2.0f; + offset = min + amplitude; + scale = (float) Math.sin(totalTick * 0.1f) * amplitude + offset; + poseStack.scale(scale * -1.5F, scale * -1.5F, scale * -1.5F); + poseStack.pushPose(); + consumer = buffer.getBuffer(Sheets.cutoutBlockSheet()); + renderBallC(poseStack, consumer, packedLight, packedOverlay); + poseStack.popPose(); + } + + @OnlyIn(Dist.CLIENT) + public void renderBallA(PoseStack poseStack, VertexConsumer consumer, int packedLight, int packedOverlay) { + PoseStack.Pose pose = poseStack.last(); + List quads = irisCoreModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(pose, quad, 0.2F, 0f, 0.2F, 1, LightTexture.FULL_BRIGHT, packedOverlay, false); + } + } + + @OnlyIn(Dist.CLIENT) + public void renderBallC(PoseStack poseStack, VertexConsumer consumer, int packedLight, int packedOverlay) { + PoseStack.Pose pose = poseStack.last(); + List quads = irisCoreModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(pose, quad, 0.4F, 0f, 0.4F, 1, LightTexture.FULL_BRIGHT, packedOverlay, false); + } + } + + @OnlyIn(Dist.CLIENT) + private void renderRings(Direction.Axis upAxis, float totalTick, PoseStack poseStack, MultiBufferSource buffer) { + VertexConsumer consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + float xRot = totalTick / 15; + float zRot = Mth.HALF_PI + totalTick / 30; + float yRot = totalTick / 20; + float sinX = Mth.sin(xRot), cosX = Mth.cos(xRot); + float sinY = Mth.sin(yRot), cosY = Mth.cos(yRot); + float sinZ = Mth.sin(zRot), cosZ = Mth.cos(zRot); + + float min = 0.5f; + float max = 1.0f; + float amplitude = (max - min) / 2.0f; + float offset = min + amplitude; + float scale = (float) Math.sin(totalTick * 0.1f) * amplitude + offset; + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateXYZ(sinX, cosY, sinZ)); + consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 2.75f, 0.1F, 10, 36, + 0.5F, 0, 0.5F, 1, upAxis); + poseStack.scale(3, 3, 3); + poseStack.popPose(); + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateXYZ(cosX, sinY, sinZ)); + consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 2.5f, 0.2F, 10, 36, + 0.4F, 0f, 0.4F, 1, upAxis); + poseStack.popPose(); + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateZ(cosZ)); + consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 2f, 0.2F, 10, 36, + 0.25F, 0, 0.25F, 1, upAxis); + poseStack.popPose(); + } + + public void renderSwirl(WorkableElectricMultiblockMachine machine, float partialTick, PoseStack poseStack, + MultiBufferSource bufferSource, int packedLight, int packedOverlay) { + if (!machine.isFormed()) { + return; + } + float totalTick = (Minecraft.getInstance().player.tickCount + partialTick); + + poseStack.pushPose(); + // do the rotaty thingy yee + Quaternionf rot = new Quaternionf() + .rotateY(totalTick / -5); + poseStack.mulPose(rot); + poseStack.translate(0, -6.3, 0); + VertexConsumer consumer = bufferSource.getBuffer(Sheets.cutoutBlockSheet()); + RenderBufferHelper.renderCube( + consumer, + poseStack.last(), + EnumSet.of(Direction.UP, Direction.DOWN), + 0xFFFFFFFF, + 200, + swirlSprite, + -3.5f, 0, -3.5f, + 3.5f, 0, 3.5f); + + poseStack.popPose(); + } + + @Override + public int getViewDistance() { + return 128; + } + + @Override + public boolean shouldRenderOffScreen(WorkableElectricMultiblockMachine machine) { + return true; + } + + @Override + public AABB getRenderBoundingBox(WorkableElectricMultiblockMachine machine) { + return new AABB(machine.getBlockPos()).inflate(getViewDistance(), 16, getViewDistance()); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/StarBallastRender.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/StarBallastRender.java new file mode 100644 index 000000000..69168bd99 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/StarBallastRender.java @@ -0,0 +1,171 @@ +package com.ghostipedia.cosmiccore.client.renderer.machine; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; + +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; +import com.gregtechceu.gtceu.client.util.ModelUtils; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.phys.AABB; +import net.neoforged.neoforge.client.model.data.ModelData; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.serialization.MapCodec; +import org.joml.Quaternionf; + +import java.util.List; + +import javax.annotation.ParametersAreNonnullByDefault; + +// This multi should never be rotated on its side +// so it uses a static location for the star as the controller should never be rotated on its side +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class StarBallastRender extends DynamicRender { + + public static final StarBallastRender INSTANCE = new StarBallastRender(); + public static final MapCodec CODEC = MapCodec.unit(StarBallastRender.INSTANCE); + public static final DynamicRenderType TYPE = new DynamicRenderType<>( + StarBallastRender.CODEC); + + public static final ResourceLocation STAR_MODEL_CORE = CosmicCore.id("block/iris/star_sphere"); + public static final ResourceLocation STAR_MODEL_OUTER = CosmicCore.id("block/iris/star_sphere_outer"); + public static final ResourceLocation STAR_MODEL_INNER = CosmicCore.id("block/iris/star_sphere_inner"); + public static final ResourceLocation STAR_MODEL_BEAM = CosmicCore.id("block/iris/star_beam"); + + static final RandomSource random = RandomSource.create(0L); + private static BakedModel starCoreModel = null; + private static BakedModel outerStarSphereModel = null; + private static BakedModel innerStarSphereModel = null; + private static BakedModel starBeamModel = null; + + private StarBallastRender() { + ModelUtils.registerBakeEventListener(true, event -> { + starCoreModel = event.getModels().get(STAR_MODEL_CORE); + outerStarSphereModel = event.getModels().get(STAR_MODEL_OUTER); + innerStarSphereModel = event.getModels().get(STAR_MODEL_INNER); + starBeamModel = event.getModels().get(STAR_MODEL_BEAM); + }); + } + + @Override + public DynamicRenderType getType() { + return TYPE; + } + + @Override + public int getViewDistance() { + return 256; + } + + @Override + public boolean shouldRenderOffScreen(IrisMultiblockMachine machine) { + return true; + } + + @Override + public AABB getRenderBoundingBox(IrisMultiblockMachine machine) { + return new AABB(machine.getBlockPos()).inflate(getViewDistance(), 16, getViewDistance()); + } + + @Override + public void render(IrisMultiblockMachine machine, float partialTick, PoseStack poseStack, + MultiBufferSource buffer, int packedLight, int packedOverlay) { + if (!machine.isFormed()) return; + + float totalTick = (Minecraft.getInstance().level.getGameTime() + partialTick); + VertexConsumer consumer = buffer.getBuffer(Sheets.translucentCullBlockSheet()); + + poseStack.pushPose(); + poseStack.translate(0.5f, -27.5f, 0.5f); + + renderStar(poseStack, consumer, totalTick, packedLight, packedOverlay); + renderStarInsides(poseStack, consumer, totalTick, packedLight, packedOverlay); + renderStarShell(poseStack, consumer, totalTick, packedLight, packedOverlay); + renderStarBeam(poseStack, consumer, totalTick, packedLight, packedOverlay); + + poseStack.popPose(); + } + + public void renderStarBeam(PoseStack poseStack, VertexConsumer consumer, + float totalTick, int packedLight, int packedOverlay) { + poseStack.pushPose(); + + Quaternionf rot = new Quaternionf() + .rotateXYZ(0.55f, 0.0f, 1f) + .rotateAxis(totalTick * Mth.TWO_PI / 80, 0f, 1f, 1); + poseStack.mulPose(rot); + // ??? what is this scaling, magic numbers galore + poseStack.scale(75.6f, 3f, 5f); + + PoseStack.Pose pose = poseStack.last(); + + List quads = starBeamModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(pose, quad, 1f, 1f, 1f, 0.65f, packedLight, packedOverlay, false); + } + poseStack.popPose(); + } + + public void renderStar(PoseStack poseStack, VertexConsumer consumer, + float totalTick, int packedLight, int packedOverlay) { + poseStack.pushPose(); + + Quaternionf rot = new Quaternionf() + .rotateXYZ(0.25f, 0.0f, 0f) + .rotateAxis(totalTick * Mth.TWO_PI / 80, 0f, 1f, 1f); + poseStack.mulPose(rot); + poseStack.scale(9.6f, 9.6f, 9.6f); + PoseStack.Pose pose = poseStack.last(); + + List quads = starCoreModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(pose, quad, 1f, 1f, 1f, 0.65f, packedLight, packedOverlay, false); + } + poseStack.popPose(); + } + + public void renderStarShell(PoseStack poseStack, VertexConsumer consumer, + float totalTick, int packedLight, int packedOverlay) { + poseStack.pushPose(); + + Quaternionf rot = new Quaternionf() + .rotateXYZ(0.65f, 0.0f, 0.35f) + .rotateAxis(totalTick * Mth.TWO_PI / 80, 0f, 1f, 0f); + poseStack.mulPose(rot); + poseStack.scale(10.0f, 10.0f, 10.0f); + PoseStack.Pose pose = poseStack.last(); + + List quads = outerStarSphereModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(pose, quad, 1f, 1f, 1f, 0.5f, packedLight, packedOverlay, false); + } + poseStack.popPose(); + } + + public void renderStarInsides(PoseStack poseStack, VertexConsumer consumer, + float tick, int packedLight, int packedOverlay) { + poseStack.pushPose(); + + poseStack.mulPose(new Quaternionf().rotateAxis(tick * Mth.TWO_PI / 80, 0, 1f, 0)); + poseStack.scale(9.85f, 9.85f, 9.85f); + PoseStack.Pose pose = poseStack.last(); + + List quads = innerStarSphereModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(pose, quad, 1f, 1f, 1f, 0.7f, packedLight, packedOverlay, false); + } + poseStack.popPose(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/StarLadderRender.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/StarLadderRender.java new file mode 100644 index 000000000..a805e4117 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/StarLadderRender.java @@ -0,0 +1,538 @@ +package com.ghostipedia.cosmiccore.client.renderer.machine; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; +import com.gregtechceu.gtceu.client.util.ModelUtils; +import com.gregtechceu.gtceu.client.util.RenderBufferHelper; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.Util; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.AABB; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.serialization.MapCodec; +import org.jetbrains.annotations.NotNull; +import org.joml.Matrix4f; +import org.joml.Quaternionf; + +import java.util.HashSet; +import java.util.function.BiFunction; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class StarLadderRender extends + DynamicRender { + + public static final StarLadderRender INSTANCE = new StarLadderRender(); + public static final MapCodec CODEC = MapCodec.unit(INSTANCE); + public static final DynamicRenderType TYPE = new DynamicRenderType<>( + StarLadderRender.CODEC); + + private static final BiFunction renderBoundCache = Util.memoize((front, upwards) -> { + Direction up = RelativeDirection.UP.getRelative(front, upwards, false); + Direction back = RelativeDirection.BACK.getRelative(front, upwards, false); + Direction left = RelativeDirection.LEFT.getRelative(front, upwards, false); + + // offset from the controller to the inner cube (scaled up by 1 in all directions) + // values are from the multi pattern + BlockPos.MutableBlockPos minPos = new BlockPos.MutableBlockPos() + .move(left, 3).move(up, 1).move(back, 2); + BlockPos.MutableBlockPos maxPos = new BlockPos.MutableBlockPos() + .move(left, -3).move(up, 7).move(back, 8); + + return AABB.encapsulatingFullBlocks(minPos, maxPos); + }); + + public static final ResourceLocation BLOOD_CUBE_TEXTURE = CosmicCore.id("block/iris/blood_cube"); + + private static TextureAtlasSprite bloodCubeSprite = null; + private static boolean isEventListenerRegistered = false; + + @SuppressWarnings("deprecation") + private StarLadderRender() { + if (!isEventListenerRegistered) { + ModelUtils.registerAtlasStitchedEventListener(true, TextureAtlas.LOCATION_BLOCKS, event -> { + bloodCubeSprite = event.getAtlas().getSprite(BLOOD_CUBE_TEXTURE); + }); + isEventListenerRegistered = true; + } + } + + @Override + public DynamicRenderType getType() { + return TYPE; + } + + @Override + public int getViewDistance() { + return 512; + } + + @Override + public AABB getRenderBoundingBox(WorkableElectricMultiblockMachine multi) { + return new AABB(multi.getBlockPos()).inflate(getViewDistance(), 256, getViewDistance()); + } + + @Override + public boolean shouldRenderOffScreen(WorkableElectricMultiblockMachine machine) { + return true; + } + + @Override + public void render(WorkableElectricMultiblockMachine machine, float partialTick, PoseStack poseStack, + MultiBufferSource buffer, int packedLight, int packedOverlay) { + if (!machine.isFormed()) { + return; + } + float totalTick = (Minecraft.getInstance().player.tickCount + partialTick); + + poseStack.pushPose(); + + // Position the pillar 11 blocks in front of the controller + Direction front = machine.getFrontFacing(); + Direction upwards = machine.getUpwardsFacing(); + boolean flipped = machine.isFlipped(); + Direction frontDir = RelativeDirection.FRONT.getRelative(front, upwards, flipped); + Direction.Axis leftAxis = RelativeDirection.LEFT.getRelative(front, upwards, flipped).getAxis(); + + float x0ffset = 0, y0ffset = 0.5f, z0ffset = 0; + + // Calculate offset 11 blocks in front of controller + Vec3i frontNormal = frontDir.getNormal(); + for (Direction.Axis axis : Direction.Axis.VALUES) { + int frontOffset = frontNormal.get(axis); + float offset = frontOffset * 10.5f; + switch (axis) { + case X -> x0ffset = offset; + case Y -> y0ffset = 0.5f; + case Z -> z0ffset = offset; + } + } + + poseStack.translate( + x0ffset + (leftAxis == Direction.Axis.X ? 0.5f : 0.0f), + y0ffset, + z0ffset + (leftAxis == Direction.Axis.Z ? 0.5f : 0.0f)); + + // Render the massive woven cable pillar + renderWovenCablePillar(poseStack, buffer, totalTick, packedLight, packedOverlay); + + poseStack.popPose(); + } + + private static void renderWireDodecahedron(PoseStack poseStack, MultiBufferSource buffer, + float scale, int sidesColorRGBA, float alpha) { + float r = ((sidesColorRGBA >> 16) & 0xFF) / 255f; + float g = ((sidesColorRGBA >> 8) & 0xFF) / 255f; + float b = ((sidesColorRGBA) & 0xFF) / 255f; + + final float phi = (1f + (float) Math.sqrt(5.0)) * 0.5f; + final float inv = 1f / phi; + + // build vertex list! Wahoo! + final float[][] V = new float[20][3]; + int idx = 0; + for (int sx = -1; sx <= 1; sx += 2) + for (int sy = -1; sy <= 1; sy += 2) + for (int sz = -1; sz <= 1; sz += 2) + V[idx++] = new float[] { sx, sy, sz }; + + for (int s1 = -1; s1 <= 1; s1 += 2) + for (int s2 = -1; s2 <= 1; s2 += 2) { + V[idx++] = new float[] { 0f, s1 * inv, s2 * phi }; + V[idx++] = new float[] { s1 * inv, s2 * phi, 0f }; + V[idx++] = new float[] { s1 * phi, 0f, s2 * inv }; + } + + for (int i = 0; i < 20; i++) { + V[i][0] *= scale; + V[i][1] *= scale; + V[i][2] *= scale; + } + + float edge2 = Float.POSITIVE_INFINITY; + for (int i = 0; i < 20; i++) + for (int j = i + 1; j < 20; j++) { + float dx = V[i][0] - V[j][0], dy = V[i][1] - V[j][1], dz = V[i][2] - V[j][2]; + float d2 = dx * dx + dy * dy + dz * dz; + if (d2 > 1e-6f && d2 < edge2) edge2 = d2; + } + final float eps = edge2 * 1.0015f; + + PoseStack.Pose pose = poseStack.last(); + Matrix4f mat = pose.pose(); + VertexConsumer vc = buffer.getBuffer(net.minecraft.client.renderer.RenderType.lines()); + + for (int i = 0; i < 20; i++) + for (int j = i + 1; j < 20; j++) { + float dx = V[i][0] - V[j][0], dy = V[i][1] - V[j][1], dz = V[i][2] - V[j][2]; + float d2 = dx * dx + dy * dy + dz * dz; + if (d2 <= eps) { + float len = (float) Math.sqrt(d2); + float nx = dx / len, ny = dy / len, nz = dz / len; + + vc.addVertex(mat, V[i][0], V[i][1], V[i][2]) + .setColor(r, g, b, alpha).setNormal(pose, nx, ny, nz); + vc.addVertex(mat, V[j][0], V[j][1], V[j][2]) + .setColor(r, g, b, alpha).setNormal(pose, nx, ny, nz); + } + } + } + + private static void renderWireDodecahedronThick(PoseStack poseStack, MultiBufferSource buffer, + float scale, float thickness, + float r, float g, float b, float a) { + final float phi = (1f + (float) Math.sqrt(5.0)) * 0.5f; + final float inv = 1f / phi; + + final float[][] V = new float[20][3]; + int idx = 0; + for (int sx = -1; sx <= 1; sx += 2) + for (int sy = -1; sy <= 1; sy += 2) + for (int sz = -1; sz <= 1; sz += 2) + V[idx++] = new float[] { sx, sy, sz }; + + for (int s1 = -1; s1 <= 1; s1 += 2) + for (int s2 = -1; s2 <= 1; s2 += 2) { + V[idx++] = new float[] { 0f, s1 * inv, s2 * phi }; + V[idx++] = new float[] { s1 * inv, s2 * phi, 0f }; + V[idx++] = new float[] { s1 * phi, 0f, s2 * inv }; + } + + for (int i = 0; i < 20; i++) { + V[i][0] *= scale; + V[i][1] *= scale; + V[i][2] *= scale; + } + + HashSet edges = new java.util.HashSet<>(64); + for (int i = 0; i < 20; i++) { + int[] ns = getInts(V, i); + for (int j : ns) { + int low = Math.min(i, j); + int high = Math.max(i, j); + long key = ((long) low << 32) | (high & 0xFFFFFFFFL); + edges.add(key); + } + } + VertexConsumer vertexConsumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + final Matrix4f mat = poseStack.last().pose(); + + var cam = Minecraft.getInstance().gameRenderer.getMainCamera(); + var v3 = cam.getLookVector(); + float vx = (float) v3.x, vy = (float) v3.y, vz = (float) v3.z; + float vlen = (float) Math.sqrt(vx * vx + vy * vy + vz * vz); + if (vlen > 0f) { + vx /= vlen; + vy /= vlen; + vz /= vlen; + } + + final float EPS = 1e-6f; + for (long key : edges) { + vertexConsumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + int i0 = (int) (key >>> 32); + int i1 = (int) (key & 0xFFFFFFFFL); + + float x0 = V[i0][0], y0 = V[i0][1], z0 = V[i0][2]; + float x1 = V[i1][0], y1 = V[i1][1], z1 = V[i1][2]; + + float dx = x1 - x0, dy = y1 - y0, dz = z1 - z0; + float L2 = dx * dx + dy * dy + dz * dz; + if (L2 < EPS) continue; + float L = (float) Math.sqrt(L2); + float ex = dx / L, ey = dy / L, ez = dz / L; + float nx = ey * vz - ez * vy; + float ny = ez * vx - ex * vz; + float nz = ex * vy - ey * vx; + float n2 = nx * nx + ny * ny + nz * nz; + if (n2 < EPS) { + float upx = 0f, upy = 1f, upz = 0f; + nx = ey * upz - ez * upy; + ny = ez * upx - ex * upz; + nz = ex * upy - ey * upx; + n2 = nx * nx + ny * ny + nz * nz; + if (n2 < EPS) { + nx = 1f; + ny = 0f; + nz = 0f; + n2 = 1f; + } + } + float s = (0.5f * thickness) / (float) Math.sqrt(n2); + float ox = nx * s, oy = ny * s, oz = nz * s; + float ax = x0 - ox, ay = y0 - oy, az = z0 - oz; + float bx = x0 + ox, by = y0 + oy, bz = z0 + oz; + float cx = x1 + ox, cy = y1 + oy, cz = z1 + oz; + float dxq = x1 - ox, dyq = y1 - oy, dzq = z1 - oz; + + // Tri 1: A,B,C + vertexConsumer.addVertex(mat, ax, ay, az).setColor(r, g, b, a); + vertexConsumer.addVertex(mat, bx, by, bz).setColor(r, g, b, a); + vertexConsumer.addVertex(mat, cx, cy, cz).setColor(r, g, b, a); + + // Tri 2: A,C,D + vertexConsumer.addVertex(mat, ax, ay, az).setColor(r, g, b, a); + vertexConsumer.addVertex(mat, cx, cy, cz).setColor(r, g, b, a); + vertexConsumer.addVertex(mat, dxq, dyq, dzq).setColor(r, g, b, a); + } + } + + private static int @NotNull [] getInts(float[][] V, int i) { + int n1 = -1, n2 = -1, n3 = -1; + float d1 = Float.POSITIVE_INFINITY, d2 = Float.POSITIVE_INFINITY, d3 = Float.POSITIVE_INFINITY; + + float xi = V[i][0], yi = V[i][1], zi = V[i][2]; + for (int j = 0; j < 20; j++) if (j != i) { + float dx = xi - V[j][0], dy = yi - V[j][1], dz = zi - V[j][2]; + float d = dx * dx + dy * dy + dz * dz; + if (d < d1) { + d3 = d2; + n3 = n2; + d2 = d1; + n2 = n1; + d1 = d; + n1 = j; + } else if (d < d2) { + d3 = d2; + n3 = n2; + d2 = d; + n2 = j; + } else if (d < d3) { + d3 = d; + n3 = j; + } + } + int[] ns = { n1, n2, n3 }; + return ns; + } + + public static void renderSolidSphere(PoseStack poseStack, MultiBufferSource buffer, + float cx, float cy, float cz, + float radius, int slices, int stacks, + float r, float g, float b, float a) { + Matrix4f mat = poseStack.last().pose(); + VertexConsumer vc = buffer.getBuffer(GTRenderTypes.getLightRing()); + + float dPhi = (float) (Mth.TWO_PI / Math.max(3, slices)); + float dTheta = (float) (Math.PI / Math.max(2, stacks)); + + for (int i = 0; i < stacks; i++) { + float th0 = i * dTheta; + float th1 = (i + 1) * dTheta; + float sin0 = Mth.sin(th0), cos0 = Mth.cos(th0); + float sin1 = Mth.sin(th1), cos1 = Mth.cos(th1); + + // one triangle strip per latitude band; <= closes seam + for (int j = 0; j <= slices; j++) { + float ph = j * dPhi; + float cosp = Mth.cos(ph), sinp = Mth.sin(ph); + + // band top (th0) + float x0 = cx + radius * sin0 * cosp; + float y0 = cy + radius * cos0; + float z0 = cz + radius * sin0 * sinp; + + // band bottom (th1) + float x1 = cx + radius * sin1 * cosp; + float y1 = cy + radius * cos1; + float z1 = cz + radius * sin1 * sinp; + + // order chosen for typical backface cull; swap if it looks inside-out + vc.addVertex(mat, x0, y0, z0).setColor(r, g, b, a); + vc.addVertex(mat, x1, y1, z1).setColor(r, g, b, a); + } + } + } + + @OnlyIn(Dist.CLIENT) + public void renderBloodCube(PoseStack poseStack, MultiBufferSource bufferSource, float totalTick) { + poseStack.pushPose(); + // rotate around center + Quaternionf rot = new Quaternionf() + .rotateXYZ(Mth.sin(totalTick / 20), + Mth.sin(totalTick / 30), + Mth.cos(Mth.HALF_PI + totalTick / 60)) + .rotateXYZ(55f * Mth.DEG_TO_RAD, 30f * Mth.DEG_TO_RAD, 0); + poseStack.mulPose(rot); + + // draw cube quads + var consumer = bufferSource.getBuffer(Sheets.translucentCullBlockSheet()); + RenderBufferHelper.renderCube(consumer, poseStack.last(), 0xffffffff, + LightTexture.FULL_BRIGHT, bloodCubeSprite, + -1, -1, -1, 1, 1, 1); + + poseStack.popPose(); + } + + @OnlyIn(Dist.CLIENT) + private void renderWovenCablePillar(PoseStack poseStack, MultiBufferSource buffer, + float totalTick, int packedLight, int packedOverlay) { + int numStrands = 4; + float pillarHeight = 2048f; + float coreRadius = 3.0f; + float strandRadius = 0.85f; + float helixRadius = 3.8f; + float windingSpeed = 0.03f; + + float animTime = -totalTick * 0.10f; + + // Render central core column first (back to front for translucency) + VertexConsumer coreConsumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + renderCoreColumn(poseStack, coreConsumer, pillarHeight, coreRadius, totalTick, packedLight, packedOverlay); + + // Render counter-rotating helix layers for structural stability look + // First layer - clockwise spiral + for (int strand = 0; strand < numStrands; strand++) { + VertexConsumer strandConsumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + float strandAngleOffset = (strand / (float) numStrands) * Mth.TWO_PI; + renderBraidedStrand(poseStack, strandConsumer, pillarHeight, helixRadius, strandRadius, + strandAngleOffset, animTime, windingSpeed, packedLight, packedOverlay, true); + } + + // Second layer - counter-clockwise spiral (creates woven/braided effect) + for (int strand = 0; strand < numStrands; strand++) { + VertexConsumer strandConsumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + float strandAngleOffset = (strand / (float) numStrands) * Mth.TWO_PI + (Mth.PI / numStrands); + renderBraidedStrand(poseStack, strandConsumer, pillarHeight, helixRadius * 0.95f, strandRadius * 0.8f, + strandAngleOffset, animTime, -windingSpeed, packedLight, packedOverlay, false); + } + } + + @OnlyIn(Dist.CLIENT) + private void renderBraidedStrand(PoseStack poseStack, VertexConsumer consumer, float height, + float helixRadius, float strandRadius, float angleOffset, + float animTime, float windingSpeed, int packedLight, int packedOverlay, + boolean isClockwise) { + int segments = 256; + float segmentHeight = height / segments; + + Matrix4f mat = poseStack.last().pose(); + + // Different colors for each layer to show the braiding + float r = isClockwise ? 0.1f : 0.15f; + float g = isClockwise ? 0.1f : 0.15f; + float b = isClockwise ? 0.1f : 0.15f; + + for (int i = 0; i < segments; i++) { + float y1 = i * segmentHeight; + float y2 = (i + 1) * segmentHeight; + + float angle1 = (y1 * windingSpeed + angleOffset + animTime) % Mth.TWO_PI; + float angle2 = (y2 * windingSpeed + angleOffset + animTime) % Mth.TWO_PI; + + float x1 = helixRadius * Mth.cos(angle1); + float z1 = helixRadius * Mth.sin(angle1); + float x2 = helixRadius * Mth.cos(angle2); + float z2 = helixRadius * Mth.sin(angle2); + + // Draw cylindrical tube segment + drawTubeSegment(mat, consumer, x1, y1, z1, x2, y2, z2, strandRadius, r, g, b, 1f); + } + } + + @OnlyIn(Dist.CLIENT) + private void renderCoreColumn(PoseStack poseStack, VertexConsumer consumer, float height, + float radius, float totalTick, int packedLight, int packedOverlay) { + int segments = 256; + float segmentHeight = height / segments; + + Matrix4f mat = poseStack.last().pose(); + + for (int i = 0; i < segments; i++) { + float y1 = i * segmentHeight; + float y2 = (i + 1) * segmentHeight; + + float glow = 0.7f + 0.3f * Mth.sin(totalTick * 0.05f + y1 * 0.1f); + + // Draw central glowing column + drawTubeSegment(mat, consumer, 0, y1, 0, 0, y2, 0, radius, + 0.3f * glow, 0.45f * glow, 0.6f * glow, 1f); + } + } + + @OnlyIn(Dist.CLIENT) + private void drawTubeSegment(Matrix4f mat, VertexConsumer consumer, + float x1, float y1, float z1, float x2, float y2, float z2, + float radius, float r, float g, float b, float a) { + int sides = 4; + float angleStep = Mth.TWO_PI / sides; + + for (int i = 0; i < sides; i++) { + float angle1 = i * angleStep; + float angle2 = (i + 1) * angleStep; + + float cos1 = Mth.cos(angle1); + float sin1 = Mth.sin(angle1); + float cos2 = Mth.cos(angle2); + float sin2 = Mth.sin(angle2); + + // First triangle of quad + consumer.addVertex(mat, x1 + radius * cos1, y1, z1 + radius * sin1).setColor(r, g, b, a); + consumer.addVertex(mat, x1 + radius * cos2, y1, z1 + radius * sin2).setColor(r, g, b, a); + consumer.addVertex(mat, x2 + radius * cos2, y2, z2 + radius * sin2).setColor(r, g, b, a); + + // Second triangle of quad + consumer.addVertex(mat, x1 + radius * cos1, y1, z1 + radius * sin1).setColor(r, g, b, a); + consumer.addVertex(mat, x2 + radius * cos2, y2, z2 + radius * sin2).setColor(r, g, b, a); + consumer.addVertex(mat, x2 + radius * cos1, y2, z2 + radius * sin1).setColor(r, g, b, a); + } + } + + @OnlyIn(Dist.CLIENT) + private void renderRings(Direction.Axis upAxis, float totalTick, PoseStack poseStack, MultiBufferSource buffer) { + VertexConsumer consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + + float xRot = totalTick / 20; + float zRot = Mth.HALF_PI + totalTick / 60; + float yRot = totalTick / 30; + float sinX = Mth.sin(xRot), cosX = Mth.cos(xRot); + float sinY = Mth.sin(yRot), cosY = Mth.cos(yRot); + float sinZ = Mth.sin(zRot), cosZ = Mth.cos(zRot); + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateXYZ(sinX, cosY, sinZ)); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 2f, 0.1F, 10, 36, + 0.5F, 0, 0, 1, upAxis); + poseStack.popPose(); + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateXYZ(cosX, sinY, sinZ)); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 1.8f, 0.1F, 10, 36, + 0.4F, 0f, 0, 1, upAxis); + poseStack.popPose(); + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateZ(cosZ)); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 1.6f, 0.1F, 10, 36, + 0.6F, 0, 0, 1, upAxis); + poseStack.popPose(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/StellarIrisRender.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/StellarIrisRender.java new file mode 100644 index 000000000..f33dd40e2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/StellarIrisRender.java @@ -0,0 +1,695 @@ +package com.ghostipedia.cosmiccore.client.renderer.machine; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; + +import com.gregtechceu.gtceu.client.renderer.GTRenderTypes; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; +import com.gregtechceu.gtceu.client.util.ModelUtils; +import com.gregtechceu.gtceu.client.util.RenderBufferHelper; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.client.resources.model.BakedModel; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.phys.AABB; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.client.model.data.ModelData; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.serialization.MapCodec; +import org.joml.Quaternionf; + +import java.util.List; + +import javax.annotation.ParametersAreNonnullByDefault; + +import static com.ghostipedia.cosmiccore.client.renderer.machine.StarBallastRender.random; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class StellarIrisRender extends DynamicRender { + + public static final StellarIrisRender INSTANCE = new StellarIrisRender(); + // Default star color - will be overridden by machine's customStarColor if set + public static final String DEFAULT_STAR_COLOR = "#FFCC44"; // Golden yellow + public static final MapCodec CODEC = MapCodec.unit(StellarIrisRender.INSTANCE); + + // Current hex color being used for rendering (set per-render from machine or default) + private String hexColor = DEFAULT_STAR_COLOR; + public static final DynamicRenderType TYPE = new DynamicRenderType<>( + StellarIrisRender.CODEC); + + public static final ResourceLocation IRIS_MODEL_CORE = CosmicCore.id("block/iris/iris_sphere"); + public static final ResourceLocation IRIS_MODEL_RING = CosmicCore.id("block/iris/iris_ring"); + public static final ResourceLocation IRIS_MODEL_RING_WHITE = CosmicCore.id("block/iris/iris_ring_white"); + public static final ResourceLocation STAR_MODEL_CORE = CosmicCore.id("block/iris/star_sphere"); + public static final ResourceLocation STAR_MODEL_OUTER = CosmicCore.id("block/iris/star_sphere_outer"); + public static final ResourceLocation STAR_MODEL_INNER = CosmicCore.id("block/iris/star_sphere_inner"); + IrisMultiblockMachine.Stage newStage; + private static BakedModel irisCoreModel = null; + private static BakedModel irisRingModel = null; + private static BakedModel irisSmallRingModel = null; + private static BakedModel starCoreModel = null; + private static BakedModel outerStarSphereModel = null; + private static BakedModel innerStarSphereModel = null; + + private StellarIrisRender() { + ModelUtils.registerBakeEventListener(true, event -> { + irisCoreModel = event.getModels().get(IRIS_MODEL_CORE); + irisRingModel = event.getModels().get(IRIS_MODEL_RING); + irisSmallRingModel = event.getModels().get(IRIS_MODEL_RING_WHITE); + + starCoreModel = event.getModels().get(STAR_MODEL_CORE); + outerStarSphereModel = event.getModels().get(STAR_MODEL_OUTER); + innerStarSphereModel = event.getModels().get(STAR_MODEL_INNER); + }); + } + + @Override + public DynamicRenderType getType() { + return TYPE; + } + + /** + * Gets the star color from the machine, converting from int to hex string. + * Returns DEFAULT_STAR_COLOR if machine has no custom color set (-1). + */ + private String getStarColorFromMachine(IrisMultiblockMachine machine) { + int customColor = machine.getCustomStarColor(); + if (customColor == -1) { + return DEFAULT_STAR_COLOR; + } + // Convert int color (0xRRGGBB) to hex string (#RRGGBB) + return String.format("#%06X", customColor & 0xFFFFFF); + } + + @OnlyIn(Dist.CLIENT) + @Override + public void render(IrisMultiblockMachine machine, float partialTick, PoseStack poseStack, MultiBufferSource buffer, + int packedLight, int packedOverlay) { + // if (!machine.isFormed()) return; + + // Set the star color from the machine's custom color (or default) + this.hexColor = getStarColorFromMachine(machine); + + float totalTick = (Minecraft.getInstance().player.tickCount + partialTick); + VertexConsumer consumer = buffer.getBuffer(Sheets.translucentCullBlockSheet()); + poseStack.pushPose(); + + // Controller is now on top spire - star renders 23 blocks below controller + // Center offset: controller is at top, star center is 23 blocks down + float x0ffset = 0.5f; + float y0ffset = -23f; + float z0ffset = 0.5f; + + poseStack.translate(x0ffset, y0ffset, z0ffset); + poseStack.scale(7.0f, 7, 7); + + if (machine.getStage() == IrisMultiblockMachine.Stage.STAR) { + + renderStar(poseStack, consumer, totalTick, packedLight, packedOverlay); + renderStarInsides(poseStack, consumer, totalTick, packedLight, packedOverlay); + renderStarShell(poseStack, consumer, totalTick, packedLight, packedOverlay); + poseStack.popPose(); + + } else if (machine.getStage() == IrisMultiblockMachine.Stage.GROWING) { + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateAxis(-totalTick * Mth.TWO_PI / 80f, 0, 1, 0)); + renderStar(poseStack, consumer, totalTick, packedLight, packedOverlay); + renderStarInsides(poseStack, consumer, totalTick, packedLight, packedOverlay); + renderStarShell(poseStack, consumer, totalTick, packedLight, packedOverlay); + poseStack.popPose(); + + renderMultiStarSystemRandomized( + machine, poseStack, buffer, totalTick, packedLight, packedOverlay, + 10, + 4.5f, + 0.75f, + 5f, + 0.12f, 0.45f, + true); + poseStack.popPose(); + } else if (machine.getStage() == IrisMultiblockMachine.Stage.SUPERSTAR) { + poseStack.scale(2, 2, 2); + renderStar(poseStack, consumer, totalTick, packedLight, packedOverlay); + renderStarInsides(poseStack, consumer, totalTick, packedLight, packedOverlay); + renderStarShell(poseStack, consumer, totalTick, packedLight, packedOverlay); + poseStack.popPose(); + + } else if (machine.getStage() == IrisMultiblockMachine.Stage.BLACK_HOLE) { + renderIris(poseStack, consumer, packedLight, packedOverlay); + renderAccretionDisk(poseStack, consumer, totalTick, packedLight, packedOverlay); + poseStack.popPose(); + + renderRingSmall(machine, poseStack, consumer, totalTick, packedLight, packedOverlay); + + } else if (machine.getStage() == IrisMultiblockMachine.Stage.DEATH) { + renderRings(machine.getFrontFacing().getAxis(), totalTick, poseStack, buffer); + renderRingsSecondary(machine.getFrontFacing().getAxis(), totalTick, poseStack, buffer); + float scale = erraticPulseEffect(0.7f, 1.6f, partialTick, 0.3f, machine); + poseStack.scale(scale, scale, scale); + renderIris(poseStack, consumer, packedLight, packedOverlay); + poseStack.popPose(); + + } else if (machine.getStage() == IrisMultiblockMachine.Stage.DEATH_GRACEFUL) { + BlockPos pos = machine.getBlockPos(); + + if (!irisFadeStartSec.containsKey(pos)) { + PoseStack.Pose pose = poseStack.last(); + java.util.List quads = irisCoreModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(pose, quad, 0f, 0f, 0f, 1f, packedLight, packedOverlay, false); + } + + startIrisFade(pos, partialTick); + } else { + boolean vanished = renderIrisFading( + poseStack, consumer, packedLight, packedOverlay, + pos, partialTick); + if (vanished) { + machine.setStage(IrisMultiblockMachine.Stage.STAR); + } + } + poseStack.popPose(); + } else { + poseStack.popPose(); + } + } + + @Override + public int getViewDistance() { + return 512; + } + + @Override + public boolean shouldRenderOffScreen(IrisMultiblockMachine machine) { + return true; + } + + @Override + public AABB getRenderBoundingBox(IrisMultiblockMachine machine) { + return new AABB(machine.getBlockPos()).inflate(getViewDistance(), 16, getViewDistance()); + } + + @OnlyIn(Dist.CLIENT) + public void renderIris(PoseStack poseStack, VertexConsumer consumer, int packedLight, int packedOverlay) { + PoseStack.Pose pose = poseStack.last(); + List quads = irisCoreModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(pose, quad, 0.0f, 0.0f, 0.0f, 1f, packedLight, packedOverlay); + } + } + + private final java.util.Map irisFadeStartSec = new java.util.HashMap<>(); + private static final float IRIS_FADE_DURATION_SEC = 10f; + + private void startIrisFade(BlockPos pos, float partialTick) { + float tSec = (Minecraft.getInstance().player.tickCount + partialTick) / 20.0f; + irisFadeStartSec.put(pos, tSec); + } + + private static float clamp01(float x) { + return x < 0f ? 0f : (x > 1f ? 1f : x); + } + + private static float easeOutQuint(float x) { + x = clamp01(x); + float inv = 1f - x; + return 1f - inv * inv * inv * inv * inv; + } + + @OnlyIn(Dist.CLIENT) + private boolean renderIrisFading(PoseStack poseStack, VertexConsumer consumer, + int packedLight, int packedOverlay, + BlockPos pos, float partialTick) { + Float t0 = irisFadeStartSec.get(pos); + if (t0 == null) { + PoseStack.Pose pose = poseStack.last(); + java.util.List quads = irisCoreModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(pose, quad, 0, 0, 0, 1f, packedLight, packedOverlay, false); + } + return false; + } + + float tSec = (Minecraft.getInstance().player.tickCount + partialTick) / 20.0f; + float elapsed = tSec - t0; + if (elapsed >= IRIS_FADE_DURATION_SEC) { + irisFadeStartSec.remove(pos); + return true; + } + + float k = clamp01(elapsed / IRIS_FADE_DURATION_SEC); + float scale = 0.02f + (1f - easeOutQuint(k)) * 0.98f; + float alpha = (1f - k) * (1f - k); + + poseStack.pushPose(); + poseStack.scale(scale, scale, scale); + PoseStack.Pose pose = poseStack.last(); + java.util.List quads = irisCoreModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(pose, quad, 0, 0, 0, alpha, packedLight, packedOverlay, false); + } + poseStack.popPose(); + + return false; + } + + @OnlyIn(Dist.CLIENT) + public void renderRing(PoseStack poseStack, VertexConsumer consumer, int packedLight, int packedOverlay) { + poseStack.pushPose(); + poseStack.scale(2.0f, 2.0f, 2.0f); + + List quads = irisRingModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(poseStack.last(), quad, 1f, 1f, 1f, 1f, packedLight, packedOverlay); + } + + poseStack.popPose(); + } + + /** + * Renders the main accretion disk with rotation around the black hole. + */ + @OnlyIn(Dist.CLIENT) + public void renderAccretionDisk(PoseStack poseStack, VertexConsumer consumer, + float totalTick, int packedLight, int packedOverlay) { + poseStack.pushPose(); + + // Offset slightly down to avoid z-fighting with the fast spinning ring + poseStack.translate(0, -0.05f, 0); + + // Slow rotation around Y axis (orbital motion) + float rotationSpeed = totalTick * Mth.TWO_PI / 200f; // Full rotation every 10 seconds + poseStack.mulPose(new Quaternionf().rotateY(rotationSpeed)); + + poseStack.scale(2.0f, 2.0f, 2.0f); + + List quads = irisRingModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(poseStack.last(), quad, 1f, 1f, 1f, 1f, packedLight, packedOverlay); + } + + poseStack.popPose(); + } + + @OnlyIn(Dist.CLIENT) + public void renderRingSmall(IrisMultiblockMachine machine, PoseStack poseStack, VertexConsumer consumer, + float totalTick, int packedLight, int packedOverlay) { + poseStack.pushPose(); + + // Controller is now on top spire - ring renders at star center (23 blocks below controller) + float x0ffset = 0.5f; + float y0ffset = -23f; + float z0ffset = 0.5f; + + poseStack.translate(x0ffset, y0ffset, z0ffset); + poseStack.mulPose(new Quaternionf().rotateAxis(totalTick * Mth.TWO_PI / 20, 0, 1, 0)); + poseStack.scale(13.0f, 13.0f, 13.0f); + + List quads = irisSmallRingModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(poseStack.last(), quad, 1f, 1f, 1f, 1f, packedLight, packedOverlay); + } + + poseStack.popPose(); + } + + @OnlyIn(Dist.CLIENT) + public void renderStarInsides(PoseStack poseStack, VertexConsumer consumer, + float totalTick, int packedLight, int packedOverlay) { + poseStack.pushPose(); + Quaternionf rot = new Quaternionf() + .rotateXYZ(0.65f, 0.0f, 0.35f) + .rotateAxis(totalTick * Mth.TWO_PI / 80, 0f, 1f, 0f); + poseStack.mulPose(rot); + poseStack.scale(1.05f, 1.05f, 1.05f); + float[] c = hexToRgba(hexColor); + PoseStack.Pose pose = poseStack.last(); + + List quads = innerStarSphereModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(pose, quad, c[0], c[1], c[2], 0.5f, packedLight, packedOverlay, false); + } + poseStack.popPose(); + } + + @OnlyIn(Dist.CLIENT) + private void renderStarAt(PoseStack poseStack, VertexConsumer consumer, + float totalTick, int packedLight, int packedOverlay, + float sizeMul, String tempHexColor, boolean spinSelf) { + String old = this.hexColor; + this.hexColor = tempHexColor != null ? tempHexColor : old; + + float spinTick = spinSelf ? totalTick : 0f; + + poseStack.pushPose(); + poseStack.scale(sizeMul, sizeMul, sizeMul); + renderStar(poseStack, consumer, spinTick, packedLight, packedOverlay); + renderStarInsides(poseStack, consumer, spinTick, packedLight, packedOverlay); + renderStarShell(poseStack, consumer, spinTick, packedLight, packedOverlay); + poseStack.popPose(); + + this.hexColor = old; + } + + @OnlyIn(Dist.CLIENT) + private void renderMultiStarSystemRandomized(IrisMultiblockMachine machine, + PoseStack poseStack, MultiBufferSource buffer, + float totalTick, int packedLight, int packedOverlay, + int count, + float meanRadius, + float radiusJitter, + float periodSec, + float starMin, float starMax, + boolean spinSelf) { + if (count < 1) return; + if (count > 5) count = 5; + + long seed = hashPos(machine.getBlockPos()) ^ (count * 0x9E3779B97F4A7C15L); + long[] S = new long[] { seed }; + + String[] palette = new String[] { "#ffd28a", "#9ad0ff", "#ff9fb0", "#fff6a4", "#b4ffea", "#d2a0ff" }; + VertexConsumer consumer = buffer.getBuffer(Sheets.translucentCullBlockSheet()); + + float innerRadius = 2.5f; + float outerRadius = meanRadius * 0.40f; + + float maxStarSize = starMax; + float minSpacing = maxStarSize * 1.8f; + + float totalSpace = outerRadius - innerRadius; + float neededSpace = minSpacing * (count - 1); + float radiusStep = Math.max(minSpacing, totalSpace / Math.max(1, count - 1)); + + float tSec = totalTick / 20.0f; + + for (int i = 0; i < count; i++) { + float radius = innerRadius + (i * radiusStep); + + float orbitTilt = (rand01(S) - 0.5f) * Mth.PI * 0.8f; + float orbitRotation = rand01(S) * Mth.TWO_PI; + + float direction = rand01(S) > 0.5f ? 1f : -1f; + + float speedMult = (0.3f + rand01(S) * 2.2f) * direction; + + float startAngle = rand01(S) * Mth.TWO_PI; + + float orbitalPeriod = periodSec * (1.0f / Math.abs(speedMult)); + float angle = startAngle + (tSec / orbitalPeriod) * Mth.TWO_PI * Math.signum(speedMult); + + float orbitX = radius * Mth.cos(angle); + float orbitY = 0f; + float orbitZ = radius * Mth.sin(angle); + + float cosTilt = Mth.cos(orbitTilt); + float sinTilt = Mth.sin(orbitTilt); + float rotX1 = orbitX; + float rotY1 = orbitY * cosTilt - orbitZ * sinTilt; + float rotZ1 = orbitY * sinTilt + orbitZ * cosTilt; + + float cosRot = Mth.cos(orbitRotation); + float sinRot = Mth.sin(orbitRotation); + float finalX = rotX1 * cosRot + rotZ1 * sinRot; + float finalY = rotY1; + float finalZ = -rotX1 * sinRot + rotZ1 * cosRot; + + float sizeRand = rand01(S); + float starSize = Mth.lerp(sizeRand, starMin, starMax); + starSize = Mth.clamp(starSize, starMin, starMax); + + String color = palette[i % palette.length]; + + float spinSpeed = 0.5f + rand01(S) * 2.0f; + float spinOffset = rand01(S) * 1000f; + float uniqueSpinTick = spinSelf ? (totalTick * spinSpeed + spinOffset) : 0f; + + poseStack.pushPose(); + poseStack.translate(finalX, finalY, finalZ); + renderStarAt(poseStack, consumer, uniqueSpinTick, packedLight, packedOverlay, + starSize, color, spinSelf); + poseStack.popPose(); + } + } + + @OnlyIn(Dist.CLIENT) + public void renderStar(PoseStack poseStack, VertexConsumer consumer, + float totalTick, int packedLight, int packedOverlay) { + poseStack.pushPose(); + Quaternionf rot = new Quaternionf() + .rotateXYZ(0.65f, 0.0f, 0.35f) + .rotateAxis(totalTick * Mth.TWO_PI / 80, 0f, 1f, 0f); + poseStack.mulPose(rot); + poseStack.scale(1.03f, 1.03f, 1.03f); + float[] c = hexToRgba(hexColor); + PoseStack.Pose pose = poseStack.last(); + + List quads = starCoreModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(pose, quad, c[0], c[1], c[2], 0.98f, packedLight, packedOverlay, false); + } + poseStack.popPose(); + } + + @OnlyIn(Dist.CLIENT) + public void renderStarShell(PoseStack poseStack, VertexConsumer consumer, + float totalTick, int packedLight, int packedOverlay) { + poseStack.pushPose(); + Quaternionf rot = new Quaternionf() + .rotateXYZ(0.65f, 0.0f, 0.35f) + .rotateAxis(totalTick * Mth.TWO_PI / 80, 0f, 1f, 0f); + poseStack.mulPose(rot); + poseStack.scale(1.09f, 1.09f, 1.09f); + float[] c = hexToRgba(hexColor); + PoseStack.Pose pose = poseStack.last(); + + List quads = outerStarSphereModel.getQuads(null, null, random, ModelData.EMPTY, null); + for (BakedQuad quad : quads) { + consumer.putBulkData(pose, quad, c[0], c[1], c[2], 1f, packedLight, packedOverlay, false); + } + poseStack.popPose(); + } + + private float prevTSec = Float.NaN; + private float spikeEnv = 0f; + private float nextSpikeT = 0f; + private long pulseSeed = 0L; + private boolean seedInit = false; + + private static long hashPos(BlockPos p) { + long x = p.getX(), y = p.getY(), z = p.getZ(); + long h = x * 0x9E3779B97F4A7C15L ^ (y + 0xC2B2AE3D27D4EB4FL) ^ (z * 0x94D049BB133111EBL); + h ^= (h >>> 30); + h *= 0xBF58476D1CE4E5B9L; + h ^= (h >>> 27); + h *= 0x94D049BB133111EBL; + h ^= (h >>> 31); + return h; + } + + private static final long A = 6364136223846793005L, C = 1442695040888963407L; + + private static long lcg(long s) { + return s * A + C; + } + + private static float rand01(long[] s) { + s[0] = lcg(s[0]); + return ((s[0] >>> 8) & 0xFFFFFF) / (float) (1 << 24); + } + + private static float expSample(long[] s, float lambda) { + float u = Math.max(1e-6f, rand01(s)); + return (float) (-Math.log(u) / lambda); + } + + @OnlyIn(Dist.CLIENT) + private float erraticPulseEffect(float min, float max, float partial, float intensity, + IrisMultiblockMachine machine) { + float tSec = (Minecraft.getInstance().player.tickCount + partial) / 20.0f; + + if (!seedInit) { + pulseSeed = hashPos(machine.getBlockPos()); + seedInit = true; + nextSpikeT = tSec + 0.2f; + } + + float dt; + if (Float.isNaN(prevTSec)) dt = 0f; + else { + dt = tSec - prevTSec; + if (dt < 0f) dt = 0f; + if (dt > 0.25f) dt = 0.25f; + } + prevTSec = tSec; + + intensity = Mth.clamp(intensity, 0f, 1f); + float rateHz = Mth.lerp(intensity, 0.3f, 3.0f); + float gain = Mth.lerp(intensity, 0.25f, 0.9f); + float decayTau = Mth.lerp(intensity, 0.60f, 0.20f); + + if (dt > 0f) { + long[] s = new long[] { pulseSeed }; + while (tSec >= nextSpikeT) { + float amp = (0.5f + 0.5f * rand01(s)) * gain; + spikeEnv += amp; + float inter = expSample(s, rateHz); + nextSpikeT += inter; + pulseSeed = s[0]; + } + + float decay = (float) Math.exp(-dt / decayTau); + spikeEnv *= decay; + } + + float w = tSec; + float jitter = 0.04f * (float) Math.sin(7.23 * w + 0.3) + 0.03f * (float) Math.sin(11.1 * w + 1.7) + + 0.02f * (float) Math.sin(4.7 * w * w + 0.5); + jitter = Mth.clamp(jitter, -0.15f, 0.15f); + + float pulse01 = Mth.clamp(0.12f + spikeEnv + jitter, 0f, 1f); + + return Mth.lerp(pulse01, min, max); + } + + @OnlyIn(Dist.CLIENT) + private void renderRings(Direction.Axis upAxis, float totalTick, PoseStack poseStack, MultiBufferSource buffer) { + VertexConsumer consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + float xRot = totalTick / 15; + float zRot = Mth.HALF_PI + totalTick / 30; + float yRot = totalTick / 20; + float sinX = Mth.sin(xRot), cosX = Mth.cos(xRot); + float sinY = Mth.sin(yRot), cosY = Mth.cos(yRot); + float sinZ = Mth.sin(zRot), cosZ = Mth.cos(zRot); + + float min = 0.5f; + float max = 1.0f; + float amplitude = (max - min) / 2.0f; + float offset = min + amplitude; + float scale = (float) Math.sin(totalTick * 0.1f) * amplitude + offset; + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateXYZ(sinX, cosY, sinZ)); + consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 6.3f, 0.3F, 10, 36, + 0F, 0, 0F, 1, upAxis); + poseStack.popPose(); + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateXYZ(cosX, sinY, sinZ)); + consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 5.75f, 0.3F, 10, 36, + 0F, 0, 0F, 1, upAxis); + poseStack.popPose(); + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateXYZ(cosZ, -sinY, 0)); + consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 3.75f, 0.3F, 10, 36, + 0F, 0, 0F, 1, upAxis); + poseStack.popPose(); + } + + private void renderRingsSecondary(Direction.Axis upAxis, float totalTick, PoseStack poseStack, + MultiBufferSource buffer) { + VertexConsumer consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + float xRot = totalTick / 17f; + float zRot = Mth.HALF_PI + 0.35f + totalTick / 29f; + float yRot = totalTick / 21f; + float sinX = Mth.sin(xRot), cosX = Mth.cos(xRot); + float sinY = Mth.sin(yRot), cosY = Mth.cos(yRot); + float sinZ = Mth.sin(zRot), cosZ = Mth.cos(zRot); + + float min = 0.45f; + float max = 1.15f; + float amplitude = (max - min) / 2.0f; + float offset = min + amplitude; + float scale = (float) Math.sin(totalTick * 0.123f + 1.1f) * amplitude + offset; + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateXYZ(sinX, cosY, sinZ)); + consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 5.10f + 0.25f * Mth.sin(totalTick * 0.9f + 0.3f), + 0.26F + 0.06F * Mth.sin(totalTick * 0.291f + 1.7f), + 12, 40, + 0F, 0, 0F, + 1, + upAxis); + poseStack.scale(scale * 2.5f, scale * 3.2f, scale * 2.7f); + poseStack.popPose(); + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateXYZ(cosX, sinY, sinZ)); + consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 4.55f + 0.30f * Mth.sin(totalTick * 0.377f + 0.9f), + 0.34F + 0.05F * Mth.sin(totalTick * 0.291f + 1.6f), + 11, 30, + 0F, 0, 0F, + 1, + upAxis); + poseStack.popPose(); + + poseStack.pushPose(); + poseStack.mulPose(new Quaternionf().rotateZ(cosZ)); + consumer = buffer.getBuffer(GTRenderTypes.getLightRing()); + RenderBufferHelper.renderRing(poseStack, consumer, + 0, 0, 0, + 5.05f + 0.22f * Mth.sin(totalTick * 0.065f + 1.9f), + 0.28F + 0.05F * Mth.sin(totalTick * 0.15f + 0.2f), + 13, 32, + 0F, 0, 0F, + 1, + upAxis); + poseStack.popPose(); + } + + public static float[] hexToRgba(String hex) { + if (hex.startsWith("#")) { + hex = hex.substring(1); + } + + int r, g, b, a; + + if (hex.length() == 6) { + r = Integer.parseInt(hex.substring(0, 2), 16); + g = Integer.parseInt(hex.substring(2, 4), 16); + b = Integer.parseInt(hex.substring(4, 6), 16); + a = 255; + } else if (hex.length() == 8) { + r = Integer.parseInt(hex.substring(0, 2), 16); + g = Integer.parseInt(hex.substring(2, 4), 16); + b = Integer.parseInt(hex.substring(4, 6), 16); + a = Integer.parseInt(hex.substring(6, 8), 16); + } else { + throw new IllegalArgumentException("Hex must be in format #RRGGBB or #RRGGBBAA"); + } + + return new float[] { + r / 255.0f, + g / 255.0f, + b / 255.0f, + a / 255.0f + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/SufferingChamberRenderer.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/SufferingChamberRenderer.java new file mode 100644 index 000000000..9b78892ea --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/SufferingChamberRenderer.java @@ -0,0 +1,150 @@ +package com.ghostipedia.cosmiccore.client.renderer.machine; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; +import com.gregtechceu.gtceu.client.util.ModelUtils; +import com.gregtechceu.gtceu.client.util.RenderBufferHelper; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.Util; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LightTexture; +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.Sheets; +import net.minecraft.client.renderer.texture.TextureAtlas; +import net.minecraft.client.renderer.texture.TextureAtlasSprite; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.Vec3i; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.phys.AABB; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.vertex.VertexConsumer; +import com.mojang.serialization.MapCodec; +import org.joml.Quaternionf; + +import java.util.EnumSet; +import java.util.function.BiFunction; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class SufferingChamberRenderer extends + DynamicRender { + + // spotless:off + public static final SufferingChamberRenderer INSTANCE = new SufferingChamberRenderer(); + public static final MapCodec CODEC = MapCodec.unit(INSTANCE); + public static final DynamicRenderType TYPE = new DynamicRenderType<>(SufferingChamberRenderer.CODEC); + // spotless:on + + public static final ResourceLocation PENTAGRAM = CosmicCore.id("block/iris/pentagram"); + + private static TextureAtlasSprite pentagramSprite = null; + + private static final BiFunction renderBoundCache = Util.memoize((front, upwards) -> { + Direction up = RelativeDirection.UP.getRelative(front, upwards, false); + Direction back = RelativeDirection.BACK.getRelative(front, upwards, false); + Direction left = RelativeDirection.LEFT.getRelative(front, upwards, false); + + BlockPos.MutableBlockPos minPos = new BlockPos.MutableBlockPos() + .move(left, 4).move(up, 3).move(back, 1); + BlockPos.MutableBlockPos maxPos = new BlockPos.MutableBlockPos() + .move(left, -4).move(up, 5).move(back, 7); + + return AABB.encapsulatingFullBlocks(minPos, maxPos); + }); + + private SufferingChamberRenderer() { + ModelUtils.registerAtlasStitchedEventListener(true, TextureAtlas.LOCATION_BLOCKS, event -> { + pentagramSprite = event.getAtlas().getSprite(PENTAGRAM); + }); + } + + @Override + public DynamicRenderType getType() { + return TYPE; + } + + @Override + public AABB getRenderBoundingBox(WorkableElectricMultiblockMachine multi) { + if (multi.isFormed()) { + AABB bounds = renderBoundCache.apply(multi.getFrontFacing(), multi.getUpwardsFacing()); + return bounds.move(multi.getBlockPos()); + } + return super.getRenderBoundingBox(multi); + } + + @Override + public int getViewDistance() { + return 256; + } + + @Override + public boolean shouldRenderOffScreen(WorkableElectricMultiblockMachine machine) { + return true; + } + + @Override + public void render(WorkableElectricMultiblockMachine machine, float partialTick, PoseStack poseStack, + MultiBufferSource bufferSource, int packedLight, int packedOverlay) { + if (!machine.isFormed()) { + return; + } + float totalTick = (Minecraft.getInstance().player.tickCount + partialTick); + + poseStack.pushPose(); + + Direction front = machine.getFrontFacing(); + Direction upwards = machine.getUpwardsFacing(); + boolean flipped = machine.isFlipped(); + + Vec3i up = RelativeDirection.UP.getRelative(front, upwards, flipped).getNormal(); + Vec3i back = RelativeDirection.BACK.getRelative(front, upwards, flipped).getNormal(); + Direction.Axis leftAxis = RelativeDirection.LEFT.getRelative(front, upwards, flipped).getAxis(); + + float x0ffset = 0, y0ffset = 0, zOffset = 0; + + for (Direction.Axis axis : Direction.Axis.VALUES) { + int upOffset = up.get(axis); + int backOffset = back.get(axis); + + float offset = upOffset * (4.0f + (upOffset * 0.5f)) + + backOffset * (4.0f + (backOffset * 0.5f)); + switch (axis) { + case X -> x0ffset = offset; + case Y -> y0ffset = offset; + case Z -> zOffset = offset; + } + } + + poseStack.translate( + x0ffset + (leftAxis == Direction.Axis.X ? 0.5f : 0.0f), + y0ffset + (leftAxis == Direction.Axis.Y ? 0.5f : 0.0f), + zOffset + (leftAxis == Direction.Axis.Z ? 0.5f : 0.0f)); + + // do the rotaty thingy yee + Quaternionf rot = new Quaternionf() + .rotateY(totalTick / 30); + poseStack.mulPose(rot); + + VertexConsumer consumer = bufferSource.getBuffer(Sheets.cutoutBlockSheet()); + RenderBufferHelper.renderCube( + consumer, + poseStack.last(), + EnumSet.of(Direction.UP, Direction.DOWN), + 0xFF88FFFF, + LightTexture.FULL_BRIGHT, + pentagramSprite, + -3.5f, 0, -3.5f, + 3.5f, 0, 3.5f); + + poseStack.popPose(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/WelderArmRender.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/WelderArmRender.java new file mode 100644 index 000000000..03d5f295d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/machine/WelderArmRender.java @@ -0,0 +1,72 @@ +package com.ghostipedia.cosmiccore.client.renderer.machine; + +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; + +import net.minecraft.client.renderer.MultiBufferSource; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.block.model.BakedQuad; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.util.RandomSource; +import net.minecraft.world.item.ItemDisplayContext; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.BlockAndTintGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.AABB; +import net.neoforged.neoforge.client.model.data.ModelData; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.serialization.MapCodec; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class WelderArmRender extends DynamicRender { + + public static final WelderArmRender INSTANCE = new WelderArmRender(); + public static final MapCodec CODEC = MapCodec.unit(INSTANCE); + public static final DynamicRenderType TYPE = new DynamicRenderType<>( + WelderArmRender.CODEC); + + @Override + public DynamicRenderType getType() { + return this.TYPE; + } + + @Override + public @NotNull List getRenderQuads(@Nullable WorkableElectricMultiblockMachine machine, + @Nullable BlockAndTintGetter level, @Nullable BlockPos pos, + @Nullable BlockState blockState, @Nullable Direction side, + RandomSource rand, @NotNull ModelData modelData, + @Nullable RenderType renderType) { + return super.getRenderQuads(machine, level, pos, blockState, side, rand, modelData, renderType); + } + + @Override + public void render(WorkableElectricMultiblockMachine machine, float partialTick, PoseStack poseStack, + MultiBufferSource buffer, int packedLight, int packedOverlay) {} + + @Override + public void renderByItem(ItemStack stack, ItemDisplayContext displayContext, PoseStack poseStack, + MultiBufferSource buffer, int packedLight, int packedOverlay) { + super.renderByItem(stack, displayContext, poseStack, buffer, packedLight, packedOverlay); + } + + @Override + public boolean shouldRenderOffScreen(WorkableElectricMultiblockMachine machine) { + return true; + } + + @Override + public int getViewDistance() { + return 256; + } + + @Override + public AABB getRenderBoundingBox(WorkableElectricMultiblockMachine machine) { + return super.getRenderBoundingBox(machine); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/client/renderer/utility/CosmicCoreRenderUtils.java b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/utility/CosmicCoreRenderUtils.java new file mode 100644 index 000000000..641caba7d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/client/renderer/utility/CosmicCoreRenderUtils.java @@ -0,0 +1,17 @@ +package com.ghostipedia.cosmiccore.client.renderer.utility; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.inventory.InventoryMenu; + +import com.mojang.blaze3d.systems.RenderSystem; + +public class CosmicCoreRenderUtils { + + public static void bindTexture(ResourceLocation resloc) { + RenderSystem.setShaderTexture(0, resloc); + } + + public static void bindBlockAtlas() { + bindTexture(InventoryMenu.BLOCK_ATLAS); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/abyss/AbyssBudget.java b/src/main/java/com/ghostipedia/cosmiccore/common/abyss/AbyssBudget.java new file mode 100644 index 000000000..2807522fe --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/abyss/AbyssBudget.java @@ -0,0 +1,96 @@ +package com.ghostipedia.cosmiccore.common.abyss; + +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.neoforged.neoforge.common.util.INBTSerializable; + +import java.util.HashMap; +import java.util.Map; + +public class AbyssBudget implements IAbyssTimer, INBTSerializable { + + @Override + public CompoundTag serializeNBT(HolderLookup.Provider provider) { + CompoundTag tag = tagSave(); + return tag != null ? tag : new CompoundTag(); + } + + @Override + public void deserializeNBT(HolderLookup.Provider provider, CompoundTag nbt) { + if (nbt != null) { + tagLoad(nbt); + } + } + + private final Map timeRemaining = new HashMap<>(); + private final Map decay = new HashMap<>(); + private final Map cleanse = new HashMap<>(); + + // spotless: off + @Override + public long getRemainingTicks(ResourceKey dimension) { + return timeRemaining.getOrDefault(dimension.location(), -1L); + } + + @Override + public void setRemainingTicks(ResourceKey dimension, long ticks) { + timeRemaining.put(dimension.location(), ticks); + } + + @Override + public boolean isDecaying(ResourceKey dimension) { + return decay.getOrDefault(dimension.location(), false); + } + + @Override + public void setDecaying(ResourceKey dimension, boolean decaying) { + decay.put(dimension.location(), decaying); + } + + @Override + public double getCleanse(ResourceKey dimension) { + return cleanse.getOrDefault(dimension.location(), 0d); + } + + @Override + public void setCleanse(ResourceKey dimension, double amount) { + cleanse.put(dimension.location(), amount); + } + // spotless: on + + public CompoundTag tagSave() { + CompoundTag tag = new CompoundTag(); + ListTag listTag = new ListTag(); + + for (var i : timeRemaining.entrySet()) { + CompoundTag abyssTagData = new CompoundTag(); + abyssTagData.putString("dimension", i.getKey().toString()); + abyssTagData.putLong("ticks", i.getValue()); + abyssTagData.putBoolean("decaying", decay.getOrDefault(i.getKey(), false)); + abyssTagData.putDouble("cleanse", cleanse.getOrDefault(i.getKey(), 0d)); + listTag.add(abyssTagData); + } + tag.put("entries", listTag); + return tag; + } + + public void tagLoad(CompoundTag tag) { + timeRemaining.clear(); + decay.clear(); + cleanse.clear(); + ListTag listTag = tag.getList("entries", ListTag.TAG_COMPOUND); + + for (Tag tagDat : listTag) { + CompoundTag compoundTag = (CompoundTag) tagDat; + var resLoc = ResourceLocation.parse(compoundTag.getString("dimension")); + timeRemaining.put(resLoc, compoundTag.getLong("ticks")); + decay.put(resLoc, compoundTag.getBoolean("decaying")); + cleanse.put(resLoc, compoundTag.getDouble("cleanse")); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/abyss/AbyssLogic.java b/src/main/java/com/ghostipedia/cosmiccore/common/abyss/AbyssLogic.java new file mode 100644 index 000000000..b177f3ba9 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/abyss/AbyssLogic.java @@ -0,0 +1,135 @@ +package com.ghostipedia.cosmiccore.common.abyss; + +import java.util.Optional; +import com.ghostipedia.cosmiccore.common.data.CosmicAttachmentTypes; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.network.packet.AbyssTimeWarnPacket; +import com.ghostipedia.cosmiccore.common.network.packet.SyncTimeBarPacket; + +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; +import net.neoforged.neoforge.event.tick.PlayerTickEvent; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; + +import static com.ghostipedia.cosmiccore.common.abyss.AbyssRules.WARNINGS; + +@EventBusSubscriber(modid = CosmicCore.MOD_ID) +public final class AbyssLogic { + + @SubscribeEvent + public static void onPlayerTick(PlayerTickEvent.Post event) { + if (event.getEntity().level().isClientSide) return; + + ServerPlayer player = (ServerPlayer) event.getEntity(); + ServerLevel level = player.serverLevel(); + + Optional.of(player.getData(CosmicAttachmentTypes.ABYSS_BUDGET)).ifPresent(cap -> { + if (cap.getRemainingTicks(AbyssRules.DIM) < 0) { + cap.setRemainingTicks(AbyssRules.DIM, AbyssRules.FIRST_ENTRY_TICKS); + cap.setDecaying(AbyssRules.DIM, level.dimension().equals(AbyssRules.DIM)); + } + + boolean inAbyss = level.dimension().equals(AbyssRules.DIM); + + if (inAbyss) { + if (cap.isDecaying(AbyssRules.DIM)) { + long left = cap.getRemainingTicks(AbyssRules.DIM); + if (left > 0) { + long next = left - 1; + cap.setRemainingTicks(AbyssRules.DIM, next); + warnPlayer(player, next / 20); + } else { + executePlayer(player, cap); + } + } + } else { + long current = cap.getRemainingTicks(AbyssRules.DIM); + if (current < AbyssRules.MAX_TICKS) { + double buffer = cap.getCleanse(AbyssRules.DIM) + (AbyssRules.REGEN_PER_SECOND / 20.0); + long recovered = (long) (buffer * 20.0); + double remainder = buffer - (recovered / 20.0); + if (recovered > 0) { + cap.setRemainingTicks(AbyssRules.DIM, Math.min(AbyssRules.MAX_TICKS, current + recovered)); + } + cap.setCleanse(AbyssRules.DIM, remainder); + } + } + + // HUD sync (every 10 ticks) + if ((level.getGameTime() % 10) == 0) { + if (inAbyss) { + sendHUD(player, cap.getRemainingTicks(AbyssRules.DIM), AbyssRules.MAX_TICKS); + } else { + hideHUD(player); + } + } + }); + } + + @SubscribeEvent + public static void onDimChange(PlayerEvent.PlayerChangedDimensionEvent event) { + if (event.getEntity().level().isClientSide) return; + ServerPlayer player = (ServerPlayer) event.getEntity(); + + Optional.of(player.getData(CosmicAttachmentTypes.ABYSS_BUDGET)).ifPresent(cap -> { + boolean nowInAbyss = player.level().dimension().equals(AbyssRules.DIM); + cap.setDecaying(AbyssRules.DIM, nowInAbyss); + + if (nowInAbyss) { + sendHUD(player, cap.getRemainingTicks(AbyssRules.DIM), AbyssRules.MAX_TICKS); + } else { + hideHUD(player); + } + }); + } + + @SubscribeEvent + public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { + if (event.getEntity().level().isClientSide) return; + ServerPlayer player = (ServerPlayer) event.getEntity(); + + Optional.of(player.getData(CosmicAttachmentTypes.ABYSS_BUDGET)).ifPresent(cap -> { + if (cap.getRemainingTicks(AbyssRules.DIM) < 0) { + cap.setRemainingTicks(AbyssRules.DIM, AbyssRules.FIRST_ENTRY_TICKS); + } + cap.setDecaying(AbyssRules.DIM, player.level().dimension().equals(AbyssRules.DIM)); + + if (player.level().dimension().equals(AbyssRules.DIM)) { + sendHUD(player, cap.getRemainingTicks(AbyssRules.DIM), AbyssRules.MAX_TICKS); + } else { + hideHUD(player); + } + }); + } + + private static void warnPlayer(ServerPlayer player, long secondsLeft) { + for (int s : WARNINGS) { + if (secondsLeft == s) { + CCoreNetwork.sendToPlayer(player, + new AbyssTimeWarnPacket(Component.translatable("abyss.warning.notice", s))); + return; + } + } + } + + // OBLITERATE THE OFFENDER - GET OUT! GET OUT! GET OUT! GET OUT! GET OUT! GET OUT! GET OUT! GET OUT! GET OUT! GET + // OUT! + private static void executePlayer(ServerPlayer player, IAbyssTimer cap) { + cap.setDecaying(AbyssRules.DIM, false); + hideHUD(player); + player.hurt(player.damageSources().fellOutOfWorld(), Float.MAX_VALUE); + } + + private static void sendHUD(ServerPlayer player, long remain, long max) { + CCoreNetwork.sendToPlayer(player, new SyncTimeBarPacket(AbyssRules.DIM.location(), remain, max)); + } + + private static void hideHUD(ServerPlayer player) { + CCoreNetwork.sendToPlayer(player, new SyncTimeBarPacket(AbyssRules.DIM.location(), -1, 0)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/abyss/AbyssRules.java b/src/main/java/com/ghostipedia/cosmiccore/common/abyss/AbyssRules.java new file mode 100644 index 000000000..93838389d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/abyss/AbyssRules.java @@ -0,0 +1,28 @@ +package com.ghostipedia.cosmiccore.common.abyss; + +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; + +public final class AbyssRules { + + private AbyssRules() {} + + // Dimension to Target. + public static final ResourceKey DIM = ResourceKey.create(Registries.DIMENSION, + ResourceLocation.fromNamespaceAndPath("frontiers", "the_deep_below")); + + public static final long MAX_TICKS = 20L * 3600; // Max 1HR + public static final long FIRST_ENTRY_TICKS = 20L * 600; // 10M + public static final double REGEN_PER_SECOND = 0.25; // By Default Regen 1s of time per 4s without external + // intervention. + public static final AbyssAction TIMEOUT = AbyssAction.DEATH; + public static final int[] WARNINGS = { 600, 300, 60, 30, 10, 5 }; + + // Enum if I want to add extra behaviors *or* change it. + public enum AbyssAction { + EJECT, + DEATH + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/abyss/IAbyssTimer.java b/src/main/java/com/ghostipedia/cosmiccore/common/abyss/IAbyssTimer.java new file mode 100644 index 000000000..07d30254a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/abyss/IAbyssTimer.java @@ -0,0 +1,19 @@ +package com.ghostipedia.cosmiccore.common.abyss; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; + +public interface IAbyssTimer { + + long getRemainingTicks(ResourceKey dimension); + + void setRemainingTicks(ResourceKey dimension, long ticks); + + boolean isDecaying(ResourceKey dimension); + + void setDecaying(ResourceKey dimension, boolean decaying); + + double getCleanse(ResourceKey dimension); + + void setCleanse(ResourceKey dimension, double amount); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicInputBusPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicInputBusPartMachine.java new file mode 100644 index 000000000..04767dfa7 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicInputBusPartMachine.java @@ -0,0 +1,216 @@ +package com.ghostipedia.cosmiccore.common.ae2gt; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.common.data.item.GTDataComponents; +import com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour; +import com.gregtechceu.gtceu.integration.ae2.gui.widget.AEItemConfigWidget; +import com.gregtechceu.gtceu.integration.ae2.machine.MEBusPartMachine; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEItemList; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEItemSlot; +import com.gregtechceu.gtceu.utils.GTMath; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.utils.Position; + +import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponents; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; + +import appeng.api.config.Actionable; +import appeng.api.stacks.GenericStack; +import appeng.api.storage.MEStorage; + +public class CosmicInputBusPartMachine extends MEBusPartMachine implements IDataStickInteractable { + + + protected final static int CONFIG_SIZE = 1; + + protected ExportOnlyAEItemList aeItemHandler; + + public CosmicInputBusPartMachine(BlockEntityCreationInfo holder) { + super(holder, IO.IN); + super.circuitSlotEnabled = false; + } + + ///////////////////////////////// + // ***** Machine LifeCycle ****// + ///////////////////////////////// + + @Override + public void onMachineDestroyed() { + flushInventory(); + } + + @Override + protected NotifiableItemStackHandler createInventory() { + this.aeItemHandler = new ExportOnlyAEItemList(this, CONFIG_SIZE); + return this.aeItemHandler; + } + + + ///////////////////////////////// + // ********** Sync ME *********// + ///////////////////////////////// + + @Override + public void autoIO() { + if (!this.isWorkingEnabled()) return; + if (!this.shouldSyncME()) return; + + if (this.updateMEStatus()) { + this.syncME(); + this.updateInventorySubscription(); + } + } + + protected void syncME() { + MEStorage networkInv = this.getMainNode().getGrid().getStorageService().getInventory(); + for (ExportOnlyAEItemSlot aeSlot : this.aeItemHandler.getInventory()) { + // Try to clear the wrong item + GenericStack exceedItem = aeSlot.exceedStack(); + if (exceedItem != null) { + long total = exceedItem.amount(); + long inserted = networkInv.insert(exceedItem.what(), exceedItem.amount(), Actionable.MODULATE, + this.actionSource); + if (inserted > 0) { + aeSlot.extractItem(0, GTMath.saturatedCast(inserted), false); + continue; + } else { + aeSlot.extractItem(0, GTMath.saturatedCast(total), false); + } + } + // Fill it + GenericStack reqItem = aeSlot.requestStack(); + if (reqItem != null) { + long extracted = networkInv.extract(reqItem.what(), reqItem.amount(), Actionable.MODULATE, + this.actionSource); + if (extracted != 0) { + aeSlot.addStack(new GenericStack(reqItem.what(), extracted)); + } + } + } + } + + protected void flushInventory() { + var grid = getMainNode().getGrid(); + if (grid != null) { + for (var aeSlot : aeItemHandler.getInventory()) { + GenericStack stock = aeSlot.getStock(); + if (stock != null) { + grid.getStorageService().getInventory().insert(stock.what(), stock.amount(), Actionable.MODULATE, + actionSource); + } + } + } + } + + /////////////////////////////// + // ********** GUI ***********// + /////////////////////////////// + + @Override + public Widget createUIWidget() { + WidgetGroup group = new WidgetGroup(new Position(0, 0)); + // ME Network status + group.addWidget(new LabelWidget(3, 0, () -> this.isOnline ? + "gtceu.gui.me_network.online" : + "gtceu.gui.me_network.offline")); + + // Config slots + group.addWidget(new AEItemConfigWidget(46, 30, this.aeItemHandler)); + + return group; + } + + @Override + public ModularUI createUI(Player entityPlayer) { + return new ModularUI(176, 50, this, entityPlayer).widget(new FancyMachineUIWidget(this, 176, 50)); + } + //////////////////////////////// + // ******* Interaction *******// + //////////////////////////////// + + @Override + public final InteractionResult onDataStickShiftUse(Player player, ItemStack dataStick) { + if (!isRemote()) { + CompoundTag tag = new CompoundTag(); + tag.put("MEInputBus", writeConfigToTag(player.registryAccess())); + dataStick.set(GTDataComponents.DATA_COPY_TAG, CustomData.of(tag)); + dataStick.set(DataComponents.CUSTOM_NAME, + Component.translatable("gtceu.machine.me.item_import.data_stick.name")); + player.sendSystemMessage(Component.translatable("gtceu.machine.me.import_copy_settings")); + } + return InteractionResult.SUCCESS; + } + + @Override + public final InteractionResult onDataStickUse(Player player, ItemStack dataStick) { + CustomData tag = dataStick.get(GTDataComponents.DATA_COPY_TAG); + if (tag == null || !tag.contains("MEInputBus")) { + return InteractionResult.PASS; + } + + if (!isRemote()) { + readConfigFromTag(player.registryAccess(), tag.copyTag().getCompound("MEInputBus")); + this.updateInventorySubscription(); + player.sendSystemMessage(Component.translatable("gtceu.machine.me.import_paste_settings")); + } + return InteractionResult.sidedSuccess(isRemote()); + } + + //////////////////////////////// + // ****** Configuration ******// + //////////////////////////////// + + protected CompoundTag writeConfigToTag(HolderLookup.Provider provider) { + CompoundTag tag = new CompoundTag(); + CompoundTag configStacks = new CompoundTag(); + tag.put("ConfigStacks", configStacks); + for (int i = 0; i < CONFIG_SIZE; i++) { + var slot = this.aeItemHandler.getInventory()[i]; + GenericStack config = slot.getConfig(); + if (config == null) { + continue; + } + CompoundTag stackTag = GenericStack.writeTag(provider, config); + configStacks.put(Integer.toString(i), stackTag); + } + tag.putByte("GhostCircuit", + (byte) IntCircuitBehaviour.getCircuitConfiguration(circuitInventory.getStackInSlot(0))); + tag.putBoolean("DistinctBuses", isDistinct()); + return tag; + } + + protected void readConfigFromTag(HolderLookup.Provider provider, CompoundTag tag) { + if (tag.contains("ConfigStacks")) { + CompoundTag configStacks = tag.getCompound("ConfigStacks"); + for (int i = 0; i < CONFIG_SIZE; i++) { + String key = Integer.toString(i); + if (configStacks.contains(key)) { + CompoundTag configTag = configStacks.getCompound(key); + this.aeItemHandler.getInventory()[i].setConfig(GenericStack.readTag(provider, configTag)); + } else { + this.aeItemHandler.getInventory()[i].setConfig(null); + } + } + } + if (tag.contains("GhostCircuit")) { + circuitInventory.setStackInSlot(0, IntCircuitBehaviour.stack(tag.getByte("GhostCircuit"))); + } + if (tag.contains("DistinctBuses")) { + setDistinct(tag.getBoolean("DistinctBuses")); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicInputHatchPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicInputHatchPartMachine.java new file mode 100644 index 000000000..41685d4cf --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicInputHatchPartMachine.java @@ -0,0 +1,203 @@ +package com.ghostipedia.cosmiccore.common.ae2gt; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; +import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.common.data.item.GTDataComponents; +import com.gregtechceu.gtceu.integration.ae2.gui.widget.AEFluidConfigWidget; +import com.gregtechceu.gtceu.integration.ae2.machine.MEHatchPartMachine; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEFluidList; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEFluidSlot; +import com.gregtechceu.gtceu.utils.GTMath; + +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.utils.Position; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.component.DataComponents; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; + +import appeng.api.config.Actionable; +import appeng.api.stacks.GenericStack; +import appeng.api.storage.MEStorage; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class CosmicInputHatchPartMachine extends MEHatchPartMachine + implements IDataStickInteractable, IHasCircuitSlot { + + + protected ExportOnlyAEFluidList aeFluidHandler; + + public CosmicInputHatchPartMachine(BlockEntityCreationInfo holder) { + super(holder, IO.IN); + super.circuitSlotEnabled = false; + } + + @Override + public void onMachineDestroyed() { + flushInventory(); + } + + @Override + protected NotifiableFluidTank createTank(int initialCapacity, int slots) { + this.aeFluidHandler = new ExportOnlyAEFluidList(this, slots); + return aeFluidHandler; + } + + + ///////////////////////////////// + // ********** Sync ME *********// + ///////////////////////////////// + + @Override + protected void autoIO() { + if (!this.isWorkingEnabled()) return; + if (!this.shouldSyncME()) return; + + if (this.updateMEStatus()) { + this.syncME(); + this.updateTankSubscription(); + } + } + + protected void syncME() { + MEStorage networkInv = this.getMainNode().getGrid().getStorageService().getInventory(); + for (ExportOnlyAEFluidSlot aeTank : this.aeFluidHandler.getInventory()) { + // Try to clear the wrong fluid + GenericStack exceedFluid = aeTank.exceedStack(); + if (exceedFluid != null) { + int total = GTMath.saturatedCast(exceedFluid.amount()); + int inserted = GTMath + .saturatedCast(networkInv.insert(exceedFluid.what(), exceedFluid.amount(), Actionable.MODULATE, + this.actionSource)); + if (inserted > 0) { + aeTank.drain(inserted, IFluidHandler.FluidAction.EXECUTE); + continue; + } else { + aeTank.drain(total, IFluidHandler.FluidAction.EXECUTE); + } + } + // Fill it + GenericStack reqFluid = aeTank.requestStack(); + if (reqFluid != null) { + long extracted = networkInv.extract(reqFluid.what(), reqFluid.amount(), Actionable.MODULATE, + this.actionSource); + if (extracted > 0) { + aeTank.addStack(new GenericStack(reqFluid.what(), extracted)); + } + } + } + } + + protected void flushInventory() { + var grid = getMainNode().getGrid(); + if (grid != null) { + for (var aeSlot : aeFluidHandler.getInventory()) { + GenericStack stock = aeSlot.getStock(); + if (stock != null) { + grid.getStorageService().getInventory().insert(stock.what(), stock.amount(), Actionable.MODULATE, + actionSource); + } + } + } + } + + /////////////////////////////// + // ********** GUI ***********// + /////////////////////////////// + + @Override + public Widget createUIWidget() { + WidgetGroup group = new WidgetGroup(new Position(0, 0)); + // ME Network status + group.addWidget(new LabelWidget(3, 0, () -> this.isOnline ? + "gtceu.gui.me_network.online" : + "gtceu.gui.me_network.offline")); + + // Config slots + group.addWidget(new AEFluidConfigWidget(3, 10, this.aeFluidHandler)); + + return group; + } + + //////////////////////////////// + // ******* Interaction *******// + //////////////////////////////// + + @Override + public final InteractionResult onDataStickShiftUse(Player player, ItemStack dataStick) { + if (!isRemote()) { + CompoundTag tag = new CompoundTag(); + tag.put("MEInputHatch", writeConfigToTag(player.registryAccess())); + dataStick.set(GTDataComponents.DATA_COPY_TAG, CustomData.of(tag)); + dataStick.set(DataComponents.CUSTOM_NAME, + Component.translatable("gtceu.machine.me.fluid_import.data_stick.name")); + player.sendSystemMessage(Component.translatable("gtceu.machine.me.import_copy_settings")); + } + return InteractionResult.SUCCESS; + } + + @Override + public final InteractionResult onDataStickUse(Player player, ItemStack dataStick) { + CustomData tag = dataStick.get(GTDataComponents.DATA_COPY_TAG); + if (tag == null || !tag.contains("MEInputHatch")) { + return InteractionResult.PASS; + } + + if (!isRemote()) { + readConfigFromTag(player.registryAccess(), tag.copyTag().getCompound("MEInputHatch")); + this.updateTankSubscription(); + player.sendSystemMessage(Component.translatable("gtceu.machine.me.import_paste_settings")); + } + return InteractionResult.sidedSuccess(isRemote()); + } + + //////////////////////////////// + // ****** Configuration ******// + //////////////////////////////// + + protected CompoundTag writeConfigToTag(HolderLookup.Provider provider) { + CompoundTag tag = new CompoundTag(); + CompoundTag configStacks = new CompoundTag(); + tag.put("ConfigStacks", configStacks); + for (int i = 0; i < CONFIG_SIZE; i++) { + var slot = this.aeFluidHandler.getInventory()[i]; + GenericStack config = slot.getConfig(); + if (config == null) { + continue; + } + CompoundTag stackTag = GenericStack.writeTag(provider, config); + configStacks.put(Integer.toString(i), stackTag); + } + return tag; + } + + protected void readConfigFromTag(HolderLookup.Provider provider, CompoundTag tag) { + if (tag.contains("ConfigStacks")) { + CompoundTag configStacks = tag.getCompound("ConfigStacks"); + for (int i = 0; i < CONFIG_SIZE; i++) { + String key = Integer.toString(i); + if (configStacks.contains(key)) { + CompoundTag configTag = configStacks.getCompound(key); + this.aeFluidHandler.getInventory()[i].setConfig(GenericStack.readTag(provider, configTag)); + } else { + this.aeFluidHandler.getInventory()[i].setConfig(null); + } + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicStockingBusPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicStockingBusPartMachine.java new file mode 100644 index 000000000..4149e4861 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicStockingBusPartMachine.java @@ -0,0 +1,415 @@ +package com.ghostipedia.cosmiccore.common.ae2gt; + +import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel; +import com.gregtechceu.gtceu.api.gui.fancy.TabsWidget; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.fancyconfigurator.AutoStockingFancyConfigurator; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.integration.ae2.machine.feature.multiblock.IMEStockingPart; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEItemList; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEItemSlot; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAESlot; +import com.gregtechceu.gtceu.integration.ae2.slot.IConfigurableSlotList; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.DropSaved; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.ItemStack; + +import appeng.api.config.Actionable; +import appeng.api.networking.IGrid; +import appeng.api.stacks.AEItemKey; +import appeng.api.stacks.AEKey; +import appeng.api.stacks.GenericStack; +import appeng.api.storage.MEStorage; +import it.unimi.dsi.fastutil.objects.Object2LongMap; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.Nullable; + +import java.util.Comparator; +import java.util.PriorityQueue; +import java.util.function.Predicate; + +public class CosmicStockingBusPartMachine extends CosmicInputBusPartMachine implements IMEStockingPart { + + + @DescSynced + @Persisted + @Getter + private boolean autoPull; + + @Getter + @Setter + @Persisted + @DropSaved + private int minStackSize = 1; + @Getter + @Setter + @Persisted + @DropSaved + private int ticksPerCycle = 40; + + @Setter + private Predicate autoPullTest; + + public CosmicStockingBusPartMachine(BlockEntityCreationInfo holder) { + super(holder); + this.autoPullTest = $ -> false; + } + + @Override + public boolean isAutoPull() { + return autoPull; + } + + @Override + public void setAutoPullTest(Predicate autoPullTest) { + this.autoPullTest = autoPullTest; + } + + @Override + public int getMinStackSize() { + return minStackSize; + } + + @Override + public void setMinStackSize(int minStackSize) { + this.minStackSize = minStackSize; + } + + @Override + public int getTicksPerCycle() { + return ticksPerCycle; + } + + @Override + public void setTicksPerCycle(int ticksPerCycle) { + this.ticksPerCycle = ticksPerCycle; + } + ///////////////////////////////// + // ***** Machine LifeCycle ****// + ///////////////////////////////// + + @Override + public void addedToController(MultiblockControllerMachine controller) { + super.addedToController(controller); + IMEStockingPart.super.addedToController(controller); + } + + @Override + public void removedFromController(MultiblockControllerMachine controller) { + IMEStockingPart.super.removedFromController(controller); + super.removedFromController(controller); + } + + @Override + protected NotifiableItemStackHandler createInventory() { + this.aeItemHandler = new CosmicStockingBusPartMachine.ExportOnlyAEStockingItemList(this, CONFIG_SIZE); + return this.aeItemHandler; + } + + + ///////////////////////////////// + // ********** Sync ME *********// + ///////////////////////////////// + + @Override + public void autoIO() { + super.autoIO(); + if (ticksPerCycle == 0) ticksPerCycle = ConfigHolder.INSTANCE.compat.ae2.updateIntervals; // Emergency Check to + // Avoid Crash loops. + if (getOffsetTimer() % ticksPerCycle == 0) { + if (autoPull) { + refreshList(); + } + syncME(); + } + } + + @Override + protected void syncME() { + // Update the visual display for the fake items. This also is important for the item handler's + // getStackInSlot() method, as it uses the cached items set here. + MEStorage networkInv = this.getMainNode().getGrid().getStorageService().getInventory(); + for (ExportOnlyAEItemSlot slot : this.aeItemHandler.getInventory()) { + var config = slot.getConfig(); + if (config != null) { + // Try to fill the slot + var key = config.what(); + long extracted = networkInv.extract(key, Long.MAX_VALUE, Actionable.SIMULATE, actionSource); + if (extracted >= minStackSize) { + slot.setStock(new GenericStack(key, extracted)); + continue; + } + } + slot.setStock(null); + } + } + + @Override + public void attachSideTabs(TabsWidget sideTabs) { + sideTabs.setMainTab(this); // removes the cover configurator, it's pointless and clashes with layout. + } + + @Override + protected void flushInventory() { + // no-op, nothing to send back to the network + } + + @Override + public void setDistinct(boolean isDistinct) { + super.setDistinct(isDistinct); + if (!isRemote() && !isDistinct) { + // Ensure that our configured items won't match any other buses in the multiblock. + // Needed since we allow duplicates in distinct mode on, but not off + validateConfig(); + } + } + + @Override + public IConfigurableSlotList getSlotList() { + return aeItemHandler; + } + + @Override + public boolean testConfiguredInOtherPart(@Nullable GenericStack config) { + if (config == null) return false; + // In distinct mode, we don't need to check other buses since only one bus can run a recipe at a time. + if (!isFormed() || isDistinct()) return false; + + // Otherwise, we need to test for if the item is configured + // in any stocking bus in the multi (besides ourselves). + for (MultiblockControllerMachine controller : getControllers()) { + for (IMultiPart part : controller.getParts()) { + if (part instanceof CosmicStockingBusPartMachine bus) { + // We don't need to check for ourselves, as this case is handled elsewhere. + if (bus == this || bus.isDistinct()) continue; + if (bus.aeItemHandler.hasStackInConfig(config, false)) { + return true; + } + } + } + } + return false; + } + + @Override + public void setAutoPull(boolean autoPull) { + this.autoPull = autoPull; + if (!isRemote()) { + if (!this.autoPull) { + this.aeItemHandler.clearInventory(0); + } else if (updateMEStatus()) { + this.refreshList(); + updateInventorySubscription(); + } + } + } + + /** + * Refresh the configuration list in auto-pull mode. + * Sets the config to the CONFIG_SIZE items with the highest amount in the ME system. + */ + private void refreshList() { + IGrid grid = this.getMainNode().getGrid(); + if (grid == null) { + aeItemHandler.clearInventory(0); + return; + } + + MEStorage networkStorage = grid.getStorageService().getInventory(); + var counter = networkStorage.getAvailableStacks(); + + // Use a PriorityQueue to sort the stacks on size, take the first CONFIG_SIZE + // biggest stacks. + PriorityQueue> topItems = new PriorityQueue<>( + Comparator.comparingLong(Object2LongMap.Entry::getLongValue)); + + for (Object2LongMap.Entry entry : counter) { + long amount = entry.getLongValue(); + AEKey what = entry.getKey(); + + if (amount <= 0) continue; + if (!(what instanceof AEItemKey itemKey)) continue; + + long request = networkStorage.extract(what, amount, Actionable.SIMULATE, actionSource); + if (request == 0) continue; + + // Ensure that it is valid to configure with this stack + if (autoPullTest != null && !autoPullTest.test(new GenericStack(itemKey, amount))) continue; + if (amount >= minStackSize) { + if (topItems.size() < CONFIG_SIZE) { + topItems.offer(entry); + } else if (amount > topItems.peek().getLongValue()) { + topItems.poll(); + topItems.offer(entry); + } + } + } + + // Now, topItems is a PQ with CONFIG_SIZE highest amount items in the system. + int index; + int itemAmount = topItems.size(); + for (index = 0; index < CONFIG_SIZE; index++) { + if (topItems.isEmpty()) break; + Object2LongMap.Entry entry = topItems.poll(); + + AEKey what = entry.getKey(); + long amount = entry.getLongValue(); + + // If we get here, the item has already been checked by the PQ. + long request = networkStorage.extract(what, amount, Actionable.SIMULATE, actionSource); + + // Since we want our items to be displayed from highest to lowest, but poll() returns + // the lowest first, we fill in the slots starting at itemAmount-1 + var slot = this.aeItemHandler.getInventory()[itemAmount - index - 1]; + slot.setConfig(new GenericStack(what, 1)); + slot.setStock(new GenericStack(what, request)); + } + + aeItemHandler.clearInventory(index); + } + + /////////////////////////////// + // ********** GUI ***********// + /////////////////////////////// + + @Override + public void attachConfigurators(ConfiguratorPanel configuratorPanel) { + IMEStockingPart.super.attachConfigurators(configuratorPanel); + // super.attachConfigurators(configuratorPanel); + configuratorPanel.attachConfigurators(new AutoStockingFancyConfigurator(this)); + } + + @Override + protected InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { + if (!isRemote()) { + setAutoPull(!autoPull); + if (autoPull) { + context.getPlayer().sendSystemMessage( + Component.translatable("gtceu.machine.me.stocking_auto_pull_enabled")); + } else { + context.getPlayer().sendSystemMessage( + Component.translatable("gtceu.machine.me.stocking_auto_pull_disabled")); + } + } + return InteractionResult.sidedSuccess(isRemote()); + } + + //////////////////////////////// + // ****** Configuration ******// + //////////////////////////////// + + @Override + protected CompoundTag writeConfigToTag(HolderLookup.Provider provider) { + if (!autoPull) { + CompoundTag tag = super.writeConfigToTag(provider); + tag.putBoolean("AutoPull", false); + return tag; + } + // if in auto-pull, no need to write actual configured slots, but still need to write the ghost circuit + CompoundTag tag = new CompoundTag(); + tag.putBoolean("AutoPull", true); + return tag; + } + + @Override + protected void readConfigFromTag(HolderLookup.Provider provider, CompoundTag tag) { + if (tag.getBoolean("AutoPull")) { + // if being set to auto-pull, no need to read the configured slots + this.setAutoPull(true); + return; + } + // set auto pull first to avoid issues with clearing the config after reading from the data stick + this.setAutoPull(false); + super.readConfigFromTag(provider, tag); + } + + private class ExportOnlyAEStockingItemList extends ExportOnlyAEItemList { + + public ExportOnlyAEStockingItemList(MetaMachine holder, int slots) { + super(holder, slots, CosmicStockingBusPartMachine.ExportOnlyAEStockingItemSlot::new); + } + + @Override + public boolean isAutoPull() { + return autoPull; + } + + @Override + public boolean isStocking() { + return true; + } + + @Override + public boolean hasStackInConfig(GenericStack stack, boolean checkExternal) { + boolean inThisBus = super.hasStackInConfig(stack, false); + if (inThisBus) return true; + if (checkExternal) { + return testConfiguredInOtherPart(stack); + } + return false; + } + } + + private class ExportOnlyAEStockingItemSlot extends ExportOnlyAEItemSlot { + + public ExportOnlyAEStockingItemSlot() { + super(); + } + + public ExportOnlyAEStockingItemSlot(@Nullable GenericStack config, @Nullable GenericStack stock) { + super(config, stock); + } + + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + if (slot == 0 && this.stock != null) { + if (this.config != null) { + // Extract the items from the real net to either validate (simulate) + // or extract (modulate) when this is called + if (!isOnline()) return ItemStack.EMPTY; + MEStorage aeNetwork = getMainNode().getGrid().getStorageService().getInventory(); + + Actionable action = simulate ? Actionable.SIMULATE : Actionable.MODULATE; + var key = config.what(); + long extracted = aeNetwork.extract(key, amount, action, actionSource); + + if (extracted > 0) { + ItemStack resultStack = key instanceof AEItemKey itemKey ? + itemKey.toStack((int) extracted) : ItemStack.EMPTY; + if (!simulate) { + // may as well update the display here + this.stock = ExportOnlyAESlot.copy(stock, stock.amount() - extracted); + if (this.stock.amount() == 0) { + this.stock = null; + } + if (this.onContentsChanged != null) { + this.onContentsChanged.run(); + } + } + return resultStack; + } + } + } + return ItemStack.EMPTY; + } + + @Override + public CosmicStockingBusPartMachine.ExportOnlyAEStockingItemSlot copy() { + return new CosmicStockingBusPartMachine.ExportOnlyAEStockingItemSlot( + this.config == null ? null : copy(this.config), + this.stock == null ? null : copy(this.stock)); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicStockingHatchPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicStockingHatchPartMachine.java new file mode 100644 index 000000000..50fb06c51 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/ae2gt/CosmicStockingHatchPartMachine.java @@ -0,0 +1,401 @@ +package com.ghostipedia.cosmiccore.common.ae2gt; + +import com.gregtechceu.gtceu.api.gui.fancy.ConfiguratorPanel; +import com.gregtechceu.gtceu.api.gui.fancy.TabsWidget; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.fancyconfigurator.AutoStockingFancyConfigurator; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.integration.ae2.machine.feature.multiblock.IMEStockingPart; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEFluidList; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEFluidSlot; +import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAESlot; +import com.gregtechceu.gtceu.integration.ae2.slot.IConfigurableSlotList; +import com.gregtechceu.gtceu.integration.ae2.utils.AEUtil; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.DropSaved; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionResult; +import net.neoforged.neoforge.fluids.FluidStack; + +import appeng.api.config.Actionable; +import appeng.api.networking.IGrid; +import appeng.api.stacks.AEFluidKey; +import appeng.api.stacks.AEKey; +import appeng.api.stacks.GenericStack; +import appeng.api.storage.MEStorage; +import it.unimi.dsi.fastutil.objects.Object2LongMap; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.Nullable; + +import java.util.Comparator; +import java.util.PriorityQueue; +import java.util.function.Predicate; + +public class CosmicStockingHatchPartMachine extends CosmicInputHatchPartMachine implements IMEStockingPart { + + + private static final int CONFIG_SIZE = 1; + + @DescSynced + @Persisted + @Getter + private boolean autoPull; + + @Getter + @Setter + @Persisted + @DropSaved + private int minStackSize = 1; + + @Getter + @Setter + @Persisted + @DropSaved + private int ticksPerCycle = 40; + + @Setter + private Predicate autoPullTest; + + public CosmicStockingHatchPartMachine(BlockEntityCreationInfo holder) { + super(holder); + this.autoPullTest = $ -> false; + } + + @Override + public boolean isAutoPull() { + return autoPull; + } + + @Override + public void setAutoPullTest(Predicate autoPullTest) { + this.autoPullTest = autoPullTest; + } + + @Override + public int getMinStackSize() { + return minStackSize; + } + + @Override + public void setMinStackSize(int minStackSize) { + this.minStackSize = minStackSize; + } + + @Override + public int getTicksPerCycle() { + return ticksPerCycle; + } + + @Override + public void setTicksPerCycle(int ticksPerCycle) { + this.ticksPerCycle = ticksPerCycle; + } + + @Override + public void addedToController(MultiblockControllerMachine controller) { + super.addedToController(controller); + IMEStockingPart.super.addedToController(controller); + } + + @Override + public void removedFromController(MultiblockControllerMachine controller) { + IMEStockingPart.super.removedFromController(controller); + super.removedFromController(controller); + } + + @Override + protected NotifiableFluidTank createTank(int initialCapacity, int slots) { + this.aeFluidHandler = new CosmicStockingHatchPartMachine.ExportOnlyAEStockingFluidList(this, CONFIG_SIZE); + return this.aeFluidHandler; + } + + + ///////////////////////////////// + // ********** Sync ME *********// + ///////////////////////////////// + + @Override + public void autoIO() { + super.autoIO(); + if (ticksPerCycle == 0) ticksPerCycle = ConfigHolder.INSTANCE.compat.ae2.updateIntervals; // Emergency Check to + // Avoid Crash loops. + if (getOffsetTimer() % ticksPerCycle == 0) { + if (autoPull) { + refreshList(); + } + syncME(); + } + } + + @Override + protected void syncME() { + MEStorage networkInv = this.getMainNode().getGrid().getStorageService().getInventory(); + for (ExportOnlyAEFluidSlot slot : aeFluidHandler.getInventory()) { + var config = slot.getConfig(); + if (config != null) { + // Try to fill the slot + var key = config.what(); + long extracted = networkInv.extract(key, Long.MAX_VALUE, Actionable.SIMULATE, actionSource); + if (extracted >= minStackSize) { + slot.setStock(new GenericStack(key, extracted)); + continue; + } + } + slot.setStock(null); + } + } + + @Override + public void attachSideTabs(TabsWidget sideTabs) { + sideTabs.setMainTab(this); // removes the cover configurator, it's pointless and clashes with layout. + } + + @Override + protected void flushInventory() { + // no-op, nothing to send back to the network + } + + @Override + public IConfigurableSlotList getSlotList() { + return aeFluidHandler; + } + + @Override + public boolean testConfiguredInOtherPart(@Nullable GenericStack config) { + if (config == null) return false; + if (!isFormed()) return false; + + for (MultiblockControllerMachine controller : getControllers()) { + for (IMultiPart part : controller.getParts()) { + if (part instanceof CosmicStockingHatchPartMachine hatch) { + if (hatch == this) continue; + if (hatch.aeFluidHandler.hasStackInConfig(config, false)) { + return true; + } + } + } + } + return false; + } + + @Override + public void setAutoPull(boolean autoPull) { + this.autoPull = autoPull; + if (!isRemote()) { + if (!this.autoPull) { + this.aeFluidHandler.clearInventory(0); + } else if (updateMEStatus()) { + this.refreshList(); + updateTankSubscription(); + } + } + } + + private void refreshList() { + IGrid grid = this.getMainNode().getGrid(); + if (grid == null) { + aeFluidHandler.clearInventory(0); + return; + } + + MEStorage networkStorage = grid.getStorageService().getInventory(); + var counter = networkStorage.getAvailableStacks(); + + // Use a PriorityQueue to sort the stacks on size, take the first CONFIG_SIZE + // biggest stacks. + PriorityQueue> topFluids = new PriorityQueue<>( + Comparator.comparingLong(Object2LongMap.Entry::getLongValue)); + + for (Object2LongMap.Entry entry : counter) { + long amount = entry.getLongValue(); + AEKey what = entry.getKey(); + + if (amount <= 0) continue; + if (!(what instanceof AEFluidKey fluidKey)) continue; + + long request = networkStorage.extract(what, amount, Actionable.SIMULATE, actionSource); + if (request == 0) continue; + + // Ensure that it is valid to configure with this stack + if (autoPullTest != null && !autoPullTest.test(new GenericStack(fluidKey, amount))) continue; + if (amount >= minStackSize) { + if (topFluids.size() < CONFIG_SIZE) { + topFluids.offer(entry); + } else if (amount > topFluids.peek().getLongValue()) { + topFluids.poll(); + topFluids.offer(entry); + } + } + } + + // Now, topFluids is a PQ with CONFIG_SIZE highest amount fluids in the system. + int index; + int fluidAmount = topFluids.size(); + for (index = 0; index < CONFIG_SIZE; index++) { + if (topFluids.isEmpty()) break; + Object2LongMap.Entry entry = topFluids.poll(); + AEKey what = entry.getKey(); + long amount = entry.getLongValue(); + + // If we get here, the fluid has already been checked by the PQ. + long request = networkStorage.extract(what, amount, Actionable.SIMULATE, actionSource); + + // Since we want our fluids to be displayed from highest to lowest, but poll() returns + // the lowest first, we fill in the slots starting at fluidAmount-1 + var slot = this.aeFluidHandler.getInventory()[fluidAmount - index - 1]; + slot.setConfig(new GenericStack(what, 1)); + slot.setStock(new GenericStack(what, request)); + } + + aeFluidHandler.clearInventory(index); + } + + /////////////////////////////// + // ********** GUI ***********// + /////////////////////////////// + + @Override + public void attachConfigurators(ConfiguratorPanel configuratorPanel) { + IMEStockingPart.super.attachConfigurators(configuratorPanel); + // super.attachConfigurators(configuratorPanel); + configuratorPanel.attachConfigurators(new AutoStockingFancyConfigurator(this)); + } + + //////////////////////////////// + // ******* Interaction *******// + //////////////////////////////// + + @Override + protected InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { + if (!isRemote()) { + setAutoPull(!autoPull); + if (autoPull) { + context.getPlayer().sendSystemMessage( + Component.translatable("gtceu.machine.me.stocking_auto_pull_enabled")); + } else { + context.getPlayer().sendSystemMessage( + Component.translatable("gtceu.machine.me.stocking_auto_pull_disabled")); + } + } + return InteractionResult.sidedSuccess(isRemote()); + } + + //////////////////////////////// + // ****** Configuration ******// + //////////////////////////////// + + @Override + protected CompoundTag writeConfigToTag(HolderLookup.Provider provider) { + if (!autoPull) { + CompoundTag tag = super.writeConfigToTag(provider); + tag.putBoolean("AutoPull", false); + return tag; + } + // if in auto-pull, no need to write actual configured slots, but still need to write the ghost circuit + CompoundTag tag = new CompoundTag(); + tag.putBoolean("AutoPull", true); + tag.putByte("GhostCircuit", + (byte) IntCircuitBehaviour.getCircuitConfiguration(circuitInventory.getStackInSlot(0))); + return tag; + } + + @Override + protected void readConfigFromTag(HolderLookup.Provider provider, CompoundTag tag) { + if (tag.getBoolean("AutoPull")) { + // if being set to auto-pull, no need to read the configured slots + this.setAutoPull(true); + circuitInventory.setStackInSlot(0, IntCircuitBehaviour.stack(tag.getByte("GhostCircuit"))); + return; + } + // set auto pull first to avoid issues with clearing the config after reading from the data stick + this.setAutoPull(false); + super.readConfigFromTag(provider, tag); + } + + private class ExportOnlyAEStockingFluidList extends ExportOnlyAEFluidList { + + public ExportOnlyAEStockingFluidList(MetaMachine holder, int slots) { + super(holder, slots, CosmicStockingHatchPartMachine.ExportOnlyAEStockingFluidSlot::new); + } + + @Override + public boolean isAutoPull() { + return autoPull; + } + + @Override + public boolean isStocking() { + return true; + } + + @Override + public boolean hasStackInConfig(GenericStack stack, boolean checkExternal) { + boolean inThisHatch = super.hasStackInConfig(stack, false); + if (inThisHatch) return true; + if (checkExternal) { + return testConfiguredInOtherPart(stack); + } + return false; + } + } + + private class ExportOnlyAEStockingFluidSlot extends ExportOnlyAEFluidSlot { + + public ExportOnlyAEStockingFluidSlot() { + super(); + } + + public ExportOnlyAEStockingFluidSlot(@Nullable GenericStack config, @Nullable GenericStack stock) { + super(config, stock); + } + + @Override + public ExportOnlyAEFluidSlot copy() { + return new CosmicStockingHatchPartMachine.ExportOnlyAEStockingFluidSlot( + this.config == null ? null : copy(this.config), + this.stock == null ? null : copy(this.stock)); + } + + @Override + public FluidStack drain(int maxDrain, FluidAction action) { + if (this.stock != null && this.config != null) { + // Extract the items from the real net to either validate (simulate) + // or extract (modulate) when this is called + if (!isOnline()) return FluidStack.EMPTY; + MEStorage aeNetwork = getMainNode().getGrid().getStorageService().getInventory(); + + Actionable actionable = action.simulate() ? Actionable.SIMULATE : Actionable.MODULATE; + var key = config.what(); + long extracted = aeNetwork.extract(key, maxDrain, actionable, actionSource); + + if (extracted > 0) { + FluidStack resultStack = key instanceof AEFluidKey fluidKey ? + AEUtil.toFluidStack(fluidKey, extracted) : FluidStack.EMPTY; + if (action.execute()) { + // may as well update the display here + this.stock = ExportOnlyAESlot.copy(stock, stock.amount() - extracted); + if (this.stock.amount() == 0) { + this.stock = null; + } + if (this.onContentsChanged != null) { + this.onContentsChanged.run(); + } + } + return resultStack; + } + } + return FluidStack.EMPTY; + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/airControl/IOxygen.java b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/IOxygen.java new file mode 100644 index 000000000..a4c72fe69 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/IOxygen.java @@ -0,0 +1,19 @@ +package com.ghostipedia.cosmiccore.common.airControl; + +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; + +public interface IOxygen { + + long getOxygenTicks(ResourceKey dimension); + + void setOxygenTicks(ResourceKey dimension, long ticks); + + boolean isConsuming(ResourceKey dimension); + + void setConsuming(ResourceKey dimension, boolean consuming); + + double getRegenBuffer(ResourceKey dimension); + + void setRegenBuffer(ResourceKey dimension, double buffer); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/airControl/IOxygenProvider.java b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/IOxygenProvider.java new file mode 100644 index 000000000..de3713313 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/IOxygenProvider.java @@ -0,0 +1,46 @@ +package com.ghostipedia.cosmiccore.common.airControl; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +/** + * Interface for items that can provide oxygen to the CosmicCore oxygen system. + * Implemented by space suit chestplates, oxygen tanks, etc. + */ +public interface IOxygenProvider { + + /** + * Check if this item can currently provide oxygen. + * + * @param stack The item stack + * @param player The player wearing/holding the item + * @return true if oxygen is available + */ + boolean hasOxygen(ItemStack stack, Player player); + + /** + * Consume oxygen from this provider. + * + * @param stack The item stack + * @param player The player + * @param amount Amount to consume (in millibuckets for fluid tanks, or ticks for other systems) + * @return Amount actually consumed + */ + long consumeOxygen(ItemStack stack, Player player, long amount); + + /** + * Get current oxygen amount. + * + * @param stack The item stack + * @return Current oxygen in millibuckets (or equivalent units) + */ + long getOxygenAmount(ItemStack stack); + + /** + * Get maximum oxygen capacity. + * + * @param stack The item stack + * @return Maximum capacity in millibuckets (or equivalent units) + */ + long getMaxOxygenCapacity(ItemStack stack); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/airControl/IOxygenSupplyItem.java b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/IOxygenSupplyItem.java new file mode 100644 index 000000000..89ae160a1 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/IOxygenSupplyItem.java @@ -0,0 +1,13 @@ +package com.ghostipedia.cosmiccore.common.airControl; + +import net.minecraft.world.item.ItemStack; + +public interface IOxygenSupplyItem { + + /** + * Try to provide up to requestTicks of oxygen from this stack. + * + * @return ticks actually provided (0..requestTicks) + */ + int drainOxygenTicks(ItemStack stack, int requestTicks); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenBudget.java b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenBudget.java new file mode 100644 index 000000000..a8984e6ef --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenBudget.java @@ -0,0 +1,97 @@ +package com.ghostipedia.cosmiccore.common.airControl; + +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.neoforged.neoforge.common.util.INBTSerializable; + +import java.util.HashMap; +import java.util.Map; + +public class OxygenBudget implements IOxygen, INBTSerializable { + + @Override + public CompoundTag serializeNBT(HolderLookup.Provider provider) { + CompoundTag tag = saveTag(); + return tag != null ? tag : new CompoundTag(); + } + + @Override + public void deserializeNBT(HolderLookup.Provider provider, CompoundTag nbt) { + if (nbt != null) { + loadTag(nbt); + } + } + + private final Map oxygenTicksByDimension = new HashMap<>(); + private final Map consumingByDimension = new HashMap<>(); + private final Map regenBufferByDimension = new HashMap<>(); + + @Override + public long getOxygenTicks(ResourceKey dimension) { + return oxygenTicksByDimension.getOrDefault(dimension.location(), -1L); + } + + @Override + public void setOxygenTicks(ResourceKey dimension, long ticks) { + oxygenTicksByDimension.put(dimension.location(), ticks); + } + + @Override + public boolean isConsuming(ResourceKey dimension) { + return consumingByDimension.getOrDefault(dimension.location(), false); + } + + @Override + public void setConsuming(ResourceKey dimension, boolean consuming) { + consumingByDimension.put(dimension.location(), consuming); + } + + @Override + public double getRegenBuffer(ResourceKey dimension) { + return regenBufferByDimension.getOrDefault(dimension.location(), 0.0); + } + + @Override + public void setRegenBuffer(ResourceKey dimension, double buffer) { + regenBufferByDimension.put(dimension.location(), buffer); + } + + // ---- NBT persistence ---- + + public CompoundTag saveTag() { + CompoundTag root = new CompoundTag(); + ListTag list = new ListTag(); + + for (var entry : oxygenTicksByDimension.entrySet()) { + ResourceLocation dim = entry.getKey(); + CompoundTag tag = new CompoundTag(); + tag.putString("dimension", dim.toString()); + tag.putLong("oxygenTicks", entry.getValue()); + tag.putBoolean("consuming", consumingByDimension.getOrDefault(dim, false)); + tag.putDouble("regenBuffer", regenBufferByDimension.getOrDefault(dim, 0.0)); + list.add(tag); + } + root.put("entries", list); + return root; + } + + public void loadTag(CompoundTag root) { + oxygenTicksByDimension.clear(); + consumingByDimension.clear(); + regenBufferByDimension.clear(); + + ListTag list = root.getList("entries", Tag.TAG_COMPOUND); + for (Tag element : list) { + CompoundTag tag = (CompoundTag) element; + ResourceLocation dim = ResourceLocation.parse(tag.getString("dimension")); + oxygenTicksByDimension.put(dim, tag.getLong("oxygenTicks")); + consumingByDimension.put(dim, tag.getBoolean("consuming")); + regenBufferByDimension.put(dim, tag.getDouble("regenBuffer")); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenConfig.java b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenConfig.java new file mode 100644 index 000000000..2731bfb91 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenConfig.java @@ -0,0 +1,74 @@ +package com.ghostipedia.cosmiccore.common.airControl; + +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.DepthsBargain; + +import net.minecraft.world.entity.player.Player; + +/** + * Configuration constants for the oxygen system. + */ +public final class OxygenConfig { + + private OxygenConfig() {} + + // ------------------------------------------------------------------------- + // Oxygen Budget + // ------------------------------------------------------------------------- + + /** Base maximum oxygen capacity in ticks (90 seconds) */ + public static final long MAX_OXYGEN_TICKS = 20L * 90; + + /** + * Get the effective max oxygen capacity for a player. + * This accounts for bargains that modify capacity (e.g., Depths bargain). + */ + public static long getMaxOxygenTicks(Player player) { + float multiplier = DepthsBargain.getCapacityMultiplier(player); + return (long) (MAX_OXYGEN_TICKS * multiplier); + } + + /** Seconds remaining at which to show warnings */ + public static final int[] WARNING_SECONDS = { 60, 30, 15, 10, 5 }; + + // ------------------------------------------------------------------------- + // Tank Behavior + // ------------------------------------------------------------------------- + + /** Extra ticks tanks can top-up per game tick when protecting player */ + public static final int TANK_TOPUP_TICKS_PER_TICK = 2; + + /** How many oxygen ticks per mB consumed from space suits (higher = suits last longer) */ + public static final int SPACE_SUIT_TICKS_PER_MB = 5; + + // ------------------------------------------------------------------------- + // HUD Sync + // ------------------------------------------------------------------------- + + /** How often to sync oxygen HUD to client (in ticks) */ + public static final int HUD_SYNC_INTERVAL = 10; + + // ------------------------------------------------------------------------- + // Damage + // ------------------------------------------------------------------------- + + /** Interval between suffocation damage ticks */ + public static final int SUFFOCATION_DAMAGE_INTERVAL = 20; + + // ------------------------------------------------------------------------- + // Rebreather Behavior + // ------------------------------------------------------------------------- + + /** Drain reduction multiplier for simple rebreather in THIN air (0.5 = half drain) */ + public static final double SIMPLE_REBREATHER_DRAIN_MULT = 0.5; + + /** Drain reduction multiplier for pressurized rebreather (0.25 = quarter drain) */ + public static final double PRESSURIZED_REBREATHER_DRAIN_MULT = 0.25; + + // ------------------------------------------------------------------------- + // Air Bladder + // ------------------------------------------------------------------------- + + public static final long AIR_BLADDER_RESTORE_TICKS = 1200; // 60 seconds of air per charge + public static final int AIR_BLADDER_MAX_CHARGES = 3; // 3 uses before empty + public static final int AIR_BLADDER_COOLDOWN = 40; // 2 second use cooldown +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenItemCap.java b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenItemCap.java new file mode 100644 index 000000000..6468356b2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenItemCap.java @@ -0,0 +1,13 @@ +package com.ghostipedia.cosmiccore.common.airControl; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import net.neoforged.neoforge.capabilities.ItemCapability; + +public class OxygenItemCap { + + private OxygenItemCap() {} + + public static final ItemCapability OXYGEN_SUPPLY = + ItemCapability.createVoid(CosmicCore.id("oxygen_supply"), IOxygenSupplyItem.class); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenLogic.java b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenLogic.java new file mode 100644 index 000000000..953487633 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenLogic.java @@ -0,0 +1,315 @@ +package com.ghostipedia.cosmiccore.common.airControl; + +import java.util.Optional; +import com.ghostipedia.cosmiccore.common.data.CosmicAttachmentTypes; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.airControl.RebreatherHelper.RebreatherType; +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.network.packet.OxygenWarnPacket; +import com.ghostipedia.cosmiccore.common.network.packet.SyncOxygenBarPacket; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.DepthsBargain; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; +import net.neoforged.neoforge.event.tick.PlayerTickEvent; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; + +import top.theillusivec4.curios.api.CuriosApi; +import top.theillusivec4.curios.api.type.inventory.IDynamicStackHandler; + +import static com.ghostipedia.cosmiccore.common.airControl.OxygenConfig.*; +import static com.ghostipedia.cosmiccore.common.airControl.OxygenItemCap.OXYGEN_SUPPLY; + +@EventBusSubscriber(modid = CosmicCore.MOD_ID) +public final class OxygenLogic { + + private OxygenLogic() {} + + private static final ThreadLocal CONSUME_BYPASS = ThreadLocal.withInitial(() -> false); + + public static boolean isConsumeBypass() { + return CONSUME_BYPASS.get(); + } + + private static final java.util.Map lastSyncOxygenValue = new java.util.concurrent.ConcurrentHashMap<>(); + private static final java.util.Map lastSyncGameTime = new java.util.concurrent.ConcurrentHashMap<>(); + + @SubscribeEvent + public static void onPlayerTick(PlayerTickEvent.Post event) { + if (event.getEntity().level().isClientSide) return; + + ServerPlayer player = (ServerPlayer) event.getEntity(); + + // Skip oxygen logic for creative/spectator players + if (player.isCreative() || player.isSpectator()) { + // Send hide packet if needed + if ((player.serverLevel().getGameTime() % HUD_SYNC_INTERVAL) == 0) { + long playerMaxOxygen = getMaxOxygenTicks(player); + CCoreNetwork.sendToPlayer(player, + new SyncOxygenBarPacket(playerMaxOxygen, playerMaxOxygen, false, 0.0)); + } + return; + } + + ServerLevel level = player.serverLevel(); + + Optional.of(player.getData(CosmicAttachmentTypes.OXYGEN_BUDGET)).ifPresent(cap -> { + // Get player-specific max capacity (may be modified by bargains) + long playerMaxOxygen = getMaxOxygenTicks(player); + + // Initialize if needed + if (cap.getOxygenTicks(level.dimension()) < 0) { + cap.setOxygenTicks(level.dimension(), playerMaxOxygen); + cap.setRegenBuffer(level.dimension(), 0.0); + } + + // Get player's Y and determine air quality + int yValue = player.blockPosition().getY(); + OxygenRules.AirRanges range = OxygenRules.getRanges(level.dimension(), yValue); + + OxygenRules.AirQuality quality; + OxygenRules.Rates rates; + + if (range == null) { + quality = OxygenRules.AirQuality.SAFE; + rates = OxygenRules.QUALITY_RATES.get(quality).copy(); + } else { + quality = range.quality; + rates = range.airRangeRates(); + } + + // Check if player is in a fluid (eyes submerged) + BlockPos eyePos = BlockPos.containing(player.getX(), player.getEyeY(), player.getZ()); + boolean eyesInFluid = !level.getFluidState(eyePos).isEmpty(); + if (eyesInFluid && !player.hasEffect(MobEffects.WATER_BREATHING)) { + OxygenRules.Rates thinAir = OxygenRules.QUALITY_RATES.get(OxygenRules.AirQuality.THIN).copy(); + rates.oxygenDrainPerTick = Math.max(rates.oxygenDrainPerTick, thinAir.oxygenDrainPerTick); + rates.oxygenRecoveryPerTick = 0.0; // No passive regen while submerged + rates.suffocationDamage = Math.max(rates.suffocationDamage, 2.0f); + quality = OxygenRules.AirQuality.THIN; + } + + long current = cap.getOxygenTicks(level.dimension()); + cap.setConsuming(level.dimension(), rates.oxygenDrainPerTick > 0); + + if (rates.oxygenDrainPerTick > 0) { + // Check for rebreather equipment and apply drain modifiers + RebreatherType rebreather = RebreatherHelper.getEquippedRebreather(player); + double drainMult = 1.0; + + // Apply rebreather effects based on air quality + if (quality == OxygenRules.AirQuality.THIN) { + // Both rebreathers work in THIN air + if (rebreather == RebreatherType.PRESSURIZED) { + drainMult = PRESSURIZED_REBREATHER_DRAIN_MULT; + } else if (rebreather == RebreatherType.SIMPLE) { + drainMult = SIMPLE_REBREATHER_DRAIN_MULT; + } + } else if (quality == OxygenRules.AirQuality.NO_AIR) { + // Only pressurized rebreather works in NO_AIR + if (rebreather == RebreatherType.PRESSURIZED) { + drainMult = PRESSURIZED_REBREATHER_DRAIN_MULT; + } + } + // TOXIC and ABYSS are not affected by rebreathers + + // Apply multiplier to drain rate using fractional accumulation + // This ensures rebreathers actually reduce effective drain (e.g., 0.5x means drain every other tick) + double baseDrain = rates.oxygenDrainPerTick; + double fractionalDrain = baseDrain * drainMult; + + // Use the regen buffer to accumulate fractional drain (stored as negative when draining) + double buffer = cap.getRegenBuffer(level.dimension()); + // If buffer was positive (from regen), reset it since we're now draining + if (buffer > 0) buffer = 0; + // Buffer is stored as negative during drain, so negate to get positive accumulator + double drainAccum = -buffer + fractionalDrain; + int drain = (int) drainAccum; // Integer part is actual drain this tick + double remainder = drainAccum - drain; // Fractional part carries over + cap.setRegenBuffer(level.dimension(), -remainder); // Store negative to indicate drain mode + + int provided = drainFromOxygenSources(player, drain, rebreather); + int remainingDrain = Math.max(0, drain - provided); + + long next = current - remainingDrain; + next = Math.max(0, Math.min(playerMaxOxygen, next)); + + cap.setOxygenTicks(level.dimension(), next); + + // Warnings & damage + if (next % 20 == 0) { + int sec = (int) (next / 20); + for (int w : WARNING_SECONDS) { + if (sec == w) { + CCoreNetwork.sendToPlayer(player, new OxygenWarnPacket("cosmiccore.oxygen.warn", w)); + break; + } + } + } + if (next <= 0 && rates.suffocationDamage > 0f && + (level.getGameTime() % SUFFOCATION_DAMAGE_INTERVAL) == 0) { + // Check for Depths bargain - instant death instead of gradual damage + if (DepthsBargain.shouldInstantKillOnSuffocation(player)) { + DepthsBargain.executeInstantSuffocation(player); + } else { + player.hurt(player.damageSources().drown(), rates.suffocationDamage); + } + } + + } else if (rates.oxygenRecoveryPerTick > 0 && current < playerMaxOxygen) { + // Passive recovery in safe air + double buffer = cap.getRegenBuffer(level.dimension()); + // If buffer was negative (from drain mode), reset it since we're now recovering + if (buffer < 0) buffer = 0; + buffer += (rates.oxygenRecoveryPerTick / 20.0); + long gain = (long) (buffer * 20.0); + double rem = buffer - (gain / 20.0); + + if (gain > 0) { + long next = Math.min(playerMaxOxygen, current + gain); + cap.setOxygenTicks(level.dimension(), next); + } + cap.setRegenBuffer(level.dimension(), rem); + } + + // HUD sync - calculate rate based on change since last sync + if ((level.getGameTime() % HUD_SYNC_INTERVAL) == 0) { + long remaining = cap.getOxygenTicks(level.dimension()); + boolean show = (quality != OxygenRules.AirQuality.SAFE) || remaining < playerMaxOxygen; + + // Calculate rate based on actual change over the sync interval + java.util.UUID playerId = player.getUUID(); + double ratePerSecond = 0.0; + long currentGameTime = level.getGameTime(); + Long prevOxygen = lastSyncOxygenValue.get(playerId); + Long prevTime = lastSyncGameTime.get(playerId); + if (prevOxygen != null && prevTime != null) { + long ticksElapsed = currentGameTime - prevTime; + if (ticksElapsed > 0) { + long oxygenChange = remaining - prevOxygen; + // Convert to per-second rate: (change / ticks) * 20 ticks/second + ratePerSecond = (oxygenChange * 20.0) / ticksElapsed; + } + } + + // Update tracking for next sync + lastSyncOxygenValue.put(playerId, remaining); + lastSyncGameTime.put(playerId, currentGameTime); + + CCoreNetwork.sendToPlayer(player, + new SyncOxygenBarPacket(remaining, playerMaxOxygen, show, ratePerSecond)); + } + }); + } + + @SubscribeEvent + public static void onLogin(PlayerEvent.PlayerLoggedInEvent event) { + if (event.getEntity().level().isClientSide) return; + + ServerPlayer player = (ServerPlayer) event.getEntity(); + ServerLevel level = player.serverLevel(); + + // Reset rate tracking for fresh rate calculation + java.util.UUID playerId = player.getUUID(); + lastSyncOxygenValue.remove(playerId); + lastSyncGameTime.remove(playerId); + + Optional.of(player.getData(CosmicAttachmentTypes.OXYGEN_BUDGET)).ifPresent(cap -> { + long playerMaxOxygen = getMaxOxygenTicks(player); + if (cap.getOxygenTicks(level.dimension()) < 0) { + cap.setOxygenTicks(level.dimension(), playerMaxOxygen); + cap.setRegenBuffer(level.dimension(), 0.0); + } + long remaining = cap.getOxygenTicks(level.dimension()); + boolean show = remaining < playerMaxOxygen; + CCoreNetwork.sendToPlayer(player, new SyncOxygenBarPacket(remaining, playerMaxOxygen, show, 0.0)); + }); + } + + @SubscribeEvent + public static void onLogout(PlayerEvent.PlayerLoggedOutEvent event) { + // Clean up tracking maps to prevent memory leaks + java.util.UUID playerId = event.getEntity().getUUID(); + lastSyncOxygenValue.remove(playerId); + lastSyncGameTime.remove(playerId); + } + + @SubscribeEvent + public static void onRespawn(PlayerEvent.PlayerRespawnEvent event) { + if (event.getEntity().level().isClientSide) return; + + ServerPlayer player = (ServerPlayer) event.getEntity(); + ServerLevel level = player.serverLevel(); + + Optional.of(player.getData(CosmicAttachmentTypes.OXYGEN_BUDGET)).ifPresent(cap -> { + long playerMaxOxygen = getMaxOxygenTicks(player); + cap.setOxygenTicks(level.dimension(), playerMaxOxygen); + cap.setRegenBuffer(level.dimension(), 0.0); + cap.setConsuming(level.dimension(), false); + CCoreNetwork.sendToPlayer(player, new SyncOxygenBarPacket(playerMaxOxygen, playerMaxOxygen, false, 0.0)); + }); + } + + // --- Oxygen provider draining --- + + /** + * Drain oxygen from all available sources. + * Priority: Space suit chestplate > Ad Astra suit > Curios back slot tanks + * Suits always provide protection. Tanks require pressurized rebreather. + */ + private static int drainFromOxygenSources(ServerPlayer player, int requestTicks, RebreatherType rebreather) { + if (requestTicks <= 0) return 0; + + int remaining = requestTicks; + + // TODO(stellaris): re-add space-suit oxygen drain when the AA/Botarium fluid-suit system is reworked (bead cosmiccore-42.13) + if (rebreather == RebreatherType.PRESSURIZED) { + remaining = drainFromCuriosBackSlot(player, remaining); + } + + return requestTicks - remaining; + } + + /** + * Drain from oxygen tanks in Curios back slot. + */ + private static int drainFromCuriosBackSlot(ServerPlayer player, int requestTicks) { + if (requestTicks <= 0) return 0; + + int remaining = requestTicks; + + var curiosCap = CuriosApi.getCuriosInventory(player); + if (curiosCap.isPresent()) { + var curiosHandler = curiosCap.get(); + var backHandler = curiosHandler.getStacksHandler("back"); + if (backHandler.isPresent()) { + IDynamicStackHandler stacks = backHandler.get().getStacks(); + for (int i = 0; i < stacks.getSlots() && remaining > 0; i++) { + ItemStack stack = stacks.getStackInSlot(i); + remaining = drainFromStack(stack, remaining); + } + } + } + + return remaining; + } + + /** + * Drain from GTCEu-style oxygen supply tanks via capability. + */ + private static int drainFromStack(ItemStack stack, int requestTicks) { + if (stack.isEmpty() || requestTicks <= 0) return requestTicks; + + IOxygenSupplyItem provider = stack.getCapability(OXYGEN_SUPPLY); + if (provider == null) return requestTicks; + int got = Math.max(0, provider.drainOxygenTicks(stack, requestTicks)); + return Math.max(0, requestTicks - got); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenRules.java b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenRules.java new file mode 100644 index 000000000..6572b2449 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/OxygenRules.java @@ -0,0 +1,180 @@ +package com.ghostipedia.cosmiccore.common.airControl; + +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +public final class OxygenRules { + + private OxygenRules() {} + + public enum AirQuality { + SAFE, + THIN, + TOXIC, + ABYSS, + NO_AIR + } + + public static final class Rates { + + public int oxygenDrainPerTick; + public double oxygenRecoveryPerTick; + public float suffocationDamage; + + public Rates copy() { + Rates rates = new Rates(); + rates.oxygenDrainPerTick = oxygenDrainPerTick; + rates.oxygenRecoveryPerTick = oxygenRecoveryPerTick; + rates.suffocationDamage = suffocationDamage; + return rates; + } + } + + private static Rates rates(int drain, double regen, float dmg) { + Rates result = new Rates(); + result.oxygenDrainPerTick = drain; + result.oxygenRecoveryPerTick = regen; + result.suffocationDamage = dmg; + return result; + } + + public static final Map QUALITY_RATES = Map.of( + AirQuality.SAFE, rates(0, 2.0, 5f), + AirQuality.THIN, rates(1, 0.0, 5f), + AirQuality.TOXIC, rates(1, 0.5, 5f), + AirQuality.ABYSS, rates(8, 0.0, 1000f), + AirQuality.NO_AIR, rates(2, 0.0, 5f)); + + // Air Ranges + + public static final class AirRanges { + + public final int minY; + public final int maxY; + public final AirQuality quality; + + public final Integer drainPerTickOverride; + public final Double regenOverride; + public final Float damageOverride; + + public AirRanges(int minY, int maxY, AirQuality quality) { + this(minY, maxY, quality, null, null, null); + } + + public AirRanges(int minY, int maxY, AirQuality quality, + Integer drainPerTickOverride, + Double regenOverride, + Float damageOverride) { + this.minY = minY; + this.maxY = maxY; + this.quality = quality; + this.drainPerTickOverride = drainPerTickOverride; + this.regenOverride = regenOverride; + this.damageOverride = damageOverride; + } + + public boolean presentAtY(int yValue) { + return yValue >= minY && yValue <= maxY; + } + + public Rates airRangeRates() { + Rates base = QUALITY_RATES.get(quality).copy(); + if (drainPerTickOverride != null) base.oxygenDrainPerTick = drainPerTickOverride; + if (regenOverride != null) base.oxygenRecoveryPerTick = regenOverride; + if (damageOverride != null) base.suffocationDamage = damageOverride; + return base; + } + } + + private static final Map, List> RANGES = new ConcurrentHashMap<>(); + + public static void addRanges(ResourceKey dimension, AirRanges... ranges) { + RANGES.computeIfAbsent(dimension, d -> new ArrayList<>()).addAll(Arrays.asList(ranges)); + RANGES.get(dimension).sort(Comparator.comparingInt(b -> b.minY)); + } + + public static AirRanges getRanges(ResourceKey dimension, int y) { + List airRangesList = RANGES.get(dimension); + if (airRangesList == null || airRangesList.isEmpty()) return null; + for (AirRanges range : airRangesList) { + if (range.presentAtY(y)) return range; + } + return null; + } + + // --- Ad Astra dimension keys --- + private static ResourceKey adAstraDim(String name) { + return ResourceKey.create(Registries.DIMENSION, ResourceLocation.fromNamespaceAndPath("ad_astra", name)); + } + + public static final ResourceKey MOON = adAstraDim("moon"); + public static final ResourceKey MOON_ORBIT = adAstraDim("moon_orbit"); + public static final ResourceKey MARS = adAstraDim("mars"); + public static final ResourceKey MARS_ORBIT = adAstraDim("mars_orbit"); + public static final ResourceKey VENUS = adAstraDim("venus"); + public static final ResourceKey VENUS_ORBIT = adAstraDim("venus_orbit"); + public static final ResourceKey MERCURY = adAstraDim("mercury"); + public static final ResourceKey MERCURY_ORBIT = adAstraDim("mercury_orbit"); + public static final ResourceKey GLACIO = adAstraDim("glacio"); + public static final ResourceKey GLACIO_ORBIT = adAstraDim("glacio_orbit"); + public static final ResourceKey EARTH_ORBIT = adAstraDim("earth_orbit"); + + // Default range registration + public static void registerAirRanges() { + // --- Overworld --- + addRanges(Level.OVERWORLD, + // y ≤ 0 : THIN air underground + new AirRanges(Integer.MIN_VALUE, 0, AirQuality.THIN, 1, 0.0, 2.0f), + // 1 to 199 : SAFE (faster regen) + new AirRanges(1, 199, AirQuality.SAFE, null, 3.0, null), + // 200+ : THIN at high altitude + new AirRanges(200, Integer.MAX_VALUE, AirQuality.THIN)); + + // --- Space (no atmosphere) --- + // All orbit dimensions have no air at all Y levels + for (ResourceKey orbit : List.of(EARTH_ORBIT, MOON_ORBIT, MARS_ORBIT, VENUS_ORBIT, MERCURY_ORBIT, + GLACIO_ORBIT)) { + addRanges(orbit, new AirRanges(Integer.MIN_VALUE, Integer.MAX_VALUE, AirQuality.NO_AIR)); + } + + // --- Planetary surfaces (no atmosphere) --- + // Moon, Mars, Mercury - no atmosphere + for (ResourceKey airless : List.of(MOON, MARS, MERCURY)) { + addRanges(airless, new AirRanges(Integer.MIN_VALUE, Integer.MAX_VALUE, AirQuality.NO_AIR)); + } + + // Venus - toxic atmosphere + addRanges(VENUS, new AirRanges(Integer.MIN_VALUE, Integer.MAX_VALUE, AirQuality.TOXIC, 2, 0.0, 3.0f)); + + // Glacio - thin but breathable at surface (ice world with some atmosphere) + addRanges(GLACIO, + new AirRanges(Integer.MIN_VALUE, 0, AirQuality.THIN, 1, 0.0, 2.0f), + new AirRanges(1, 127, AirQuality.SAFE, null, 1.5, null), + new AirRanges(128, Integer.MAX_VALUE, AirQuality.THIN)); + } + + public static final class ResolvedAirRange { + + public final AirQuality airQuality; + public final Rates rates; + + public ResolvedAirRange(AirQuality quality, Rates rates) { + this.airQuality = quality; + this.rates = rates; + } + } + + public static ResolvedAirRange resolve(ResourceKey dimension, int yVal) { + AirRanges range = getRanges(dimension, yVal); + if (range == null) { + Rates safe = QUALITY_RATES.get(AirQuality.SAFE).copy(); + return new ResolvedAirRange(AirQuality.SAFE, safe); + } + return new ResolvedAirRange(range.quality, range.airRangeRates()); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/airControl/RebreatherHelper.java b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/RebreatherHelper.java new file mode 100644 index 000000000..4a2493107 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/airControl/RebreatherHelper.java @@ -0,0 +1,94 @@ +package com.ghostipedia.cosmiccore.common.airControl; + +import com.ghostipedia.cosmiccore.common.data.CosmicItems; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +import top.theillusivec4.curios.api.CuriosApi; +import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; +import top.theillusivec4.curios.api.type.inventory.ICurioStacksHandler; +import top.theillusivec4.curios.api.type.inventory.IDynamicStackHandler; + +import java.util.Optional; + +/** + * Helper class for detecting and interacting with rebreather equipment. + */ +public final class RebreatherHelper { + + private RebreatherHelper() {} + + /** + * Rebreather types in order of capability. + */ + public enum RebreatherType { + /** No rebreather equipped */ + NONE, + /** Simple rebreather - slows oxygen drain in THIN air only */ + SIMPLE, + /** Pressurized rebreather - works in NO_AIR, allows tank usage */ + PRESSURIZED + } + + /** + * Get the best rebreather type the player has equipped. + * Checks head curio slot for rebreather items. + * + * @param player The player to check + * @return The best rebreather type found + */ + public static RebreatherType getEquippedRebreather(Player player) { + if (player == null) return RebreatherType.NONE; + + // Check for pressurized first (better) + if (hasCurioItem(player, "head", CosmicItems.PRESSURIZED_REBREATHER.asItem())) { + return RebreatherType.PRESSURIZED; + } + + // Check for simple + if (hasCurioItem(player, "head", CosmicItems.SIMPLE_REBREATHER.asItem())) { + return RebreatherType.SIMPLE; + } + + return RebreatherType.NONE; + } + + /** + * Check if player has a simple rebreather or better equipped. + */ + public static boolean hasSimpleRebreatherOrBetter(Player player) { + RebreatherType type = getEquippedRebreather(player); + return type == RebreatherType.SIMPLE || type == RebreatherType.PRESSURIZED; + } + + /** + * Check if player has a pressurized rebreather equipped. + */ + public static boolean hasPressurizedRebreather(Player player) { + return getEquippedRebreather(player) == RebreatherType.PRESSURIZED; + } + + /** + * Check if a specific item is in a curio slot. + */ + private static boolean hasCurioItem(LivingEntity entity, String slotId, Item item) { + Optional cap = CuriosApi.getCuriosInventory(entity); + if (cap.isPresent()) { + ICuriosItemHandler curioHandler = cap.get(); + Optional handler = curioHandler.getStacksHandler(slotId); + if (handler.isPresent()) { + IDynamicStackHandler stackHandler = handler.get().getStacks(); + for (int i = 0; i < stackHandler.getSlots(); i++) { + ItemStack stack = stackHandler.getStackInSlot(i); + if (stack.is(item)) { + return true; + } + } + } + } + return false; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/block/DivingBellEscapePad.java b/src/main/java/com/ghostipedia/cosmiccore/common/block/DivingBellEscapePad.java new file mode 100644 index 000000000..0771d716a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/block/DivingBellEscapePad.java @@ -0,0 +1,150 @@ +package com.ghostipedia.cosmiccore.common.block; + +import java.util.Optional; +import com.ghostipedia.cosmiccore.common.data.CosmicAttachmentTypes; + +import com.ghostipedia.cosmiccore.common.teleporter.SafeTeleporter; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; + +// Escape Pad block that teleports players back to their origin dimension. Placed automatically by the Diving Bell. +public class DivingBellEscapePad extends Block { + + public DivingBellEscapePad(Properties properties) { + super(properties); + } + + @Override + public InteractionResult useWithoutItem(BlockState state, Level level, BlockPos pos, Player player, + BlockHitResult hit) { + if (level.isClientSide) { + return InteractionResult.SUCCESS; + } + + ServerPlayer serverPlayer = (ServerPlayer) player; + Optional.of(serverPlayer.getData(CosmicAttachmentTypes.TELEPORT_ORIGIN)).ifPresent(cap -> { + if (!cap.hasValidOrigin()) { + // No valid origin data - send to respawn point + serverPlayer.displayClientMessage( + Component.translatable("cosmiccore.divingbell.no_return"), true); + teleportToRespawn(serverPlayer); + return; + } + + // Get return destination + var originDim = cap.getOriginDimension(); + Vec3 originPos = cap.getOriginPosition(); + float originYaw = cap.getOriginYaw(); + float originPitch = cap.getOriginPitch(); + + MinecraftServer server = level.getServer(); + if (server == null) return; + + ServerLevel originLevel = server.getLevel(originDim); + if (originLevel == null) { + // Origin dimension doesn't exist + serverPlayer.displayClientMessage( + Component.translatable("cosmiccore.divingbell.invalid_origin"), true); + cap.clearOriginData(); + teleportToRespawn(serverPlayer); + return; + } + + // Validate origin is safe (chunk loaded, not void) + BlockPos originBlockPos = BlockPos.containing(originPos); + if (!isOriginSafe(originLevel, originBlockPos)) { + serverPlayer.displayClientMessage( + Component.translatable("cosmiccore.divingbell.unsafe_origin"), true); + cap.clearOriginData(); + teleportToRespawn(serverPlayer); + return; + } + + serverPlayer.changeDimension(SafeTeleporter.toSafe(originLevel, originBlockPos, serverPlayer)); + + serverPlayer.setYRot(originYaw); + serverPlayer.setXRot(originPitch); + + // Clear Abyss decay flag + // Don't think this is needed... + // serverPlayer.getCapability(com.ghostipedia.cosmiccore.common.abyss.AbyssBudgetCap.CAP) + // .ifPresent(abyssCap -> { + // abyssCap.setDecaying(AbyssRules.DIM, false); + // }); + + // Success message + serverPlayer.displayClientMessage( + Component.translatable("cosmiccore.divingbell.returned"), true); + + // Clear origin data + cap.clearOriginData(); + }); + + return InteractionResult.CONSUME; + } + + // Check if the origin position is safe to teleport to. + private boolean isOriginSafe(ServerLevel level, BlockPos pos) { + // Check if chunk is loaded + if (!level.isLoaded(pos)) { + return false; + } + + // Check if it's not in void + if (pos.getY() < level.getMinBuildHeight()) { + return false; + } + + // Check 2-block tall air column where player stands + BlockState at = level.getBlockState(pos); + BlockState above = level.getBlockState(pos.above()); + + // if (at.isSuffocating(level, pos)) { + // return false; + // } + // + // if (!at.getFluidState().isEmpty()) { + // return false; + // } + + // Head level: same checks to ensure full 2-block clearance + if (above.isSuffocating(level, pos.above())) { + return false; + } + + if (!above.getFluidState().isEmpty()) { + return false; + } + + return true; + } + + // Teleport player to their respawn point as fallback. + private void teleportToRespawn(ServerPlayer player) { + BlockPos respawn = player.getRespawnPosition(); + ServerLevel respawnLevel = player.server.getLevel(player.getRespawnDimension()); + + if (respawn != null && respawnLevel != null) { + // Teleport to bed/respawn anchor + player.teleportTo(respawnLevel, respawn.getX() + 0.5, respawn.getY(), respawn.getZ() + 0.5, + player.getYRot(), player.getXRot()); + } else { + // Ultimate fallback - overworld spawn (should not fail under normal circumstances) + ServerLevel overworld = player.server.overworld(); + BlockPos spawn = overworld.getSharedSpawnPos(); + player.teleportTo(overworld, spawn.getX() + 0.5, spawn.getY(), spawn.getZ() + 0.5, + player.getYRot(), player.getXRot()); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/block/MagnetBlock.java b/src/main/java/com/ghostipedia/cosmiccore/common/block/MagnetBlock.java index d37b9a6f3..0ce115991 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/block/MagnetBlock.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/block/MagnetBlock.java @@ -3,66 +3,78 @@ import com.ghostipedia.cosmiccore.CosmicCore; import com.ghostipedia.cosmiccore.api.block.IMagnetType; import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; -import com.gregtechceu.gtceu.GTCEu; + import com.gregtechceu.gtceu.api.block.ActiveBlock; import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.client.renderer.block.TextureOverrideRenderer; import com.gregtechceu.gtceu.utils.GTUtil; -import com.lowdragmc.lowdraglib.Platform; -import lombok.Getter; + import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.StringRepresentable; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.BlockGetter; + import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.List; -import java.util.Map; + +import javax.annotation.ParametersAreNonnullByDefault; + @ParametersAreNonnullByDefault public class MagnetBlock extends ActiveBlock { + public IMagnetType magnetBlock; + public MagnetBlock(Properties properties, IMagnetType magnetType) { - super(properties, Platform.isClient() ? new TextureOverrideRenderer(new ResourceLocation("block/cube_all"), - Map.of("all", magnetType.getTexture())) : null, - Platform.isClient() ? new TextureOverrideRenderer(GTCEu.id("block/cube_2_layer_all"), - Map.of("bot_all", magnetType.getTexture(), - "top_all", new ResourceLocation(magnetType.getTexture() + "_bloom"))) : null); + super(properties); this.magnetBlock = magnetType; } + @Override - public void appendHoverText(ItemStack stack, @Nullable BlockGetter level, List tooltip, TooltipFlag flag) { - super.appendHoverText(stack, level, tooltip, flag); + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltip, + TooltipFlag flag) { + super.appendHoverText(stack, context, tooltip, flag); if (GTUtil.isShiftDown()) { tooltip.add(Component.translatable("cosmiccore.wire_coil.magnet_stats")); - tooltip.add(Component.translatable("cosmiccore.wire_coil.magnet_capacity", magnetBlock.getMagnetFieldCapacity())); + tooltip.add(Component.translatable("cosmiccore.wire_coil.magnet_capacity", + magnetBlock.getMagnetFieldCapacity())); tooltip.add(Component.translatable("cosmiccore.wire_coil.magnet_regen", magnetBlock.getMagnetRegenRate())); - tooltip.add(Component.translatable("cosmiccore.wire_coil.eu_multiplier", magnetBlock.energyConsumption())); + tooltip.add(Component.translatable("cosmiccore.wire_coil.eu_multiplier", magnetBlock.energyConsumption())); } else { tooltip.add(Component.translatable("block.gtceu.wire_coil.tooltip_extended_info")); } } - public enum MagnetType implements StringRepresentable, IMagnetType{ - HIGH_POWERED("high_powered",15000,10,3, CosmicMaterials.LivingIgniclad, CosmicCore.id("block/casings/solid/alternator_flux_coiling_copper")), - FUSION_GRADE("fusion_grade",100000,500,8192, CosmicMaterials.LivingIgniclad, CosmicCore.id("block/casings/solid/magnet_fusion_grade")); - @NotNull @Getter + public enum MagnetType implements StringRepresentable, IMagnetType { + + HIGH_POWERED("high_powered", 15000, 10, 3, CosmicMaterials.LivingIgniclad, + CosmicCore.id("block/casings/solid/alternator_flux_coiling_copper")), + FUSION_GRADE("fusion_grade", 100000, 500, 8192, CosmicMaterials.LivingIgniclad, + CosmicCore.id("block/casings/solid/magnet_fusion_grade")), + STELLAR_NEUTRONIUM_GRADE("stellar_neutronium_grade", 250000, 2500, 32768, CosmicMaterials.LivingIgniclad, + CosmicCore.id("block/casings/solid/stellar_neutronium_grade_magnet")); + // NYI + // RAMPART_SUPERCONDUCTING_MAGNET("rampart_magnet", 25000000, 15000, 524288, CosmicMaterials.LivingIgniclad, + // CosmicCore.id("block/casings/solid/rampart_magnet")), + // GALVORN_SPATIALLY_RESISTANT_MAGNET("galvorn_spatially_resistant_magnet", 1000000000, 750000, 8388608, + // CosmicMaterials.LivingIgniclad, + // CosmicCore.id("block/casings/solid/galvorn_magnet")); + + @NotNull private final String name; - @Getter private final int magnetStrength; - @Getter private final int regenRate; - @Getter private final int energyConsumed; - @Getter private final Material material; - @NotNull @Getter + @NotNull private final ResourceLocation texture; - MagnetType(String name, int magnetStrength, int regenRate, int energyConsumed, Material material, ResourceLocation texture) { + + MagnetType(String name, int magnetStrength, int regenRate, int energyConsumed, Material material, + ResourceLocation texture) { this.name = name; this.magnetStrength = magnetStrength; this.regenRate = regenRate; @@ -70,6 +82,33 @@ public enum MagnetType implements StringRepresentable, IMagnetType{ this.material = material; this.texture = texture; } + + public String getName() { + return name; + } + + public int getMagnetStrength() { + return magnetStrength; + } + + public int getRegenRate() { + return regenRate; + } + + public int getEnergyConsumed() { + return energyConsumed; + } + + public Material getMaterial() { + return material; + } + + @NotNull + @Override + public ResourceLocation getTexture() { + return texture; + } + @NotNull @Override public String toString() { @@ -82,7 +121,6 @@ public String getSerializedName() { return name; } - @Override public int getMagnetFieldCapacity() { return getMagnetStrength(); @@ -97,8 +135,5 @@ public int getMagnetRegenRate() { public int energyConsumption() { return getEnergyConsumed(); } - } - - } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/block/MothHomeBlock.java b/src/main/java/com/ghostipedia/cosmiccore/common/block/MothHomeBlock.java new file mode 100644 index 000000000..cb15dabcc --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/block/MothHomeBlock.java @@ -0,0 +1,20 @@ +package com.ghostipedia.cosmiccore.common.block; + +import net.minecraft.world.level.block.Block; + +import lombok.Getter; + +/** + * Moth Home block - provides moths for the Cargo Moth system. + * Different tiers provide faster cycles and more moths per home. + */ +public class MothHomeBlock extends Block { + + @Getter + private final int tier; + + public MothHomeBlock(Properties properties, int tier) { + super(properties); + this.tier = tier; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/block/WorkableSteamHullType.java b/src/main/java/com/ghostipedia/cosmiccore/common/block/WorkableSteamHullType.java new file mode 100644 index 000000000..a245e964a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/block/WorkableSteamHullType.java @@ -0,0 +1,25 @@ +package com.ghostipedia.cosmiccore.common.block; + +import com.gregtechceu.gtceu.GTCEu; + +import net.minecraft.resources.ResourceLocation; + +import org.jetbrains.annotations.NotNull; + +public record WorkableSteamHullType(String name, ResourceLocation bottom, ResourceLocation top, ResourceLocation side) { + + public static WorkableSteamHullType BRONZE_BRICK_HULL = new WorkableSteamHullType("bricked_bronze", + GTCEu.id("block/casings/steam/bricked_bronze/bottom"), + GTCEu.id("block/casings/steam/bricked_bronze/top"), + GTCEu.id("block/casings/steam/bricked_bronze/side")); + public static WorkableSteamHullType STEEL_BRICK_HULL = new WorkableSteamHullType("bricked_steel", + GTCEu.id("block/casings/solid/machine_casing_solid_steel"), + GTCEu.id("block/casings/solid/machine_casing_solid_steel"), + GTCEu.id("block/casings/firebox/machine_casing_firebox_steel")); + + @NotNull + @Override + public String toString() { + return name(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/block/debug/CreativeThermiaContainerMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/block/debug/CreativeThermiaContainerMachine.java new file mode 100644 index 000000000..475c11413 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/block/debug/CreativeThermiaContainerMachine.java @@ -0,0 +1,107 @@ +package com.ghostipedia.cosmiccore.common.block.debug; + +import com.ghostipedia.cosmiccore.api.capability.recipe.IHeatContainer; +import com.ghostipedia.cosmiccore.api.machine.trait.NotifiableThermiaContainer; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; +import com.lowdragmc.lowdraglib.gui.texture.ResourceBorderTexture; +import com.lowdragmc.lowdraglib.gui.texture.TextTexture; +import com.lowdragmc.lowdraglib.gui.widget.*; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.player.Player; + +import org.jetbrains.annotations.NotNull; + +import static com.ghostipedia.cosmiccore.common.machine.multiblock.part.ThermiaHatchPartMachine.getThermiaLimits; + +public class CreativeThermiaContainerMachine extends MetaMachine implements IHeatContainer, IUIMachine { + + // FieldHolder + @Persisted + private long heat = 0; + @Persisted + private boolean active = false; + @Persisted + private boolean source = true; + private long lastAverageHeatIOPerTick = 0; + + + @Persisted + @DescSynced + private final NotifiableThermiaContainer thermiaContainer; + + public CreativeThermiaContainerMachine(BlockEntityCreationInfo holder) { + super(holder); + long currentTemp = 0; + this.thermiaContainer = new NotifiableThermiaContainer(this, IO.BOTH, getThermiaLimits(GTValues.MAX), + currentTemp); + } + + @Override + public long acceptHeatFromNetwork(Direction side) { + return 0; + } + + @Override + public boolean inputsHeat(Direction side) { + return false; + } + + @Override + public long changeHeat(long heatDifference) { + return 0; + } + + @Override + public long getOverloadLimit() { + return 0; + } + + @Override + public long getHeatStorage() { + return 0; + } + + @Override + public ModularUI createUI(Player entityPlayer) { + return new ModularUI(176, 166, this, entityPlayer) + .background(GuiTextures.BACKGROUND) + .widget(new LabelWidget(7, 32, "gtceu.creative.energy.voltage")) + .widget(new TextFieldWidget(9, 47, 152, 16, () -> String.valueOf(heat), + value -> { + heat = Long.parseLong(value); + }).setNumbersOnly(0L, Long.MAX_VALUE)) + .widget(new LabelWidget(7, 110, + () -> "Average Energy I/O per tick: " + this.lastAverageHeatIOPerTick)) + .widget(new SwitchWidget(7, 139, 77, 20, (clickData, value) -> active = value) + .setTexture( + new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON, + new TextTexture("gtceu.creative.activity.off")), + new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON, + new TextTexture("gtceu.creative.activity.on"))) + .setPressed(active)) + .widget(new SwitchWidget(85, 139, 77, 20, (clickData, value) -> { + source = value; + if (source) { + heat = 0; + } else { + heat = Long.MIN_VALUE; + } + }).setTexture( + new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON, + new TextTexture("gtceu.creative.energy.sink")), + new GuiTextureGroup(ResourceBorderTexture.BUTTON_COMMON, + new TextTexture("gtceu.creative.energy.source"))) + .setPressed(source)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/blockentity/CosmicCoilBlockEntity.java b/src/main/java/com/ghostipedia/cosmiccore/common/blockentity/CosmicCoilBlockEntity.java new file mode 100644 index 000000000..c2eeb48dd --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/blockentity/CosmicCoilBlockEntity.java @@ -0,0 +1,13 @@ +package com.ghostipedia.cosmiccore.common.blockentity; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.BlockEntityType; +import net.minecraft.world.level.block.state.BlockState; + +public class CosmicCoilBlockEntity extends BlockEntity { + + public CosmicCoilBlockEntity(BlockEntityType type, BlockPos pos, BlockState blockState) { + super(type, pos, blockState); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/breath/OxygenHelper.java b/src/main/java/com/ghostipedia/cosmiccore/common/breath/OxygenHelper.java index b805cd431..ec6741412 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/breath/OxygenHelper.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/breath/OxygenHelper.java @@ -1,27 +1,37 @@ package com.ghostipedia.cosmiccore.common.breath; -import fuzs.thinair.api.v1.AirQualityLevel; -import fuzs.thinair.helper.AirQualityHelperImpl; +import com.ghostipedia.cosmiccore.common.airControl.OxygenRules; + +import net.minecraft.core.BlockPos; import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.level.Level; +/** + * Helper for checking air quality using CosmicCore's oxygen system. + * Used by Create diving helmet integration. + */ public class OxygenHelper { - + /** + * Check if the air quality at the entity's location should activate breathing equipment. + * Returns true if air is not SAFE (i.e., THIN, TOXIC, ABYSS, or NO_AIR). + */ public static boolean airQualityActivatesHelmet(LivingEntity entity) { - final var air = AirQualityHelperImpl.INSTANCE.getAirQualityAtLocation(entity.level(),entity.getEyePosition()); - return air == AirQualityLevel.RED || air == AirQualityLevel.YELLOW; + Level level = entity.level(); + BlockPos pos = entity.blockPosition(); + + // Check if eyes are in fluid - always needs helmet + BlockPos eyePos = BlockPos.containing(entity.getX(), entity.getEyeY(), entity.getZ()); + if (!level.getFluidState(eyePos).isEmpty()) { + return true; + } + + // Check our air quality system + OxygenRules.AirRanges range = OxygenRules.getRanges(level.dimension(), pos.getY()); + if (range == null) { + return false; // No range defined = SAFE + } + + return range.quality != OxygenRules.AirQuality.SAFE; } - - -// -// @SubscribeEvent -// public static void aircheck(LivingEvent.LivingTickEvent event){ -// if(event.getEntity() instanceof Player player){ -// -// } -// -// } - - - } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/commands/ExportRegistryCommand.java b/src/main/java/com/ghostipedia/cosmiccore/common/commands/ExportRegistryCommand.java new file mode 100644 index 000000000..a944f20e9 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/commands/ExportRegistryCommand.java @@ -0,0 +1,145 @@ +package com.ghostipedia.cosmiccore.common.commands; + +import net.minecraft.ChatFormatting; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.network.chat.Component; +import net.minecraft.core.registries.BuiltInRegistries; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.context.CommandContext; + +import java.io.BufferedWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +import static net.minecraft.commands.Commands.*; + +public class ExportRegistryCommand { + + private static final int ENTRIES_PER_FILE = 1000; + private static final long CONFIRM_WINDOW_MS = 5000; + private static final ConcurrentHashMap PENDING_CONFIRMS = new ConcurrentHashMap<>(); + + public static void register(CommandDispatcher dispatcher) { + dispatcher.register( + literal("exportregistry") + .requires(source -> source.hasPermission(4)) + .executes(ExportRegistryCommand::execute)); + } + + private static int execute(CommandContext ctx) { + var source = ctx.getSource(); + var player = source.getEntity(); + UUID id = player != null ? player.getUUID() : UUID.nameUUIDFromBytes("console".getBytes()); + + long now = System.currentTimeMillis(); + Long lastAttempt = PENDING_CONFIRMS.get(id); + + if (lastAttempt == null || (now - lastAttempt) > CONFIRM_WINDOW_MS) { + PENDING_CONFIRMS.put(id, now); + source.sendSuccess(() -> Component.literal("⚠⚠⚠ WARNING ⚠⚠⚠") + .withStyle(ChatFormatting.RED, ChatFormatting.BOLD) + .append(Component.literal( + "\nYou are about to trigger a registry dump into a folder within your .minecraft directory of ALL items and fluids in the game. This may consume a large volume of computer storage.") + .withStyle(ChatFormatting.YELLOW)) + .append(Component.literal( + "\nThis is a developer tool for workspace integration with grep/searching tools. Use with caution") + .withStyle(ChatFormatting.GRAY)) + .append(Component.literal("\n⚠⚠⚠ WARNING ⚠⚠⚠") + .withStyle(ChatFormatting.RED, ChatFormatting.BOLD)) + .append(Component.literal("\nRun again within 5 seconds to confirm.") + .withStyle(ChatFormatting.GREEN)), + false); + return 0; + } + + PENDING_CONFIRMS.remove(id); + source.sendSuccess(() -> Component.literal("Exporting registries...") + .withStyle(ChatFormatting.GREEN), true); + + Path gameDir = source.getServer().getServerDirectory(); + Path dumpDir = gameDir.resolve("registry-dump"); + + try { + if (Files.exists(dumpDir)) { + try (var stream = Files.walk(dumpDir)) { + stream.sorted(Comparator.reverseOrder()) + .forEach(p -> { + try { + Files.delete(p); + } catch (IOException ignored) {} + }); + } + } + Files.createDirectories(dumpDir); + + int itemCount = exportRegistry(dumpDir, "items", collectItems()); + int fluidCount = exportRegistry(dumpDir, "fluids", collectFluids()); + + int finalItemCount = itemCount; + int finalFluidCount = fluidCount; + source.sendSuccess(() -> Component.literal("✔ Registry dump complete: ") + .withStyle(ChatFormatting.GREEN) + .append(Component.literal(finalItemCount + " items, " + finalFluidCount + " fluids") + .withStyle(ChatFormatting.WHITE)) + .append(Component.literal(" → registry-dump/") + .withStyle(ChatFormatting.GRAY)), + true); + + } catch (IOException e) { + source.sendFailure(Component.literal("Failed to export registry: " + e.getMessage())); + return 0; + } + + return 1; + } + + private static List collectItems() { + List entries = new ArrayList<>(); + BuiltInRegistries.ITEM.forEach(item -> { + var id = BuiltInRegistries.ITEM.getKey(item); + if (id != null) { + String displayName = item.getDescription().getString(); + entries.add(id + " | " + displayName); + } + }); + entries.sort(String::compareTo); + return entries; + } + + private static List collectFluids() { + List entries = new ArrayList<>(); + BuiltInRegistries.FLUID.forEach(fluid -> { + var id = BuiltInRegistries.FLUID.getKey(fluid); + if (id != null) { + String displayName = fluid.getFluidType().getDescription().getString(); + entries.add(id + " | " + displayName); + } + }); + entries.sort(String::compareTo); + return entries; + } + + private static int exportRegistry(Path dir, String prefix, List entries) throws IOException { + int fileIndex = 0; + for (int i = 0; i < entries.size(); i += ENTRIES_PER_FILE) { + int end = Math.min(i + ENTRIES_PER_FILE, entries.size()); + List chunk = entries.subList(i, end); + Path file = dir.resolve(String.format("%s_%04d.txt", prefix, fileIndex)); + try (BufferedWriter writer = Files.newBufferedWriter(file)) { + for (String entry : chunk) { + writer.write(entry); + writer.newLine(); + } + } + fileIndex++; + } + return entries.size(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/commands/SoulCommand.java b/src/main/java/com/ghostipedia/cosmiccore/common/commands/SoulCommand.java new file mode 100644 index 000000000..dab0039a8 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/commands/SoulCommand.java @@ -0,0 +1,95 @@ +package com.ghostipedia.cosmiccore.common.commands; + +import com.ghostipedia.cosmiccore.api.capability.souls.SoulType; +import com.ghostipedia.cosmiccore.api.data.souls.SoulNetworkSavedData; +import com.ghostipedia.cosmiccore.api.recipe.ingredient.SoulStack; +import com.ghostipedia.cosmiccore.common.commands.argument.SoulTypeArgument; +import com.ghostipedia.cosmiccore.common.item.SoulNetworkReaderItem; + +import net.minecraft.commands.CommandBuildContext; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.network.chat.Component; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.context.CommandContext; +import dev.ftb.mods.ftbteams.data.TeamArgument; + +import java.util.UUID; + +import static net.minecraft.commands.Commands.*; + +public class SoulCommand { + + public static void register(CommandDispatcher dispatcher, CommandBuildContext buildContext) { + dispatcher.register( + literal("soul") + .requires(source -> source.hasPermission(LEVEL_ADMINS)) + .then(literal("player") + .then(argument("player", EntityArgument.player()) + .then(literal("info").executes(ctx -> displayInfo(ctx, + EntityArgument.getPlayer(ctx, "player").getUUID()))) + .then(literal("reset").executes(ctx -> resetNetwork(ctx, + EntityArgument.getPlayer(ctx, "player").getUUID()))) + .then(literal("add").then(argument("type", SoulTypeArgument.soulType()) + .then(argument("amount", IntegerArgumentType.integer()) + .executes(ctx -> addSouls(ctx, + EntityArgument.getPlayer(ctx, "player").getUUID(), + SoulTypeArgument.get(ctx, "type"), + IntegerArgumentType.getInteger(ctx, "amount")))))) + .then(literal("syphon").then(argument("type", SoulTypeArgument.soulType()) + .then(argument("amount", IntegerArgumentType.integer()) + .executes(ctx -> syphon(ctx, + EntityArgument.getPlayer(ctx, "player").getUUID(), + SoulTypeArgument.get(ctx, "type"), + IntegerArgumentType.getInteger(ctx, "amount")))))))) + .then(literal("team") + .then(argument("team", TeamArgument.create()) + .then(literal("info").executes( + ctx -> displayInfo(ctx, TeamArgument.get(ctx, "team").getTeamId()))) + .then(literal("reset").executes( + ctx -> resetNetwork(ctx, TeamArgument.get(ctx, "team").getTeamId()))) + .then(literal("add").then(argument("type", SoulTypeArgument.soulType()) + .then(argument("amount", IntegerArgumentType.integer()) + .executes(ctx -> addSouls(ctx, + TeamArgument.get(ctx, "team").getTeamId(), + SoulTypeArgument.get(ctx, "type"), + IntegerArgumentType.getInteger(ctx, "amount")))))) + .then(literal("syphon").then(argument("type", SoulTypeArgument.soulType()) + .then(argument("amount", IntegerArgumentType.integer()) + .executes(ctx -> syphon(ctx, + TeamArgument.get(ctx, "team").getTeamId(), + SoulTypeArgument.get(ctx, "type"), + IntegerArgumentType.getInteger(ctx, "amount"))))))))); + } + + private static int displayInfo(CommandContext context, UUID owner) { + var network = SoulNetworkSavedData.getSoulNetwork(context.getSource().getLevel(), owner); + context.getSource().sendSuccess(() -> SoulNetworkReaderItem.displaySoulNetworkInfo(network), false); + return 1; + } + + private static int resetNetwork(CommandContext context, UUID owner) { + var network = SoulNetworkSavedData.getSoulNetwork(context.getSource().getLevel(), owner); + network.reset(); + context.getSource().sendSuccess(() -> Component.translatable("gui.cosmiccore.soul.reset"), false); + return 1; + } + + private static int addSouls(CommandContext context, UUID owner, SoulType type, int amount) { + var network = SoulNetworkSavedData.getSoulNetwork(context.getSource().getLevel(), owner); + network.add(new SoulStack(type, amount), Integer.MAX_VALUE, Integer.MAX_VALUE, false); + context.getSource().sendSuccess( + () -> Component.translatable("gui.cosmiccore.soul.add", amount, type.getSerializedName()), false); + return 1; + } + + private static int syphon(CommandContext context, UUID owner, SoulType type, int amount) { + var network = SoulNetworkSavedData.getSoulNetwork(context.getSource().getLevel(), owner); + network.syphon(new SoulStack(type, amount), false); + context.getSource().sendSuccess( + () -> Component.translatable("gui.cosmiccore.soul.remove", amount, type.getSerializedName()), false); + return 1; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/commands/StarLadderCommand.java b/src/main/java/com/ghostipedia/cosmiccore/common/commands/StarLadderCommand.java new file mode 100644 index 000000000..29db54903 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/commands/StarLadderCommand.java @@ -0,0 +1,68 @@ +package com.ghostipedia.cosmiccore.common.commands; + +import com.ghostipedia.cosmiccore.api.data.savedData.StarLadderSavedData; + +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.context.CommandContext; +import dev.ftb.mods.ftbteams.api.FTBTeamsAPI; + +import java.util.UUID; + +import static net.minecraft.commands.Commands.*; + +public class StarLadderCommand { + + public static void register(CommandDispatcher dispatcher) { + dispatcher.register( + literal("starladder") + .requires(source -> source.hasPermission(LEVEL_ADMINS)) + .then(literal("status") + .then(argument("player", EntityArgument.player()) + .executes(ctx -> showStatus(ctx, + EntityArgument.getPlayer(ctx, "player"))))) + .then(literal("reset") + .then(argument("player", EntityArgument.player()) + .executes(ctx -> resetUplink(ctx, + EntityArgument.getPlayer(ctx, "player")))))); + } + + private static UUID getTeamId(ServerPlayer player) { + var teamManager = FTBTeamsAPI.api().getManager(); + var team = teamManager.getTeamForPlayer(player).orElse(null); + return team != null ? team.getTeamId() : player.getUUID(); + } + + private static int showStatus(CommandContext ctx, ServerPlayer player) { + UUID teamId = getTeamId(player); + var data = StarLadderSavedData.getOrCreate(ctx.getSource().getServer()); + boolean established = data.isEstablished(teamId); + + ctx.getSource().sendSuccess(() -> Component.literal("Star Ladder uplink for ") + .append(player.getDisplayName()) + .append(": ") + .append(established ? Component.literal("ESTABLISHED").withStyle(s -> s.withColor(0x40CC40)) : + Component.literal("NOT ESTABLISHED").withStyle(s -> s.withColor(0xCC4040))), + false); + return 1; + } + + private static int resetUplink(CommandContext ctx, ServerPlayer player) { + UUID teamId = getTeamId(player); + var data = StarLadderSavedData.getOrCreate(ctx.getSource().getServer()); + boolean wasEstablished = data.resetEstablished(teamId); + + if (wasEstablished) { + ctx.getSource().sendSuccess(() -> Component.literal("Reset Star Ladder uplink for ") + .append(player.getDisplayName()), false); + } else { + ctx.getSource().sendSuccess(() -> Component.literal("Star Ladder uplink was not established for ") + .append(player.getDisplayName()), false); + } + return 1; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/commands/VeinSurveyCommand.java b/src/main/java/com/ghostipedia/cosmiccore/common/commands/VeinSurveyCommand.java new file mode 100644 index 000000000..92def0ae0 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/commands/VeinSurveyCommand.java @@ -0,0 +1,275 @@ +package com.ghostipedia.cosmiccore.common.commands; + +import com.ghostipedia.cosmiccore.common.worldgen.survey.VeinSurveyUtil; +import com.ghostipedia.cosmiccore.common.worldgen.survey.VeinSurveyUtil.VeinInfo; + +import com.gregtechceu.gtceu.api.data.worldgen.IWorldGenLayer; +import com.gregtechceu.gtceu.api.data.worldgen.WorldGeneratorUtils; + +import net.minecraft.ChatFormatting; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.coordinates.BlockPosArgument; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.ClickEvent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.suggestion.SuggestionProvider; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +import static net.minecraft.commands.Commands.*; + +public class VeinSurveyCommand { + + private static final int DEFAULT_RADIUS = 2000; + private static final int MAX_RADIUS = 10000; + private static final int MAX_RESULTS_DISPLAY = 10; + + private static final SuggestionProvider VEIN_SUGGESTIONS = (context, builder) -> { + var level = context.getSource().getLevel(); + var layers = WorldGeneratorUtils.WORLD_GEN_LAYERS.values().stream() + .filter(l -> l.isApplicableForLevel(level.dimension())) + .toList(); + + for (var layer : layers) { + for (String veinType : VeinSurveyUtil.getAvailableVeinTypes(level, layer)) { + if (veinType.toLowerCase().startsWith(builder.getRemainingLowerCase())) { + builder.suggest(veinType); + } + } + } + return builder.buildFuture(); + }; + + public static void register(CommandDispatcher dispatcher) { + dispatcher.register( + literal("survey") + .requires(source -> source.hasPermission(LEVEL_ALL)) + .executes(ctx -> surveyFromPlayer(ctx, DEFAULT_RADIUS, null)) + .then(argument("radius", IntegerArgumentType.integer(100, MAX_RADIUS)) + .executes(ctx -> surveyFromPlayer(ctx, + IntegerArgumentType.getInteger(ctx, "radius"), null)) + .then(argument("filter", StringArgumentType.word()) + .suggests(VEIN_SUGGESTIONS) + .executes(ctx -> surveyFromPlayer(ctx, + IntegerArgumentType.getInteger(ctx, "radius"), + StringArgumentType.getString(ctx, "filter"))))) + .then(literal("nearest") + .executes(ctx -> findNearest(ctx, null)) + .then(argument("filter", StringArgumentType.word()) + .suggests(VEIN_SUGGESTIONS) + .executes(ctx -> findNearest(ctx, + StringArgumentType.getString(ctx, "filter"))))) + .then(literal("at") + .then(argument("pos", BlockPosArgument.blockPos()) + .then(argument("radius", IntegerArgumentType.integer(100, MAX_RADIUS)) + .executes(ctx -> surveyFromPos(ctx, + BlockPosArgument.getLoadedBlockPos(ctx, "pos"), + IntegerArgumentType.getInteger(ctx, "radius"), + null)) + .then(argument("filter", StringArgumentType.word()) + .suggests(VEIN_SUGGESTIONS) + .executes(ctx -> surveyFromPos(ctx, + BlockPosArgument.getLoadedBlockPos(ctx, "pos"), + IntegerArgumentType.getInteger(ctx, "radius"), + StringArgumentType.getString(ctx, "filter"))))))) + .then(literal("types") + .executes(VeinSurveyCommand::listVeinTypes))); + } + + private static int surveyFromPlayer(CommandContext ctx, int radius, String filter) { + ServerPlayer player = ctx.getSource().getPlayer(); + if (player == null) { + ctx.getSource().sendFailure(Component.translatable("cosmiccore.survey.command.player_only")); + return 0; + } + return performSurvey(ctx, player.blockPosition(), radius, filter); + } + + private static int surveyFromPos(CommandContext ctx, BlockPos pos, int radius, String filter) { + return performSurvey(ctx, pos, radius, filter); + } + + private static int performSurvey(CommandContext ctx, BlockPos center, int radius, + String filter) { + ServerLevel level = ctx.getSource().getLevel(); + + ctx.getSource().sendSuccess(() -> Component.translatable("cosmiccore.survey.command.scanning", radius) + .withStyle(ChatFormatting.YELLOW), false); + + IWorldGenLayer layer = WorldGeneratorUtils.WORLD_GEN_LAYERS.values().stream() + .filter(l -> l.isApplicableForLevel(level.dimension())) + .findFirst() + .orElse(null); + + List veins = VeinSurveyUtil.surveyVeins(level, center, radius, layer); + + if (filter != null && !filter.isEmpty()) { + String filterLower = filter.toLowerCase(); + veins = veins.stream() + .filter(v -> v.getVeinName().toLowerCase().contains(filterLower)) + .toList(); + } + + if (veins.isEmpty()) { + ctx.getSource() + .sendSuccess(() -> (filter != null ? + Component.translatable("cosmiccore.survey.no_veins.filtered", filter) : + Component.translatable("cosmiccore.survey.no_veins")) + .withStyle(ChatFormatting.RED), false); + return 0; + } + + final List finalVeins = veins; + ctx.getSource().sendSuccess(() -> Component.literal("") + .append(Component.translatable("cosmiccore.survey.command.results").withStyle(ChatFormatting.GOLD)) + .append("\n") + .append(Component.translatable("cosmiccore.survey.found", finalVeins.size(), radius) + .withStyle(ChatFormatting.GRAY)), + false); + + Map veinCounts = veins.stream() + .collect(Collectors.groupingBy(VeinInfo::getVeinName, Collectors.counting())); + + MutableComponent typeSummary = Component.literal("\n") + .append(Component.translatable("cosmiccore.survey.command.vein_types").withStyle(ChatFormatting.GRAY)); + boolean first = true; + for (var entry : veinCounts.entrySet()) { + if (!first) typeSummary.append(", "); + first = false; + typeSummary.append(Component.literal(entry.getKey() + " (" + entry.getValue() + ")") + .withStyle(ChatFormatting.WHITE)); + } + ctx.getSource().sendSuccess(() -> typeSummary, false); + + ctx.getSource().sendSuccess(() -> Component.literal("\n") + .append(Component.translatable("cosmiccore.survey.command.nearest_veins") + .withStyle(ChatFormatting.YELLOW)), + false); + + int displayCount = Math.min(MAX_RESULTS_DISPLAY, veins.size()); + for (int i = 0; i < displayCount; i++) { + sendVeinEntry(ctx, veins.get(i), center, i + 1); + } + + if (veins.size() > MAX_RESULTS_DISPLAY) { + int remaining = veins.size() - MAX_RESULTS_DISPLAY; + ctx.getSource().sendSuccess(() -> Component.translatable("cosmiccore.survey.command.more", remaining) + .withStyle(ChatFormatting.GRAY), false); + } + + return veins.size(); + } + + private static int findNearest(CommandContext ctx, String filter) { + ServerPlayer player = ctx.getSource().getPlayer(); + if (player == null) { + ctx.getSource().sendFailure(Component.translatable("cosmiccore.survey.command.player_only")); + return 0; + } + + ServerLevel level = ctx.getSource().getLevel(); + BlockPos center = player.blockPosition(); + + IWorldGenLayer layer = WorldGeneratorUtils.WORLD_GEN_LAYERS.values().stream() + .filter(l -> l.isApplicableForLevel(level.dimension())) + .findFirst() + .orElse(null); + + Optional nearest = VeinSurveyUtil.findNearestVein(level, center, MAX_RADIUS, layer, filter); + + if (nearest.isEmpty()) { + ctx.getSource() + .sendSuccess(() -> (filter != null ? + Component.translatable("cosmiccore.survey.no_veins.filtered", filter) : + Component.translatable("cosmiccore.survey.no_veins")) + .withStyle(ChatFormatting.RED), false); + return 0; + } + + VeinInfo vein = nearest.get(); + ctx.getSource() + .sendSuccess(() -> (filter != null ? + Component.translatable("cosmiccore.survey.nearest_vein.filtered", filter) : + Component.translatable("cosmiccore.survey.nearest_vein")) + .withStyle(ChatFormatting.GOLD), false); + sendVeinEntry(ctx, vein, center, 1); + + return 1; + } + + private static void sendVeinEntry(CommandContext ctx, VeinInfo vein, BlockPos from, int index) { + BlockPos pos = vein.center(); + int distance = vein.horizontalDistanceFrom(from); + String direction = vein.directionFrom(from); + + ChatFormatting nameColor = vein.isConfirmed() ? ChatFormatting.AQUA : ChatFormatting.GRAY; + String confidenceIndicator = vein.isConfirmed() ? "" : "? "; + + String tpCommand = "/tp @s " + pos.getX() + " ~ " + pos.getZ(); + + MutableComponent entry = Component.literal(index + ". ") + .withStyle(ChatFormatting.GRAY) + .append(Component.literal(confidenceIndicator + vein.getVeinName()).withStyle(nameColor)) + .append(Component.literal(" - ").withStyle(ChatFormatting.GRAY)) + .append(Component.literal(distance + "m " + direction).withStyle(ChatFormatting.WHITE)) + .append(Component.literal(" [").withStyle(ChatFormatting.DARK_GRAY)) + .append(Component.literal("X:" + pos.getX() + " Z:" + pos.getZ()) + .withStyle(Style.EMPTY + .withColor(ChatFormatting.GREEN) + .withUnderlined(true) + .withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, tpCommand)) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, + Component.translatable("cosmiccore.survey.click_tp"))))) + .append(Component.literal("]").withStyle(ChatFormatting.DARK_GRAY)); + + ctx.getSource().sendSuccess(() -> entry, false); + } + + private static int listVeinTypes(CommandContext ctx) { + ServerLevel level = ctx.getSource().getLevel(); + + IWorldGenLayer layer = WorldGeneratorUtils.WORLD_GEN_LAYERS.values().stream() + .filter(l -> l.isApplicableForLevel(level.dimension())) + .findFirst() + .orElse(null); + + List types = VeinSurveyUtil.getAvailableVeinTypes(level, layer); + + if (types.isEmpty()) { + ctx.getSource().sendSuccess(() -> Component.translatable("cosmiccore.survey.command.no_veins_dimension") + .withStyle(ChatFormatting.RED), false); + return 0; + } + + ctx.getSource() + .sendSuccess(() -> Component.translatable("cosmiccore.survey.command.available_types", types.size()) + .withStyle(ChatFormatting.GOLD), false); + + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < types.size(); i++) { + sb.append(types.get(i)); + if ((i + 1) % 4 == 0 || i == types.size() - 1) { + final String line = sb.toString(); + ctx.getSource().sendSuccess(() -> Component.literal(line).withStyle(ChatFormatting.WHITE), false); + sb.setLength(0); + } else { + sb.append(", "); + } + } + + return types.size(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/commands/WirelessEnergyCommand.java b/src/main/java/com/ghostipedia/cosmiccore/common/commands/WirelessEnergyCommand.java new file mode 100644 index 000000000..409379eec --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/commands/WirelessEnergyCommand.java @@ -0,0 +1,140 @@ +package com.ghostipedia.cosmiccore.common.commands; + +import com.ghostipedia.cosmiccore.api.data.wireless.WirelessEnergySavedData; + +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.client.Minecraft; +import net.minecraft.commands.CommandBuildContext; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.arguments.EntityArgument; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; +import com.mojang.brigadier.context.CommandContext; +import dev.ftb.mods.ftbteams.api.FTBTeamsAPI; +import dev.ftb.mods.ftbteams.api.Team; +import dev.ftb.mods.ftbteams.data.TeamArgument; + +import java.util.UUID; +import java.util.function.BiFunction; + +import static net.minecraft.commands.Commands.*; + +public class WirelessEnergyCommand { + + public static void register(CommandDispatcher dispatcher, CommandBuildContext buildContext) { + dispatcher.register( + literal("wireless") + .then(wirelessLiteral("info", LEVEL_ALL, WirelessEnergyCommand::displayPlayerInfo, + WirelessEnergyCommand::displayTeamInfo)) + .then(literal("debug").requires(source -> source.hasPermission(LEVEL_ALL)) + .executes(WirelessEnergyCommand::displayDebugInfo)) + .then(wirelessLiteral("clear", LEVEL_ADMINS, WirelessEnergyCommand::clearPlayerData, + WirelessEnergyCommand::clearTeamData))); + } + + private static LiteralArgumentBuilder wirelessLiteral(String name, int permissionLevel, + BiFunction, ServerPlayer, Integer> playerCommand, + BiFunction, Team, Integer> teamCommand) { + return literal(name) + .requires(source -> source.hasPermission(permissionLevel)) + .then(literal("player").then(argument("player", EntityArgument.player()) + .executes(ctx -> playerCommand.apply(ctx, EntityArgument.getPlayer(ctx, "player"))))) + .then(literal("team").then(argument("team", TeamArgument.create()) + .executes(ctx -> teamCommand.apply(ctx, TeamArgument.get(ctx, "team"))))) + .executes(ctx -> sourceCommand(ctx, playerCommand, teamCommand)); + } + + private static int sourceCommand(CommandContext context, + BiFunction, ServerPlayer, Integer> playerCommand, + BiFunction, Team, Integer> teamCommand) { + var owner = getPlayerOrTeam(context.getSource().getPlayer()); + if (owner instanceof ServerPlayer player) return playerCommand.apply(context, player); + else if (owner instanceof Team team) return teamCommand.apply(context, team); + else return -1; + } + + private static Object getPlayerOrTeam(ServerPlayer player) { + var team = FTBTeamsAPI.api().getManager().getTeamForPlayer(player); + return (team.isPresent() && !team.get().isPlayerTeam()) ? team.get() : player; + } + + // #################################### + // Display Info + // #################################### + + private static int displayDebugInfo(CommandContext context) { + var characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,./ "; + var stringBuilder = new StringBuilder(); + for (var character : characters.toCharArray()) { + stringBuilder + .append(character) + .append(":") + .append(Minecraft.getInstance().font.width(String.valueOf(character))) + .append(";"); + } + System.out.println(stringBuilder); + return 1; + } + + private static int displayPlayerInfo(CommandContext context, ServerPlayer player) { + var message = generateInfoMessage(context.getSource().getLevel(), player.getUUID(), + Component.translatable("cosmic.command.wireless.energy.player", player.getName())); + context.getSource().sendSuccess(() -> message, false); + return 1; + } + + private static int displayTeamInfo(CommandContext context, Team team) { + var message = generateInfoMessage(context.getSource().getLevel(), team.getTeamId(), + Component.translatable("cosmic.command.wireless.energy.team", team.getName())); + context.getSource().sendSuccess(() -> message, false); + return 1; + } + + private static Component generateInfoMessage(ServerLevel serverLevel, UUID owner, Component ownerName) { + var wirelessData = WirelessEnergySavedData.getOrCreate(serverLevel); + + var message = Component.translatable("cosmic.command.wireless.energy.header", ownerName).append("\n") + .append(Component.translatable("cosmic.command.wireless.energy.capacity", + FormattingUtil.formatNumbers(wirelessData.getEnergyCapacity(owner)))) + .append("\n") + .append(Component.translatable("cosmic.command.wireless.energy.stored", + FormattingUtil.formatNumbers(wirelessData.getEnergyStored(owner)))) + .append("\n") + .append(Component.translatable("cosmic.command.wireless.energy.input", + FormattingUtil.formatNumbers(wirelessData.getEnergyInput(owner)))) + .append("\n") + .append(Component.translatable("cosmic.command.wireless.energy.output", + FormattingUtil.formatNumbers(wirelessData.getEnergyOutput(owner)))) + .append("\n") + .append(Component.translatable("cosmic.command.wireless.energy.buffered", + FormattingUtil.formatNumbers(wirelessData.getEnergyBuffered(owner)))) + .append("\n") + .append(Component.translatable("cosmic.command.wireless.energy.active", wirelessData.isActive(owner))); + + return message; + } + + // #################################### + // Clear data + // #################################### + + private static int clearPlayerData(CommandContext context, ServerPlayer player) { + return clearData(context, player.getUUID()); + } + + private static int clearTeamData(CommandContext context, Team team) { + return clearData(context, team.getTeamId()); + } + + private static int clearData(CommandContext context, UUID uuid) { + var level = context.getSource().getLevel(); + var wirelessData = WirelessEnergySavedData.getOrCreate(level); + wirelessData.clearWirelessEnergy(uuid); + return 1; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/commands/argument/SoulTypeArgument.java b/src/main/java/com/ghostipedia/cosmiccore/common/commands/argument/SoulTypeArgument.java new file mode 100644 index 000000000..c4b02e0f9 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/commands/argument/SoulTypeArgument.java @@ -0,0 +1,58 @@ +package com.ghostipedia.cosmiccore.common.commands.argument; + +import com.ghostipedia.cosmiccore.api.capability.souls.SoulType; + +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.SharedSuggestionProvider; +import net.minecraft.network.chat.Component; + +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.arguments.ArgumentType; +import com.mojang.brigadier.context.CommandContext; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.brigadier.exceptions.DynamicCommandExceptionType; +import com.mojang.brigadier.suggestion.Suggestions; +import com.mojang.brigadier.suggestion.SuggestionsBuilder; + +import java.util.Arrays; +import java.util.Collection; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; + +public class SoulTypeArgument implements ArgumentType { + + private static final Collection EXAMPLES = Arrays.stream(SoulType.values()) + .map(SoulType::getSerializedName) + .collect(Collectors.toList()); + + public static final DynamicCommandExceptionType ERROR_INVALID_VALUE = new DynamicCommandExceptionType( + (object) -> Component.translatable("argument.enum.invalid", object)); + + public static SoulTypeArgument soulType() { + return new SoulTypeArgument(); + } + + public static SoulType get(CommandContext context, String name) { + return context.getArgument(name, SoulType.class); + } + + @Override + public SoulType parse(StringReader reader) throws CommandSyntaxException { + String s = reader.readUnquotedString(); + SoulType soulType = SoulType.byName(s); + if (soulType == null) { + throw ERROR_INVALID_VALUE.create(s); + } + return soulType; + } + + @Override + public CompletableFuture listSuggestions(CommandContext context, SuggestionsBuilder builder) { + return SharedSuggestionProvider.suggest(EXAMPLES, builder); + } + + @Override + public Collection getExamples() { + return EXAMPLES; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicAttachmentTypes.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicAttachmentTypes.java new file mode 100644 index 000000000..6a2f628af --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicAttachmentTypes.java @@ -0,0 +1,34 @@ +package com.ghostipedia.cosmiccore.common.data; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.abyss.AbyssBudget; +import com.ghostipedia.cosmiccore.common.airControl.OxygenBudget; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionData; +import com.ghostipedia.cosmiccore.common.teleporter.TeleportOrigin; + +import net.neoforged.neoforge.attachment.AttachmentType; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import net.neoforged.neoforge.registries.NeoForgeRegistries; + +public class CosmicAttachmentTypes { + + public static final DeferredRegister> ATTACHMENT_TYPES = + DeferredRegister.create(NeoForgeRegistries.ATTACHMENT_TYPES, CosmicCore.MOD_ID); + + public static final DeferredHolder, AttachmentType> REFLECTION = ATTACHMENT_TYPES + .register("reflection", + () -> AttachmentType.serializable(holder -> new ReflectionData()).copyOnDeath().build()); + + public static final DeferredHolder, AttachmentType> OXYGEN_BUDGET = ATTACHMENT_TYPES + .register("oxygen_budget", + () -> AttachmentType.serializable(holder -> new OxygenBudget()).copyOnDeath().build()); + + public static final DeferredHolder, AttachmentType> ABYSS_BUDGET = ATTACHMENT_TYPES + .register("abyss_budget", + () -> AttachmentType.serializable(holder -> new AbyssBudget()).copyOnDeath().build()); + + public static final DeferredHolder, AttachmentType> TELEPORT_ORIGIN = ATTACHMENT_TYPES + .register("teleport_origin", + () -> AttachmentType.serializable(holder -> new TeleportOrigin()).copyOnDeath().build()); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBlockEntities.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBlockEntities.java new file mode 100644 index 000000000..e5c3afb7e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBlockEntities.java @@ -0,0 +1,8 @@ +package com.ghostipedia.cosmiccore.common.data; + +public class CosmicBlockEntities { + + // TODO(embers): ember emitter/receptor block entities shelved with Embers (beads cosmiccore-42.13 / 42.14) + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBlocks.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBlocks.java index a312434c1..cc421fd6b 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBlocks.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBlocks.java @@ -3,142 +3,996 @@ import com.ghostipedia.cosmiccore.CosmicCore; import com.ghostipedia.cosmiccore.api.CosmicCoreAPI; import com.ghostipedia.cosmiccore.api.block.IMagnetType; +import com.ghostipedia.cosmiccore.client.renderer.block.NebulaeCoilRenderer; +import com.ghostipedia.cosmiccore.common.block.DivingBellEscapePad; import com.ghostipedia.cosmiccore.common.block.MagnetBlock; -import com.ghostipedia.cosmiccore.common.data.recipe.RecipeTags; +import com.ghostipedia.cosmiccore.common.block.MothHomeBlock; +import com.ghostipedia.cosmiccore.common.blockentity.CosmicCoilBlockEntity; + +import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTCEuAPI; +import com.gregtechceu.gtceu.api.block.ActiveBlock; import com.gregtechceu.gtceu.api.block.ICoilType; -import com.gregtechceu.gtceu.api.block.RendererBlock; -import com.gregtechceu.gtceu.api.block.RendererGlassBlock; -import com.gregtechceu.gtceu.api.item.RendererBlockItem; -import com.gregtechceu.gtceu.client.renderer.block.TextureOverrideRenderer; +import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; import com.gregtechceu.gtceu.common.block.CoilBlock; -import com.lowdragmc.lowdraglib.Platform; -import com.lowdragmc.lowdraglib.client.renderer.IRenderer; -import com.tterrag.registrate.util.entry.BlockEntry; -import com.tterrag.registrate.util.nullness.NonNullBiConsumer; -import com.tterrag.registrate.util.nullness.NonNullSupplier; +import com.gregtechceu.gtceu.common.data.models.GTModels; +import com.gregtechceu.gtceu.data.recipe.CustomTags; + import net.minecraft.client.renderer.RenderType; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; +import net.minecraft.world.item.BlockItem; import net.minecraft.world.level.block.*; import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.block.state.properties.NoteBlockInstrument; +import net.minecraft.world.level.material.MapColor; +import net.neoforged.neoforge.client.model.generators.ConfiguredModel; +import net.neoforged.neoforge.client.model.generators.ModelFile; + +import com.teamresourceful.resourcefullib.common.registry.RegistryEntry; +import com.tterrag.registrate.providers.DataGenContext; +import com.tterrag.registrate.providers.RegistrateBlockstateProvider; +import com.tterrag.registrate.util.entry.BlockEntry; +import com.tterrag.registrate.util.nullness.NonNullBiConsumer; +import com.tterrag.registrate.util.nullness.NonNullFunction; +import com.tterrag.registrate.util.nullness.NonNullSupplier; +import it.unimi.dsi.fastutil.ints.Int2ReferenceArrayMap; import java.util.Map; -import java.util.function.BiFunction; import java.util.function.Supplier; import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; - +import static com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties.ACTIVE; public class CosmicBlocks { + static { REGISTRATE.creativeModeTab(() -> CosmicCreativeModeTabs.COSMIC_CORE); } - //Coil Register - + // Coil Register + // TODO(stellaris): SUN_GLOBE used Ad Astra GLOBES registry + GlobeBlock — dropped with Ad Astra (bead cosmiccore-42.13) - public static final BlockEntry COIL_PRISMATIC_TUNGSTENSTEEL = createCoilBlock(CosmicCoilBlock.CoilType.PRISMATIC_TUNGSTENSTEEL); - public static final BlockEntry COIL_RESONANT_VIRTUE_MELD = createCoilBlock(CosmicCoilBlock.CoilType.RESONANT_VIRTUE_MELD); - public static final BlockEntry COIL_NAQUADIC_SUPERALLOY = createCoilBlock(CosmicCoilBlock.CoilType.NAQUADIC_SUPERALLOY); + public static final BlockEntry COIL_PRISMATIC_TUNGSTENSTEEL = createCoilBlock( + CosmicCoilBlock.CoilType.PRISMATIC_TUNGSTENSTEEL); + public static final BlockEntry COIL_RESONANT_VIRTUE_MELD = createCoilBlock( + CosmicCoilBlock.CoilType.RESONANT_VIRTUE_MELD); + public static final BlockEntry COIL_NAQUADIC_SUPERALLOY = createCoilBlock( + CosmicCoilBlock.CoilType.NAQUADIC_SUPERALLOY); public static final BlockEntry COIL_TRANAVINE = createCoilBlock(CosmicCoilBlock.CoilType.TRINAVINE); - public static final BlockEntry COIL_PSIONIC_GALVORN = createCoilBlock(CosmicCoilBlock.CoilType.PSIONIC_GALVORN); - public static final BlockEntry COIL_LIVING_IGNICLAD = createCoilBlock(CosmicCoilBlock.CoilType.LIVING_IGNICLAD); - public static final BlockEntry COIL_PROGRAMMABLE_MATTER = createCoilBlock(CosmicCoilBlock.CoilType.PROGRAMMABLE_MATTER); - public static final BlockEntry COIL_SHIMMERING_NEUTRONIUM = createCoilBlock(CosmicCoilBlock.CoilType.SHIMMERING_NEUTRONIUM); - public static final BlockEntry COIL_CAUSAL_FABRIC = createCoilBlock(CosmicCoilBlock.CoilType.CAUSAL_FABRIC); - public static final BlockEntry CASING_DYSON_CELL = createCasingBlock("dyson_solar_cell", CosmicCore.id("block/casings/solid/dyson_solar_cell")); - public static final BlockEntry NAQUADAH_PRESSURE_RESISTANT_CASING = createCasingBlock("naquadah_pressure_resistant_casing", CosmicCore.id("block/casings/solid/naquadah_pressure_resistant_casing")); - public static final BlockEntry RESONANTLY_TUNED_VIRTUE_MELD_CASING = createCasingBlock("resonantly_tuned_virtue_meld_casing", CosmicCore.id("block/casings/solid/resonantly_tuned_virtue_meld_casing")); - public static final BlockEntry ALTERNATOR_FLUX_COILING = createCasingBlock("alternator_flux_coiling", CosmicCore.id("block/casings/solid/alternator_flux_coiling_copper")); - public static final BlockEntry PLATED_AEROCLOUD = createCasingBlock("plated_aerocloud", CosmicCore.id("block/casings/solid/plated_aerocloud")); + public static final BlockEntry COIL_PSIONIC_GALVORN = createCoilBlock( + CosmicCoilBlock.CoilType.PSIONIC_GALVORN); + public static final BlockEntry COIL_LIVING_IGNICLAD = createCoilBlock( + CosmicCoilBlock.CoilType.LIVING_IGNICLAD); + public static final BlockEntry COIL_PROGRAMMABLE_MATTER = createCoilBlock( + CosmicCoilBlock.CoilType.PROGRAMMABLE_MATTER); + public static final BlockEntry COIL_SHIMMERING_NEUTRONIUM = createCoilBlock( + CosmicCoilBlock.CoilType.SHIMMERING_NEUTRONIUM); + public static final BlockEntry COIL_CAUSAL_FABRIC = createCoilBlockWithEntity( + CosmicCoilBlock.CoilType.CAUSAL_FABRIC, + (ctx, prov) -> { + String name = ctx.getName(); + ActiveBlock block = ctx.getEntry(); + ModelFile inactive = prov.models() + .cubeAll(name, CosmicCore.id("block/casings/coils/causal_fabric_off")); + ModelFile active = prov.models() + .cubeAll(name + "_active", CosmicCore.id("block/casings/coils/causal_fabric")); + + prov.getVariantBuilder(block) + .partialState().with(GTBlockStateProperties.ACTIVE, false).modelForState().modelFile(inactive) + .addModel() + .partialState().with(GTBlockStateProperties.ACTIVE, true).modelForState().modelFile(active) + .addModel(); + }); + + // New Casings ; Several reference textures from GTOCore, make sure to give credits to them! + public static final BlockEntry REFLECTIVE_STARMETAL_CASING = createCasingBlock("reflective_starmetal_casing", + CosmicCore.id("block/casings/solid/reflective_starmetal_casing")); + public static final BlockEntry TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING = createCasingBlock( + "tritanium_lined_heavy_neutronium_casing", + CosmicCore.id("block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing")); + public static final BlockEntry HIGH_TOLERANCE_RHENIUM_CASING = createCasingBlock( + "high_tolerance_rhenium_casing", + CosmicCore.id("block/casings/solid/high_tolerance_rhenium_casing")); + public static final BlockEntry HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING = createCasingBlock( + "highly_flexible_reinforced_trinavine_casing", + CosmicCore.id("block/casings/solid/highly_flexible_reinforced_trinavine_casing")); + public static final BlockEntry CASING_DYSON_CELL = createCasingBlock("dyson_solar_cell", + CosmicCore.id("block/casings/solid/dyson_solar_cell")); + public static final BlockEntry STAR_LADDER_CASING = createCasingBlock("dyson_solar_cell", + CosmicCore.id("block/casings/solid/dyson_solar_cell")); + public static final BlockEntry NAQUADAH_PRESSURE_RESISTANT_CASING = createCasingBlock( + "naquadah_pressure_resistant_casing", + CosmicCore.id("block/casings/solid/naquadah_pressure_resistant_casing")); + public static final BlockEntry RESONANTLY_TUNED_VIRTUE_MELD_CASING = createCasingBlock( + "resonantly_tuned_virtue_meld_casing", + CosmicCore.id("block/casings/solid/resonantly_tuned_virtue_meld_casing")); + public static final BlockEntry STEEL_PLATED_BRONZE = createCasingBlock("steel_plated_bronze_casing", + CosmicCore.id("block/casings/solid/steel_plated_bronze_casing")); + public static final BlockEntry ALTERNATOR_FLUX_COILING = createCasingBlock("alternator_flux_coiling", + CosmicCore.id("block/casings/solid/alternator_flux_coiling_copper")); + public static final BlockEntry PLATED_AEROCLOUD = createCasingBlock("plated_aerocloud", + CosmicCore.id("block/casings/solid/plated_aerocloud")); + public static final BlockEntry SELF_HEALING_PTHANTERUM = createCasingBlock("self_healing_pthanterum_casing", + CosmicCore.id("block/casings/solid/self_healing_pthanterum_casing")); + + public static final BlockEntry CRYOGENIC_CASING = createCasingBlock("cryogenic_casing", + CosmicCore.id("block/casings/solid/cryogenic_casing")); + + public static final BlockEntry HEAVY_FROST_PROOF_CASING = createCasingBlock("heavy_frost_proof_casing", + CosmicCore.id("block/casings/solid/heavy_frost_proof_casing")); + public static final BlockEntry SOUL_STAINED_STEEL_ALU_CASING = createCasingBlock( + "soul_stained_steel_aluminium_plated_casing", + CosmicCore.id("block/casings/solid/soul_stained_steel_aluminium_plated_casing")); + public static final BlockEntry LIVING_ROCK_TILES = createCasingBlock("livingrock_tiles", + CosmicCore.id("block/casings/solid/livingrock_tiles")); + + public static final BlockEntry NEUTRONIUM_BOUEY = createCasingBlock("neutronium_buoy", + CosmicCore.id("block/casings/solid/neutronium_buoy")); + public static final BlockEntry PTHANTERUM_WAVE_BREAKERS_CASING = createCasingBlock( + "pthanterum_wave_breakers", + CosmicCore.id("block/casings/solid/pthanterum_wave_breakers")); + public static final BlockEntry CYCLOZINE_HIGH_RIGIDITY_CASING = createCasingBlock( + "cyclozine_high_rigidity_casing", + CosmicCore.id("block/casings/solid/cyclozine_high_rigidity_casing")); + + public static final BlockEntry LIGHT_DAWNSTONE_CASING = createCasingBlock( + "light_dawnstone_casing", + CosmicCore.id("block/casings/solid/light_dawnstone_casing")); + + public static final BlockEntry REINFORCED_DAWNSTONE_CASING = createCasingBlock( + "reinforced_dawnstone_casing", + CosmicCore.id("block/casings/solid/reinforced_dawnstone_casing")); + + // Mechanical Alveary + public static final BlockEntry ALVEARY_CASING = createCasingBlock( + "alveary_casing", + CosmicCore.id("block/casings/solid/alveary_casing")); + + // public static final BlockEntry SOMAPLASTIC_HEAVY_FRAMES = createCasingBlock("somaplastic_heavy_frames", + // CosmicCore.id("block/casings/solid/cyclozine_high_rigidity_casing")); + // public static final BlockEntry MOON_DIVE_CASING = createCasingBlock("moon_dive_casing", + // CosmicCore.id("block/casings/solid/moon_dive_casing")); + + public static final BlockEntry BICHROMAL_NEVRAMITE_CASING = createCasingBlock("bichromal_nevramite_casing", + CosmicCore.id("block/casings/solid/bichromal_nevramite_casing")); + public static final BlockEntry FULGORINTH_PRIME_CASING = createCasingBlock("fulgorinth_prime_casing", + CosmicCore.id("block/casings/solid/fulgorinth_prime_casing")); + public static final BlockEntry OSCILLATING_GILDED_PTHANTERUM_CASING = createCasingBlock( + "oscillating_gilded_pthanterum_casings", + CosmicCore.id("block/casings/solid/oscillating_gilded_pthanterum_casings")); + public static final BlockEntry PRESSURE_CONTAINMNET_CASING = createCasingBlock("pressure_containment_casing", + CosmicCore.id("block/casings/solid/pressure_containment_casing")); + public static final BlockEntry ROYAL_ICHORIUM_CASING = createCasingBlock("royal_ichorium_casing", + CosmicCore.id("block/casings/solid/royal_ichorium_casing")); + public static final BlockEntry VIBRANT_RUBIDIUM_CASING = createCasingBlock("vibrant_rubidium_casing", + CosmicCore.id("block/casings/solid/vibrant_rubidium_casing")); + public static final BlockEntry WAILING_ICHOR_CASING = createCasingBlock("wailing_ichor_casing", + CosmicCore.id("block/casings/solid/wailing_ichor_casing")); + + public static final BlockEntry MAGNET_HIGH_POWERED = createMagnetBlock( + MagnetBlock.MagnetType.HIGH_POWERED); + public static final BlockEntry MAGNET_FUSION_GRADE = createMagnetBlock( + MagnetBlock.MagnetType.FUSION_GRADE); + public static final BlockEntry MAGNET_STELLAR_GRADE = createMagnetBlock( + MagnetBlock.MagnetType.STELLAR_NEUTRONIUM_GRADE); + + // TODO : FIGURE OUT WHY these are breaking the minable tags for pickaxe/wrench.. + public static final BlockEntry GILDED_PTHANTERUM_CASING = createCasingBlock( + "gilded_pthanterum_casing", CosmicCore.id("block/casings/solid/gilded_pthanterum_casing")); + public static final BlockEntry WEAR_RESISTANT_RURIDIT_CASING = createCasingBlock( + "wear_resistant_ruridit_casing", CosmicCore.id("block/casings/solid/ruridit_casing")); + public static final BlockEntry REINFORCED_NAQUADRIA_CASING = createCasingBlock( + "reinforced_naquadria_casing", CosmicCore.id("block/casings/solid/reinforced_naquadria_casing")); + public static final BlockEntry HIGH_TEMP_FISSION_CASING = createCasingBlock( + "high_temperature_fission_casing", CosmicCore.id("block/casings/solid/high_temperature_fission_casing")); + public static final BlockEntry CYCLOZINE_CHEMICALLY_REPELLING_CASING = createCasingBlock( + "cyclozine_chemically_repelling_casing", + CosmicCore.id("block/casings/solid/vomahine_certified_chemically_resistant_casing")); + public static final BlockEntry CYCLOZINE_CHEMICALLY_REPELLING_PIPE = createCasingBlock( + "cyclozine_chemically_repelling_pipe", + CosmicCore.id("block/casings/solid/vomahine_certified_chemically_resistant_pipe")); + public static final BlockEntry MULTIPURPOSE_INTERSTELLAR_GRADE_CASING = createCasingBlock( + "multi_purpose_interstellar_grade_casing", + CosmicCore.id("block/casings/solid/vomahine_certified_interstellar_grade_casing")); + public static final BlockEntry ULTRA_POWERED_CASING = createCasingBlock( + "ultra_powered_casing", CosmicCore.id("block/casings/solid/vomahine_ultra_powered_casing")); + public static final BlockEntry HIGHLY_CONDUCTIVE_FISSION_CASING = createCasingBlock( + "highly_conductive_fission_casing", CosmicCore.id("block/casings/solid/highly_conductive_fission_casing")); + public static final BlockEntry GEARBOX_PTHANTERUM = createCasingBlock( + "machine_casing_gearbox_pthanterum", + CosmicCore.id("block/casings/gearbox/machine_casing_gearbox_pthanterum")); + public static final BlockEntry GEARBOX_NAQUADRIA = createCasingBlock( + "machine_casing_gearbox_naquadria", + CosmicCore.id("block/casings/gearbox/machine_casing_gearbox_naquadria")); + + public static final BlockEntry RUST_WEAVE_CASING = createCasingBlock( + "rust_weave_casing", + CosmicCore.id("block/casings/solid/rust_weave_casing")); + + public static final BlockEntry RUST_STAINED_CASING = createCasingBlock( + "rust_stained_casing", + CosmicCore.id("block/casings/solid/rust_stained_casing")); + + public static final BlockEntry SOMARUST_CASING = createCasingBlock( + "somarust_casing", + CosmicCore.id("block/casings/solid/somarust_casing")); + + public static final BlockEntry SOUL_MUTED_CASING = createCasingBlock( + "soul_muted_casing", + CosmicCore.id("block/casings/solid/soul_muted_casing")); + + // Blood Magic replacement blocks + public static final BlockEntry BLANK_RUNE = createCasingBlock( + "blank_rune", + CosmicCore.id("block/casings/solid/soul_muted_casing")); + public static final BlockEntry RITUAL_STONE = createCasingBlock( + "ritual_stone", + CosmicCore.id("block/casings/solid/soul_muted_casing")); + public static final BlockEntry LIGHT_RITUAL_STONE = createCasingBlock( + "light_ritual_stone", + CosmicCore.id("block/casings/solid/soul_muted_casing")); + + // Star Ladder Casings + + public static final BlockEntry SUPERHEAVY_STEEL_CASING = createCasingBlock( + "superheavy_steel_casing", + CosmicCore.id("block/casings/solid/superheavy_steel_casing")); + + public static final BlockEntry RIGID_HIGH_SPEED_STEEL_CASING = createCasingBlock( + "rigid_high_speed_steel_casing", + CosmicCore.id("block/casings/solid/rigid_high_speed_steel_casing")); + + public static final BlockEntry BOLTED_HEAVY_FRAME_CASING = createCasingBlock( + "bolted_heavy_frame_casing", + CosmicCore.id("block/casings/solid/bolted_heavy_frame_casing")); + + public static final BlockEntry ETHERSTEEL_PLATED_ASH_TILES = createStoneCasingBlock( + "ethersteel_plated_ash_tiles", + CosmicCore.id("block/casings/solid/ethersteel_plated_ash_tiles")); + + // I think i deleted the uh, yeah.. + public static final BlockEntry CASING_HEAT_VENT = createActiveCasing("heat_fan", + "block/variant/heat_fan"); + public static final BlockEntry CASING_INTAKE_LUDICRIOUS = createActiveCasing("ludicrious_intake", + "block/variant/ludicrious_intake"); + public static final BlockEntry CASING_INTAKE_ULTIMATE = createActiveCasing("ultimate_intake", + "block/variant/ultimate_intake"); + public static final BlockEntry RADIOACTIVE_FILTER_CASING = createActiveCasing( + "radioactive_filter_casing", + "block/variant/radioactive_filter_casing"); + + public static final BlockEntry STEEL_ROSE_LANTERN = createLantern("steel_rose_lantern", + CosmicCore.id("block/lanterns/steel_rose_lantern"), + CosmicCore.id("block/lanterns/steel_rose_lantern_hanging")); + + public static final BlockGroup STEEL_ROSE_LIGHT = createStoneBuildingBlock( + "steel_rose_light", + CosmicCore.id("block/casings/cosmetic/steel_rose_light")); + + public static final BlockGroup IRON_PLATED_DEEPSLATE_BLOCK = createStoneBuildingBlock( + "iron_plated_deepslate_tile", + CosmicCore.id("block/casings/cosmetic/iron_plated_deepslate_tile")); + + /* SHELVED ember blocks — Embers dropped on 1.21.1 (beads cosmiccore-42.13 / 42.14) + public static final Map> EMBER_EMITTER_BLOCKS = new Int2ReferenceArrayMap<>(); + public static final Map> EMBER_RECEPTOR_BLOCKS = new Int2ReferenceArrayMap<>(); + + // RECIEVERS + public static final BlockEntry COSMIC_EMBER_RECEIVER_STEAM = REGISTRATE + .block("steam_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 0)) + .lang("Steam Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("steam_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_LV = REGISTRATE + .block("lv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 1)) + .lang("LV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("lv_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_MV = REGISTRATE + .block("mv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 2)) + .lang("MV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("mv_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_HV = REGISTRATE + .block("hv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 3)) + .lang("HV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("hv_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_EV = REGISTRATE + .block("ev_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 4)) + .lang("EV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("ev_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_IV = REGISTRATE + .block("iv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 5)) + .lang("IV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("iv_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_LUV = REGISTRATE + .block("luv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 6)) + .lang("LuV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("luv_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_ZPM = REGISTRATE + .block("zpm_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 7)) + .lang("ZPM Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("zpm_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_UV = REGISTRATE + .block("uv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 8)) + .lang("UV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("uv_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_UHV = REGISTRATE + .block("uhv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 9)) + .lang("UHV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("uhv_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_UEV = REGISTRATE + .block("uev_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 10)) + .lang("UEV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("uev_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_UIV = REGISTRATE + .block("uiv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 11)) + .lang("UIV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("uiv_ember_receptor"))); + }) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_UXV = REGISTRATE + .block("uxv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 12)) + .lang("UXV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("uxv_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_OPV = REGISTRATE + .block("opv_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 13)) + .lang("OPV Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("opv_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_RECEIVER_MAX = REGISTRATE + .block("max_ember_receptor", props -> new CosmicEmberReceptorBlock(props, 14)) + .lang("MAX Ember Receptor") + .initialProperties(RegistryManager.EMBER_RECEIVER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("max_ember_receptor"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + // EMITTERS + public static final BlockEntry COSMIC_EMBER_EMITTER_STEAM = REGISTRATE + .block("steam_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 0)) + .lang("Steam Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("steam_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_LV = REGISTRATE + .block("lv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 1)) + .lang("LV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), prov.models().getExistingFile(CosmicCore.id("lv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_MV = REGISTRATE + .block("mv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 2)) + .lang("MV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), prov.models().getExistingFile(CosmicCore.id("mv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_HV = REGISTRATE + .block("hv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 3)) + .lang("HV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), prov.models().getExistingFile(CosmicCore.id("hv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_EV = REGISTRATE + .block("ev_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 4)) + .lang("EV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), prov.models().getExistingFile(CosmicCore.id("ev_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_IV = REGISTRATE + .block("iv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 5)) + .lang("IV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), prov.models().getExistingFile(CosmicCore.id("iv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_LUV = REGISTRATE + .block("luv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 6)) + .lang("LuV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("luv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_ZPM = REGISTRATE + .block("zpm_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 7)) + .lang("ZPM Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("zpm_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); - public static final BlockEntry MAGNET_HIGH_POWERED = createMagnetBlock(MagnetBlock.MagnetType.HIGH_POWERED); - public static final BlockEntry MAGNET_FUSION_GRADE = createMagnetBlock(MagnetBlock.MagnetType.FUSION_GRADE); + public static final BlockEntry COSMIC_EMBER_EMITTER_UV = REGISTRATE + .block("uv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 8)) + .lang("UV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), prov.models().getExistingFile(CosmicCore.id("uv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + public static final BlockEntry COSMIC_EMBER_EMITTER_UHV = REGISTRATE + .block("uhv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 9)) + .lang("UHV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("uhv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); -//TODO : FIGURE OUT WHY these are breaking the minable tags for pickaxe/wrench.. - public static final BlockEntry HIGH_TEMP_FISSION_CASING = createCasingBlockWrenchOnly("high_temperature_fission_casing", CosmicCore.id("block/casings/solid/high_temperature_fission_casing")); - public static final BlockEntry HIGHLY_CONDUCTIVE_FISSION_CASING = createCasingBlockWrenchOnly("highly_conductive_fission_casing", CosmicCore.id("block/casings/solid/highly_conductive_fission_casing")); + public static final BlockEntry COSMIC_EMBER_EMITTER_UEV = REGISTRATE + .block("uev_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 10)) + .lang("UEV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("uev_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); - //This is a Bunch of Rendering Magic I barely understand (See: I Don't understand at all) ~Ghost - private static BlockEntry createCasingBlock(String name, ResourceLocation texture) { - return createCasingBlock(name, RendererBlock::new, texture, () -> Blocks.IRON_BLOCK, () -> RenderType::cutoutMipped); + public static final BlockEntry COSMIC_EMBER_EMITTER_UIV = REGISTRATE + .block("uiv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 11)) + .lang("UIV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("uiv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_UXV = REGISTRATE + .block("uxv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 12)) + .lang("UXV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("uxv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_OPV = REGISTRATE + .block("opv_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 13)) + .lang("OPV Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("opv_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + public static final BlockEntry COSMIC_EMBER_EMITTER_MAX = REGISTRATE + .block("max_ember_emitter", props -> new CosmicEmberEmitterBlock(props, 14)) + .lang("MAX Ember Emitter") + .initialProperties(RegistryManager.EMBER_EMITTER::get) + .exBlockstate((ctx, prov) -> { + prov.directionalBlock(ctx.getEntry(), + prov.models().getExistingFile(CosmicCore.id("max_ember_emitter"))); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + static { + EMBER_EMITTER_BLOCKS.put(0, COSMIC_EMBER_EMITTER_STEAM); + EMBER_EMITTER_BLOCKS.put(1, COSMIC_EMBER_EMITTER_LV); + EMBER_EMITTER_BLOCKS.put(2, COSMIC_EMBER_EMITTER_MV); + EMBER_EMITTER_BLOCKS.put(3, COSMIC_EMBER_EMITTER_HV); + EMBER_EMITTER_BLOCKS.put(4, COSMIC_EMBER_EMITTER_EV); + EMBER_EMITTER_BLOCKS.put(5, COSMIC_EMBER_EMITTER_IV); + EMBER_EMITTER_BLOCKS.put(6, COSMIC_EMBER_EMITTER_LUV); + EMBER_EMITTER_BLOCKS.put(7, COSMIC_EMBER_EMITTER_ZPM); + EMBER_EMITTER_BLOCKS.put(8, COSMIC_EMBER_EMITTER_UV); + EMBER_EMITTER_BLOCKS.put(9, COSMIC_EMBER_EMITTER_UHV); + EMBER_EMITTER_BLOCKS.put(10, COSMIC_EMBER_EMITTER_UEV); + EMBER_EMITTER_BLOCKS.put(11, COSMIC_EMBER_EMITTER_UIV); + EMBER_EMITTER_BLOCKS.put(12, COSMIC_EMBER_EMITTER_UXV); + EMBER_EMITTER_BLOCKS.put(13, COSMIC_EMBER_EMITTER_OPV); + EMBER_EMITTER_BLOCKS.put(14, COSMIC_EMBER_EMITTER_MAX); + + EMBER_RECEPTOR_BLOCKS.put(0, COSMIC_EMBER_RECEIVER_STEAM); + EMBER_RECEPTOR_BLOCKS.put(1, COSMIC_EMBER_RECEIVER_LV); + EMBER_RECEPTOR_BLOCKS.put(2, COSMIC_EMBER_RECEIVER_MV); + EMBER_RECEPTOR_BLOCKS.put(3, COSMIC_EMBER_RECEIVER_HV); + EMBER_RECEPTOR_BLOCKS.put(4, COSMIC_EMBER_RECEIVER_EV); + EMBER_RECEPTOR_BLOCKS.put(5, COSMIC_EMBER_RECEIVER_IV); + EMBER_RECEPTOR_BLOCKS.put(6, COSMIC_EMBER_RECEIVER_LUV); + EMBER_RECEPTOR_BLOCKS.put(7, COSMIC_EMBER_RECEIVER_ZPM); + EMBER_RECEPTOR_BLOCKS.put(8, COSMIC_EMBER_RECEIVER_UV); + EMBER_RECEPTOR_BLOCKS.put(9, COSMIC_EMBER_RECEIVER_UHV); + EMBER_RECEPTOR_BLOCKS.put(10, COSMIC_EMBER_RECEIVER_UEV); + EMBER_RECEPTOR_BLOCKS.put(11, COSMIC_EMBER_RECEIVER_UIV); + EMBER_RECEPTOR_BLOCKS.put(12, COSMIC_EMBER_RECEIVER_UXV); + EMBER_RECEPTOR_BLOCKS.put(13, COSMIC_EMBER_RECEIVER_OPV); + EMBER_RECEPTOR_BLOCKS.put(14, COSMIC_EMBER_RECEIVER_MAX); } - private static BlockEntry createCasingBlockWrenchOnly(String name, ResourceLocation texture) { - return createCasingBlockWrenchOnly(name, RendererBlock::new, texture, () -> Blocks.IRON_BLOCK, () -> RenderType::cutoutMipped); + */ + + // GLASS BLOCKS + public static final BlockEntry ZBLAN_REINFORCED_GLASS = createGlassCasingBlock( + "zblan_glass", CosmicCore.id("block/casings/glass/zblan_glass"), () -> RenderType::translucent); + + public static final BlockEntry DIVING_BELL_ESCAPE_PAD = REGISTRATE + .block("diving_bell_escape_pad", DivingBellEscapePad::new) + .initialProperties(() -> Blocks.STONE) + .exBlockstate(GTModels.cubeAllModel(CosmicCore.id("block/diving_bell_escape_pad"))) + .simpleItem() + .register(); + + // MOTH HOME BLOCKS - For Cargo Moths system + public static final BlockEntry MOTH_HOME_T1 = createMothHomeBlock(1); + public static final BlockEntry MOTH_HOME_T2 = createMothHomeBlock(2); + public static final BlockEntry MOTH_HOME_T3 = createMothHomeBlock(3); + public static final BlockEntry MOTH_HOME_T4 = createMothHomeBlock(4); + + // Moth Station Casing + public static final BlockEntry MOTH_STATION_CASING = createCasingBlock("moth_station_casing", + CosmicCore.id("block/casings/solid/moth_station_casing")); + + private static BlockEntry createMothHomeBlock(int tier) { + return REGISTRATE + .block("moth_home_t" + tier, p -> new MothHomeBlock(p, tier)) + .lang("Moth Home (T" + tier + ")") + .initialProperties(() -> Blocks.IRON_BLOCK) + .properties(p -> p.strength(3.0f, 6.0f)) + .exBlockstate(GTModels.cubeAllModel(CosmicCore.id("block/casings/moth/moth_home_t" + tier))) + .simpleItem() + .register(); } - private static BlockEntry createGlassCasingBlock(String name, ResourceLocation texture, Supplier> type) { - return createCasingBlockWrenchOnly(name, RendererGlassBlock::new, texture, () -> Blocks.GLASS, type); + + private static BlockEntry createGlassCasingBlock(String name, ResourceLocation texture, + Supplier> type) { + NonNullFunction supplier = TransparentBlock::new; + return REGISTRATE.block(name, supplier) + .initialProperties(() -> Blocks.GLASS) + .properties(p -> p.isValidSpawn((state, level, pos, ent) -> false)) + .addLayer(type) + .exBlockstate(GTModels.cubeAllModel(texture)) + .tag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) + .item(BlockItem::new) + .build() + .register(); } - private static BlockEntry createCasingBlock(String name, BiFunction blockSupplier, ResourceLocation texture, NonNullSupplier properties, Supplier> type) { - return REGISTRATE.block(name, p -> (Block) blockSupplier.apply(p, - Platform.isClient() ? new TextureOverrideRenderer(new ResourceLocation("block/cube_all"), - Map.of("all", texture)) : null)) + public record BlockGroup(BlockEntry block, BlockEntry stairs, BlockEntry slab) {} + + public static BlockGroup createStoneBuildingBlock(String name, ResourceLocation texture) { + return createStoneBuildingBlocks(name, texture, () -> Blocks.DEEPSLATE_BRICKS, + () -> RenderType::solid); + } + + public static BlockGroup createStoneBuildingBlocks(String name, + ResourceLocation texture, + NonNullSupplier properties, + Supplier> type) { + BlockEntry fullBlock = REGISTRATE.block(name, Block::new) .initialProperties(properties) - .blockstate(NonNullBiConsumer.noop()) + .properties(p -> p.isValidSpawn(((blockState, blockGetter, blockPos, entityType) -> false)) + .speedFactor(1.25f) + .requiresCorrectToolForDrops() + .strength(5, 6) + .sound(SoundType.NETHERITE_BLOCK)) + .addLayer(type) + .exBlockstate(GTModels.cubeAllModel(texture)) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); - .tag(RecipeTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE) - .item(RendererBlockItem::new) - .model(NonNullBiConsumer.noop()) + BlockEntry stairBlock = REGISTRATE + .block(name + "_stairs", s -> new StairBlock(fullBlock.getDefaultState(), s)) + .initialProperties(fullBlock) + .properties(p -> p.isValidSpawn(((blockState, blockGetter, blockPos, entityType) -> false)) + .speedFactor(1.25f) + .requiresCorrectToolForDrops() + .strength(5, 6) + .sound(SoundType.NETHERITE_BLOCK)) + .addLayer(type) + .blockstate((ctx, prov) -> prov.stairsBlock(ctx.get(), texture)) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) .build() .register(); + + BlockEntry slabBlock = REGISTRATE.block(name + "_slab", SlabBlock::new) + .initialProperties(fullBlock) + .properties(p -> p.isValidSpawn(((blockState, blockGetter, blockPos, entityType) -> false)) + .speedFactor(1.25f) + .requiresCorrectToolForDrops() + .strength(5, 6) + .sound(SoundType.NETHERITE_BLOCK)) + .addLayer(type) + .blockstate((ctx, prov) -> { + var slab = prov.models().slab(ctx.getName(), texture, texture, texture); + var slabTop = prov.models().slabTop(ctx.getName() + "_top", texture, texture, texture); + var fullModel = prov.models().cubeAll(name, texture); + + prov.slabBlock((SlabBlock) ctx.get(), slab, slabTop, fullModel); + }) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + + return new BlockGroup(fullBlock, stairBlock, slabBlock); + } + + public static BlockEntry createCasingBlock(String name, ResourceLocation texture) { + return createCasingBlock(name, Block::new, texture, () -> Blocks.IRON_BLOCK, + () -> RenderType::cutoutMipped); } - private static BlockEntry createCasingBlockWrenchOnly(String name, BiFunction blockSupplier, ResourceLocation texture, NonNullSupplier properties, Supplier> type) { - return REGISTRATE.block(name, p -> (Block) blockSupplier.apply(p, - Platform.isClient() ? new TextureOverrideRenderer(new ResourceLocation("block/cube_all"), - Map.of("all", texture)) : null)) + + public static BlockEntry createCasingBlock(String name, + NonNullFunction blockSupplier, + ResourceLocation texture, + NonNullSupplier properties, + Supplier> type) { + return REGISTRATE.block(name, blockSupplier) .initialProperties(properties) - .blockstate(NonNullBiConsumer.noop()) - .tag(RecipeTags.MINEABLE_WITH_WRENCH) - .item(RendererBlockItem::new) - .model(NonNullBiConsumer.noop()) + .properties(p -> p.isValidSpawn((state, level, pos, ent) -> false)) + .addLayer(type) + .exBlockstate(GTModels.cubeAllModel(texture)) + .tag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) + .item(BlockItem::new) .build() .register(); } - private static BlockEntry createBottomTopCasingBlock(String name, BiFunction blockSupplier, ResourceLocation sideTexture, ResourceLocation topTexture, ResourceLocation bottomTexture, NonNullSupplier properties, Supplier> type) { - return REGISTRATE.block(name, p -> (Block) blockSupplier.apply(p, - Platform.isClient() ? new TextureOverrideRenderer(new ResourceLocation("block/cube_bottom_top"), - Map.of("side", sideTexture, "top", topTexture, "bottom", bottomTexture)) : null)) - .initialProperties(properties) - .blockstate(NonNullBiConsumer.noop()) - .tag(RecipeTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE) - .item(RendererBlockItem::new) - .model(NonNullBiConsumer.noop()) + + private static BlockEntry createSidedCasingBlock(String name, ResourceLocation texture) { + return REGISTRATE.block(name, Block::new) + .initialProperties(() -> Blocks.IRON_BLOCK) + .properties(p -> p.isValidSpawn((state, level, pos, ent) -> false)) + .addLayer(() -> RenderType::cutoutMipped) + .blockstate(GTModels.createSidedCasingModel(texture)) + .tag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) + .item(BlockItem::new) .build() .register(); } private static BlockEntry createCoilBlock(ICoilType coilType) { - BlockEntry coilBlock = REGISTRATE.block("%s_coil_block".formatted(coilType.getName()), p -> new CoilBlock(p, coilType)) + BlockEntry coilBlock = REGISTRATE + .block("%s_coil_block".formatted(coilType.getName()), p -> new CoilBlock(p, coilType)) .initialProperties(() -> Blocks.IRON_BLOCK) .addLayer(() -> RenderType::cutoutMipped) - .blockstate(NonNullBiConsumer.noop()) - .tag(RecipeTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE) - .item(RendererBlockItem::new) - .model(NonNullBiConsumer.noop()) + .blockstate(GTModels.createCoilModel(coilType)) + .tag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) + .item(BlockItem::new) + .build() + .register(); + GTCEuAPI.HEATING_COILS.put(coilType, coilBlock); + return coilBlock; + } + + private static BlockEntry createCoilBlockWithEntity(ICoilType coilType, + NonNullBiConsumer, RegistrateBlockstateProvider> blockState) { + BlockEntry coilBlock = REGISTRATE + .block("%s_coil_block".formatted(coilType.getName()), p -> (CoilBlock) new CosmicCoilBlock(p, coilType)) + .initialProperties(() -> Blocks.IRON_BLOCK) + .addLayer(() -> RenderType::translucent) + .blockstate(blockState) + .tag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) + .simpleItem() + .blockEntity(CosmicCoilBlockEntity::new) + .renderer(() -> NebulaeCoilRenderer::new) .build() .register(); GTCEuAPI.HEATING_COILS.put(coilType, coilBlock); return coilBlock; } + + protected static BlockEntry createActiveCasing(String name, String baseModelPath) { + return REGISTRATE.block(name, ActiveBlock::new) + .initialProperties(() -> Blocks.NETHERITE_BLOCK) + .addLayer(() -> RenderType::cutoutMipped) + .blockstate(GTModels.createActiveModel(CosmicCore.id(baseModelPath))) + .tag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) + .item(BlockItem::new) + .model((ctx, prov) -> prov.withExistingParent(ctx.getName(), CosmicCore.id(baseModelPath))) + .build() + .register(); + } + private static BlockEntry createMagnetBlock(IMagnetType magnetType) { - BlockEntry magnetBlock = REGISTRATE.block("%s_magnet".formatted(magnetType.getName()), p -> new MagnetBlock(p, magnetType)) + BlockEntry magnetBlock = REGISTRATE + .block("%s_magnet".formatted(magnetType.getName()), p -> new MagnetBlock(p, magnetType)) .initialProperties(() -> Blocks.IRON_BLOCK) .addLayer(() -> RenderType::cutoutMipped) - .blockstate(NonNullBiConsumer.noop()) - .tag(RecipeTags.MINEABLE_WITH_WRENCH, BlockTags.MINEABLE_WITH_PICKAXE) - .item(RendererBlockItem::new) - .model(NonNullBiConsumer.noop()) + .blockstate(createMagnetModel("%s_magnet".formatted(magnetType.getName()), magnetType)) + .tag(CustomTags.MINEABLE_WITH_CONFIG_VALID_PICKAXE_WRENCH) + .item(BlockItem::new) .build() .register(); - CosmicCoreAPI.MAGNET_COILS.put(magnetType,magnetBlock); + CosmicCoreAPI.MAGNET_COILS.put(magnetType, magnetBlock); return magnetBlock; } - public static void init() { + public static NonNullBiConsumer, RegistrateBlockstateProvider> createMagnetModel(String name, + IMagnetType magnetType) { + return (ctx, prov) -> { + ActiveBlock block = ctx.getEntry(); + ModelFile inactive = prov.models().cubeAll(name, magnetType.getTexture()); + ModelFile active = prov.models().withExistingParent(name + "_active", GTCEu.id("block/cube_2_layer/all")) + .texture("bot_all", magnetType.getTexture()) + .texture("top_all", magnetType.getTexture().withSuffix("_bloom")); + prov.getVariantBuilder(block) + .partialState().with(ACTIVE, false).modelForState().modelFile(inactive).addModel() + .partialState().with(ACTIVE, true).modelForState().modelFile(active).addModel(); + }; + } + private static BlockBehaviour.Properties ironProperties() { + return BlockBehaviour.Properties.of() + .mapColor(MapColor.METAL) + .instrument(NoteBlockInstrument.IRON_XYLOPHONE) + .requiresCorrectToolForDrops() + .strength(5, 6) + .sound(SoundType.COPPER); } + + public static BlockEntry createLantern(String name, ResourceLocation texture, + ResourceLocation textureHanging) { + return createLantern( + name, + LanternBlock::new, + texture, + textureHanging, + () -> Blocks.LANTERN, + () -> RenderType::cutout, + 15); + } + + public static BlockEntry createLantern(String name, + NonNullFunction blockSupplier, + ResourceLocation texture, ResourceLocation hangingTexture, + NonNullSupplier properties, + java.util.function.Supplier> type, + int lightLevel) { + return REGISTRATE.block(name, blockSupplier) + .initialProperties(properties) + .properties(prop -> prop + .strength(3.5f) + .sound(SoundType.LANTERN) + .requiresCorrectToolForDrops() + .noOcclusion() + .lightLevel(l -> lightLevel)) + .addLayer(type) + .blockstate((context, provider) -> { + + var standing = provider.models() + .withExistingParent(context.getName(), provider.mcLoc("block/lantern")) + .texture("lantern", texture) + .texture("particle", texture); + + var hanging = provider.models() + .withExistingParent(context.getName() + "_hanging", provider.mcLoc("block/lantern_hanging")) + .texture("lantern", hangingTexture) + .texture("particle", hangingTexture); + + provider.getVariantBuilder(context.get()) + .forAllStates(state -> { + boolean isHanging = state.getValue(BlockStateProperties.HANGING); + return new ConfiguredModel[] { + new ConfiguredModel( + isHanging ? hanging : standing) + }; + }); + }) + .tag(BlockTags.MINEABLE_WITH_SHOVEL) + .item(BlockItem::new) + .model((context, provider) -> provider.withExistingParent(context.getName(), + provider.modLoc("block/" + context.getName()))) + .build() + .register(); + } + + public static BlockEntry createStoneCasingBlock(String name, + ResourceLocation texture) { + return REGISTRATE.block(name, Block::new) + .initialProperties(() -> Blocks.DEEPSLATE) + .properties(p -> p.isValidSpawn(((blockState, blockGetter, blockPos, entityType) -> false)) + .requiresCorrectToolForDrops() + .strength(5, 6) + .sound(SoundType.DEEPSLATE_TILES)) + .addLayer(() -> RenderType::solid) + .exBlockstate(GTModels.cubeAllModel(texture)) + .tag(BlockTags.MINEABLE_WITH_PICKAXE) + .item(BlockItem::new) + .build() + .register(); + } + + public static void init() {} } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBotanyItemRegistration.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBotanyItemRegistration.java new file mode 100644 index 000000000..d16d328c4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicBotanyItemRegistration.java @@ -0,0 +1,42 @@ +package com.ghostipedia.cosmiccore.common.data; + +import com.gregtechceu.gtceu.api.item.ComponentItem; + +import net.minecraft.world.item.ItemStack; + +import com.tterrag.registrate.util.entry.ItemEntry; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; + +public class CosmicBotanyItemRegistration { + + public static final ItemEntry DULIA_LILY = REGISTRATE.item("dulia_lily", ComponentItem::new) + .lang("Dulia Lily") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry RAYMARCHING_DANDILIFEON = REGISTRATE + .item("raymarching_dandilifeon", ComponentItem::new) + .lang("Dulia Lily") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + + public enum CosmicBotanyItem { + + DULIA(CosmicBotanyItemRegistration.DULIA_LILY.asStack()), + + DANDILIFEON(CosmicBotanyItemRegistration.RAYMARCHING_DANDILIFEON.asStack()); + + public ItemStack item; + + private CosmicBotanyItem(ItemStack item) { + this.item = item; + } + }; + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCoilBlock.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCoilBlock.java index a65f32329..5c187b5a6 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCoilBlock.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCoilBlock.java @@ -2,49 +2,73 @@ import com.ghostipedia.cosmiccore.CosmicCore; import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; -import com.gregtechceu.gtceu.GTCEu; + import com.gregtechceu.gtceu.api.block.ICoilType; import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.common.data.GTMaterials; -import lombok.Getter; +import com.gregtechceu.gtceu.common.block.CoilBlock; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.StringRepresentable; +import net.minecraft.world.level.block.EntityBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.function.Supplier; -public class CosmicCoilBlock { +public class CosmicCoilBlock extends CoilBlock implements EntityBlock { + + public CosmicCoilBlock(Properties properties, ICoilType coilType) { + super(properties, coilType); + } + + @Nullable + @Override + public BlockEntity newBlockEntity(@NotNull BlockPos pos, @NotNull BlockState state) { + return CosmicBlocks.COIL_CAUSAL_FABRIC.getSibling(Registries.BLOCK_ENTITY_TYPE) + .get().create(pos, state); + } + public enum CoilType implements StringRepresentable, ICoilType { - PRISMATIC_TUNGSTENSTEEL("prismatic_tungstensteel", 4500, 3, 4, 2, () -> CosmicMaterials.PrismaticTungstensteel, CosmicCore.id("block/casings/coils/prismatic_tungstensteel")), - RESONANT_VIRTUE_MELD("resonant_virtue_meld", 5400, 4, 5, 3, () -> CosmicMaterials.ResonantVirtueMeld, CosmicCore.id("block/casings/coils/resonant_virtue_meld")), - NAQUADIC_SUPERALLOY("naquadric_superalloy", 7200, 5, 6, 4, () -> CosmicMaterials.NaquadicSuperalloy, CosmicCore.id("block/casings/coils/naquadric_superalloy")), - TRINAVINE("trinavine", 9500, 3, 7, 4, () -> CosmicMaterials.Trinavine, CosmicCore.id("block/casings/coils/trinavine")), - LIVING_IGNICLAD("living_igniclad", 10800, 7, 8, 5, () -> CosmicMaterials.LivingIgniclad, CosmicCore.id("block/casings/coils/living_igniclad")), - PSIONIC_GALVORN("psionic_galvorn", 12800, 8, 9, 6, () -> CosmicMaterials.PsionicGalvorn, CosmicCore.id("block/casings/coils/psionic_galvorn")), - PROGRAMMABLE_MATTER("programable_matter", 15800, 9, 10, 7, () -> CosmicMaterials.ProgrammableMatter, CosmicCore.id("block/casings/coils/programable_matter")), - SHIMMERING_NEUTRONIUM("shimmering_neutronium", 19840, 10, 11, 8, () -> CosmicMaterials.ShimmeringNeutronium, CosmicCore.id("block/casings/coils/shimmering_neutronium")), - CAUSAL_FABRIC("causal_fabric", 36000, 11, 15, 9, () -> CosmicMaterials.CausalFabric, CosmicCore.id("block/casings/coils/causal_fabric")); + PRISMATIC_TUNGSTENSTEEL("prismatic_tungstensteel", 4500, 3, 4, 2, () -> CosmicMaterials.PrismaticTungstensteel, + CosmicCore.id("block/casings/coils/prismatic_tungstensteel")), + RESONANT_VIRTUE_MELD("resonant_virtue_meld", 5400, 4, 5, 3, () -> CosmicMaterials.ResonantVirtueMeld, + CosmicCore.id("block/casings/coils/resonant_virtue_meld")), + NAQUADIC_SUPERALLOY("naquadric_superalloy", 7200, 5, 6, 4, () -> CosmicMaterials.NaquadicSuperalloy, + CosmicCore.id("block/casings/coils/naquadric_superalloy")), + TRINAVINE("reinforced_trinavine", 9500, 3, 7, 4, () -> CosmicMaterials.Trinavine, + CosmicCore.id("block/casings/coils/trinavine")), + LIVING_IGNICLAD("living_igniclad", 10800, 7, 8, 5, () -> CosmicMaterials.LivingIgniclad, + CosmicCore.id("block/casings/coils/living_igniclad")), + PSIONIC_GALVORN("psionic_galvorn", 12800, 8, 9, 6, () -> CosmicMaterials.PsionicGalvorn, + CosmicCore.id("block/casings/coils/psionic_galvorn")), + PROGRAMMABLE_MATTER("programable_matter", 15800, 9, 10, 7, () -> CosmicMaterials.ProgrammableMatter, + CosmicCore.id("block/casings/coils/programable_matter")), + SHIMMERING_NEUTRONIUM("shimmering_neutronium", 19840, 10, 11, 8, () -> CosmicMaterials.ShimmeringNeutronium, + CosmicCore.id("block/casings/coils/shimmering_neutronium")), + CAUSAL_FABRIC("causal_fabric", 36000, 11, 15, 9, () -> CosmicMaterials.CausalFabric, + CosmicCore.id("block/casings/coils/causal_fabric")); @NotNull - @Getter private final String name; - //electric blast furnace properties - @Getter + // electric blast furnace properties private final int coilTemperature; - @Getter private final int tier; - //multi smelter properties - @Getter + // multi smelter properties private final int level; - @Getter private final int energyDiscount; @NotNull private final Supplier material; - @NotNull @Getter + @NotNull private final ResourceLocation texture; - CoilType(String name, int coilTemperature, int tier, int level, int energyDiscount, Supplier material, ResourceLocation texture) { + CoilType(String name, int coilTemperature, int tier, int level, int energyDiscount, Supplier material, + ResourceLocation texture) { this.name = name; this.coilTemperature = coilTemperature; this.tier = tier; @@ -54,6 +78,39 @@ public enum CoilType implements StringRepresentable, ICoilType { this.texture = texture; } + @NotNull + @Override + public String getName() { + return name; + } + + @Override + public int getCoilTemperature() { + return coilTemperature; + } + + @Override + public int getTier() { + return tier; + } + + @Override + public int getLevel() { + return level; + } + + @Override + public int getEnergyDiscount() { + return energyDiscount; + } + + @NotNull + @Override + public ResourceLocation getTexture() { + return texture; + } + + @Override public Material getMaterial() { return material.get(); } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCoreDatagen.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCoreDatagen.java index 807bc7d93..0c0eb7315 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCoreDatagen.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCoreDatagen.java @@ -3,8 +3,7 @@ import com.ghostipedia.cosmiccore.api.registries.CosmicRegistration; import com.ghostipedia.cosmiccore.common.data.lang.CosmicLangHandler; import com.ghostipedia.cosmiccore.common.data.tag.CosmicTagsHandler; -import com.gregtechceu.gtceu.common.registry.GTRegistration; -import com.gregtechceu.gtceu.data.tags.TagsHandler; + import com.tterrag.registrate.providers.ProviderType; public class CosmicCoreDatagen { @@ -16,5 +15,4 @@ public static void init() { CosmicRegistration.REGISTRATE.addDataGenerator(ProviderType.ENTITY_TAGS, CosmicTagsHandler::initEntity); CosmicRegistration.REGISTRATE.addDataGenerator(ProviderType.LANG, CosmicLangHandler::init); } - } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java index 7423213dc..ea3235f2d 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicCreativeModeTabs.java @@ -1,21 +1,26 @@ package com.ghostipedia.cosmiccore.common.data; + import com.ghostipedia.cosmiccore.CosmicCore; -import com.gregtechceu.gtceu.common.data.GTCreativeModeTabs; + +import net.minecraft.world.item.CreativeModeTab; + import com.tterrag.registrate.util.entry.RegistryEntry; -import net.minecraft.world.item.*; import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; - public class CosmicCreativeModeTabs { - public static RegistryEntry COSMIC_CORE = REGISTRATE.defaultCreativeTab(CosmicCore.MOD_ID, - builder -> builder.displayItems(new GTCreativeModeTabs.RegistrateDisplayItemsGenerator(CosmicCore.MOD_ID, REGISTRATE)) - .title(REGISTRATE.addLang("itemGroup", CosmicCore.id("creative_tab"), "Cosmic Core")) - .icon(CosmicItems.DONK::asStack) - .build()) - .register(); - public static void init() { + // 1.21 Registrate auto-populates the default tab from the mod's registered entries via its own + // BuildCreativeModeTabContentsEvent handler, so we no longer attach a GTCEu RegistrateDisplayItemsGenerator + // here. Doing both added every entry twice (e.g. the CoilBlocks), which is a hard "already exists" crash + // whenever the tab (re)builds. Registrate's auto-add is now the single source of truth for this tab. + public static RegistryEntry COSMIC_CORE = REGISTRATE.defaultCreativeTab( + CosmicCore.MOD_ID, + builder -> builder + .title(REGISTRATE.addLang("itemGroup", CosmicCore.id("creative_tab"), "Cosmic Core")) + .icon(CosmicItems.DONK::asStack) + .build()) + .register(); - } + public static void init() {} } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java index d08801498..a33aa4d1c 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicItems.java @@ -1,198 +1,3084 @@ package com.ghostipedia.cosmiccore.common.data; -import com.ghostipedia.cosmiccore.api.item.armor.*; +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.item.LinkedTerminalBehavior; import com.ghostipedia.cosmiccore.api.registries.CosmicRegistration; +import com.ghostipedia.cosmiccore.client.renderer.item.HaloItemRenderer; +import com.ghostipedia.cosmiccore.client.renderer.item.RadianceItemRenderer; +import com.ghostipedia.cosmiccore.common.airControl.OxygenConfig; import com.ghostipedia.cosmiccore.common.data.tag.item.CosmicItemTags; +import com.ghostipedia.cosmiccore.common.item.AirBladderItem; +import com.ghostipedia.cosmiccore.common.item.AsteroidItem; +import com.ghostipedia.cosmiccore.common.item.AsteroidTargetingChipItem; +import com.ghostipedia.cosmiccore.common.item.OxygenTankItem; +import com.ghostipedia.cosmiccore.common.item.SoulNetworkReaderItem; +import com.ghostipedia.cosmiccore.common.item.armor.ChestSanguineWarptechSuite; +import com.ghostipedia.cosmiccore.common.item.armor.HelmetSanguineWarptechSuite; +import com.ghostipedia.cosmiccore.common.item.armor.SanguineWarptechSuite; +import com.ghostipedia.cosmiccore.common.item.armor.boots.CosmicBootsArmorLogic; +import com.ghostipedia.cosmiccore.common.item.behavior.EffectApplicationBehavior; +import com.ghostipedia.cosmiccore.common.item.behavior.InfiniteSprayCanBehavior; +import com.ghostipedia.cosmiccore.common.item.behavior.OxygenSupplyTankBehavior; +import com.ghostipedia.cosmiccore.common.item.behavior.StructureWriteBehavior; +import com.ghostipedia.cosmiccore.common.item.behavior.VeinSurveyBehavior; +import com.ghostipedia.cosmiccore.common.item.behavior.WirelessPDABehavior; +import com.ghostipedia.cosmiccore.gtbridge.recipemaker.RecipeMakerBehavior; +import com.ghostipedia.cosmiccore.common.reflection.item.MirrorItem; +import com.ghostipedia.cosmiccore.common.reflection.item.SoulMutilatorItem; +import com.ghostipedia.cosmiccore.utils.ItemData; +import com.ghostipedia.cosmiccore.utils.StringUtil; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.item.ComponentItem; +import com.gregtechceu.gtceu.api.item.armor.ArmorComponentItem; +import com.gregtechceu.gtceu.api.item.component.ElectricStats; +import com.gregtechceu.gtceu.api.item.component.ICustomDescriptionId; import com.gregtechceu.gtceu.api.item.component.IItemComponent; +import com.gregtechceu.gtceu.api.item.component.ThermalFluidStats; +import com.gregtechceu.gtceu.common.data.GTItems; +import com.gregtechceu.gtceu.common.item.behavior.ItemFluidContainer; +import com.gregtechceu.gtceu.common.item.behavior.TooltipBehavior; import com.gregtechceu.gtceu.common.item.armor.GTArmorMaterials; +import com.gregtechceu.gtceu.common.registry.GTRegistration; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.integration.jade.GTJadePlugin; +import com.gregtechceu.gtceu.data.recipe.CustomTags; + +import com.lowdragmc.lowdraglib.utils.LocalizationUtils; + +import net.minecraft.client.renderer.item.ItemProperties; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.*; +import net.minecraft.world.level.Level; +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.FluidUtil; + +import com.teamresourceful.resourcefullib.common.registry.RegistryEntry; +import com.tterrag.registrate.providers.ProviderType; import com.tterrag.registrate.util.entry.ItemEntry; +import com.tterrag.registrate.util.nullness.NonNullBiConsumer; import com.tterrag.registrate.util.nullness.NonNullConsumer; -import earth.terrarium.adastra.common.tags.ModItemTags; -import net.minecraft.world.item.ArmorItem; -import net.minecraft.world.item.Rarity; +import team.lodestar.lodestone.systems.easing.Easing; +import java.awt.*; +import java.util.function.Function; + +import static com.ghostipedia.cosmiccore.CosmicUtils.attachRenderer; import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.common.data.GTItems.attach; +public class CosmicItems { -@SuppressWarnings("Convert2MethodRef") -public class CosmicItems { + // TODO(stellaris): SUN_GLOBE item used Ad Astra GLOBES registry + RenderedBlockItem — dropped with Ad Astra (bead cosmiccore-42.13) static { CosmicRegistration.REGISTRATE.creativeModeTab(() -> CosmicCreativeModeTabs.COSMIC_CORE); } -//Literally Random shit - public static final ItemEntry DONK = REGISTRATE.item("donk", ComponentItem::create) - .lang("Donk") - .properties(p -> p.stacksTo(16)) - .tag() + // Modules + + public static final ItemEntry SOUL_READER = REGISTRATE + .item("soul_reader", SoulNetworkReaderItem::new) + .lang("Soul Network Reader") + .properties(p -> p.stacksTo(1)) + .tag() .defaultModel() .register(); - public static final ItemEntry WAXED_LEATHER = REGISTRATE.item("waxed_leather", ComponentItem::create) - .lang("Waxed Leather") + + /* SHELVED (cosmiccore-42.14): Malum 1.8.2 reworked the spirit-type system + (MalumSpiritType.create / SpiritVisualMotif / SpiritTypeRegistry.register removed, + now DeferredSpiritTypes + SpiritColorProperties). Re-add the 4 cosmic spirit types + and their SpiritShardItems once the Malum spirit API is ported. + public static final ItemEntry ETHERIC_SPIRIT_ITEM = REGISTRATE + .item("etheric_spirit", (properties -> new SpiritShardItem(properties, CosmicItems.ETHERIC_SPIRIT))) + .lang("Etheric Spirit") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); - public static final ItemEntry OVERLOADED_PEARLS = REGISTRATE.item("overloaded_pearls", ComponentItem::create) - .lang("Overloaded Pearls") + + public static MalumSpiritType ETHERIC_SPIRIT = SpiritTypeRegistry.register(MalumSpiritType.create("etheric", + new SpiritVisualMotif(new Color(120, 75, 255), new Color(55, 55, 55), 0.9f, Easing.BOUNCE_IN_OUT), + ETHERIC_SPIRIT_ITEM) + .setItemColor(SpiritVisualMotif::getPrimaryColor) + .build()); + + public static final ItemEntry WRATHFUL_SPIRIT_ITEM = REGISTRATE + .item("wrathful_spirit", (properties -> new SpiritShardItem(properties, CosmicItems.WRATHFUL_SPIRIT))) + .lang("Wrathful Spirit") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); - public static final ItemEntry BLACKSTONE_PUSTULE = REGISTRATE.item("blackstone_pustule", ComponentItem::create) - .lang("Blackstone Pustule") + + public static MalumSpiritType WRATHFUL_SPIRIT = SpiritTypeRegistry.register(MalumSpiritType.create("wrathful", + new SpiritVisualMotif(2, new Color(120, 200, 80), new Color(200, 55, 0), 0.9f, Easing.SINE_IN_OUT), + WRATHFUL_SPIRIT_ITEM) + .setItemColor(SpiritVisualMotif::getPrimaryColor) + .build()); + + public static final ItemEntry PRIDEFUL_SPIRIT_ITEM = REGISTRATE + .item("prideful_spirit", (properties -> new SpiritShardItem(properties, CosmicItems.PRIDEFUL_SPIRIT))) + .lang("Prideful Spirit") .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + + public static MalumSpiritType PRIDEFUL_SPIRIT = SpiritTypeRegistry.register(MalumSpiritType.create("prideful", + new SpiritVisualMotif(4, new Color(120, 0, 100), new Color(200, 55, 0), 0.9f, Easing.SINE_IN_OUT), + PRIDEFUL_SPIRIT_ITEM) + .setItemColor(SpiritVisualMotif::getPrimaryColor) + .build()); + + public static final ItemEntry MALICE_SPIRIT_ITEM = REGISTRATE + .item("malice_spirit", (properties -> new SpiritShardItem(properties, CosmicItems.MALICE_SPIRIT))) + .lang("Malice Spirit") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + + public static MalumSpiritType MALICE_SPIRIT = SpiritTypeRegistry.register(MalumSpiritType.create("malice", + new SpiritVisualMotif(4, new Color(210, 210, 210), new Color(200, 55, 0), 0.9f, Easing.SINE_IN_OUT), + MALICE_SPIRIT_ITEM) + .setItemColor(SpiritVisualMotif::getPrimaryColor) + .build()); + */ + public static final ItemEntry PROD_MOD_1 = REGISTRATE.item("prod_mod_1", ComponentItem::new) + .lang("Productivity Module Mk.1") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry PROD_MOD_2 = REGISTRATE.item("prod_mod_2", ComponentItem::new) + .lang("Productivity Module Mk.2") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry PROD_MOD_3 = REGISTRATE.item("prod_mod_3", ComponentItem::new) + .lang("Productivity Module Mk.3") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry PROD_MOD_4 = REGISTRATE.item("prod_mod_4", ComponentItem::new) + .lang("Productivity Module Mk.4") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry PARA_MOD_1 = REGISTRATE.item("para_mod_1", ComponentItem::new) + .lang("Parallelization Module Mk.1") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry PARA_MOD_2 = REGISTRATE.item("para_mod_2", ComponentItem::new) + .lang("Parallelization Module Mk.2") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry PARA_MOD_3 = REGISTRATE.item("para_mod_3", ComponentItem::new) + .lang("Parallelization Module Mk.3") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry PARA_MOD_4 = REGISTRATE.item("para_mod_4", ComponentItem::new) + .lang("Parallelization Module Mk.4") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry RESONANT_MODULE = REGISTRATE + .item("resonant_mod", ComponentItem::new) + .lang("Resonant Module") + .properties(p -> p.stacksTo(1)) + .tag() .defaultModel() .register(); + public static final ItemEntry PROTOCYTE_MOD = REGISTRATE.item("protocyte_mod", ComponentItem::new) + .lang("Protocyte Module") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry FUSION_MODULE_MK1 = REGISTRATE + .item("resonant_mod", ComponentItem::new) + .lang("Fusion Module Mk.1") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .register(); - //New Circuits - //Echo (ZPM-UEV) - public static final ItemEntry SONAR_PROCESSOR = REGISTRATE.item("echo_processor", ComponentItem::create) - .lang("Echo Processor") + public static final ItemEntry PALE_SAW = REGISTRATE + .item("pale_saw", ComponentItem::new) + .lang("Pale Saw") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); - public static final ItemEntry SONAR_PROCESSOR_ASSEMBLY = REGISTRATE.item("echo_processor_assembly", ComponentItem::create) - .lang("Echo Processor Assembly") + public static final ItemEntry PALE_SCRAP = REGISTRATE + .item("pale_scrap", ComponentItem::new) + .lang("Pale Scrap") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); - public static final ItemEntry SONAR_PROCESSOR_SUPERCOMPUTER = REGISTRATE.item("echo_processor_supercomputer", ComponentItem::create) - .lang("Echo Processor Supercomputer") + public static final ItemEntry ABRASIVE_ROSIN_MILLSTONES = REGISTRATE + .item("abrasive_rosin_millstones", ComponentItem::new) + .lang("Abrasive Rosin Millstones") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); - public static final ItemEntry SONAR_PROCESSOR_MAINFRAME = REGISTRATE.item("echo_processor_mainframe", ComponentItem::create) - .lang("Echo Processor Mainframe") + + public static final ItemEntry BITUMEN_WAX = REGISTRATE + .item("bitumen_wax", ComponentItem::new) + .lang("Bitumen Wax") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); -//Optical (UV-UIV) - public static final ItemEntry OPTICAL_PROCESSOR = REGISTRATE.item("optical_processor", ComponentItem::create) - .lang("Optical Processor") + public static final ItemEntry ENERGIZED_SILK = REGISTRATE + .item("energized_silk", ComponentItem::new) + .lang("Energized Silk") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); - public static final ItemEntry OPTICAL_PROCESSOR_ASSEMBLY = REGISTRATE.item("optical_processor_assembly", ComponentItem::create) - .lang("Optical Processor Assembly") + + public static final ItemEntry HARMONICALLY_TUNED_CIRCUIT_BOARD = REGISTRATE + .item("harmonically_tuned_circuit_board", + ComponentItem::new) + .lang("Harmonically Tuned Circuit Board") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); - public static final ItemEntry OPTICAL_PROCESSOR_SUPERCOMPUTER = REGISTRATE.item("optical_processor_supercomputer", ComponentItem::create) - .lang("Optical Processor Supercomputer") + public static final ItemEntry HARMONICALLY_TUNED_PRINTED_CIRCUIT_BOARD = REGISTRATE + .item("harmonically_tuned_printed_circuit_board", + ComponentItem::new) + .lang("Harmonically Tuned Printed Circuit Board") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); - public static final ItemEntry OPTICAL_PROCESSOR_MAINFRAME = REGISTRATE.item("optical_processor_mainframe", ComponentItem::create) - .lang("Optical Processor Mainframe") + + public static final ItemEntry OPTICALLY_REFINED_CIRCUIT_BOARD = REGISTRATE + .item("optically_refined_circuit_board", + ComponentItem::new) + .lang("Optically Refined Circuit Board") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry OPTICALLY_REFINED_PRINTED_CIRCUIT_BOARD = REGISTRATE + .item("optically_refined_printed_circuit_board", + ComponentItem::new) + .lang("Optically Refined Printed Circuit Board") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry PERSONA_CORE_ASSISTED_CIRCUIT_BOARD = REGISTRATE + .item("persona_core_assisted_circuit_board", + ComponentItem::new) + .lang("Persona Core Assisted Circuit Board") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry PERSONA_CORE_ASSISTED_PRINTED_CIRCUIT_BOARD = REGISTRATE + .item("persona_core_assisted_printed_circuit_board", + ComponentItem::new) + .lang("Persona Core Assisted Printed Circuit Board") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry RECORD_KEPT_CIRCUIT_BOARD = REGISTRATE + .item("record_kept_circuit_board", + ComponentItem::new) + .lang("Record Kept Circuit Board") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); -//Cosmic (UHV-UXV) - public static final ItemEntry COSMIC_PROCESSOR = REGISTRATE.item("cosmic_processor", ComponentItem::create) - .lang("Cosmic Processor") + public static final ItemEntry RECORD_KEPT_PRINTED_CIRCUIT_BOARD = REGISTRATE + .item("record_kept_printed_circuit_board", + ComponentItem::new) + .lang("Record Kept Printed Circuit Board") .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + + // Drone Frames + public static final ItemEntry DRONE_FRAME_1 = REGISTRATE.item("drone_frame_1", ComponentItem::new) + .lang("Drone Frame Mk.1") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry DRONE_FRAME_2 = REGISTRATE.item("drone_frame_2", ComponentItem::new) + .lang("Drone Frame Mk.2") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry DRONE_FRAME_3 = REGISTRATE.item("drone_frame_3", ComponentItem::new) + .lang("Drone Frame Mk.3") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry DRONE_FRAME_4 = REGISTRATE.item("drone_frame_4", ComponentItem::new) + .lang("Drone Frame Mk.4") + .properties(p -> p.stacksTo(16)) + .tag() .defaultModel() .register(); - public static final ItemEntry COSMIC_PROCESSOR_ASSEMBLY = REGISTRATE.item("cosmic_processor_assembly", ComponentItem::create) - .lang("Cosmic Processor Assembly") + public static final ItemEntry DRONE_FRAME_5 = REGISTRATE.item("drone_frame_5", ComponentItem::new) + .lang("Drone Frame Mk.5") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + + // Harmonic Chip Stuff + public static final ItemEntry FLAWED_RESONANT_WAFER = REGISTRATE + .item("flawed_resonant_wafer", ComponentItem::new) + .lang("Flawed Harmonic Wafer") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); - public static final ItemEntry COSMIC_PROCESSOR_SUPERCOMPUTER = REGISTRATE.item("cosmic_processor_supercomputer", ComponentItem::create) - .lang("Cosmic Processor Supercomputer") + + public static final ItemEntry REFINED_RESONANT_WAFER = REGISTRATE + .item("refined_resonant_wafer", ComponentItem::new) + .lang("Refined Harmonic Wafer") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); - public static final ItemEntry COSMIC_PROCESSOR_MAINFRAME = REGISTRATE.item("cosmic_processor_mainframe", ComponentItem::create) - .lang("Cosmic Processor Mainframe") + public static final ItemEntry WAFER_PRAGMISO = REGISTRATE + .item("wafer_pragmiso", ComponentItem::new) + .lang("Pragmiso Wafer [Physics]") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); -//Psionic Circuit (UEV-OPV) - public static final ItemEntry PSIONIC_PROCESSOR = REGISTRATE.item("psionic_processor", ComponentItem::create) - .lang("Psionic Processor") + + public static final ItemEntry WAFER_ALCHEMICA = REGISTRATE + .item("alchemia_wafer", ComponentItem::new) + .lang("Alchemica Wafer [Chemistry]") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); - public static final ItemEntry PSIONIC_PROCESSOR_ASSEMBLY = REGISTRATE.item("psionic_processor_assembly", ComponentItem::create) - .lang("Psionic Processor Assembly") + + public static final ItemEntry WAFER_THAUMICA = REGISTRATE + .item("thaumica_wafer", ComponentItem::new) + .lang("Thaumica Wafer [Arcana]") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); - public static final ItemEntry PSIONIC_PROCESSOR_SUPERCOMPUTER = REGISTRATE.item("psionic_processor_supercomputer", ComponentItem::create) - .lang("Psionic Processor Supercomputer") + + public static final ItemEntry WAFER_ETERNA = REGISTRATE.item("eterna_wafer", ComponentItem::new) + .lang("Eterna Wafer [Aionology]") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); - public static final ItemEntry PSIONIC_PROCESSOR_MAINFRAME = REGISTRATE.item("psionic_processor_mainframe", ComponentItem::create) - .lang("Psionic Processor Mainframe") + public static final ItemEntry WAFER_LOGOS = REGISTRATE + .item("fused_wafer_of_logos", ComponentItem::new) + .lang("Fused Harmonic Wafer of Logos") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); - //Macroverse (UIV-MAX) - public static final ItemEntry MACROVERSE_PROCESSOR = REGISTRATE.item("macroverse_processor", ComponentItem::create) - .lang("Macroverse Processor") + public static final ItemEntry WAFER_ESOTERIC = REGISTRATE + .item("fused_wafer_of_esoterica", ComponentItem::new) + .lang("Fused Harmonic Wafer of Esoterica") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); - public static final ItemEntry MACROVERSE_PROCESSOR_ASSEMBLY = REGISTRATE.item("macroverse_processor_assembly", ComponentItem::create) - .lang("Macroverse Processor Assembly") + public static final ItemEntry HARMONIC_OSCILLATING_CHIP = REGISTRATE + .item("harmonic_chiplet_oscillating", ComponentItem::new) + .lang("Harmonic Central Processing Unit") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); - public static final ItemEntry MACROVERSE_PROCESSOR_SUPERCOMPUTER = REGISTRATE.item("macroverse_processor_supercomputer", ComponentItem::create) - .lang("Macroverse Processor Supercomputer") + + public static final ItemEntry NULL_WAFER_HARMONIC = REGISTRATE + .item("null_refined_resonant_wafer", ComponentItem::new) + .lang("Nullified Harmonic Wafer") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); - public static final ItemEntry MACROVERSE_PROCESSOR_MAINFRAME = REGISTRATE.item("macroverse_processor_mainframe", ComponentItem::create) - .lang("Macroverse Processor Mainframe") + + public static final ItemEntry NULLIFIED_HARMONICS_WAFER = REGISTRATE + .item("nullified_harmonics_wafer", ComponentItem::new) + .lang("Nullified Harmonic Wafer") .properties(p -> p.stacksTo(64)) + .tag() .defaultModel() .register(); - // Space Suite - public static ItemEntry SPACE_NANO_CHESTPLATE = REGISTRATE.item("space_nanomuscle_chestplate", (p) -> new SpaceArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.CHESTPLATE, 5000, p) - .setArmorLogic(new NanoMuscleSpaceSuite(ArmorItem.Type.CHESTPLATE, 512, - 6_400_000L * (long) Math.max(1, Math.pow(4, ConfigHolder.INSTANCE.tools.voltageTierNanoSuit - 3)), - ConfigHolder.INSTANCE.tools.voltageTierNanoSuit))) - .tag(CosmicItemTags.NANOMUSCLE_SPACE_SUITE, ModItemTags.SPACE_SUITS, ModItemTags.FREEZE_RESISTANT_ARMOR, ModItemTags.HEAT_RESISTANT_ARMOR) - .lang("NanoMuscle™ Space Suite Chestplate") - .properties(p -> p.rarity(Rarity.RARE)) + public static final ItemEntry REFINED_HARMONICS_WAFER = REGISTRATE + .item("refined_harmonics_wafer", ComponentItem::new) + .lang("Refined Harmonic Wafer") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() .register(); - public static ItemEntry ADVANCED_SPACE_NANO_CHESTPLATE = REGISTRATE.item("space_advanced_nanomuscle_chestplate", (p) -> new SpaceArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.CHESTPLATE, 10000, p) - .setArmorLogic(new AdvancedNanoMuscleSpaceSuite(512, - 12_800_000L * (long) Math.max(1, Math.pow(4, ConfigHolder.INSTANCE.tools.voltageTierAdvNanoSuit - 3)), - ConfigHolder.INSTANCE.tools.voltageTierAdvNanoSuit))) - .tag(CosmicItemTags.NANOMUSCLE_SPACE_SUITE, ModItemTags.SPACE_SUITS, ModItemTags.FREEZE_RESISTANT_ARMOR, ModItemTags.HEAT_RESISTANT_ARMOR) - .lang("Advanced NanoMuscle™ Space Suite Chestplate") - .properties(p -> p.rarity(Rarity.EPIC)) + + // Tesserae + public static final ItemEntry TESSARON = REGISTRATE.item("tessaron", ComponentItem::new) + .lang("Vexil - [Tessaron]") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() .register(); - public static ItemEntry SPACE_QUARK_CHESTPLATE = REGISTRATE.item("space_quarktech_chestplate", (p) -> new SpaceArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.CHESTPLATE, 20000, p) - .setArmorLogic(new QuarkTechSpaceSuite(ArmorItem.Type.CHESTPLATE, 8192, - 100_000_000L * (long) Math.max(1, Math.pow(4, ConfigHolder.INSTANCE.tools.voltageTierQuarkTech - 5)), - ConfigHolder.INSTANCE.tools.voltageTierNanoSuit))) - .tag(CosmicItemTags.QUARKTECH_SPACE_SUITE, ModItemTags.SPACE_SUITS, ModItemTags.FREEZE_RESISTANT_ARMOR, ModItemTags.HEAT_RESISTANT_ARMOR) - .lang("QuarkTech™ Space Suite Chestplate") - .properties(p -> p.rarity(Rarity.RARE)) + public static final ItemEntry ESSON = REGISTRATE.item("esson", ComponentItem::new) + .lang("Luminon - [Esson]") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() .register(); - public static ItemEntry ADVANCED_SPACE_QUARK_CHESTPLATE = REGISTRATE.item("space_advanced_quarktech_chestplate", (p) -> new SpaceArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.CHESTPLATE, 50000, p) - .setArmorLogic(new AdvancedQuarkTechSpaceSuite(8192, - 100_000_000L * (long) Math.max(1, Math.pow(4, ConfigHolder.INSTANCE.tools.voltageTierAdvQuarkTech - 6)), - ConfigHolder.INSTANCE.tools.voltageTierAdvNanoSuit))) - .tag(CosmicItemTags.QUARKTECH_SPACE_SUITE, ModItemTags.SPACE_SUITS, ModItemTags.FREEZE_RESISTANT_ARMOR, ModItemTags.HEAT_RESISTANT_ARMOR) - .lang("Advanced QuarkTech™ Space Suite Chestplate") - .properties(p -> p.rarity(Rarity.EPIC)) + + public static final ItemEntry VEXIUN = REGISTRATE.item("vexiun", ComponentItem::new) + .lang("Vexil - [Vexiun]") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry PHANTNON = REGISTRATE.item("phantnon", ComponentItem::new) + .lang("Luminon - [Phantnon]") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() .register(); - public static NonNullConsumer attach(IItemComponent... components) { - return item -> item.attachComponents(components); - } + public static final ItemEntry AMBRION = REGISTRATE.item("ambrion", ComponentItem::new) + .lang("Vexil - [Ambrion]") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry SPECTIL = REGISTRATE.item("spectil", ComponentItem::new) + .lang("Luminon - [Spectil]") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); - public static void init() { + public static final ItemEntry ETHERA = REGISTRATE.item("ethera", ComponentItem::new) + .lang("Vexil - [Ethera]") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry NYXON = REGISTRATE.item("nyxon", ComponentItem::new) + .lang("Luminon - [Nyxon]") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); - } -} \ No newline at end of file + public static final ItemEntry PYRITH = REGISTRATE.item("pyrith", ComponentItem::new) + .lang("Vexil - [Pyrith]") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry SERAPHON = REGISTRATE.item("seraphon", ComponentItem::new) + .lang("Luminon - [Seraphon]") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry TENAEBRUM = REGISTRATE.item("tenaebrum", ComponentItem::new) + .lang("Vexil - [Tenaebrum]") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry DYNAMIA = REGISTRATE.item("dynamia", ComponentItem::new) + .lang("Luminon - [Dynamia]") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRYSTALA = REGISTRATE.item("crystala", ComponentItem::new) + .lang("Vexil - [Crystala]") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry MYSTRIX = REGISTRATE.item("mystrix", ComponentItem::new) + .lang("Luminon - [Mystrix]") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CHRONIA = REGISTRATE.item("chronia", ComponentItem::new) + .lang("Vexil - [Chronia]") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry ECHON = REGISTRATE.item("echon", ComponentItem::new) + .lang("Luminon - [Echon]") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + + // Literally Random shit + public static final ItemEntry DONK = REGISTRATE.item("donk", ComponentItem::new) + .lang("Donk") + .properties(p -> p.stacksTo(16)) + .onRegister(attach(new RecipeMakerBehavior())) + .tag() + .defaultModel() + .register(); + public static final ItemEntry DILUMIXAL_NAQ_DOPED_BOULE = REGISTRATE + .item("dilumixal_naquadah_doped_silicon_boule", ComponentItem::new) + .lang("DiLumixal Naquadah-doped Silicon Boule") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry DILUMIXAL_NAQ_DOPED_WAFER = REGISTRATE + .item("dilumixal_naquadah_doped_silicon_wafer", ComponentItem::new) + .lang("DiLumixal Naquadah-doped Silicon Wafer") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry CRYSTAL_CHIPLET_MASK = REGISTRATE + .item("crystal_chiplet_mask", ComponentItem::new) + .lang("Crystal Chiplet Mask") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry MASKED_CRYSTAL_CHIPLET_PACKAGE = REGISTRATE + .item("masked_crystal_chiplet_package", ComponentItem::new) + .lang("Masked Crystal Chiplet Package") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry CRYSTAL_CHIPLET_BASE = REGISTRATE + .item("crystal_chiplet_base", ComponentItem::new) + .lang("Crystal Chiplet Base") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry ENGRAVED_CRYSTAL_CHIPLET = REGISTRATE + .item("engraved_crystal_chiplet", ComponentItem::new) + .lang("Engraved Crystal Chiplet") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry UNSEALED_CRYSTAL_CPU = REGISTRATE + .item("unsealed_crystal_cpu", ComponentItem::new) + .lang("Unsealed Crystal CPU") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry CRYSTALLINE_TRANSISTOR = REGISTRATE + .item("crystalline_transistor", ComponentItem::new) + .lang("Crystalline Transistor") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry CRYSTALLINE_RESISTOR = REGISTRATE + .item("crystalline_resistor", ComponentItem::new) + .lang("Crystalline Resistor") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry CRYSTALLINE_CAPACITOR = REGISTRATE + .item("crystalline_capacitor", ComponentItem::new) + .lang("Crystalline Capacitor") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry CRYSTALLINE_DIODE = REGISTRATE + .item("crystalline_diode", ComponentItem::new) + .lang("Crystalline Diode") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry CRYSTALLINE_INDUCTOR = REGISTRATE + .item("crystalline_inductor", ComponentItem::new) + .lang("Crystalline Inductor") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + + // Lucid Circuit Components + public static final ItemEntry TEMPORAL_STABLE_THUNDERING_WAFER = REGISTRATE + .item("temporal_stable_thundering_wafer", ComponentItem::new) + .lang("Temporal Stable Thundering Wafer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry LUCIDITY_CPU_MASK = REGISTRATE + .item("lucidity_cpu_mask", ComponentItem::new) + .lang("Lucidity CPU Mask") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry PREPARED_LUCID_WAFER = REGISTRATE + .item("prepared_lucid_wafer", ComponentItem::new) + .lang("Prepared Lucid Wafer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry LUCID_CPU_WAFER = REGISTRATE + .item("lucid_cpu_wafer", ComponentItem::new) + .lang("Lucid CPU Wafer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry SOUL_CUT_LUCID_CPU_CHIP = REGISTRATE + .item("soul_cut_lucid_cpu_chip", ComponentItem::new) + .lang("Soul Cut Lucid CPU Chip") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry TEMPORAL_REINFORCED_LUCID_CIRCUIT_BOARD = REGISTRATE + .item("temporal_reinforced_lucid_circuit_board", ComponentItem::new) + .lang("Temporal Reinforced Lucid Circuit Board") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry TEMPORAL_REINFORCED_LUCID_PRINTED_CIRCUIT_BOARD = REGISTRATE + .item("temporal_reinforced_lucid_printed_circuit_board", ComponentItem::new) + .lang("Temporal Reinforced Lucid Printed Circuit Board") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry FIBER_MESH_INGOT_FRAME = REGISTRATE + .item("fiber_mesh_ingot_frame", ComponentItem::new) + .lang("Fiber Mesh Ingot Frame") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + public static final ItemEntry THERMAL_CHAIN_AGENT = REGISTRATE + .item("thermal_chain_agent", ComponentItem::new) + .lang("Thermal Chain Agent") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry RADIO_MODULE_HV = REGISTRATE + .item("hv_radio_module", ComponentItem::new) + .lang("HV Radio Module") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry RADIO_MODULE_EV = REGISTRATE + .item("ev_radio_module", ComponentItem::new) + .lang("EV Radio Module") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry RADIO_MODULE_IV = REGISTRATE + .item("iv_radio_module", ComponentItem::new) + .lang("IV Radio Module") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry RADIO_MODULE_LUV = REGISTRATE + .item("luv_radio_module", ComponentItem::new) + .lang("LuV Radio Module") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry RADIO_MODULE_ZPM = REGISTRATE + .item("zpm_radio_module", ComponentItem::new) + .lang("ZPM Radio Module") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry RADIO_MODULE_UV = REGISTRATE + .item("uv_radio_module", ComponentItem::new) + .lang("UV Radio Module") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry RADIO_MODULE_UHV = REGISTRATE + .item("uhv_radio_module", ComponentItem::new) + .lang("UHV Radio Module") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry RADIO_MODULE_UEV = REGISTRATE + .item("uev_radio_module", ComponentItem::new) + .lang("UEV Radio Module") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry RADIO_MODULE_UIV = REGISTRATE + .item("uiv_radio_module", ComponentItem::new) + .lang("UIV Radio Module") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry RADIO_MODULE_UXV = REGISTRATE + .item("uxv_radio_module", ComponentItem::new) + .lang("UXV Radio Module") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry RADIO_MODULE_OPV = REGISTRATE + .item("opv_radio_module", ComponentItem::new) + .lang("OPV Radio Module") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + // The Fuckin Spinny Boi + public static final ItemEntry GYROSCOPE_UV = REGISTRATE + .item("uv_gyroscope", ComponentItem::new) + .lang("UV Gyroscope") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry GYROSCOPE_UHV = REGISTRATE + .item("uhv_gyroscope", ComponentItem::new) + .lang("UHV Gyroscope") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry GYROSCOPE_UEV = REGISTRATE + .item("uev_gyroscope", ComponentItem::new) + .lang("UEV Gyroscope") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry GYROSCOPE_UIV = REGISTRATE + .item("uiv_gyroscope", ComponentItem::new) + .lang("UIV Gyroscope") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry GYROSCOPE_UXV = REGISTRATE + .item("uxv_gyroscope", ComponentItem::new) + .lang("UXV Gyroscope") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry GYROSCOPE_OPV = REGISTRATE + .item("opv_gyroscope", ComponentItem::new) + .lang("OPv Gyroscope") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry GELATIN_SCAFFOLD = REGISTRATE + .item("gelatin_scaffold", ComponentItem::new) + .lang("Gelatin Scaffold") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry BIFIDOBACTERIUM_BREVE_CULTURE = REGISTRATE + .item("bifidobacterium_breve_culture", ComponentItem::new) + .lang("Bifidobacterium Breve Culture") + .properties(p -> p.stacksTo(4)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry BIFIDOBACTERIUM_BREVE = REGISTRATE + .item("bifidobacterium_breve", ComponentItem::new) + .lang("Bifidobacterium Breve") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + // Strep + public static final ItemEntry STREPTOCOCCUS_PYOGENES_CULTURE = REGISTRATE + .item("streptococcus_pyogenes_culture", ComponentItem::new) + .lang("Streptococcus Pyogenes Culture") + .properties(p -> p.stacksTo(4)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry STREPTOCOCCUS_PYOGENES = REGISTRATE + .item("streptococcus_pyogenes", ComponentItem::new) + .lang("Streptococcus Pyogenes") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + // E COLI + public static final ItemEntry ESCHERICHIA_COLI_CULTURE = REGISTRATE + .item("escherichia_coli_culture", ComponentItem::new) + .lang("Escherichia Coli Culture") + .properties(p -> p.stacksTo(4)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry ESCHERICHIA_COLI = REGISTRATE + .item("escherichia_coli", ComponentItem::new) + .lang("Escherichia Coli") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CONTAMINATED_PETRI_DISH = REGISTRATE + .item("contaminated_petri_dish", ComponentItem::new) + .lang("Contaminated Petri Dish") + .properties(p -> p.stacksTo(8)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry PREPARED_PETRI_DISH = REGISTRATE + .item("prepared_petri_dish", ComponentItem::new) + .lang("Prepared Petri Dish") + .properties(p -> p.stacksTo(8)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry ULTRASONIC_HOMOGENIZER = REGISTRATE + .item("ultrasonic_homogenizer", ComponentItem::new) + .lang("Ultrasonic Homogenizer") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry COMPUTATION_SUPPORT_UNIT = REGISTRATE + .item("computation_support_unit", ComponentItem::new) + .lang("Computation Support Unit") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry WIRED_PETRI_DISH = REGISTRATE + .item("wired_petri_dish", ComponentItem::new) + .lang("Wired Petri Dish") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry SCULK_FIBROBLAST = REGISTRATE + .item("sculk_fibroblast", ComponentItem::new) + .lang("Sculk Fibroblast") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry SCULK_MYOFIBROBLAST = REGISTRATE + .item("sculk_myofibroblast", ComponentItem::new) + .lang("Sculk Myofibroblast") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + // UNSURE IF THESE WILL BE USED + public static final ItemEntry RESPIRATORY_SCULK_HEMOCYTOBLAST = REGISTRATE + .item("resipiratory_sculk_hemocytoblast", ComponentItem::new) + .lang("Respiratory Sculk Hemocytoblast") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry SATURATED_SCULK_HEMOCYTOBLAST = REGISTRATE + .item("saturated_sculk_hemocytoblast", ComponentItem::new) + .lang("Saturated Sculk Hemocytoblast") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry INERT_FUNGAL_SPORES = REGISTRATE + .item("inert_fungal_spores", ComponentItem::new) + .lang("Inert Fungal Spores") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry HEME_RING = REGISTRATE + .item("heme_ring", ComponentItem::new) + .lang("Heme Ring") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + + // Thrusters (Space Industry stuff) + + public static final ItemEntry THRUSTER_UV = REGISTRATE + .item("uv_thruster", ComponentItem::new) + .lang(" Thruster") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry THRUSTER_UHV = REGISTRATE + .item("uhv_thruster", ComponentItem::new) + .lang("UHV Thruster") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry THRUSTER_UEV = REGISTRATE + .item("uev_thruster", ComponentItem::new) + .lang("UEV Thruster") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry THRUSTER_UIV = REGISTRATE + .item("uiv_thruster", ComponentItem::new) + .lang("UIV Thruster") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry THRUSTER_UXV = REGISTRATE + .item("uxv_thruster", ComponentItem::new) + .lang("UXV Thruster") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry THRUSTER_OPV = REGISTRATE + .item("opv_thruster", ComponentItem::new) + .lang("OPv Thruster") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + // Power Cells + public static final ItemEntry POWER_CELL_UV = REGISTRATE + .item("uv_powercell", ComponentItem::new) + .lang("UV Power Cell") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry POWER_CELL_UHV = REGISTRATE + .item("uhv_powercell", ComponentItem::new) + .lang("UHV Power Cell") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry POWER_CELL_UEV = REGISTRATE + .item("uev_powercell", ComponentItem::new) + .lang("UEV Power Cell") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry POWER_CELL_UIV = REGISTRATE + .item("uiv_powercell", ComponentItem::new) + .lang("UIV Power Cell") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry POWER_CELL_UXV = REGISTRATE + .item("uxv_powercell", ComponentItem::new) + .lang("UXV Power Cell") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry POWER_CELL_OPV = REGISTRATE + .item("opv_powercell", ComponentItem::new) + .lang("OPv Power Cell") + .properties(p -> p.stacksTo(64)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry FERMIUM_RAD_CHARGES = REGISTRATE + .item("fermium_rad_charges", ComponentItem::new) + .lang("Fermium Radiation Charge") + .properties(p -> p.stacksTo(8)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry NEURO_PROCESSING_ASSEMBLY = REGISTRATE + .item("neuro_processing_assembly", ComponentItem::new) + .lang("Neuroprocessing Assembly Board") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry SOMATIC_PROCESSING_ASSEMBLY = REGISTRATE + .item("somatic_processing_assembly", ComponentItem::new) + .lang("Somatoprocessing Assembly Board") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry OPTIC_PROCESSING_ASSEMBLY = REGISTRATE + .item("optical_processing_assembly", ComponentItem::new) + .lang("Optical Processor Assembly") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry SELF_AWARE_PROCESSING_ASSEMBLY = REGISTRATE + .item("self_aware_processing_assembly", ComponentItem::new) + .lang("Self Aware Processor Assembly") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry RECORD_KEEPING_PROCESSOR_ASSEMBLY = REGISTRATE + .item("record_keeping_processor_assembly", ComponentItem::new) + .lang("Record Keeping Processor Assembly") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry PROGRAMMABLE_MOTE = REGISTRATE + .item("programmable_mote", ComponentItem::new) + .lang("§5Programmable Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry PERPETUITY_SHARD = REGISTRATE + .item("shard_of_perpetuity", ComponentItem::new) + .lang("Shard of Perpetuity") + .properties(p -> p.stacksTo(64)) + .onRegister(attach( + new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.lore.shard_small.0")); + tooltips.add(Component.translatable("cosmiccore.lore.shard_small.1")); + }), + new com.ghostipedia.cosmiccore.common.reflection.item.ShardConsumeBehavior(1))) + .defaultModel() + .register(); + public static final ItemEntry PERPETUITY_SHARD_LARGE = REGISTRATE + .item("large_shard_of_perpetuity", ComponentItem::new) + .lang("Large Shard of Perpetuity") + .properties(p -> p.stacksTo(64)) + .onRegister(attach( + new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.lore.shard_large.0")); + tooltips.add(Component.translatable("cosmiccore.lore.shard_large.1")); + }), + new com.ghostipedia.cosmiccore.common.reflection.item.CapacityShardBehavior(10))) + .defaultModel() + .register(); + public static final ItemEntry PERPETUITY_SHARD_MASSIVE = REGISTRATE + .item("cluster_of_perpetuity", ComponentItem::new) + .lang("Cluster of Perpetuity") + .properties(p -> p.stacksTo(16)) + .onRegister(attach( + new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.lore.shard_huge.0")); + tooltips.add(Component.translatable("cosmiccore.lore.shard_huge.1")); + tooltips.add(Component.translatable("cosmiccore.lore.shard_huge.2")); + }), + new com.ghostipedia.cosmiccore.common.reflection.item.ScarRemovalBehavior())) + .defaultModel() + .register(); + public static final ItemEntry WIRELESS_PDA = REGISTRATE + .item("wireless_pda", ComponentItem::new) + .lang("Wireless Data PDA") + .properties(p -> p.stacksTo(1)) + .tag() + .onRegister(attach(new WirelessPDABehavior())) + .defaultModel() + .register(); + + /* SHELVED (cosmiccore-42.14): CosmicScytheItem needs the Malum 1.8.2 scythe rework + (enchantment-based scythe system removed), NeoForge item-capability rework, and + GTCEu electric-item port. Re-add the three scythes once CosmicScytheItem is ported. + public static final ItemEntry NANO_SCYTHE = REGISTRATE + .item("nano_scythe", + props -> new CosmicScytheItem( + SOUL_STAINED_STEEL, + 10.5f, 0.5f, props)) + .properties(p -> p.stacksTo(1)) + .lang("Nano Scythe") + .defaultModel() + .register(); + + public static final ItemEntry QUANTUM_SCYTHE = REGISTRATE + .item("quantum_scythe", + props -> new CosmicScytheItem( + SOUL_STAINED_STEEL, + 25.5f, 0.5f, props)) + .properties(p -> p.stacksTo(1)) + .lang("Quark Scythe") + .defaultModel() + .register(); + + public static final ItemEntry SANGUINE_SCYTHE = REGISTRATE + .item("sanguine_scythe", + props -> new CosmicScytheItem( + SOUL_STAINED_STEEL, + 100f, 0.5f, props)) + .properties(p -> p.stacksTo(1)) + .lang("Sanguine Scythe") + .defaultModel() + .register(); + */ + + public static ItemEntry THE_ONE_RING = REGISTRATE + .item("the_one_ring", p -> (ComponentItem) new ComponentItem(p) { + + @Override + public boolean canBeHurtBy(ItemStack stack, DamageSource damageSource) { + return damageSource.is(DamageTypes.LAVA); + } + + @Override + public int getEntityLifespan(ItemStack itemStack, Level level) { + return Short.MIN_VALUE; + } + + @Override + public boolean onDroppedByPlayer(ItemStack item, Player player) { + return false; + } + + @Override + public boolean isFoil(ItemStack stack) { + return true; + } + }) + .lang("The One Ring") + .properties(p -> p.stacksTo(1).fireResistant()) + .onRegister(attach(new EffectApplicationBehavior() + .addEffect(() -> new MobEffectInstance(MobEffects.INVISIBILITY, 10), 1.0F) + .addEffect(() -> new MobEffectInstance(MobEffects.UNLUCK, 10, 5), 1.0F) + .addEffect(() -> new MobEffectInstance(MobEffects.MOVEMENT_SPEED, 10, 1), 1.0F), + new TooltipBehavior(list -> { + list.add(Component.translatable("item.cosmiccore.the_one_ring.tooltip.0")); + list.add(Component.translatable("item.cosmiccore.the_one_ring.tooltip.1")); + }))) + .register(); + // public static final ItemEntry PARADOX_ECHOS = REGISTRATE.item("paradox_harmonics", + // ComponentItem::new) + // .lang("Paradox Harmonics") + // .properties(p -> p.stacksTo(64)) + // .defaultModel() + // .register(); + // public static final ItemEntry ECTOPHASM = REGISTRATE.item("ectophasm", ComponentItem::new) + // .lang("Ectophasm") + // .properties(p -> p.stacksTo(64)) + // .defaultModel() + // .register(); + // public static final ItemEntry DEMONIC_DESIRE = REGISTRATE.item("demonic_desire", + // ComponentItem::new) + // .lang("Deomic Desire") + // .properties(p -> p.stacksTo(64)) + // .defaultModel() + // .register(); + // public static final ItemEntry WEAKENED_SOUL = REGISTRATE.item("weakened_soul", + // ComponentItem::new) + // .lang("Weakened Soul") + // .properties(p -> p.stacksTo(64)) + // .defaultModel() + // .register(); + // + + public static ItemEntry SPACE_RADIO = REGISTRATE + .item("space_radio", ComponentItem::new) + .lang("Space Radio") + .properties(p -> p.stacksTo(1).fireResistant()) + .onRegister(attach(new TooltipBehavior(list -> { + list.add(Component.translatable("item.cosmiccore.space_radio.tooltip")); + }))) + .register(); + + public static ItemEntry SIMPLE_REBREATHER = REGISTRATE + .item("simple_rebreather", ComponentItem::new) + .lang("Simple Rebreather") + .properties(p -> p.stacksTo(1).fireResistant()) + .onRegister(attach(new TooltipBehavior(list -> { + list.add(Component.translatable("item.cosmiccore.simple_rebreather.tooltip")); + }))) + .register(); + + public static ItemEntry PRESSURIZED_REBREATHER = REGISTRATE + .item("pressurized_rebreather", ComponentItem::new) + .lang("Pressurized Rebreather") + .properties(p -> p.stacksTo(1).fireResistant()) + .onRegister(attach(new TooltipBehavior(list -> { + list.add(Component.translatable("item.cosmiccore.simple_rebreather.tooltip")); + list.add(Component.translatable("item.cosmiccore.pressurized_rebreather.tooltip")); + }))) + .register(); + + public static final ItemEntry WAXED_LEATHER = REGISTRATE.item("waxed_leather", ComponentItem::new) + .lang("Waxed Leather") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry OVERLOADED_PEARLS = REGISTRATE + .item("overloaded_pearls", ComponentItem::new) + .lang("Overloaded Pearls") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ADVANCED_RAM_WAFER = REGISTRATE + .item("aram_wafer", ComponentItem::new) + .lang("ARAM Wafer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ADVANCED_RAM_CHIP = REGISTRATE.item("aram_chip", ComponentItem::new) + .lang("ARAM Chip") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + public static final ItemEntry RUNEWOVEN_PCB = REGISTRATE + .item("runewoven_plastic_circuit_board", ComponentItem::new) + .lang("Runewoven Plastic Circuit Board") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry MANA_PCB = REGISTRATE + .item("plastic_circuit_board", ComponentItem::new) + .lang("Mana-doped Plastic Circuit Board") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ENTHELIC_BOARD = REGISTRATE + .item("multilayered_enthel_circuit_board", ComponentItem::new) + .lang("Multilayered Enthel Circuit Board") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ENTHELIC_PCB = REGISTRATE + .item("spirit_engraved_enthel_circuit_board", ComponentItem::new) + .lang("Spirit Engraved Enthel Circuit Board") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + public static final ItemEntry ENTHEL_CPU = REGISTRATE + .item("spirit_runed_enthel_cpu", ComponentItem::new) + .lang("Spirit Runed Enthel CPU") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ENTHEL_CPU_WAFER = REGISTRATE + .item("spirit_runed_enthel_cpu_wafer", ComponentItem::new) + .lang("Spirit Runed Enthel CPU Wafer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + public static final ItemEntry RUNIC_HEX_CPU = REGISTRATE.item("runic_hex_cpu", ComponentItem::new) + .lang("Hex Etched CPU Chip") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry RUNIC_HEX_CPU_WAFER = REGISTRATE + .item("runic_hex_cpu_wafer", ComponentItem::new) + .lang("Hex Etched CPU Wafer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + public static final ItemEntry BLACKSTONE_PUSTULE = REGISTRATE + .item("blackstone_pustule", ComponentItem::new) + .lang("Blackstone Pustule") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + // public static final ItemEntry WRAPPED_S = REGISTRATE + // .item("blackstone_pustule", ComponentItem::new) + // .lang("Blackstone Pustule") + // .properties(p -> p.stacksTo(64)) + // .defaultModel() + // .register(); + + // New Circuits + + // Hex circuits + public static final ItemEntry HEX_PROCESSOR = REGISTRATE + .item("hex_processor", ComponentItem::new) + .lang("Hex Processor") + .tag(CustomTags.MV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry HEX_PROCESSOR_ASSEMBLY = REGISTRATE + .item("hex_processor_assembly", ComponentItem::new) + .lang("Hex Processor Assembly") + .tag(CustomTags.HV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry HEX_PROCESSOR_SUPERCOMPUTER = REGISTRATE + .item("hex_processor_supercomputer", ComponentItem::new) + .lang("Hex Processor Supercomputer") + .tag(CustomTags.EV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry HEX_PROCESSOR_MAINFRAME = REGISTRATE + .item("hex_processor_mainframe", ComponentItem::new) + .lang("Hex Processor Mainframe") + .tag(CustomTags.IV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + // Enthelic + public static final ItemEntry ENTHELIC_PROCESSOR = REGISTRATE + .item("enthelic_processor", ComponentItem::new) + .lang("Enthelic Processor") + .tag(CustomTags.HV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ENTHELIC_PROCESSOR_ASSEMBLY = REGISTRATE + .item("enthelic_processor_assembly", ComponentItem::new) + .lang("Enthelic Processor Assembly") + .tag(CustomTags.EV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ENTHELIC_PROCESSOR_SUPERCOMPUTER = REGISTRATE + .item("enthelic_processor_supercomputer", ComponentItem::new) + .lang("Enthelic Processor Supercomputer") + .tag(CustomTags.IV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ENTHELIC_PROCESSOR_MAINFRAME = REGISTRATE + .item("enthelic_processor_mainframe", ComponentItem::new) + .lang("Enthelic Processor Mainframe") + .tag(CustomTags.LuV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + // Lucidic + public static final ItemEntry LUCIDIC_PROCESSOR = REGISTRATE + .item("lucidic_processor", ComponentItem::new) + .lang("Lucidic Processor") + .tag(CustomTags.EV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry LUCIDIC_PROCESSOR_ASSEMBLY = REGISTRATE + .item("lucidic_processor_assembly", ComponentItem::new) + .lang("Lucidic Processor Assembly") + .tag(CustomTags.IV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry LUCIDIC_PROCESSOR_SUPERCOMPUTER = REGISTRATE + .item("lucidic_processor_supercomputer", ComponentItem::new) + .lang("Lucidic Processor Supercomputer") + .tag(CustomTags.LuV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry LUCIDIC_PROCESSOR_MAINFRAME = REGISTRATE + .item("lucidic_processor_mainframe", ComponentItem::new) + .lang("Lucidic Processor Mainframe") + .tag(CustomTags.ZPM_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + // Harmonic (ZPM-UEV) + public static final ItemEntry SONAR_PROCESSOR = REGISTRATE + .item("harmonic_processor", ComponentItem::new) + .lang("Harmonic Processor") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry SONAR_PROCESSOR_ASSEMBLY = REGISTRATE + .item("harmonic_processor_assembly", ComponentItem::new) + .lang("Harmonic Processor Assembly") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry SONAR_PROCESSOR_SUPERCOMPUTER = REGISTRATE + .item("harmonic_processor_supercomputer", ComponentItem::new) + .lang("Harmonic Processor Supercomputer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry SONAR_PROCESSOR_MAINFRAME = REGISTRATE + .item("harmonic_processor_mainframe", ComponentItem::new) + .lang("Harmonic Processor Mainframe") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + // Optical (UV-UIV) + public static final ItemEntry OPTICAL_PROCESSOR = REGISTRATE + .item("optical_processor", ComponentItem::new) + .lang("Optical Processor") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry OPTICAL_PROCESSOR_ASSEMBLY = REGISTRATE + .item("optical_processor_assembly", ComponentItem::new) + .lang("Optical Processor Assembly") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry OPTICAL_PROCESSOR_SUPERCOMPUTER = REGISTRATE + .item("optical_processor_supercomputer", ComponentItem::new) + .lang("Optical Processor Supercomputer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry OPTICAL_PROCESSOR_MAINFRAME = REGISTRATE + .item("optical_processor_mainframe", ComponentItem::new) + .lang("Optical Processor Mainframe") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + // Suelescent (UHV-UXV) + public static final ItemEntry COSMIC_PROCESSOR = REGISTRATE + .item("suelescent_processor", ComponentItem::new) + .lang("Suelescent Processor") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry COSMIC_PROCESSOR_ASSEMBLY = REGISTRATE + .item("suelescent_processor_assembly", ComponentItem::new) + .lang("Suelescent Processor Assembly") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry COSMIC_PROCESSOR_SUPERCOMPUTER = REGISTRATE + .item("suelescent_processor_supercomputer", ComponentItem::new) + .lang("Suelescent Processor Supercomputer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry COSMIC_PROCESSOR_MAINFRAME = REGISTRATE + .item("suelescent_processor_mainframe", ComponentItem::new) + .lang("Suelescent Processor Mainframe") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + // Akashic Circuit (UEV-OPV) + public static final ItemEntry PSIONIC_PROCESSOR = REGISTRATE + .item("akashic_processor", ComponentItem::new) + .lang("Akashic Processor") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry PSIONIC_PROCESSOR_ASSEMBLY = REGISTRATE + .item("akashic_processor_assembly", ComponentItem::new) + .lang("Akashic Processor Assembly") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry PSIONIC_PROCESSOR_SUPERCOMPUTER = REGISTRATE + .item("akashic_processor_supercomputer", ComponentItem::new) + .lang("Akashic Processor Supercomputer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry PSIONIC_PROCESSOR_MAINFRAME = REGISTRATE + .item("akashic_processor_mainframe", ComponentItem::new) + .lang("Akashic Processor Mainframe") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + // Eschaton (UIV-MAX) + public static final ItemEntry ESCHATON_PROCESSOR = REGISTRATE + .item("eschaton_processor", ComponentItem::new) + .lang("Eschaton Processor") + .properties(p -> p.stacksTo(64)) + .onRegister(attachRenderer(() -> HaloItemRenderer.create(6, 0xFFFFFFFF, + ResourceLocation.fromNamespaceAndPath(CosmicCore.MOD_ID, "block/iris/rnd/tentacle_halo"), true, + false))) + .defaultModel() + .register(); + public static final ItemEntry ESCHATON_PROCESSOR_ASSEMBLY = REGISTRATE + .item("eschaton_processor_assembly", ComponentItem::new) + .lang("Eschaton Processor Assembly") + .properties(p -> p.stacksTo(64)) + .onRegister(attachRenderer(() -> HaloItemRenderer.create(6, 0xFFFFFFFF, + ResourceLocation.fromNamespaceAndPath(CosmicCore.MOD_ID, "block/iris/rnd/tentacle_halo"), true, + false))) + .defaultModel() + .register(); + public static final ItemEntry ESCHATON_PROCESSOR_SUPERCOMPUTER = REGISTRATE + .item("eschaton_processor_supercomputer", ComponentItem::new) + .lang("Eschaton Processor Supercomputer") + .properties(p -> p.stacksTo(64)) + .onRegister(attachRenderer(() -> HaloItemRenderer.create(6, 0xFFFFFFFF, + ResourceLocation.fromNamespaceAndPath(CosmicCore.MOD_ID, "block/iris/rnd/tentacle_halo"), true, + false))) + .defaultModel() + .register(); + public static final ItemEntry ESCHATON_PROCESSOR_MAINFRAME = REGISTRATE + .item("eschaton_processor_mainframe", ComponentItem::new) + .lang("Eschaton Processor Mainframe") + .properties(p -> p.stacksTo(64)) + .onRegister(attachRenderer(() -> HaloItemRenderer.create(6, 0xFFFFFFFF, + ResourceLocation.fromNamespaceAndPath(CosmicCore.MOD_ID, "block/iris/rnd/tentacle_halo"), true, + false))) + .onRegister(attach(new TooltipBehavior(lines -> { + lines.add(Component.literal(StringUtil + .rainbowDancing(LocalizationUtils.format("cosmiccore.circuit.lore.tier.max.0")))); + lines.add(Component.translatable("cosmiccore.circuit.lore.tier.max.1")); + lines.add(Component.translatable("cosmiccore.circuit.lore.tier.max.2")); + lines.add(Component.translatable("cosmiccore.circuit.lore.tier.max.3")); + + }))) + .defaultModel() + .register(); + + // Demon/Soul Related Items + + public static final ItemEntry WICKED_ESSENCE = REGISTRATE + .item("wicked_essence", ComponentItem::new) + .lang("Wicked Essence") + .properties(p -> p.stacksTo(64)) + .onRegister(attach(new TooltipBehavior(lines -> { + lines.add(Component.literal(StringUtil + .goldFlicker(LocalizationUtils.format("cosmiccore.lore.broken_virtue.0")))); + }))) + .defaultModel() + .register(); + + public static final ItemEntry ABERRANT_ESSENCE = REGISTRATE + .item("aberrant_essence", ComponentItem::new) + .lang("§6Aberrant Essence") + .properties(p -> p.stacksTo(64)) + .onRegister(attach(new TooltipBehavior(lines -> { + lines.add(Component.literal(StringUtil + .midnightOscillation(LocalizationUtils.format("cosmiccore.lore.broken_virtue.1")))); + }))) + .defaultModel() + .register(); + + public static final ItemEntry FIRECLAY_BALL = REGISTRATE.item("fireclay_ball", ComponentItem::new) + .lang("Fireclay Ball") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry HARDENED_RESIN = REGISTRATE + .item("hardened_resin", ComponentItem::new) + .lang("Hardened Resin") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static ItemEntry DEBUG_STRUCTURE_WRITER = REGISTRATE + .item("debug_structure_writer", ComponentItem::new) + .lang("Debug Structure Writer") + .properties(p -> p.stacksTo(1)) + .onRegister(attach(StructureWriteBehavior.INSTANCE)) + .register(); + + // Space Suite — TODO(stellaris): AA/Botarium oxygen space-suit chestplates shelved (see _shelved/api/item/armor, bead cosmiccore-42.13) + /* SHELVED (AA/Botarium space suits — armor logic moved to _shelved): + public static ItemEntry SPACE_NANO_CHESTPLATE = REGISTRATE + .item("space_nanomuscle_chestplate", + (p) -> new SpaceArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.CHESTPLATE, 5000, p) + .setArmorLogic(new NanoMuscleSpaceSuite(ArmorItem.Type.CHESTPLATE, 512, + 6_400_000L * (long) Math.max(1, + Math.pow(4, ConfigHolder.INSTANCE.tools.voltageTierNanoSuit - 3)), + ConfigHolder.INSTANCE.tools.voltageTierNanoSuit))) + .tag(CosmicItemTags.NANOMUSCLE_SPACE_SUITE, ModItemTags.SPACE_SUITS, ModItemTags.FREEZE_RESISTANT_ARMOR, + ModItemTags.HEAT_RESISTANT_ARMOR) + .lang("NanoMuscle™ Space Suite Chestplate") + .properties(p -> p.rarity(Rarity.RARE)) + .register(); + public static ItemEntry ADVANCED_SPACE_NANO_CHESTPLATE = REGISTRATE + .item("space_advanced_nanomuscle_chestplate", + (p) -> new SpaceArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.CHESTPLATE, 10000, p) + .setArmorLogic(new AdvancedNanoMuscleSpaceSuite(512, + 12_800_000L * (long) Math.max(1, + Math.pow(4, ConfigHolder.INSTANCE.tools.voltageTierAdvNanoSuit - 3)), + ConfigHolder.INSTANCE.tools.voltageTierAdvNanoSuit))) + .tag(CosmicItemTags.NANOMUSCLE_SPACE_SUITE, ModItemTags.SPACE_SUITS, ModItemTags.FREEZE_RESISTANT_ARMOR, + ModItemTags.HEAT_RESISTANT_ARMOR) + .lang("Advanced NanoMuscle™ Space Suite Chestplate") + .properties(p -> p.rarity(Rarity.EPIC)) + .register(); + public static ItemEntry SPACE_QUARK_CHESTPLATE = REGISTRATE + .item("space_quarktech_chestplate", + (p) -> new SpaceArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.CHESTPLATE, 20000, p) + .setArmorLogic(new QuarkTechSpaceSuite(ArmorItem.Type.CHESTPLATE, 8192, + 100_000_000L * (long) Math.max(1, + Math.pow(4, ConfigHolder.INSTANCE.tools.voltageTierQuarkTech - 5)), + ConfigHolder.INSTANCE.tools.voltageTierQuarkTech))) + .tag(CosmicItemTags.QUARKTECH_SPACE_SUITE, ModItemTags.SPACE_SUITS, ModItemTags.FREEZE_RESISTANT_ARMOR, + ModItemTags.HEAT_RESISTANT_ARMOR) + .lang("QuarkTech™ Space Suite Chestplate") + .properties(p -> p.rarity(Rarity.RARE)) + .register(); + public static ItemEntry ADVANCED_SPACE_QUARK_CHESTPLATE = REGISTRATE + .item("space_advanced_quarktech_chestplate", + (p) -> new SpaceArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.CHESTPLATE, 50000, p) + .setArmorLogic(new AdvancedQuarkTechSpaceSuite(8192, + 1_000_000_000L * (long) Math.max(1, + Math.pow(4, ConfigHolder.INSTANCE.tools.voltageTierAdvQuarkTech - 6)), + ConfigHolder.INSTANCE.tools.voltageTierAdvQuarkTech))) + .tag(CosmicItemTags.QUARKTECH_SPACE_SUITE, ModItemTags.SPACE_SUITS, ModItemTags.FREEZE_RESISTANT_ARMOR, + ModItemTags.HEAT_RESISTANT_ARMOR) + .lang("Advanced QuarkTech™ Space Suite Chestplate") + .properties(p -> p.rarity(Rarity.EPIC)) + .register(); + */ + // Oiled up white girl trying to understand what the FUCK an armor tag is, i'm doing to fucking shove a whole + // pineapple up the ass of whatever mojang employee thought these were **OKAY TO CODE** + + public static ItemEntry SANGUINE_WARPTECH_HELMET = REGISTRATE.item("sanguine_warptech_helmet", + (p) -> new ArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.HELMET, p) + .setArmorLogic(new HelmetSanguineWarptechSuite(ArmorItem.Type.HELMET, + 8192, + 100_000_000L * (long) Math.max(1, + Math.pow(4, ConfigHolder.INSTANCE.tools.voltageTierQuarkTech - 5)), + ConfigHolder.INSTANCE.tools.voltageTierQuarkTech))) + .lang("Sanguine WarpTech Helmet") + .properties(p -> p.rarity(Rarity.EPIC)) + .tag(CustomTags.PPE_ARMOR) + .register(); + + public static ItemEntry SANGUINE_WARPTECH_CHESTPLATE = REGISTRATE + .item("sanguine_warptech_chestplate", + (p) -> new ArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.CHESTPLATE, p) + .setArmorLogic(new ChestSanguineWarptechSuite(8192, + 10_000_000_000L * (long) Math.max(1, + Math.pow(4, ConfigHolder.INSTANCE.tools.voltageTierAdvQuarkTech - 6)), + ConfigHolder.INSTANCE.tools.voltageTierAdvQuarkTech))) + // TODO(stellaris): AA ModItemTags (SPACE_SUITS/FREEZE/HEAT) dropped with Ad Astra; oxygen-tank sub-feature removed (now plain armor) + .tag(CosmicItemTags.QUARKTECH_SPACE_SUITE) + .lang("Sanguine WarpTech Gravplate") + .properties(p -> p.rarity(Rarity.EPIC)) + .register(); + public static ItemEntry SANGUINE_WARPTECH_LEGGINGS = REGISTRATE + .item("sanguine_warptech_leggings", + (p) -> new ArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.LEGGINGS, p) + .setArmorLogic(new SanguineWarptechSuite(ArmorItem.Type.LEGGINGS, + 8192, + 100_000_000L * (long) Math.max(1, + Math.pow(4, ConfigHolder.INSTANCE.tools.voltageTierQuarkTech - 5)), + ConfigHolder.INSTANCE.tools.voltageTierQuarkTech))) + .lang("Sanguine WarpTech Leggings") + .properties(p -> p.rarity(Rarity.EPIC)) + .tag(CustomTags.PPE_ARMOR) + .register(); + + public static ItemEntry SANGUINE_WARPTECH_BOOTS = REGISTRATE.item("sanguine_warptech_boots", + (p) -> new ArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.BOOTS, p) + .setArmorLogic(new SanguineWarptechSuite(ArmorItem.Type.BOOTS, + 8192, + 100_000_000L * (long) Math.max(1, + Math.pow(4, ConfigHolder.INSTANCE.tools.voltageTierQuarkTech - 5)), + ConfigHolder.INSTANCE.tools.voltageTierQuarkTech))) + .lang("Sanguine WarpTech Boots") + .properties(p -> p.rarity(Rarity.EPIC)) + .tag(CustomTags.PPE_ARMOR) + .register(); + + // OMNIA CIRCUITS + + public static final ItemEntry OMNIA_CIRCUIT_LV = REGISTRATE + .item("omnia_circuit_lv", ComponentItem::new) + .lang("LV Omnia Circuit") + .properties(p -> p.stacksTo(64)) + .tag(CustomTags.LV_CIRCUITS) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.omnia_circuit.lv")); + }))) + .defaultModel() + .register(); + public static final ItemEntry OMNIA_CIRCUIT_MV = REGISTRATE + .item("omnia_circuit_mv", ComponentItem::new) + .lang("MV Omnia Circuit") + .properties(p -> p.stacksTo(64)) + .tag(CustomTags.MV_CIRCUITS) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.omnia_circuit.mv")); + }))) + .defaultModel() + .register(); + public static final ItemEntry OMNIA_CIRCUIT_HV = REGISTRATE + .item("omnia_circuit_hv", ComponentItem::new) + .lang("HV Omnia Circuit") + .properties(p -> p.stacksTo(64)) + .tag(CustomTags.HV_CIRCUITS) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.omnia_circuit.hv")); + }))) + .defaultModel() + .register(); + public static final ItemEntry OMNIA_CIRCUIT_EV = REGISTRATE + .item("omnia_circuit_ev", ComponentItem::new) + .lang("EV Omnia Circuit") + .properties(p -> p.stacksTo(64)) + .tag(CustomTags.EV_CIRCUITS) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.omnia_circuit.ev")); + }))) + .defaultModel() + .register(); + public static final ItemEntry OMNIA_CIRCUIT_IV = REGISTRATE + .item("omnia_circuit_iv", ComponentItem::new) + .lang("IV Omnia Circuit") + .properties(p -> p.stacksTo(64)) + .tag(CustomTags.IV_CIRCUITS) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.omnia_circuit.iv")); + }))) + .defaultModel() + .register(); + public static final ItemEntry OMNIA_CIRCUIT_LUV = REGISTRATE + .item("omnia_circuit_luv", ComponentItem::new) + .lang("LuV Omnia Circuit") + .properties(p -> p.stacksTo(64)) + .tag(CustomTags.LuV_CIRCUITS) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.omnia_circuit.luv")); + }))) + .defaultModel() + .register(); + public static final ItemEntry OMNIA_CIRCUIT_ZPM = REGISTRATE + .item("omnia_circuit_zpm", ComponentItem::new) + .lang("ZPM Omnia Circuit") + .properties(p -> p.stacksTo(64)) + .tag(CustomTags.ZPM_CIRCUITS) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.omnia_circuit.zpm")); + }))) + .defaultModel() + .register(); + public static final ItemEntry OMNIA_CIRCUIT_UV = REGISTRATE + .item("omnia_circuit_uv", ComponentItem::new) + .lang("UV Omnia Circuit") + .properties(p -> p.stacksTo(64)) + .tag(CustomTags.UV_CIRCUITS) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.omnia_circuit.uv")); + }))) + .defaultModel() + .register(); + public static final ItemEntry OMNIA_CIRCUIT_UHV = REGISTRATE + .item("omnia_circuit_uhv", ComponentItem::new) + .lang("UHV Omnia Circuit") + .tag(CustomTags.UHV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.omnia_circuit.uhv")); + }))) + .defaultModel() + .register(); + public static final ItemEntry OMNIA_CIRCUIT_UEV = REGISTRATE + .item("omnia_circuit_uev", ComponentItem::new) + .lang("UEV Omnia Circuit") + .tag(CustomTags.UEV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.omnia_circuit.uev")); + }))) + .defaultModel() + .register(); + public static final ItemEntry OMNIA_CIRCUIT_UIV = REGISTRATE + .item("omnia_circuit_uiv", ComponentItem::new) + .lang("UIV Omnia Circuit") + .tag(CustomTags.UIV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.omnia_circuit.uiv")); + }))) + .defaultModel() + .register(); + public static final ItemEntry OMNIA_CIRCUIT_UXV = REGISTRATE + .item("omnia_circuit_uxv", ComponentItem::new) + .lang("UXV Omnia Circuit") + .tag(CustomTags.UXV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.omnia_circuit.uxv")); + }))) + .defaultModel() + .register(); + public static final ItemEntry OMNIA_CIRCUIT_OPV = REGISTRATE + .item("omnia_circuit_opv", ComponentItem::new) + .lang("OPV Omnia Circuit") + .tag(CustomTags.OpV_CIRCUITS) + .properties(p -> p.stacksTo(64)) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.omnia_circuit.opv")); + }))) + .defaultModel() + .register(); + public static final ItemEntry RUNE_SLATE_ARKLYS = REGISTRATE + .item("rune_slate_arklys", ComponentItem::new) + .lang("Rune Slate [Arklys]") + .properties(p -> p.stacksTo(64)) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.arklys.1")); + tooltips.add(Component.translatable("cosmiccore.arklys.2")); + tooltips.add(Component.translatable("cosmiccore.rune_vague")); + }))) + .defaultModel() + .register(); + public static final ItemEntry RUNE_SLATE_TYLOMIR = REGISTRATE + .item("rune_slate_tylomir", ComponentItem::new) + .lang("Rune Slate [Tylomir]") + .properties(p -> p.stacksTo(64)) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.tylomir.1")); + tooltips.add(Component.translatable("cosmiccore.tylomir.2")); + tooltips.add(Component.translatable("cosmiccore.rune_vague")); + }))) + .defaultModel() + .register(); + public static final ItemEntry RUNE_SLATE_KHORUTH = REGISTRATE + .item("rune_slate_khoruth", ComponentItem::new) + .lang("Rune Slate [Khoruth]") + .properties(p -> p.stacksTo(64)) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.khoruth.1")); + tooltips.add(Component.translatable("cosmiccore.khoruth.2")); + tooltips.add(Component.translatable("cosmiccore.rune_vague")); + }))) + .defaultModel() + .register(); + public static final ItemEntry RUNE_SLATE_ZELOTHAR = REGISTRATE + .item("rune_slate_zelothar", ComponentItem::new) + .lang("Rune Slate [Zelothar]") + .properties(p -> p.stacksTo(64)) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.zelothar.1")); + tooltips.add(Component.translatable("cosmiccore.zelothar.2")); + tooltips.add(Component.translatable("cosmiccore.rune_vague")); + }))) + .defaultModel() + .register(); + public static final ItemEntry RUNE_SLATE_TENURA = REGISTRATE + .item("rune_slate_tenura", ComponentItem::new) + .lang("Rune Slate [Tenura]") + .properties(p -> p.stacksTo(64)) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.tenura.1")); + tooltips.add(Component.translatable("cosmiccore.tenura.2")); + tooltips.add(Component.translatable("cosmiccore.rune_vague")); + }))) + .defaultModel() + .register(); + + public static final ItemEntry RUNE_SLATE_VALDRIS = REGISTRATE + .item("rune_slate_valdris", ComponentItem::new) + .lang("Rune Slate [Valdris]") + .properties(p -> p.stacksTo(64)) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.valdris.1")); + tooltips.add(Component.translatable("cosmiccore.valdris.2")); + tooltips.add(Component.translatable("cosmiccore.rune_vague")); + }))) + .defaultModel() + .register(); + + public static final ItemEntry RUNE_CONJUNCTION_VALKRUTH = REGISTRATE + .item("rune_conjunction_valkruth", ComponentItem::new) + .lang("Rune Conjunction [Valkruth]") + .properties(p -> p.stacksTo(64)) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.conjuct_valkruth.1")); + tooltips.add(Component.translatable("cosmiccore.conjuct_valkruth.2")); + tooltips.add(Component.translatable("cosmiccore.conjuct_valkruth_emotion.1")); + tooltips.add(Component.translatable("cosmiccore.rune_emotion_weak.1")); + tooltips.add(Component.translatable("cosmiccore.rune_emotion_weak.2")); + }))) + .defaultModel() + .register(); + + public static final ItemEntry RUNE_CONJUNCTION_KHOLYS = REGISTRATE + .item("rune_conjunction_kholys", ComponentItem::new) + .lang("Rune Conjunction [Kholys]") + .properties(p -> p.stacksTo(64)) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.conjuct_kholys.1")); + tooltips.add(Component.translatable("cosmiccore.conjuct_kholys.2")); + tooltips.add(Component.translatable("cosmiccore.conjuct_kholys_emotion.1")); + tooltips.add(Component.translatable("cosmiccore.rune_emotion_weak.1")); + tooltips.add(Component.translatable("cosmiccore.rune_emotion_weak.2")); + }))) + .defaultModel() + .register(); + + public static final ItemEntry RUNE_CONJUNCTION_ARKLYTHAR = REGISTRATE + .item("rune_conjunction_arklythar", ComponentItem::new) + .lang("Rune Conjunction [Arklythar]") + .properties(p -> p.stacksTo(64)) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("cosmiccore.conjuct_arklythar.1")); + tooltips.add(Component.translatable("cosmiccore.conjuct_arklythar.2")); + tooltips.add(Component.translatable("cosmiccore.conjuct_arklythar_emotion.1")); + tooltips.add(Component.translatable("cosmiccore.rune_emotion_weak.1")); + tooltips.add(Component.translatable("cosmiccore.rune_emotion_weak.2")); + }))) + .defaultModel() + .register(); + // Gravity Normalizer Item Variation + public static final ItemEntry PORTABLE_GRAVITY_CORE = REGISTRATE + .item("portable_gravity_core", ComponentItem::new) + .lang("§6Portable Gravity Core") + .tag() + .properties(p -> p.stacksTo(64)) + .onRegister(attach(new TooltipBehavior(tooltips -> { + tooltips.add(Component.translatable("item.cosmiccore.portable_gravity_core.tooltip")); + }))) + .defaultModel() + .register(); + // infinite spraycan + public static final ItemEntry INFINITE_SPRAY_CAN = REGISTRATE + .item("infinite_spray_can", ComponentItem::new) + .lang("§5 Infinite_spray_can") + .setData(ProviderType.ITEM_MODEL, NonNullBiConsumer.noop()) + .properties(p -> p.stacksTo(1)) + .onRegister(attach(new InfiniteSprayCanBehavior(1))) + .onRegister(modelPredicate(CosmicCore.id("color"), + (itemStack) -> (float) ItemData.readTag(itemStack).getInt(InfiniteSprayCanBehavior.ColorTag))) + .register(); + + public static ItemEntry NEUTRONITE_FLUID_CELL = GTRegistration.REGISTRATE + .item("indestructible_fluid_cell", ComponentItem::new) + .lang("Indestructible %s Fluid Cell") + .setData(ProviderType.ITEM_MODEL, NonNullBiConsumer.noop()) + .color(() -> GTItems::cellColor) + .onRegister(attach( + ThermalFluidStats.create(1024000, 1000000, true, true, true, true, true), + new ItemFluidContainer(), cellName())) + .register(); + // Drones + public static final ItemEntry RUSTY_DRONE = REGISTRATE + .item("rusty_drone", ComponentItem::new) + .lang("Rusty Drone") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ROBUST_DRONE = REGISTRATE + .item("robust_drone", ComponentItem::new) + .lang("Robust Drone") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry INDUSTRIAL_DRONE = REGISTRATE + .item("industrial_drone", ComponentItem::new) + .lang("Industrial Drone") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry SANGUINE_DRONE = REGISTRATE + .item("sanguine_drone", ComponentItem::new) + .lang("Sanguine Drone") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry PLASMATIC_DRONE = REGISTRATE + .item("plasmatic_drone", ComponentItem::new) + .lang("plasmatic_drone") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + // WildFire Cores + public static final ItemEntry LV_WILDFIRE_CORE = REGISTRATE + .item("lv_wildfire_core", ComponentItem::new) + .lang("LV Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry MV_WILDFIRE_CORE = REGISTRATE + .item("mv_wildfire_core", ComponentItem::new) + .lang("MV Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry HV_WILDFIRE_CORE = REGISTRATE + .item("hv_wildfire_core", ComponentItem::new) + .lang("HV Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry EV_WILDFIRE_CORE = REGISTRATE + .item("ev_wildfire_core", ComponentItem::new) + .lang("EV Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry IV_WILDFIRE_CORE = REGISTRATE + .item("iv_wildfire_core", ComponentItem::new) + .lang("IV Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry LUV_WILDFIRE_CORE = REGISTRATE + .item("luv_wildfire_core", ComponentItem::new) + .lang("LuV Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ZPM_WILDFIRE_CORE = REGISTRATE + .item("zpm_wildfire_core", ComponentItem::new) + .lang("ZPM Wildfire Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + public static final ItemEntry BASIC_GENE_KIT = REGISTRATE + .item("basic_gene_kit", ComponentItem::new) + .lang("Basic Gene Kit") + .properties(p -> p.stacksTo(16)) + .defaultModel() + .register(); + + public static final ItemEntry INTERMEDIATE_GENE_KIT = REGISTRATE + .item("intermediate_gene_kit", ComponentItem::new) + .lang("Intermediate Gene Kit") + .properties(p -> p.stacksTo(16)) + .defaultModel() + .register(); + + public static final ItemEntry ADVANCED_GENE_KIT = REGISTRATE + .item("advanced_gene_kit", ComponentItem::new) + .lang("Advanced Gene Kit") + .properties(p -> p.stacksTo(16)) + .defaultModel() + .register(); + + // MANA WAFERS AND CHIPS + public static final ItemEntry LATENT_CAPACITY_WAFER = REGISTRATE + .item("latent_capacity_wafer", ComponentItem::new) + .lang("Latent Capacity Wafer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry LATENT_EFFICACY_WAFER = REGISTRATE + .item("latent_efficacy_wafer", ComponentItem::new) + .lang("Latent Efficacy Wafer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry LATENT_POTENCY_WAFER = REGISTRATE + .item("latent_potency_wafer", ComponentItem::new) + .lang("Latent Potency Wafer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry LATENT_VERBOSITY_WAFER = REGISTRATE + .item("latent_verbosity_wafer", ComponentItem::new) + .lang("Latent Verbosity Wafer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + // BOULE AND WAFER + public static final ItemEntry LIVINGROCK_ALUMINATE_BOULE = REGISTRATE + .item("livingrock_aluminate_boule", ComponentItem::new) + .lang("Livingrock Aluminate Boule") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry LIVINGROCK_ALUMINATE_WAFER = REGISTRATE + .item("livirock_aluminite_wafer", ComponentItem::new) + .lang("Livingrock Aluminate Wafer") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + // CHIPS + public static final ItemEntry CAPACITY_CHIP = REGISTRATE + .item("capacity_chip", ComponentItem::new) + .lang("Capacity Chip") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry EFFICACY_CHIP = REGISTRATE + .item("efficacy_chip", ComponentItem::new) + .lang("Efficacy Chip") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry POTENCY_CHIP = REGISTRATE + .item("potency_chip", ComponentItem::new) + .lang("Potency Chip") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry VERBOSITY_CHIP = REGISTRATE + .item("verbosity_chip", ComponentItem::new) + .lang("Verbosity Chip") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + // Project Star Eater + + public static final ItemEntry HAULER_PROBE_GRADE_1 = REGISTRATE + .item("freight_beetle_grade_1", ComponentItem::new) + .lang("Freight Beetle Mk.1") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry ARMORED_HAULER_PROBE_GRADE_1 = REGISTRATE + .item("armored_freight_beetle_grade_1", ComponentItem::new) + .lang("Armored Freight Beetle Mk.1") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUSHER_WASPS_GRADE_1 = REGISTRATE + .item("crusher_wasps_grade_1", ComponentItem::new) + .lang("Crusher Wasps Mk.1") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry RAZOR_HORNET_GRADE_1 = REGISTRATE + .item("razor_hornet_grade_1", ComponentItem::new) + .lang("Razor Hornet Mk.1") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry PULVERIZING_BEETLE_GRADE_1 = REGISTRATE + .item("pulverizing_beetle_grade_1", ComponentItem::new) + .lang("Pulverizing Beetle Mk.1") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUCIBLE_MANTIS_GRADE_1 = REGISTRATE + .item("crucible_mantis_grade_1", ComponentItem::new) + .lang("Crucible Mantis Mk.1") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry HAULER_PROBE_GRADE_2 = REGISTRATE + .item("freight_beetle_grade_2", ComponentItem::new) + .lang("Freight Beetle Mk.2") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry ARMORED_HAULER_PROBE_GRADE_2 = REGISTRATE + .item("armored_freight_beetle_grade_2", ComponentItem::new) + .lang("Armored Freight Beetle Mk.2") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUSHER_WASPS_GRADE_2 = REGISTRATE + .item("crusher_wasps_grade_2", ComponentItem::new) + .lang("Crusher Wasps Mk.2") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry RAZOR_HORNET_GRADE_2 = REGISTRATE + .item("razor_hornet_grade_2", ComponentItem::new) + .lang("Razor Hornet Mk.2") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry PULVERIZING_BEETLE_GRADE_2 = REGISTRATE + .item("pulverizing_beetle_grade_2", ComponentItem::new) + .lang("Pulverizing Beetle Mk.2") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUCIBLE_MANTIS_GRADE_2 = REGISTRATE + .item("razor_hornet_grade_2", ComponentItem::new) + .lang("Crucible Mantis Mk.2") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + // GRADE 3 + + public static final ItemEntry HAULER_PROBE_GRADE_3 = REGISTRATE + .item("freight_beetle_grade_3", ComponentItem::new) + .lang("Freight Beetle Mk.3") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry ARMORED_HAULER_PROBE_GRADE_3 = REGISTRATE + .item("armored_freight_beetle_grade_3", ComponentItem::new) + .lang("Armored Freight Beetle Mk.3") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUSHER_WASPS_GRADE_3 = REGISTRATE + .item("crusher_wasps_grade_3", ComponentItem::new) + .lang("Crusher Wasps Mk.3") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry RAZOR_HORNET_GRADE_3 = REGISTRATE + .item("razor_hornet_grade_3", ComponentItem::new) + .lang("Razor Hornet Mk.3") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry PULVERIZING_BEETLE_GRADE_3 = REGISTRATE + .item("pulverizing_beetle_grade_3", ComponentItem::new) + .lang("Pulverizing Beetle Mk.3") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUCIBLE_MANTIS_GRADE_3 = REGISTRATE + .item("razor_hornet_grade_3", ComponentItem::new) + .lang("Crucible Mantis Mk.3") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + // GRADE 4 + + public static final ItemEntry HAULER_PROBE_GRADE_4 = REGISTRATE + .item("freight_beetle_grade_4", ComponentItem::new) + .lang("Freight Beetle Mk.4") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry ARMORED_HAULER_PROBE_GRADE_4 = REGISTRATE + .item("armored_freight_beetle_grade_4", ComponentItem::new) + .lang("Armored Freight Beetle Mk.4") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUSHER_WASPS_GRADE_4 = REGISTRATE + .item("crusher_wasps_grade_4", ComponentItem::new) + .lang("Crusher Wasps Mk.4") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry RAZOR_HORNET_GRADE_4 = REGISTRATE + .item("razor_hornet_grade_4", ComponentItem::new) + .lang("Razor Hornet Mk.4") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry PULVERIZING_BEETLE_GRADE_4 = REGISTRATE + .item("pulverizing_beetle_grade_4", ComponentItem::new) + .lang("Pulverizing Beetle Mk.4") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUCIBLE_MANTIS_GRADE_4 = REGISTRATE + .item("razor_hornet_grade_4", ComponentItem::new) + .lang("Crucible Mantis Mk.4") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry HAULER_PROBE_GRADE_5 = REGISTRATE + .item("freight_beetle_grade_5", ComponentItem::new) + .lang("Freight Beetle Mk.5") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry ARMORED_HAULER_PROBE_GRADE_5 = REGISTRATE + .item("armored_freight_beetle_grade_5", ComponentItem::new) + .lang("Armored Freight Beetle Mk.5") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUSHER_WASPS_GRADE_5 = REGISTRATE + .item("crusher_wasps_grade_5", ComponentItem::new) + .lang("Crusher Wasps Mk.5") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry RAZOR_HORNET_GRADE_5 = REGISTRATE + .item("razor_hornet_grade_5", ComponentItem::new) + .lang("Razor Hornet Mk.5") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry PULVERIZING_BEETLE_GRADE_5 = REGISTRATE + .item("pulverizing_beetle_grade_5", ComponentItem::new) + .lang("Pulverizing Beetle Mk.5") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry CRUCIBLE_MANTIS_GRADE_5 = REGISTRATE + .item("razor_hornet_grade_5", ComponentItem::new) + .lang("Crucible Mantis Mk.5") + .properties(p -> p.stacksTo(64).durability(1024)) + .tag() + .defaultModel() + .register(); + + public static ItemEntry LINKED_TERMINAL = REGISTRATE + .item("linked_terminal", ComponentItem::new) + .lang("Linked Terminal") + .model((ctx, prov) -> prov.generated( + ctx::getEntry, + prov.modLoc("item/terminal/linked_terminal"), + prov.modLoc("item/terminal/terminal_overlay"))) + .properties(p -> p.stacksTo(1)) + .onRegister(attach(new LinkedTerminalBehavior())) + .register(); + + public static final ItemEntry CARBON_ASTEROID = REGISTRATE + .item("carbon_asteroid_base", AsteroidItem::new) + .lang("Carbonic Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + public static final ItemEntry FERRIC_ASTEROID = REGISTRATE + .item("ferric_asteroid", AsteroidItem::new) + .lang("Ferric Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry RARE_METAL_ASTEROID = REGISTRATE + .item("rare_metals_asteroid", AsteroidItem::new) + .lang("Exotic Metals Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry AURIC_ASTEROID = REGISTRATE + .item("auric_asteroid", AsteroidItem::new) + .lang("Auric Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry BRIMSTONE_ASTEROID = REGISTRATE + .item("brimstone_asteroid", AsteroidItem::new) + .lang("Brimstone Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry LITH_ASTEROID = REGISTRATE + .item("lith_asteroid", AsteroidItem::new) + .lang("Lith Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry MAFIC_ASTEROID = REGISTRATE + .item("mafic_asteroid", AsteroidItem::new) + .lang("Mafic Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry MOSSY_ASTEROID = REGISTRATE + .item("mossy_asteroid", AsteroidItem::new) + .lang("Mossy Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry OCCULT_ASTEROID = REGISTRATE + .item("occult_asteroid", AsteroidItem::new) + .lang("Occult Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry OXIDE_ASTEROID = REGISTRATE + .item("oxide_asteroid", AsteroidItem::new) + .lang("Oxide Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry SANGUINE_ASTEROID = REGISTRATE + .item("sanguine_asteroid", AsteroidItem::new) + .lang("Sanguine Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry WASTELAND_ASTEROID = REGISTRATE + .item("wasteland_asteroid", AsteroidItem::new) + .lang("Wasteland Asteroid") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .onRegister(attachRenderer(() -> RadianceItemRenderer.INSTANCE)) + .register(); + + public static final ItemEntry TUNGSTENSTEEL_NANOLATTICE_SPOOL = REGISTRATE + .item("tungstensteel_nanolattice_spool", ComponentItem::new) + .lang("Tungstensteel Nanolattice Spool") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + + public static final ItemEntry TRINAVINE_NANOLATTICE_SPOOL = REGISTRATE + .item("trinavine_nanolattice_spool", ComponentItem::new) + .lang("Trinavine Nanolattice Spool") + .properties(p -> p.stacksTo(16)) + .tag() + .defaultModel() + .register(); + // What we'd write our NBT ON and Read in LARVA + public static final ItemEntry TARGETING_CHIP = REGISTRATE + .item("asteroid_targeting_chip", props -> new AsteroidTargetingChipItem(props.stacksTo(1))) + .lang("Asteroid Targeting Chip") + .properties(p -> p.stacksTo(1)) + .tag() + .defaultModel() + .register(); + public static final ItemEntry FLESH_PACKED_PLUTONIUM_FUEL = REGISTRATE + .item("flesh_packed_plutonium_fuel", ComponentItem::new) + .lang("Flesh Packed Plutonium Fuel") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + + public static final ItemEntry FLESH_PACKED_URANIUM_FUEL = REGISTRATE + .item("flesh_packed_uranium_fuel", ComponentItem::new) + .lang("Flesh Packed Uranium Fuel") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + + public static final ItemEntry FLESH_PACKED_NEPTUNIUM_FUEL = REGISTRATE + .item("flesh_packed_neptunium_fuel", ComponentItem::new) + .lang("Flesh Packed Neptunium Fuel") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + + public static final ItemEntry SPENT_FLESH_PACKED_PLUTONIUM_FUEL = REGISTRATE + .item("spent_flesh_packed_plutonium_fuel", ComponentItem::new) + .lang("Spent Flesh Packed Plutonium Fuel") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + + public static final ItemEntry SPENT_FLESH_PACKED_URANIUM_FUEL = REGISTRATE + .item("spent_flesh_packed_uranium_fuel", ComponentItem::new) + .lang("Spent Flesh Packed Uranium Fuel") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + + public static final ItemEntry SPENT_FLESH_PACKED_NEPTUNIUM_FUEL = REGISTRATE + .item("spent_flesh_packed_neptunium_fuel", ComponentItem::new) + .lang("Spent Flesh Packed Neptunium Fuel") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + + public static final ItemEntry SUPERHEATED_FUEL_ROD = REGISTRATE + .item("superheated_fuel_rod", ComponentItem::new) + .lang("Superheated Fuel Rod") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + + public static final ItemEntry EMPTY_FUEL_ROD = REGISTRATE + .item("empty_fuel_rod", ComponentItem::new) + .lang("Empty Fuel Rod") + .properties(p -> p.stacksTo(16)) + .defaultModel() + .register(); + + public static final ItemEntry FLESH_WASTE_URANIUM = REGISTRATE + .item("fleshy_uranium_waste", ComponentItem::new) + .lang("Bio-Metallic Fleshy Uranium Waste") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + public static final ItemEntry FLESH_WASTE_PLUTONIUM = REGISTRATE + .item("fleshy_plutonium_waste", ComponentItem::new) + .lang("Bio-Metallic Fleshy Plutonium Waste") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + public static final ItemEntry FLESH_WASTE_NEPTUNIUM = REGISTRATE + .item("fleshy_neptunium_waste", ComponentItem::new) + .lang("Bio-Metallic Fleshy Neptunium Waste") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + // ------------------------------------------------------------------------- + // Air Bladder - pre-LV portable air + // ------------------------------------------------------------------------- + + public static final ItemEntry AIR_BLADDER = REGISTRATE + .item("air_bladder", AirBladderItem::new) + .lang("Air Bladder") + .properties(p -> p.stacksTo(1)) + .model((ctx, prov) -> {}) + .onRegister(modelPredicate( + ResourceLocation.fromNamespaceAndPath(CosmicCore.MOD_ID, "charges"), + stack -> (float) AirBladderItem.getCharges(stack) / OxygenConfig.AIR_BLADDER_MAX_CHARGES)) + .register(); + + // ------------------------------------------------------------------------- + // Oxygen Supply Tanks + // ------------------------------------------------------------------------- + + public static final ItemEntry OXYGEN_SUPPLY_TANK_BRONZE = REGISTRATE + .item("bronze_supply_tank", OxygenTankItem::new) + .lang("Bronze Supply Tank") + .properties(p -> p.stacksTo(1)) + .onRegister(attach(new OxygenSupplyTankBehavior(1000, 5, 10))) + .defaultModel() + .register(); + + public static final ItemEntry OXYGEN_SUPPLY_TANK_STEEL = REGISTRATE + .item("steel_supply_tank", OxygenTankItem::new) + .lang("Steel Supply Tank") + .properties(p -> p.stacksTo(1)) + .onRegister(attach(new OxygenSupplyTankBehavior(2500, 5, 15))) + .defaultModel() + .register(); + + public static ICustomDescriptionId cellName() { + return new ICustomDescriptionId() { + + @Override + public Component getItemName(ItemStack stack) { + Component prefix = FluidUtil.getFluidContained(stack).map(FluidStack::getDisplayName) + .orElse(Component.translatable("gtceu.fluid.empty")); + return Component.translatable(stack.getDescriptionId(), prefix); + } + }; + } + + public static NonNullConsumer attach(IItemComponent... components) { + return item -> item.attachComponents(components); + } + + // ------------------------------------------------------------------------- + // Cosmic Boots - Additive movement bonuses that stack with Quake movement + // Tiers: Hydraulic (LV), Nano (HV), Quark (IV), Sanguine (ZPM) + // All boots have +1 step height via attribute modifier + // ------------------------------------------------------------------------- + + // Hydraulic Boots (LV) - Entry level mobility boots + // Feels like a nice upgrade from vanilla - snappy and responsive + public static ItemEntry HYDRAULIC_BOOTS = REGISTRATE + .item("hydraulic_boots", + (p) -> new ArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.BOOTS, p) + .setArmorLogic(new CosmicBootsArmorLogic( + 128, // energyPerUse + 400_000L, // capacity (LV tier) + 1, // tier (LV) + 0.8, // maxSpeed cap (b/t) + 2.0, // groundAcceleration bonus + 0.5, // groundDeceleration + 0.8, // airControl bonus + 3.0, // jumpPower - ~4 blocks high + true, // fallNegation + "textures/armor/hydraulic_boots.png"))) + .lang("Hydraulic Globetrotters Boots") + .properties(p -> p.rarity(Rarity.UNCOMMON)) + .tag(CustomTags.PPE_ARMOR) + .register(); + + // Nano Boots (HV) - Mid-tier, noticeably quick + // Clear upgrade from Hydraulic - you feel the difference immediately + public static ItemEntry NANO_BOOTS = REGISTRATE + .item("nano_boots", + (p) -> new ArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.BOOTS, p) + .setArmorLogic(new CosmicBootsArmorLogic( + 512, // energyPerUse + 6_400_000L, // capacity (HV tier) + 3, // tier (HV) + 1.5, // maxSpeed cap (b/t) + 4.0, // groundAcceleration bonus + 0.6, // groundDeceleration + 1.0, // airControl bonus + 4.0, // jumpPower - ~5 blocks high + true, // fallNegation + "textures/armor/nano_boots.png"))) + .lang("NanoMuscle\u2122 Globetrotters Boots") + .properties(p -> p.rarity(Rarity.RARE)) + .tag(CustomTags.PPE_ARMOR) + .register(); + + // Quark Boots (IV) - High-tier, fast as hell + // Like riding a motorcycle - exhilarating speed with control + public static ItemEntry QUARK_BOOTS = REGISTRATE + .item("quark_boots", + (p) -> new ArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.BOOTS, p) + .setArmorLogic(new CosmicBootsArmorLogic( + 2048, // energyPerUse + 25_600_000L, // capacity (IV tier) + 5, // tier (IV) + 1.25, // maxSpeed cap (b/t) + 3.5, // groundAcceleration bonus + 0.75, // groundDeceleration + 1.2, // airControl bonus + 3.5, // jumpPower - ~4.5 blocks high + true, // fallNegation + "textures/armor/quark_boots.png"))) + .lang("QuarkTech\u2122 Globetrotters Boots") + .properties(p -> p.rarity(Rarity.EPIC)) + .tag(CustomTags.PPE_ARMOR) + .register(); + + // Sanguine Boots (ZPM) - Ultimate tier, very fast + // Shot out of a cannon - high speed with great control + public static ItemEntry SANGUINE_BOOTS = REGISTRATE + .item("sanguine_boots", + (p) -> new ArmorComponentItem(GTArmorMaterials.ARMOR, ArmorItem.Type.BOOTS, p) + .setArmorLogic(new CosmicBootsArmorLogic( + 8192, // energyPerUse + 409_600_000L, // capacity (ZPM tier) + 7, // tier (ZPM) + 2.25, // maxSpeed cap (b/t) + 6.0, // groundAcceleration bonus + 0.9, // groundDeceleration - can stop on a dime + 1.5, // airControl bonus - full air control + 6.5, // jumpPower - ~8 blocks high + true, // fallNegation + "textures/armor/sanguine_boots.png"))) + .lang("Sanguine Globetrotters Boots") + .properties(p -> p.rarity(Rarity.EPIC)) + .tag(CustomTags.PPE_ARMOR) + .register(); + + // ------------------------------------------------------------------------- + // Reflection System + // ------------------------------------------------------------------------- + + public static final ItemEntry REFLECTION_MIRROR = REGISTRATE + .item("reflection_mirror", MirrorItem::new) + .lang("Mirror of Erosion") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + + public static final ItemEntry SOUL_MUTILATOR = REGISTRATE + .item("soul_mutilator", SoulMutilatorItem::new) + .lang("Soul Mutilator") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + + // ------------------------------------------------------------------------- + // Vein Survey Scanner + // ------------------------------------------------------------------------- + + // LV tier - shows vein type + distance only + public static final ItemEntry VEIN_SURVEY_SCANNER_LV = REGISTRATE + .item("vein_survey_scanner_lv", ComponentItem::new) + .lang("Vein Survey Scanner (LV)") + .properties(p -> p.stacksTo(1)) + .onRegister(attach( + ElectricStats.createElectricItem(100_000L, GTValues.LV), + new VeinSurveyBehavior(2000, GTValues.V[GTValues.LV] * 4, VeinSurveyBehavior.DetailLevel.BASIC))) + .defaultModel() + .register(); + + // MV tier - also shows compass direction + public static final ItemEntry VEIN_SURVEY_SCANNER_MV = REGISTRATE + .item("vein_survey_scanner_mv", ComponentItem::new) + .lang("Advanced Vein Survey Scanner (MV)") + .properties(p -> p.stacksTo(1)) + .onRegister(attach( + ElectricStats.createElectricItem(400_000L, GTValues.MV), + new VeinSurveyBehavior(2000, GTValues.V[GTValues.MV] * 4, VeinSurveyBehavior.DetailLevel.COMPASS))) + .defaultModel() + .register(); + + // HV tier - shows exact coordinates + public static final ItemEntry VEIN_SURVEY_SCANNER_HV = REGISTRATE + .item("vein_survey_scanner_hv", ComponentItem::new) + .lang("Precision Vein Survey Scanner (HV)") + .properties(p -> p.stacksTo(1)) + .onRegister(attach( + ElectricStats.createElectricItem(1_600_000L, GTValues.HV), + new VeinSurveyBehavior(2000, GTValues.V[GTValues.HV] * 4, VeinSurveyBehavior.DetailLevel.PRECISE))) + .defaultModel() + .register(); + + // Oneiric Signets — non-consumed gate items (Blood Orb replacement) + public static final ItemEntry ONEIRIC_SIGNET_T1 = REGISTRATE + .item("oneiric_signet_t1", ComponentItem::new) + .lang("Oneiric Signet Mk.I") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + public static final ItemEntry ONEIRIC_SIGNET_T2 = REGISTRATE + .item("oneiric_signet_t2", ComponentItem::new) + .lang("Oneiric Signet Mk.II") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + public static final ItemEntry ONEIRIC_SIGNET_T3 = REGISTRATE + .item("oneiric_signet_t3", ComponentItem::new) + .lang("Oneiric Signet Mk.III") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + public static final ItemEntry ONEIRIC_SIGNET_T4 = REGISTRATE + .item("oneiric_signet_t4", ComponentItem::new) + .lang("Oneiric Signet Mk.IV") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + public static final ItemEntry ONEIRIC_SIGNET_T5 = REGISTRATE + .item("oneiric_signet_t5", ComponentItem::new) + .lang("Oneiric Signet Mk.V") + .properties(p -> p.stacksTo(1)) + .defaultModel() + .register(); + + // Soul Motes — tiered crafting ingredients (Slate replacement) + public static final ItemEntry FAINT_MOTE = REGISTRATE + .item("faint_mote", ComponentItem::new) + .lang("Faint Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry DIM_MOTE = REGISTRATE + .item("dim_mote", ComponentItem::new) + .lang("Dim Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry PALE_MOTE = REGISTRATE + .item("pale_mote", ComponentItem::new) + .lang("Pale Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry CLEAR_MOTE = REGISTRATE + .item("clear_mote", ComponentItem::new) + .lang("Clear Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry BRIGHT_MOTE = REGISTRATE + .item("bright_mote", ComponentItem::new) + .lang("Bright Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry RADIANT_MOTE = REGISTRATE + .item("radiant_mote", ComponentItem::new) + .lang("Radiant Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry VIVID_MOTE = REGISTRATE + .item("vivid_mote", ComponentItem::new) + .lang("Vivid Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry BLAZING_MOTE = REGISTRATE + .item("blazing_mote", ComponentItem::new) + .lang("Blazing Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry INCANDESCENT_MOTE = REGISTRATE + .item("incandescent_mote", ComponentItem::new) + .lang("Incandescent Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry TRANSCENDENT_MOTE = REGISTRATE + .item("transcendent_mote", ComponentItem::new) + .lang("Transcendent Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + // Wrapped Soul Motes — intermediate crafting step between mote tiers + public static final ItemEntry WRAPPED_FAINT_MOTE = REGISTRATE + .item("wrapped_faint_mote", ComponentItem::new) + .lang("Wrapped Faint Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry WRAPPED_DIM_MOTE = REGISTRATE + .item("wrapped_dim_mote", ComponentItem::new) + .lang("Wrapped Dim Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry WRAPPED_PALE_MOTE = REGISTRATE + .item("wrapped_pale_mote", ComponentItem::new) + .lang("Wrapped Pale Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry WRAPPED_CLEAR_MOTE = REGISTRATE + .item("wrapped_clear_mote", ComponentItem::new) + .lang("Wrapped Clear Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry WRAPPED_BRIGHT_MOTE = REGISTRATE + .item("wrapped_bright_mote", ComponentItem::new) + .lang("Wrapped Bright Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry WRAPPED_RADIANT_MOTE = REGISTRATE + .item("wrapped_radiant_mote", ComponentItem::new) + .lang("Wrapped Radiant Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry WRAPPED_VIVID_MOTE = REGISTRATE + .item("wrapped_vivid_mote", ComponentItem::new) + .lang("Wrapped Vivid Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry WRAPPED_BLAZING_MOTE = REGISTRATE + .item("wrapped_blazing_mote", ComponentItem::new) + .lang("Wrapped Blazing Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry WRAPPED_INCANDESCENT_MOTE = REGISTRATE + .item("wrapped_incandescent_mote", ComponentItem::new) + .lang("Wrapped Incandescent Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry WRAPPED_TRANSCENDENT_MOTE = REGISTRATE + .item("wrapped_transcendent_mote", ComponentItem::new) + .lang("Wrapped Transcendent Mote") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + // Soul Reagents — BM reagent replacements + public static final ItemEntry SOMNOLENT_DEW = REGISTRATE + .item("somnolent_dew", ComponentItem::new) + .lang("Somnolent Dew") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry PYRETIC_ICHOR = REGISTRATE + .item("pyretic_ichor", ComponentItem::new) + .lang("Pyretic Ichor") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ETHER_WISP = REGISTRATE + .item("ether_wisp", ComponentItem::new) + .lang("Ether Wisp") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry VERDANT_ANIMA = REGISTRATE + .item("verdant_anima", ComponentItem::new) + .lang("Verdant Anima") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry TETHERING_RESIN = REGISTRATE + .item("tethering_resin", ComponentItem::new) + .lang("Tethering Resin") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry STASIS_BRINE = REGISTRATE + .item("stasis_brine", ComponentItem::new) + .lang("Stasis Brine") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + // Tau items — BM tau replacements + public static final ItemEntry TAU_OIL = REGISTRATE + .item("tau_oil", ComponentItem::new) + .lang("Tau Oil") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry TAU_FRUIT = REGISTRATE + .item("tau_fruit", ComponentItem::new) + .lang("Tau Fruit") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + public static final ItemEntry WEAK_BINDING_PUTTY = REGISTRATE + .item("weak_binding_putty", ComponentItem::new) + .lang("Weak Binding Putty") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry COMPACTIFIED_ROD = REGISTRATE + .item("compactified_rod", ComponentItem::new) + .lang("Compactified Rod") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry ODDLY_DENSE_MALLET_FACE = REGISTRATE + .item("oddly_dense_mallet_face", ComponentItem::new) + .lang("Oddly Dense Mallet Face") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry SOLID_CORE = REGISTRATE + .item("solid_core", ComponentItem::new) + .lang("Solid Core") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry HEAVY_BINDINGS = REGISTRATE + .item("heavy_bindings", ComponentItem::new) + .lang("Heavy Bindings") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry STURDY_PLATES = REGISTRATE + .item("sturdy_plates", ComponentItem::new) + .lang("Sturdy Plates") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + public static final ItemEntry BRONZE_ASH_DUST = REGISTRATE + .item("bronze_ash_dust", ComponentItem::new) + .lang("Bronze Ash Dust") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + public static final ItemEntry COGWORK_UNITS = REGISTRATE + .item("cogwork_units", ComponentItem::new) + .lang("Cogwork Units") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + public static final ItemEntry STEAM_PISTON = REGISTRATE + .item("steam_piston", ComponentItem::new) + .lang("Steam Piston") + .properties(p -> p.stacksTo(64)) + .defaultModel() + .register(); + + public static NonNullConsumer modelPredicate(ResourceLocation predicate, + Function property) { + return item -> { + if (GTCEu.isClientSide()) { + ItemProperties.register(item, predicate, (itemStack, c, l, i) -> property.apply(itemStack)); + } + }; + } + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicLootModifiers.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicLootModifiers.java new file mode 100644 index 000000000..712afdd74 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicLootModifiers.java @@ -0,0 +1,29 @@ +package com.ghostipedia.cosmiccore.common.data; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.glm.GenericLootModifier; +import com.ghostipedia.cosmiccore.common.glm.NoSilkTouchOreLootModifier; + +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.common.loot.IGlobalLootModifier; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredRegister; +import net.neoforged.neoforge.registries.NeoForgeRegistries; + +import com.mojang.serialization.MapCodec; + +public class CosmicLootModifiers { + + public static final DeferredRegister> GLOBAL_LOOT_MODIFIERS = DeferredRegister + .create(NeoForgeRegistries.Keys.GLOBAL_LOOT_MODIFIER_SERIALIZERS, CosmicCore.MOD_ID); + + public static final DeferredHolder, MapCodec> GENERIC_LOOT_MODIFIER = GLOBAL_LOOT_MODIFIERS + .register("generic", () -> GenericLootModifier.CODEC); + + public static final DeferredHolder, MapCodec> NO_SILK_TOUCH_ORE = GLOBAL_LOOT_MODIFIERS + .register("no_silk_touch_ore", () -> NoSilkTouchOreLootModifier.CODEC); + + public static void register(IEventBus bus) { + GLOBAL_LOOT_MODIFIERS.register(bus); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicMachines.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicMachines.java index 525515865..07fef91ec 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicMachines.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicMachines.java @@ -1,202 +1,978 @@ package com.ghostipedia.cosmiccore.common.data; import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.multiblock.DimensionalEnergyCapacitor; +import com.ghostipedia.cosmiccore.api.machine.multiblock.DimensionalEnergyInterface; import com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility; +import com.ghostipedia.cosmiccore.api.machine.part.DroneMaintenanceInterfacePartMachine; +import com.ghostipedia.cosmiccore.api.machine.part.SteamFluidHatchPartMachine; +import com.ghostipedia.cosmiccore.api.machine.part.WirelessEnergyHatchPartMachine; import com.ghostipedia.cosmiccore.api.registries.CosmicRegistration; -import com.ghostipedia.cosmiccore.common.data.recipe.CosmicRecipeModifiers; -import com.ghostipedia.cosmiccore.common.machine.multiblock.electric.MagneticFieldMachine; -import com.ghostipedia.cosmiccore.common.machine.multiblock.part.SoulHatchPartMachine; +import com.ghostipedia.cosmiccore.client.renderer.machine.CosmicDynamicRenderHelpers; +import com.ghostipedia.cosmiccore.common.ae2gt.CosmicStockingBusPartMachine; +import com.ghostipedia.cosmiccore.common.ae2gt.CosmicStockingHatchPartMachine; +import com.ghostipedia.cosmiccore.common.block.debug.CreativeThermiaContainerMachine; +import com.ghostipedia.cosmiccore.common.machine.WirelessChargerMachine; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.WirelessDataBankMachine; +import com.ghostipedia.cosmiccore.common.machine.multiblock.part.*; +import com.ghostipedia.cosmiccore.common.machine.part.WirelessDataSensor; import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.capability.recipe.IRecipeCapabilityHolder; -import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.data.RotationState; -import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; -import com.gregtechceu.gtceu.api.data.tag.TagPrefix; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; -import com.gregtechceu.gtceu.api.machine.MachineDefinition; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.*; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; -import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; +import com.gregtechceu.gtceu.api.machine.steam.SimpleSteamMachine; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; -import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; -import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; +import com.gregtechceu.gtceu.api.pattern.MultiblockShapeInfo; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.recipe.GTRecipeType; +import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifierList; import com.gregtechceu.gtceu.api.registry.registrate.MachineBuilder; -import com.gregtechceu.gtceu.common.data.GTBlocks; -import com.gregtechceu.gtceu.common.data.GTMaterials; -import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; +import com.gregtechceu.gtceu.client.util.TooltipHelper; +import com.gregtechceu.gtceu.common.data.*; +import com.gregtechceu.gtceu.common.data.GTMachines; +import com.gregtechceu.gtceu.common.data.machines.GCYMMachines; +import com.gregtechceu.gtceu.common.data.machines.GTMultiMachines; +import com.gregtechceu.gtceu.common.data.models.GTModels; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.ActiveTransformerMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.FusionReactorMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.PowerSubstationMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.part.EnergyHatchPartMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.part.FluidHatchPartMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.primitive.PrimitiveWorkableMachine; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; -import com.gregtechceu.gtceu.utils.GTHashMaps; -import com.gregtechceu.gtceu.utils.ItemStackHashStrategy; -import it.unimi.dsi.fastutil.objects.Object2IntMap; -import it.unimi.dsi.fastutil.objects.Object2IntOpenCustomHashMap; -import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; +import it.unimi.dsi.fastutil.Pair; + import java.util.*; import java.util.function.BiFunction; -import java.util.stream.Collectors; -import static com.ghostipedia.cosmiccore.api.pattern.CosmicPredicates.magnetCoils; +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.*; import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.ghostipedia.cosmiccore.common.data.CosmicMachinesUtils.*; +import static com.ghostipedia.cosmiccore.common.data.recipe.CosmicRecipeModifiers.COSMIC_MODULES; +import static com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes.BIO_LAB; +import static com.gregtechceu.gtceu.api.GTValues.*; +import static com.gregtechceu.gtceu.api.capability.recipe.IO.OUT; +import static com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties.*; import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.util.RelativeDirection.*; +import static com.gregtechceu.gtceu.common.data.GCYMBlocks.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; +import static com.gregtechceu.gtceu.common.data.GTMachines.CREATIVE_TOOLTIPS; +import static com.gregtechceu.gtceu.common.data.GTMachines.ITEM_IMPORT_BUS; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.CENTRIFUGE_RECIPES; +import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.DUMMY_RECIPES; +import static com.gregtechceu.gtceu.common.data.machines.GTMachineUtils.*; +import static com.gregtechceu.gtceu.common.data.machines.GTMultiMachines.FUSION_REACTOR; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.*; public class CosmicMachines { + static { CosmicRegistration.REGISTRATE.creativeModeTab(() -> CosmicCreativeModeTabs.COSMIC_CORE); } - public static final int[] HIGH_TIERS = GTValues.tiersBetween(GTValues.IV, GTCEuAPI.isHighTier() ? GTValues.OpV : GTValues.UHV); + public final static MachineDefinition[] SOUL_IMPORT_HATCH = registerSoulHatch( + "soul_input_hatch", "Soul Input Hatch", + IO.IN, HIGH_TIERS, IMPORT_SOUL); + public static final MachineDefinition[] SOUL_EXPORT_HATCH = registerSoulHatch( + "soul_output_hatch", "Soul Output Hatch", + IO.OUT, HIGH_TIERS, EXPORT_SOUL); - public static GTRecipe copyOutputs(GTRecipe recipe, ContentModifier modifier) { - return new GTRecipe(recipe.recipeType, recipe.getId(), recipe.inputs, recipe.copyContents(recipe.outputs, modifier), recipe.tickInputs, recipe.copyContents(recipe.tickOutputs, modifier), new ArrayList<>(recipe.conditions), new ArrayList<>(recipe.ingredientActions), recipe.data, recipe.duration, recipe.isFuel); - } + // TODO(embers): EMBER_IMPORT_HATCH / EMBER_EXPORT_HATCH shelved with Embers (bead cosmiccore-42.14) - public final static MachineDefinition[] SOUL_IMPORT_HATCH = registerSoulTieredHatch( - "soul_input_hatch", "Soul Input Hatch", "soul_hatch.import", - IO.IN, HIGH_TIERS, CosmicPartAbility.IMPORT_SOUL); - - public static final MachineDefinition[] SOUL_EXPORT_HATCH = registerSoulTieredHatch( - "soul_output_hatch", "Soul Output Hatch", "soul_hatch.export", - IO.OUT, HIGH_TIERS, CosmicPartAbility.EXPORT_SOUL); - -//Enable If needed Inside of Dev -// public static final MultiblockMachineDefinition SOUL_TESTER = REGISTRATE.multiblock("soul_tester", PrimitiveWorkableMachine::new) -// .rotationState(RotationState.NON_Y_AXIS) -// .recipeType(CosmicCoreRecipeTypes.SOUL_TESTER_RECIPES) -// .appearanceBlock(GTBlocks.CASING_PRIMITIVE_BRICKS) -// .pattern(definition -> FactoryBlockPattern.start() -// .aisle("S", "C", "I") -// .where("C", controller(blocks(definition.getBlock()))) -// .where("S", abilities(CosmicPartAbility.IMPORT_SOUL).or(abilities(CosmicPartAbility.EXPORT_SOUL))) -// .where("I", abilities(PartAbility.EXPORT_ITEMS).or(abilities(PartAbility.IMPORT_ITEMS))) -// .build()) -// .workableCasingRenderer(GTCEu.id("block/casings/solid/machine_casing_inert_ptfe"), GTCEu.id("block/multiblock/coke_oven")) -// .register(); - - //Terrifying Recipe Modifiers half of this is moonruns to me :lets: - public final static MultiblockMachineDefinition DRYGMY_GROVE = REGISTRATE.multiblock("drygmy_grove", WorkableElectricMultiblockMachine::new) - .rotationState(RotationState.NON_Y_AXIS) - .recipeType(CosmicRecipeTypes.GROVE_RECIPES) - .recipeModifiers(true, - (machine, recipe) -> { - if (machine instanceof IRecipeCapabilityHolder holder) { - // Find all the items in the combined Item Input inventories and create oversized ItemStacks - Object2IntMap ingredientStacks = Objects.requireNonNullElseGet(holder.getCapabilitiesProxy().get(IO.IN, ItemRecipeCapability.CAP), Collections::>emptyList) - .stream() - .map(container -> container.getContents().stream().filter(ItemStack.class::isInstance).map(ItemStack.class::cast).toList()) - .flatMap(container -> GTHashMaps.fromItemStackCollection(container).object2IntEntrySet().stream()) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, Integer::sum, () -> new Object2IntOpenCustomHashMap<>(ItemStackHashStrategy.comparingAllButCount()))); - ItemStack stack = new ItemStack(BuiltInRegistries.ITEM.get(new ResourceLocation("ars_nouveau:drygmy_charm"))); - //Never let the multiplier be 0 (THIS IS NOT ACTUALLY PARALLEL, It's just being used to to some goober grade math) - if (ingredientStacks.getInt(stack) >= 1) { - var maxParallel = ingredientStacks.getInt(stack) / 2; - recipe = copyOutputs(recipe, ContentModifier.multiplier(maxParallel)); - } - } - return recipe; - }, - GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK)) - .appearanceBlock(GTBlocks.CASING_STAINLESS_CLEAN) - .pattern(definition -> FactoryBlockPattern.start() - .aisle("##QQQ##", "##QQQ##", "#######", "#######", "#######", "##QQQ##", "##QQQ##") - .aisle("#QQQQQ#", "#QMMMQ#", "#FLBBF#", "#F#B#F#", "#F###F#", "#QGGGQ#", "#QQQQQ#") - .aisle("QQQQQQQ", "QMMMMMQ", "#B#####", "#B#####", "#######", "QGP#PGQ", "QQQQQQQ") - .aisle("QQQQQQQ", "QMMMMMQ", "#B###B#", "#######", "#######", "QG###GQ", "QQQQQQQ") - .aisle("QQQQQQQ", "QMMMMMQ", "####LB#", "#####B#", "#######", "QGP#PGQ", "QQQQQQQ") - .aisle("#QQQQQ#", "#QMMMQ#", "#F#BBF#", "#F##BF#", "#F###F#", "#QGGGQ#", "#QQQQQ#") - .aisle("##QQQ##", "##QCQ##", "#######", "#######", "#######", "##QQQ##", "##QQQ##") - .where('#', any()) - .where("C", controller(blocks(definition.getBlock()))) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) - .where('M', blocks(Blocks.MOSS_BLOCK)) - .where('B', blocks(Blocks.AZALEA_LEAVES) - .or(blocks(Blocks.FLOWERING_AZALEA_LEAVES))) - .where('L', blocks(Blocks.FLOWERING_AZALEA) - .or(blocks(Blocks.AZALEA))) - .where('P', blocks(GTBlocks.CASING_STEEL_PIPE.get())) - .where('G', blocks(Blocks.SEA_LANTERN)) //WHAT THE HELL IS A LAMP BRO - HALP - .where('Q', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get()) - .or(abilities(PartAbility.IMPORT_FLUIDS)) - .or(abilities(PartAbility.EXPORT_FLUIDS)) - .or(abilities(PartAbility.IMPORT_ITEMS)) - .or(abilities(PartAbility.EXPORT_ITEMS)) - .or(abilities(PartAbility.INPUT_ENERGY)) - .or(abilities(PartAbility.MAINTENANCE)) - .or(abilities(CosmicPartAbility.IMPORT_SOUL)) - ).build()) - .workableCasingRenderer(GTCEu.id("block/casings/solid/machine_casing_clean_stainless_steel"), GTCEu.id("block/multiblock/data_bank")) + public static final MachineDefinition[] THERMIA_VENT = registerThermiaTieredHatch( + "thermia_export_hatch", "Thermia Vent", "thermia_output_hatch", + IO.OUT, HIGH_TIERS, EXPORT_THERMIA); + public static final MachineDefinition[] THERMIA_SOCKET = registerThermiaTieredHatch( + "thermia_import_hatch", "Thermia Socket", "thermia_input_hatch", + IO.IN, HIGH_TIERS, IMPORT_THERMIA); + + public static final MachineDefinition[] WIRELESS_ENERGY_INPUT_HATCH = registerWirelessEnergyTieredHatch( + "wireless_energy_hatch", "Wireless Energy Hatch", "wireless_energy_1a", + IO.IN, HIGH_TIERS, 1, PartAbility.INPUT_ENERGY); + public static final MachineDefinition[] WIRELESS_ENERGY_OUTPUT_DYNAMO = registerWirelessEnergyTieredHatch( + "wireless_energy_dynamo", "Wireless Energy Dynamo", "wireless_energy_1a", + IO.OUT, HIGH_TIERS, 1, PartAbility.OUTPUT_ENERGY); + public static final MachineDefinition[] WIRELESS_ENERGY_INPUT_HATCH_4A = registerWirelessEnergyTieredHatch( + "4a_wireless_energy_hatch", "4A Wireless Energy Hatch", "wireless_energy_4a", + IO.IN, HIGH_TIERS, 4, PartAbility.INPUT_ENERGY); + public static final MachineDefinition[] WIRELESS_ENERGY_OUTPUT_DYNAMO_4A = registerWirelessEnergyTieredHatch( + "4a_wireless_energy_dynamo", "4A Wireless Energy Dynamo", "wireless_energy_4a", + IO.OUT, HIGH_TIERS, 4, PartAbility.OUTPUT_ENERGY); + public static final MachineDefinition[] WIRELESS_ENERGY_INPUT_HATCH_16A = registerWirelessEnergyTieredHatch( + "16a_wireless_energy_hatch", "16A Wireless Energy Hatch", "wireless_energy_16a", + IO.IN, HIGH_TIERS, 16, PartAbility.INPUT_ENERGY); + public static final MachineDefinition[] WIRELESS_ENERGY_OUTPUT_DYNAMO_16A = registerWirelessEnergyTieredHatch( + "16a_wireless_energy_dynamo", "16A Wireless Energy Dynamo", "wireless_energy_16a", + IO.OUT, HIGH_TIERS, 16, PartAbility.OUTPUT_ENERGY); + + public static final MachineDefinition[] NAQUAHINE_MINI_REACTOR = CosmicMachinesUtils.registerSimpleGenerator( + "naquahine_mini_reactor", + CosmicRecipeTypes.MINI_NAQUAHINE_REACTOR, genericGeneratorTankSizeFunction, 0.0f, GTValues.IV, GTValues.LuV, + GTValues.ZPM, GTValues.UV, GTValues.UHV); + public static final Pair STEAM_BENDER = CosmicMachinesUtils + .registerSteamMachines( + "steam_bender", SimpleSteamMachine::new, (pressure, builder) -> builder + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(GTRecipeTypes.BENDER_RECIPES) + .recipeModifier(SimpleSteamMachine::recipeModifier) + .addOutputLimit(ItemRecipeCapability.CAP, 1) + .workableSteamHullModel(pressure, GTCEu.id("block/machines/bender")) + .register()); + public static final Pair STEAM_WIREMILL = CosmicMachinesUtils + .registerSteamMachines( + "steam_wiremill", SimpleSteamMachine::new, (pressure, builder) -> builder + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(GTRecipeTypes.WIREMILL_RECIPES) + .recipeModifier(SimpleSteamMachine::recipeModifier) + .addOutputLimit(ItemRecipeCapability.CAP, 1) + .modelProperty(GTMachineModelProperties.VENT_DIRECTION, RelativeDirection.BACK) + .workableSteamHullModel(pressure, GTCEu.id("block/machines/wiremill")) + .register()); + + public static final MachineDefinition[] COSMIC_PARALLEL_HATCH = registerTieredMachines("cosmic_parallel_hatch", + CosmicParallelHatchPartMachine::new, + (tier, builder) -> builder + .langValue(switch (tier) { + case 9 -> "Extreme"; + case 10 -> "WarpTech"; + case 15 -> "Paradox"; + default -> "Simple"; // Should never be hit. + } + " Parallel Control Hatch") + .rotationState(RotationState.ALL) + .abilities(CosmicPartAbility.COSMIC_PARALLEL_HATCH) + .workableTieredHullModel(GTCEu.id("block/machines/parallel_hatch_mk" + (tier - 4))) + .tooltips(Component.translatable("gtceu.machine.parallel_hatch_mk" + tier + ".tooltip")) + .register(), + ZPM, UV, UHV, UEV, UIV); + + public static final MachineDefinition[] COSMIC_MODULE_HATCH = registerTieredMachines("module_hatch", + ModuleHatchPartMachine::new, + (tier, builder) -> builder + .langValue(switch (tier) { + case 8 -> "Basic"; + case 9 -> "Advanced"; + case 10 -> "Elite"; + default -> "Simple"; + } + " Module Hatch") + .rotationState(RotationState.ALL) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) + .abilities(CosmicPartAbility.MODULE_HATCH) + // TODO for ghosti: give tooltip and model + .overlayTieredHullModel("module_hatch") + .tooltips(Component.translatable("gtceu.machine.parallel_hatch_mk_1.tooltip")) + .register(), + UV, UHV, UEV); + public static final MachineDefinition[] CALX_REACTOR = registerTieredMachines("calx_reactor", + (holder, tier) -> new SimpleTieredMachine(holder, tier, defaultTankSizeFunction), + (tier, builder) -> builder + .recipeType(CosmicRecipeTypes.CALX_REACTOR) + .editableUI(SimpleTieredMachine.EDITABLE_UI_CREATOR.apply(CosmicCore.id("calx_reactor"), + CosmicRecipeTypes.CALX_REACTOR)) + .tooltipBuilder((stack, list) -> { + list.add(Component.translatable("cosmiccore.calx_reactor.desc")); + }) + .tooltips(workableTiered(tier, GTValues.V[tier], GTValues.V[tier] * 64, + CosmicRecipeTypes.CALX_REACTOR, + defaultTankSizeFunction.applyAsInt(tier), true)) + .workableTieredHullModel(CosmicCore.id("block/overlay/machine/calx_reactor")) + .register(), + ELECTRIC_TIERS); + + public static final MachineDefinition[] MANA_LEACHING_TUB = registerTieredMachines("mana_leaching_tub", + (holder, tier) -> new SimpleTieredMachine(holder, tier, defaultTankSizeFunction), + (tier, builder) -> builder.recipeType(CosmicRecipeTypes.MANA_LEACHING_TUB) + .editableUI(SimpleTieredMachine.EDITABLE_UI_CREATOR.apply(CosmicCore.id("mana_leaching_tub"), + CosmicRecipeTypes.MANA_LEACHING_TUB)) + .tooltipBuilder((stack, list) -> { + list.add(Component.translatable("cosmiccore.mana_leaching_tub.desc")); + }) + .tooltips(workableTiered(tier, GTValues.V[tier], GTValues.V[tier] * 64, + CosmicRecipeTypes.MANA_LEACHING_TUB, + defaultTankSizeFunction.applyAsInt(tier), true)) + .workableTieredHullModel(CosmicCore.id("block/overlay/machine/mana_leaching_tub")) + .register(), + ELECTRIC_TIERS); + + public static final MachineDefinition[] ROASTER = registerTieredMachines("roaster", + (holder, tier) -> new SimpleTieredMachine(holder, tier, defaultTankSizeFunction), + (tier, builder) -> builder.recipeType(CosmicRecipeTypes.ROASTER) + .editableUI(SimpleTieredMachine.EDITABLE_UI_CREATOR.apply(CosmicCore.id("roaster"), + CosmicRecipeTypes.ROASTER)) + .tooltipBuilder((stack, list) -> { + list.add(Component.translatable("cosmiccore.roaster.desc")); + }) + .tooltips(workableTiered(tier, GTValues.V[tier], GTValues.V[tier] * 64, CosmicRecipeTypes.ROASTER, + defaultTankSizeFunction.applyAsInt(tier), true)) + .workableTieredHullModel(CosmicCore.id("block/overlay/machine/roaster")) + .register(), + ELECTRIC_TIERS); + + public static final MachineDefinition[] THERMOMAG = registerTieredMachines("thermomagnitizer", + (holder, tier) -> new SimpleTieredMachine(holder, tier, defaultTankSizeFunction), + (tier, builder) -> builder.recipeType(CosmicRecipeTypes.THERMOMAG) + .editableUI(SimpleTieredMachine.EDITABLE_UI_CREATOR.apply(CosmicCore.id("thermomagnitizer"), + CosmicRecipeTypes.THERMOMAG)) + .tooltipBuilder((stack, list) -> { + list.add(Component.translatable("cosmiccore.thermomagnitizer.desc")); + }) + .tooltips(workableTiered(tier, GTValues.V[tier], GTValues.V[tier] * 64, CosmicRecipeTypes.THERMOMAG, + defaultTankSizeFunction.applyAsInt(tier), true)) + .workableTieredHullModel(CosmicCore.id("block/overlay/machine/thermomagnitizer")) + .register(), + ELECTRIC_TIERS); + + public static final MachineDefinition[] VAC_BUBBLER = registerTieredMachines("vacuum_bubbler", + (holder, tier) -> new SimpleTieredMachine(holder, tier, defaultTankSizeFunction), + (tier, builder) -> builder + .recipeType(CosmicRecipeTypes.VAC_BUBBLER) + .editableUI(SimpleTieredMachine.EDITABLE_UI_CREATOR.apply(CosmicCore.id("vacuum_bubbler"), + CosmicRecipeTypes.VAC_BUBBLER)) + .tooltipBuilder((stack, list) -> { + list.add(Component.translatable("cosmiccore.vacuum_bubbler.desc")); + }) + .tooltips( + workableTiered(tier, GTValues.V[tier], GTValues.V[tier] * 64, CosmicRecipeTypes.VAC_BUBBLER, + defaultTankSizeFunction.applyAsInt(tier), true)) + .workableTieredHullModel(CosmicCore.id("block/overlay/machine/vacuum_bubbler")) + .register(), + ELECTRIC_TIERS); + + public static final MachineDefinition[] WIRELESS_CHARGER = registerTieredMachines("wireless_charger", + WirelessChargerMachine::new, + (tier, builder) -> builder + .langValue("%s Wireless Charger".formatted(VN[tier])) + .tooltipBuilder((stack, list) -> { + list.add(Component.translatable("cosmiccore.wireless_charger.range.single", + FormattingUtil.formatNumbers(2048L * (tier - GTValues.MV)))); + list.add(Component.translatable("cosmiccore.wireless_charger.range.mixed", + FormattingUtil.formatNumbers(1024L * (tier - GTValues.MV)))); + }) + .workableTieredHullModel(CosmicCore.id("block/overlay/machine/wireless_charger")) + .register(), + GTValues.tiersBetween(HV, UIV)); + + // TODO(forestry): INDUSTRIAL_APIARY (IndustrialApiaryMachine + BEES recipes) shelved with Forestry (bead cosmiccore-42.13) + + public static final MachineDefinition[] BIO_LAB_SINGLE = registerTieredMachines("biolab", + (holder, tier) -> new SimpleTieredMachine(holder, tier, defaultTankSizeFunction), (tier, builder) -> builder + .langValue("%s Bio Lab %s".formatted(VLVH[tier], VLVT[tier])) + .editableUI(SimpleTieredMachine.EDITABLE_UI_CREATOR.apply(GTCEu.id("biolab"), + BIO_LAB)) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(BIO_LAB) + .recipeModifier(OC_NON_PERFECT) + .workableTieredHullModel(GTCEu.id("block/machines/brewery")) + .tooltips(workableTiered(tier, GTValues.V[tier], GTValues.V[tier] * 64, + BIO_LAB, defaultTankSizeFunction.applyAsInt(tier), true)) + .register(), + EV, IV, LuV, ZPM, UV); + + public final static MachineDefinition COSMIC_STOCKING_ME_PART_BUS = REGISTRATE + .machine("cosmic_me_assemblyline_bus", CosmicStockingBusPartMachine::new) + .langValue("ME Assembly Line Bus") + .tier(UV) + .rotationState(RotationState.ALL) + .abilities(ME_ASSEMBLY_PARTS) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) + .overlayTieredHullModel("item_me_assemblyline") + .tooltips( + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.0"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.1"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.2"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.3"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.4"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.5"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.6"), + Component.translatable("gtceu.part_sharing.enabled")) .register(); - public final static MultiblockMachineDefinition NAQUAHINE_PRESSURE_REACTOR = REGISTRATE.multiblock("naquahine_pressure_reactor", MagneticFieldMachine::new) + + public final static MachineDefinition COSMIC_STOCKING_ME_PART_HATCH = REGISTRATE + .machine("cosmic_me_assemblyline_hatch", CosmicStockingHatchPartMachine::new) + .langValue("ME Assembly Line Hatch") + .tier(UV) + .rotationState(RotationState.ALL) + .abilities(ME_ASSEMBLY_PARTS_FLUID) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) + .overlayTieredHullModel("fluid_me_assemblyline") + .tooltips( + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.0"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.1"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.2"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.3"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.4"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.5"), + Component.translatable("cosmiccore.machine.me.stocking_item.tooltip.6"), + Component.translatable("gtceu.part_sharing.enabled")) + .register(); + + public static final MachineDefinition[] ENERGY_OUTPUT_HATCH_4A = registerTieredMachines("energy_output_hatch_4a", + (holder, tier) -> new EnergyHatchPartMachine(holder, tier, OUT, 4), + (tier, builder) -> builder + .langValue(VNF[tier] + " 4A Dynamo Hatch") + .rotationState(RotationState.ALL) + .abilities(PartAbility.OUTPUT_ENERGY) + .modelProperty(IS_FORMED, false) + .tooltips(Component.translatable("gtceu.universal.tooltip.voltage_out", + FormattingUtil.formatNumbers(V[tier]), VNF[tier]), + Component.translatable("gtceu.universal.tooltip.amperage_out", 4), + Component.translatable("gtceu.universal.tooltip.energy_storage_capacity", + FormattingUtil + .formatNumbers(EnergyHatchPartMachine.getHatchEnergyCapacity(tier, 4))), + Component.translatable("gtceu.machine.energy_hatch.output_hi_amp.tooltip")) + .overlayTieredHullModel("energy_output_hatch_4a") + .register(), + GTValues.tiersBetween(ULV, HV)); + + public static final MachineDefinition[] ENERGY_OUTPUT_HATCH_16A = registerTieredMachines("energy_output_hatch_16a", + (holder, tier) -> new EnergyHatchPartMachine(holder, tier, OUT, 16), + (tier, builder) -> builder + .langValue(VNF[tier] + " 16A Dynamo Hatch") + .rotationState(RotationState.ALL) + .abilities(PartAbility.OUTPUT_ENERGY) + .modelProperty(IS_FORMED, false) + .tooltips(Component.translatable("gtceu.universal.tooltip.voltage_out", + FormattingUtil.formatNumbers(V[tier]), VNF[tier]), + Component.translatable("gtceu.universal.tooltip.amperage_out", 16), + Component.translatable("gtceu.universal.tooltip.energy_storage_capacity", + FormattingUtil + .formatNumbers(EnergyHatchPartMachine.getHatchEnergyCapacity(tier, 16))), + Component.translatable("gtceu.machine.energy_hatch.output_hi_amp.tooltip")) + .overlayTieredHullModel("energy_output_hatch_16a") + .register(), + GTValues.tiersBetween(ULV, HV)); + + // Enable If needed Inside of Dev + public static final MultiblockMachineDefinition SOUL_TESTER = REGISTRATE + .multiblock("soul_tester", PrimitiveWorkableMachine::new) .rotationState(RotationState.NON_Y_AXIS) - .recipeType(CosmicRecipeTypes.NAQUAHINE_REACTOR) - .recipeModifier(CosmicRecipeModifiers::magnetRecipe) - .appearanceBlock(CosmicBlocks.NAQUADAH_PRESSURE_RESISTANT_CASING) - .generator(true) + .recipeType(CosmicRecipeTypes.SOUL_TESTER_RECIPES) + .appearanceBlock(GTBlocks.CASING_PRIMITIVE_BRICKS) .pattern(definition -> FactoryBlockPattern.start() - .aisle("##QQQ##", "##QQQ##", "###Q###", "#######", "#######","#######","#######","#######","#######","#######","###Q###","##QQQ##","##QQQ##") - .aisle("#QQQQQ#", "#QQSQQ#", "#FQQQF#", "#FQFQF#", "#F###F#","#F###F#","#F###F#","#F###F#","#F###F#","#FQFQF#","#FQQQF#","#QQSQQ#","#QQQQQ#") - .aisle("QQQQQQQ", "QQSSSQQ", "#QSSSQ#", "#QHGHQ#", "#QHGHQ#","#QHGHQ#","#QHGHQ#","#QHGHQ#","#QHGHQ#","#QHGHQ#","#QSSSQ#","QQSSSQQ","QQQQQQQ") - .aisle("QQQQQQQ", "QSSSSSQ", "QQSSSQQ", "#FGSGF#", "##GSG##","##GSG##","##GSG##","##GSG##","##GSG##","#FGSGF#","QQSSSQQ","QSSSSSQ","QQQQQQQ") - .aisle("QQQQQQQ", "QQSSSQQ", "#QSSSQ#", "#QHGHQ#", "#QHGHQ#","#QHGHQ#","#QHGHQ#","#QHGHQ#","#QHGHQ#","#QHGHQ#","#QSSSQ#","QQSSSQQ","QQQQQQQ") - .aisle("#QQQQQ#", "#QQSQQ#", "#FQQQF#", "#FQFQF#", "#F###F#","#F###F#","#F###F#","#F###F#","#F###F#","#FQFQF#","#FQQQF#","#QQSQQ#","#QQQQQ#") - .aisle("##QQQ##", "##QCQ##", "###Q###", "#######", "#######","#######","#######","#######","#######","#######","###Q###","##QQQ##","##QQQ##") - .where('#', any()) + .aisle("S", "S", "C", "I", "I") .where("C", controller(blocks(definition.getBlock()))) - .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.NaquadahAlloy))) - .where('S', magnetCoils()) - .where('H', blocks(CosmicBlocks.RESONANTLY_TUNED_VIRTUE_MELD_CASING.get())) - .where('G', blocks(GTBlocks.FUSION_GLASS.get())) - .where('Q', blocks(CosmicBlocks.NAQUADAH_PRESSURE_RESISTANT_CASING.get()) - .or(abilities(PartAbility.IMPORT_FLUIDS)) - .or(abilities(PartAbility.EXPORT_FLUIDS)) - .or(abilities(PartAbility.IMPORT_ITEMS)) - .or(abilities(PartAbility.EXPORT_ITEMS)) - .or(abilities(PartAbility.INPUT_ENERGY)) - .or(abilities(PartAbility.MAINTENANCE)) - .or(abilities(PartAbility.OUTPUT_LASER)) - .or(abilities(PartAbility.INPUT_LASER)) - .or(abilities(PartAbility.INPUT_ENERGY)) - .or(abilities(PartAbility.OUTPUT_ENERGY)) - ).build()) - .workableCasingRenderer(CosmicCore.id("block/casings/solid/naquadah_pressure_resistant_casing"), GTCEu.id("block/multiblock/hpca")) - + .where("S", abilities(CosmicPartAbility.IMPORT_SOUL).or(abilities(CosmicPartAbility.EXPORT_SOUL))) + .where("I", abilities(PartAbility.EXPORT_ITEMS).or(abilities(PartAbility.IMPORT_ITEMS))) + .build()) + .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_inert_ptfe"), + GTCEu.id("block/multiblock/coke_oven")) .register(); - private static MachineDefinition[] registerSoulTieredHatch(String name, String displayName, String model, IO io, int[] tiers, PartAbility... abilities) { + /* + * public static final MultiblockMachineDefinition EMBER_TESTER = REGISTRATE.multiblock("ember_tester", + * PrimitiveWorkableMachine::new) + * .rotationState(RotationState.NON_Y_AXIS) + * .recipeType(CosmicRecipeTypes.EMBER_TESTER_RECIPES) + * .appearanceBlock(GTBlocks.CASING_PRIMITIVE_BRICKS) + * .pattern(definition -> FactoryBlockPattern.start() + * .aisle("S", "C", "I") + * .where("C", controller(blocks(definition.getBlock()))) + * .where("S", abilities(IMPORT_EMBER).or(abilities(EXPORT_EMBER))) + * .where("I", abilities(PartAbility.EXPORT_ITEMS).or(abilities(PartAbility.IMPORT_ITEMS))) + * .build()) + * .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_inert_ptfe"), + * GTCEu.id("block/multiblock/coke_oven")) + * .register(); + */ + + public static final MultiblockMachineDefinition LARGE_COMBUSTION_ENGINE = registerCosmicLargeCombustionEngine( + "large_combustion_engine_cc", EV, + CASING_TITANIUM_STABLE, CASING_TITANIUM_GEARBOX, CASING_ENGINE_INTAKE, + GTCEu.id("block/casings/solid/machine_casing_stable_titanium"), + GTCEu.id("block/multiblock/generator/large_combustion_engine")); + public static final MultiblockMachineDefinition EXTREME_COMBUSTION_ENGINE = registerCosmicLargeCombustionEngine( + "extreme_combustion_engine_cc", IV, + CASING_TUNGSTENSTEEL_ROBUST, CASING_TUNGSTENSTEEL_GEARBOX, CASING_EXTREME_ENGINE_INTAKE, + GTCEu.id("block/casings/solid/machine_casing_robust_tungstensteel"), + GTCEu.id("block/multiblock/generator/extreme_combustion_engine")); + public static final MultiblockMachineDefinition LUDICROUS_COMBUSTION_ENGINE = registerCosmicLargeCombustionEngine( + "ludicrous_combustion_engine_cc", LuV, + GILDED_PTHANTERUM_CASING, GEARBOX_PTHANTERUM, CASING_INTAKE_LUDICRIOUS, + CosmicCore.id("block/casings/solid/gilded_pthanterum_casing"), + GTCEu.id("block/multiblock/generator/extreme_combustion_engine")); + public static final MultiblockMachineDefinition ULTIMATE_COMBUSTION_ENGINE = registerCosmicLargeCombustionEngine( + "ultimate_combustion_engine_cc", ZPM, + REINFORCED_NAQUADRIA_CASING, GEARBOX_NAQUADRIA, CASING_INTAKE_ULTIMATE, + CosmicCore.id("block/casings/solid/reinforced_naquadria_casing"), + GTCEu.id("block/multiblock/generator/extreme_combustion_engine")); + + private static MachineDefinition[] registerSoulHatch(String name, String displayName, IO io, + int[] tiers, PartAbility... abilities) { return registerTieredMachines(name, (holder, tier) -> new SoulHatchPartMachine(holder, tier, io), (tier, builder) -> builder .langValue(GTValues.VNF[tier] + ' ' + displayName) .abilities(abilities) .rotationState(RotationState.ALL) - .overlayTieredHullRenderer(model) - .compassNode("soul_hatch") + .modelProperty(GTMachineModelProperties.IS_FORMED, false) + .overlayTieredHullModel("soul_hatch") + .tooltipBuilder((item, tooltip) -> { + if (io == IO.IN) + tooltip.add(Component.translatable("tooltip.cosmiccore.soul_hatch.input", + SoulHatchPartMachine.getMaxConsumption(tier))); + }).register(), + tiers); + } + + // TODO(embers): registerEmberHatch (EmberHatchPartMachine) shelved with Embers (bead cosmiccore-42.14) + + private static MachineDefinition[] registerWirelessEnergyTieredHatch(String name, String displayName, String model, + IO io, int[] tiers, int amperage, + PartAbility... abilities) { + return registerTieredMachines(name, + (holder, tier) -> new WirelessEnergyHatchPartMachine(holder, tier, io, amperage), + (tier, builder) -> builder + .langValue(VNF[tier] + ' ' + displayName) + .abilities(abilities) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) + .rotationState(RotationState.ALL) + .tooltips(WirelessEnergyHatchPartMachine.getTooltipComponents(tier, io, amperage)) + .overlayTieredHullModel(model) + .register(), + tiers); + } + + private static MachineDefinition[] registerThermiaTieredHatch(String name, String displayName, String model, IO io, + int[] tiers, PartAbility... abilities) { + return registerTieredMachines(name, + (holder, tier) -> new ThermiaHatchPartMachine(holder, tier, io), + (tier, builder) -> builder + .abilities(abilities) + .rotationState(RotationState.ALL) + .overlayTieredHullModel(model) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) .tooltipBuilder((item, tooltip) -> { if (io == IO.IN) - tooltip.add(Component.translatable("tooltip.cosmiccore.soul_hatch.input", SoulHatchPartMachine.getMaxConsumption(tier))); + tooltip.add(Component.translatable("tooltip.cosmiccore.thermia_hatch_limit", + ThermiaHatchPartMachine.getThermiaLimits(tier))); else - tooltip.add(Component.translatable("tooltip.cosmiccore.soul_hatch.output", SoulHatchPartMachine.getMaxCapacity(tier))); - }).register(), tiers); + tooltip.add(Component.translatable("tooltip.cosmiccore.thermia_hatch_limit", + ThermiaHatchPartMachine.getThermiaLimits(tier))); + }).register(), + tiers); } - private static MachineDefinition[] registerTieredMachines(String name, BiFunction factory, BiFunction, MachineDefinition> builder, int... tiers) { + public static final MachineDefinition CROP_HOLDER = REGISTRATE.machine("crop_holder", CropHolderPartMachines::new) + .langValue("Crop Holder") + .tier(HV) + .rotationState(RotationState.ALL) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) + .abilities(PartAbility.IMPORT_ITEMS) + .modelProperty(RecipeLogic.STATUS_PROPERTY, RecipeLogic.Status.IDLE) + .model(createWorkableTieredHullMachineModel(GTCEu.id("block/machines/object_holder")) + .andThen((ctx, prov, model) -> { + model.addReplaceableTextures("bottom", "top", "side"); + })) + .register(); + + // TODO(forestry): BEE_HOLDER (BeeHolderPartMachine) shelved with Forestry (bead cosmiccore-42.13) + + public static final MachineDefinition SENSOR_HATCH = REGISTRATE.machine("sensor_hatch", WirelessDataSensor::new) + .langValue("Sensor Hatch") + .rotationState(RotationState.ALL) + .abilities(PSS_SENSORS) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) + .modelProperty(RecipeLogic.STATUS_PROPERTY, RecipeLogic.Status.IDLE) + .model(createWorkableTieredHullMachineModel(GTCEu.id("block/machines/object_holder")) + .andThen((ctx, prov, model) -> { + model.addReplaceableTextures("bottom", "top", "side"); + })) + .register(); + + public static final MachineDefinition CREATIVE_HEAT = REGISTRATE + .machine("creative_thermal", CreativeThermiaContainerMachine::new) + .rotationState(RotationState.NONE) + .model(createSingleOverlayTieredHullMachineModel(GTModels.BLANK_TEXTURE, + GTCEu.id("block/overlay/machine/overlay_energy_emitter"))) + .tooltipBuilder(CREATIVE_TOOLTIPS) + .register(); + + private static MachineDefinition[] registerTieredMachines(String name, + BiFunction factory, + BiFunction, MachineDefinition> builder, + int... tiers) { MachineDefinition[] definitions = new MachineDefinition[GTValues.TIER_COUNT]; for (int tier : tiers) { - var register = REGISTRATE.machine(GTValues.VN[tier].toLowerCase(Locale.ROOT) + "_" + name, holder -> factory.apply(holder, tier)).tier(tier); + var register = REGISTRATE.machine(GTValues.VN[tier].toLowerCase(Locale.ROOT) + "_" + name, + holder -> factory.apply(holder, tier)).tier(tier); definitions[tier] = builder.apply(tier, register); } return definitions; } + public static final MultiblockMachineDefinition DIMENSIONAL_ENERGY_CAPACITOR = REGISTRATE + .multiblock("dimensional_energy_capacitor", DimensionalEnergyCapacitor::new) + .langValue("Power Substation") + .rotationState(RotationState.ALL) + .recipeType(GTRecipeTypes.DUMMY_RECIPES) + .appearanceBlock(CASING_PALLADIUM_SUBSTATION) + .tooltips(Component.translatable("gtceu.machine.power_substation.tooltip.0"), + Component.translatable("gtceu.machine.power_substation.tooltip.1"), + Component.translatable("gtceu.machine.power_substation.tooltip.2", + PowerSubstationMachine.MAX_BATTERY_LAYERS), + Component.translatable("gtceu.machine.power_substation.tooltip.3"), + Component.translatable("gtceu.machine.power_substation.tooltip.4", + PowerSubstationMachine.PASSIVE_DRAIN_MAX_PER_STORAGE / 1000), + Component.translatable("gtceu.machine.dec.tooltip.0"), + Component.translatable("gtceu.machine.dec.tooltip.1"), + Component.translatable("gtceu.machine.dec.tooltip.2"), + Component.translatable("gtceu.machine.dec.tooltip.3")) + .pattern(definition -> FactoryBlockPattern.start(RIGHT, BACK, UP) + .aisle("XXSXX", "XXXXX", "XXXXX", "XXXXX", "XXXXX") + .aisle("XXXXX", "XCCCX", "XCCCX", "XCCCX", "XXXXX") + .aisle("GGGGG", "GBBBG", "GBBBG", "GBBBG", "GGGGG") + .setRepeatable(1, DimensionalEnergyCapacitor.MAX_BATTERY_LAYER) + .aisle("GGGGG", "GGGGG", "GGGGG", "GGGGG", "GGGGG") + .where('S', controller(blocks(definition.getBlock()))) + .where('C', blocks(CASING_PALLADIUM_SUBSTATION.get())) + .where('X', + blocks(CASING_PALLADIUM_SUBSTATION.get()) + .setMinGlobalLimited(DimensionalEnergyCapacitor.MIN_CASINGS) + .or(abilities(PSS_SENSORS)) + .or(autoAbilities(true, false, false)) + .or(abilities(PartAbility.INPUT_ENERGY, PartAbility.SUBSTATION_INPUT_ENERGY, + PartAbility.INPUT_LASER)) + .or(abilities(PartAbility.OUTPUT_ENERGY, PartAbility.SUBSTATION_OUTPUT_ENERGY, + PartAbility.OUTPUT_LASER))) + .where('G', blocks(CASING_LAMINATED_GLASS.get())) + .where('B', Predicates.powerSubstationBatteries()) + .build()) + .shapeInfos(definition -> { + List shapeInfo = new ArrayList<>(); + MultiblockShapeInfo.ShapeInfoBuilder builder = MultiblockShapeInfo.builder() + .aisle("ICSCO", "NCMCT", "GGGGG", "GGGGG", "GGGGG") + .aisle("CCCCC", "CCCCC", "GBBBG", "GBBBG", "GGGGG") + .aisle("CCCCC", "CCCCC", "GBBBG", "GBBBG", "GGGGG") + .aisle("CCCCC", "CCCCC", "GBBBG", "GBBBG", "GGGGG") + .aisle("CCCCC", "CCCCC", "GGGGG", "GGGGG", "GGGGG") + .where('S', definition, Direction.NORTH) + .where('C', CASING_PALLADIUM_SUBSTATION) + .where('G', CASING_LAMINATED_GLASS) + .where('I', GTMachines.ENERGY_INPUT_HATCH[HV], Direction.NORTH) + .where('N', GTMachines.SUBSTATION_ENERGY_INPUT_HATCH[EV], Direction.NORTH) + .where('O', GTMachines.ENERGY_OUTPUT_HATCH[HV], Direction.NORTH) + .where('T', GTMachines.SUBSTATION_ENERGY_OUTPUT_HATCH[EV], Direction.NORTH) + .where('M', + ConfigHolder.INSTANCE.machines.enableMaintenance ? + GTMachines.MAINTENANCE_HATCH.getBlock().defaultBlockState().setValue( + GTMachines.MAINTENANCE_HATCH.get().getRotationState().property, + Direction.NORTH) : + CASING_PALLADIUM_SUBSTATION.get().defaultBlockState()); + + GTCEuAPI.PSS_BATTERIES.entrySet().stream() + // filter out empty batteries in example structures, though they are still + // allowed in the predicate (so you can see them on right-click) + .filter(entry -> entry.getKey().getCapacity() > 0) + .sorted(Comparator.comparingInt(entry -> entry.getKey().getTier())) + .forEach(entry -> shapeInfo.add(builder.where('B', entry.getValue().get()).build())); + + return shapeInfo; + }) + .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_palladium_substation"), + GTCEu.id("block/multiblock/power_substation")) + .register(); + + public static final MultiblockMachineDefinition DIMENSIONAL_ENERGY_INTERFACE = REGISTRATE + .multiblock("dimensional_energy_interface", DimensionalEnergyInterface::new) + .langValue("Power Substation Dimensional Interface") + .rotationState(RotationState.ALL) + .recipeType(GTRecipeTypes.DUMMY_RECIPES) + .appearanceBlock(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING) + .tooltips(Component.translatable("gtceu.machine.active_transformer.tooltip.0"), + Component.translatable("gtceu.machine.active_transformer.tooltip.1")) + .tooltipBuilder( + (stack, + components) -> components.add(Component.translatable("gtceu.machine.active_transformer.tooltip.2") + .append(Component.translatable("gtceu.machine.active_transformer.tooltip.3") + .withStyle(TooltipHelper.RAINBOW_HSL_SLOW)))) + .tooltips(Component.translatable("gtceu.machine.dec.tooltip.4")) + .pattern((definition) -> FactoryBlockPattern.start() + .aisle("XXX", "XXX", "XXX") + .aisle("XXX", "XCX", "XXX") + .aisle("XMX", "XSX", "XXX") + .where('S', controller(blocks(definition.getBlock()))) + .where('X', blocks(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.get()).setMinGlobalLimited(12) + .or(ActiveTransformerMachine.getHatchPredicates())) + .where('C', blocks(GTBlocks.SUPERCONDUCTING_COIL.get())) + .where('M', + blocks(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.get()).or(autoAbilities(true, false, false))) + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing"), + GTCEu.id("block/multiblock/data_bank")) + .register(); + + public static final MachineDefinition STEAM_IMPORT_HATCH = REGISTRATE + .machine("steam_fluid_input_hatch", holder -> new SteamFluidHatchPartMachine(holder, IO.IN, 4000, 1)) + .rotationState(RotationState.ALL) + .abilities(PartAbility.IMPORT_FLUIDS) + .colorOverlaySteamHullModel(ResourceLocation.fromNamespaceAndPath(GTCEu.MOD_ID, "block/overlay/machine/overlay_pipe"), + ResourceLocation.fromNamespaceAndPath(GTCEu.MOD_ID, "block/overlay/machine/overlay_fluid_hatch"), + ResourceLocation.fromNamespaceAndPath(GTCEu.MOD_ID, "block/overlay/machine/overlay_fluid_hatch")) + .tooltips(Component.translatable("gtceu.machine.steam_fluid_hatch_notice")) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) + .langValue("Fluid Input Hatch (Steam)") + .register(); + public static final MachineDefinition STEAM_EXPORT_HATCH = REGISTRATE + .machine("steam_fluid_output_hatch", holder -> new SteamFluidHatchPartMachine(holder, IO.OUT, 4000, 1)) + .rotationState(RotationState.ALL) + .abilities(PartAbility.EXPORT_FLUIDS) + .colorOverlaySteamHullModel(ResourceLocation.fromNamespaceAndPath(GTCEu.MOD_ID, "block/overlay/machine/overlay_pipe"), + ResourceLocation.fromNamespaceAndPath(GTCEu.MOD_ID, "block/overlay/machine/overlay_fluid_hatch"), + ResourceLocation.fromNamespaceAndPath(GTCEu.MOD_ID, "block/overlay/machine/overlay_fluid_hatch")) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) + .langValue("Fluid Output Hatch (Steam)") + .register(); + + public static final MultiblockMachineDefinition WIRELESS_DATA_TRANSMITTER = REGISTRATE + .multiblock("wireless_data_transmitter", WirelessDataBankMachine::new) + .langValue("Wireless Data Transmitter") + .rotationState(RotationState.NON_Y_AXIS) + .appearanceBlock(HIGH_POWER_CASING) + .recipeType(GTRecipeTypes.DUMMY_RECIPES) + .pattern(definition -> FactoryBlockPattern.start() + // spotless: off + .aisle(" AAAAAAA ", " BBB ", " BBB ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ") + .aisle(" AAAAAAAAAAA ", " A A ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ") + .aisle(" ACAACCCAACA ", " C CCC C ", " C CCC C ", " C CCC C ", " CC C CC ", + " C ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ") + .aisle("AAAAAD DAAAAA", " D D ", " D D ", " D D ", " CCCD DCCC ", + " D D ", " ", " ", " ", " ", + " ", " ", " ", " D ", " ", + " ", " ", " ", " ", " D ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ") + .aisle("AAAAAADAAAAAA", " D ", " D ", " D ", " CCCDCCC ", + " D ", " D ", " D ", " D ", " D ", + " D ", " D ", " D ", " DDD ", " D ", + " D ", " D ", " D ", " D ", " DDD ", + " D ", " D ", " ", " ", " ", + " ", " ", " ", " ") + .aisle("AACDAAAAADCAA", "B CD DC B", "B CD DC B", " CD DC ", " DC CD ", + " D D ", " ", " ", " ", " ", + " ", " ", " ", " DD DD ", " ", + " ", " ", " ", " ", " DD DD ", + " ", " ", " ", " E ", " ", + " E ", " ", " E ", " ") + .aisle("AAC DAAAD CAA", "B C D E D C B", "B C D E D C B", " C D E D C ", " C D E D C ", + " C D E D C ", " D E D ", " D E D ", " D E D ", " D E D ", + " D E D ", " D E D ", " D E D ", " DD E DD ", " D E D ", + " D E D ", " D E D ", " D E D ", " D E D ", " DD E DD ", + " D E D ", " D E D ", " E ", " EEE ", " E ", + " EEE ", " E ", " EEE ", " E ") + .aisle("AACDAAAAADCAA", "B CD DC B", "B CD DC B", " CD DC ", " DC CD ", + " D D ", " ", " ", " ", " ", + " ", " ", " ", " DD DD ", " ", + " ", " ", " ", " ", " DD DD ", + " ", " ", " ", " E ", " ", + " E ", " ", " E ", " ") + .aisle("AAAAAADAAAAAA", " D ", " D ", " D ", " CCCDCCC ", + " D ", " D ", " D ", " D ", " D ", + " D ", " D ", " D ", " DDD ", " D ", + " D ", " D ", " D ", " D ", " DDD ", + " D ", " D ", " ", " ", " ", + " ", " ", " ", " ") + .aisle("AAAAAD DAAAAA", " D D ", " D D ", " D D ", " CCCD DCCC ", + " D D ", " ", " ", " ", " ", + " ", " ", " ", " D ", " ", + " ", " ", " ", " ", " D ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ") + .aisle(" ACAACCCAACA ", " C CCC C ", " C CCC C ", " C CCC C ", " CC C CC ", + " C ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ") + .aisle(" AAAAAAAAAAA ", " A A ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ") + .aisle(" AAAAAAA ", " BBB ", " BQB ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ", + " ", " ", " ", " ") + // spotless: on + .where("Q", controller(blocks(definition.getBlock()))) + .where("A", blocks(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.get())) + .where("B", blocks(HIGH_POWER_CASING.get()) + .or(abilities(PartAbility.OPTICAL_DATA_RECEPTION)) + .or(abilities(PartAbility.INPUT_ENERGY)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where("C", blocks(HIGH_TOLERANCE_RHENIUM_CASING.get())) + .where("D", frames(GTMaterials.Neutronium)) + .where("E", blocks(REFLECTIVE_STARMETAL_CASING.get())) + .build()) + .workableCasingModel(GTCEu.id("block/casings/hpca/high_power_casing"), + CosmicCore.id("block/multiblock/wireless_data_transmitter")) + .register(); + public static final MultiblockMachineDefinition LOCAL_POWER_CAPACITOR = REGISTRATE + .multiblock("capacitor_array", PowerSubstationMachine::new) + .langValue("Capacitor Array") + .rotationState(RotationState.NON_Y_AXIS) + .appearanceBlock(CASING_PALLADIUM_SUBSTATION) + .recipeType(GTRecipeTypes.DUMMY_RECIPES) + .tooltips(Component.translatable("cosmiccore.machine.capacitor_array.tooltip.0"), + Component.translatable("cosmiccore.machine.capacitor_array.tooltip.1")) + .pattern(definition -> FactoryBlockPattern.start(RIGHT, BACK, UP) + .aisle("ACA", "AAA", "AAA") + .aisle("ABA", "BDB", "ABA") + .setRepeatable(1, 11) + .aisle("AAA", "AAA", "AAA") + .where("C", controller(blocks(definition.getBlock()))) + .where("A", blocks(CASING_PALLADIUM_SUBSTATION.get()) + .or(abilities(PartAbility.INPUT_ENERGY, PartAbility.OUTPUT_ENERGY, + PartAbility.SUBSTATION_INPUT_ENERGY, + PartAbility.SUBSTATION_OUTPUT_ENERGY) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1)))) + .where("D", Predicates.powerSubstationBatteries()) + .where("B", blocks(CASING_LAMINATED_GLASS.get())) + .build()) + .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_palladium_substation"), + GTCEu.id("block/multiblock/power_substation")) + .register(); + + public static final MachineDefinition WIRELESS_DATA_HATCH = REGISTRATE + .machine("wireless_data_hatch", WirelessDataHatchPartMachine::new) + .langValue("Wireless Data Hatch") + .rotationState(RotationState.ALL) + .abilities(PartAbility.DATA_ACCESS) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) + .tier(UEV) + .overlayTieredHullModel("wireless_data_hatch") + .register(); + + public static final MachineDefinition DRONE_MAINTENANCE_INTERFACE = REGISTRATE + .machine("drone_maintenance_interface", + (blockEntity) -> new DroneMaintenanceInterfacePartMachine(blockEntity)) + .rotationState(RotationState.ALL) + .abilities(PartAbility.MAINTENANCE) + .tooltips(Component.translatable("gtceu.part_sharing.disabled")) + .tier(EV) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) + .overlayTieredHullModel("drone_hatch_maint") + .langValue("Drone Maintenance Interface") + .register(); + + public static final MachineDefinition STERILIZATION_HATCH = REGISTRATE + .machine("sterilization_hatch", (holder) -> new SterilizationHatchPartMachine(holder, ZPM, IO.IN, 16000)) + .langValue("Sterilzation Hatch") + .rotationState(RotationState.ALL) + .tier(ZPM) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) + .overlayTieredHullModel("cleaning_cover") + .abilities(STERILIZE_HATCH) + .register(); + + public static final MachineDefinition HUGE_STERILIZATION_HATCH = REGISTRATE + .machine("huge_sterilization_hatch", + (holder) -> new SterilizationHatchPartMachine(holder, ZPM, IO.IN, 16000)) + .langValue("Sterilzation Hatch") + .rotationState(RotationState.ALL) + .tier(ZPM) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) + .overlayTieredHullModel("cleaning_cover") + .abilities(STERILIZE_HATCH) + .register(); + + public static final MachineDefinition[] FLUID_IMPORT_HATCH_4X_HV = CosmicMachinesUtils.registerFluidHatches( + "input_hatch_4x", "Quadruple Input Hatch", "fluid_hatch.import", + IO.IN, FluidHatchPartMachine.INITIAL_TANK_CAPACITY_4X, 4, + new int[] { GTValues.HV }, + PartAbility.IMPORT_FLUIDS, PartAbility.IMPORT_FLUIDS_4X); + + public static final MachineDefinition[] FLUID_EXPORT_HATCH_4X_HV = CosmicMachinesUtils.registerFluidHatches( + "output_hatch_4x", "Quadruple Output Hatch", "fluid_hatch.export", + IO.OUT, FluidHatchPartMachine.INITIAL_TANK_CAPACITY_4X, 4, + new int[] { GTValues.HV }, // only HV + PartAbility.EXPORT_FLUIDS, PartAbility.EXPORT_FLUIDS_4X); + + public static final MultiblockMachineDefinition LARGE_STEAM_TURBINE = registerLargeTurbineCosmic( + "steam_large_turbine", + HV, + GTRecipeTypes.STEAM_TURBINE_FUELS, + CASING_STEEL_TURBINE, CASING_STEEL_GEARBOX, + GTCEu.id("block/casings/mechanic/machine_casing_turbine_steel"), + GTCEu.id("block/multiblock/generator/large_steam_turbine"), + false); + + // Dreamer's Basin is now registered in DreamersBasin.java + + // Alveary casing texture (single texture for all faces) + private static final ResourceLocation ALVEARY_CASING_TEXTURE = CosmicCore.id("block/casings/solid/alveary_casing"); + + /** + * Creates an alveary part model with overlay on all 4 horizontal faces. + * Uses custom template that renders overlay on north/south/east/west. + */ + public static MachineBuilder.ModelInitializer createAlvearyPartModel( + ResourceLocation casingTexture, + ResourceLocation overlayTexture) { + return (ctx, prov, builder) -> { + ResourceLocation alvearyTemplate = CosmicCore.id("block/machine/template/part/alveary_part_machine"); + + var baseModel = prov.models().withExistingParent(ctx.getName() + "_base", alvearyTemplate); + baseModel.texture("bottom", casingTexture); + baseModel.texture("top", casingTexture); + baseModel.texture("side", casingTexture); + + builder.forAllStatesModels(state -> prov.models().nested().parent(baseModel) + .texture("overlay", overlayTexture) + .texture("overlay_emissive", GTCEu.id("block/void"))); + }; + } + + // TODO(forestry): Alveary modifier casings (14 ALVEARY_*_PART + registerAlvearyModifier / AlvearyModifierPartMachine) shelved with Forestry (bead cosmiccore-42.13) + public static void init() { + GTMultiMachines.LARGE_COMBUSTION_ENGINE.setRecipeTypes(new GTRecipeType[] { DUMMY_RECIPES }); + GTMultiMachines.LARGE_COMBUSTION_ENGINE.setRenderXEIPreview(false); + GTMultiMachines.LARGE_COMBUSTION_ENGINE.setRenderWorldPreview(false); + GTMultiMachines.LARGE_PLASMA_TURBINE.setRecipeTypes(new GTRecipeType[] { DUMMY_RECIPES }); + GTMultiMachines.LARGE_PLASMA_TURBINE.setRenderXEIPreview(false); + GTMultiMachines.LARGE_PLASMA_TURBINE.setRenderWorldPreview(false); + GTMultiMachines.EXTREME_COMBUSTION_ENGINE.setRecipeTypes(new GTRecipeType[] { DUMMY_RECIPES }); + GTMultiMachines.EXTREME_COMBUSTION_ENGINE.setRenderXEIPreview(false); + GTMultiMachines.EXTREME_COMBUSTION_ENGINE.setRenderWorldPreview(false); + GTMultiMachines.ASSEMBLY_LINE.setRecipeModifier(new RecipeModifierList(COSMIC_MODULES, OC_NON_PERFECT)); + GTMultiMachines.ASSEMBLY_LINE.setAlwaysTryModifyRecipe(true); + // TODO(cosmiccore-42.14): GCYMMachines.MEGA_BLAST_FURNACE removed in GTCEu 8.0 + GTMultiMachines.POWER_SUBSTATION.setRenderXEIPreview(false); + GTMultiMachines.POWER_SUBSTATION.setRenderWorldPreview(false); + + GTMultiMachines.LARGE_STEAM_TURBINE.setRecipeTypes(new GTRecipeType[] { DUMMY_RECIPES }); + GTMultiMachines.LARGE_STEAM_TURBINE.setRenderXEIPreview(false); + GTMultiMachines.LARGE_STEAM_TURBINE.setRenderWorldPreview(false); + + for (MachineDefinition miner : GTMachines.MINER) { + if (miner == null) continue; + miner.setRecipeTypes(new GTRecipeType[] { DUMMY_RECIPES }); + } + GTMachines.STEAM_MINER.first().setRecipeTypes(new GTRecipeType[] { DUMMY_RECIPES }); + GTMachines.STEAM_MINER.second().setRecipeTypes(new GTRecipeType[] { DUMMY_RECIPES }); + + for (MultiblockMachineDefinition largeMiner : GTMultiMachines.LARGE_MINER) { + if (largeMiner == null) continue; + largeMiner.setRecipeTypes(new GTRecipeType[] { DUMMY_RECIPES }); + largeMiner.setRenderXEIPreview(false); + largeMiner.setRenderWorldPreview(false); + } + + for (MultiblockMachineDefinition definition : FUSION_REACTOR) { + if (definition == null) continue; + definition.setPatternFactory(() -> { + var casing = blocks(FusionReactorMachine.getCasingState(definition.getTier())); + return FactoryBlockPattern.start() + .aisle("###############", "######OGO######", "###############") + .aisle("######ICI######", "####GGAAAGG####", "######ICI######") + .aisle("####CC###CC####", "###EAAOGOAAE###", "####CC###CC####") + .aisle("###C#######C###", "##EKEG###GEKE##", "###C#######C###") + .aisle("##C#########C##", "#GAE#######EAG#", "##C#########C##") + .aisle("##C#########C##", "#GAG#######GAG#", "##C#########C##") + .aisle("#I###########I#", "OAO#########OAO", "#I###########I#") + .aisle("#C###########C#", "GAG#########GAG", "#C###########C#") + .aisle("#I###########I#", "OAO#########OAO", "#I###########I#") + .aisle("##C#########C##", "#GAG#######GAG#", "##C#########C##") + .aisle("##C#########C##", "#GAE#######EAG#", "##C#########C##") + .aisle("###C#######C###", "##EKEG###GEKE##", "###C#######C###") + .aisle("####CC###CC####", "###EAAOGOAAE###", "####CC###CC####") + .aisle("######ICI######", "####GGAAAGG####", "######ICI######") + .aisle("###############", "######OSO######", "###############") + .where('S', controller(blocks(definition.get()))) + .where('G', blocks(FUSION_GLASS.get()).or(casing)) + .where('E', casing.or( + blocks(PartAbility.INPUT_ENERGY.getBlockRange(definition.getTier(), UV) + .toArray(Block[]::new)) + .setMinGlobalLimited(1).setPreviewCount(16))) + .where('C', casing) + .where('K', blocks(FusionReactorMachine.getCoilState(definition.getTier()))) + .where('O', casing.or(abilities(PartAbility.EXPORT_FLUIDS)) + .or(abilities(PartAbility.EXPORT_ITEMS))) + .where('A', air()) + .where('I', casing.or(abilities(PartAbility.IMPORT_FLUIDS).setMinGlobalLimited(2)) + .or(abilities(PartAbility.IMPORT_ITEMS))) + .where('#', any()) + .build(); + }); + } + GCYMMachines.LARGE_CENTRIFUGE.setPatternFactory(() -> FactoryBlockPattern.start() + .aisle("#XXX#", "XXXXX", "#XXX#") + .aisle("XXXXX", "XAPAX", "XXXXX") + .aisle("XXXXX", "XPAPX", "XXXXX") + .aisle("XXXXX", "XAPAX", "XXXXX") + .aisle("#XXX#", "XXSXX", "#XXX#") + .where('S', controller(blocks(GCYMMachines.LARGE_CENTRIFUGE.getBlock()))) + .where('X', blocks(CASING_VIBRATION_SAFE.get()).setMinGlobalLimited(40) + .or(Predicates.autoAbilities(CENTRIFUGE_RECIPES)) + .or(Predicates.autoAbilities(true, false, true)) + .or(abilities(STERILIZE_HATCH).setMaxGlobalLimited(1, 1))) + .where('P', Predicates.blocks(CASING_STEEL_PIPE.get())) + .where('A', Predicates.air()) + .where('#', Predicates.any()) + .build()); + + GTMultiMachines.ASSEMBLY_LINE.setPatternFactory(() -> FactoryBlockPattern.start(BACK, UP, RIGHT) + .aisle("FIF", "RTR", "SAG", "#Y#") + .aisle("FIF", "RTR", "DAG", "#Y#").setRepeatable(3, 15) + .aisle("FOF", "RTR", "DAG", "#Y#") + .where('S', Predicates.controller(blocks(GTMultiMachines.ASSEMBLY_LINE.getBlock()))) + .where('F', blocks(CASING_STEEL_SOLID.get()) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS_1X, ME_ASSEMBLY_PARTS_FLUID) + .setMaxGlobalLimited(4))) + .where('O', + Predicates.abilities(PartAbility.EXPORT_ITEMS) + .addTooltips(Component.translatable("gtceu.multiblock.pattern.location_end"))) + .where('Y', + blocks(CASING_STEEL_SOLID.get()).or(Predicates.abilities(PartAbility.INPUT_ENERGY) + .setMinGlobalLimited(1).setMaxGlobalLimited(2))) + .where('I', blocks(ITEM_IMPORT_BUS[0].getBlock()).or(Predicates.abilities(ME_ASSEMBLY_PARTS))) + .where('G', blocks(CASING_GRATE.get())) + .where('A', blocks(CASING_ASSEMBLY_CONTROL.get())) + .where('R', blocks(CASING_LAMINATED_GLASS.get())) + .where('T', blocks(CASING_ASSEMBLY_LINE.get())) + .where('D', + Predicates.abilities(PartAbility.DATA_ACCESS, PartAbility.OPTICAL_DATA_RECEPTION) + .setExactLimit(1) + .or(Predicates.abilities(MODULE_HATCH).setMaxGlobalLimited(1, 1)) + .or(blocks(CASING_GRATE.get()))) + .where('#', Predicates.any()) + .build()); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicMachinesUtils.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicMachinesUtils.java new file mode 100644 index 000000000..7a439bfc6 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicMachinesUtils.java @@ -0,0 +1,255 @@ +package com.ghostipedia.cosmiccore.common.data; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.CosmicLargeTurbineMachine; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.ExoticCombustionEngineMachine; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.machine.*; +import com.gregtechceu.gtceu.common.machine.multiblock.part.RotorHolderPartMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; +import com.gregtechceu.gtceu.api.pattern.predicates.SimplePredicate; +import com.gregtechceu.gtceu.api.recipe.GTRecipeType; +import com.gregtechceu.gtceu.api.registry.registrate.MachineBuilder; +import com.gregtechceu.gtceu.common.data.GTMaterialItems; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; +import com.gregtechceu.gtceu.common.machine.multiblock.part.FluidHatchPartMachine; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import com.lowdragmc.lowdraglib.utils.BlockInfo; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.ItemLike; +import net.minecraft.world.level.block.Block; + +import it.unimi.dsi.fastutil.Pair; +import it.unimi.dsi.fastutil.ints.Int2IntFunction; + +import java.util.Locale; +import java.util.function.BiFunction; +import java.util.function.Supplier; +import java.util.stream.Stream; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.GTValues.*; +import static com.gregtechceu.gtceu.api.GTValues.V; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.blocks; +import static com.gregtechceu.gtceu.common.data.machines.GTMachineUtils.workableTiered; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.OVERLAY_FLUID_HATCH_HALF_PX_TEX; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.OVERLAY_FLUID_HATCH_TEX; +import static com.gregtechceu.gtceu.utils.FormattingUtil.toEnglishName; + +public class CosmicMachinesUtils { + + // Verbaitm the LCE/ECE Code Logic used in GTCEU; Thanks Guys! + public static MultiblockMachineDefinition registerCosmicLargeCombustionEngine(String name, int tier, + Supplier casing, + Supplier gear, + Supplier intake, + ResourceLocation casingTexture, + ResourceLocation overlayModel) { + return REGISTRATE.multiblock(name, holder -> new ExoticCombustionEngineMachine(holder, tier)) + .rotationState(RotationState.ALL) + .recipeType(GTRecipeTypes.COMBUSTION_GENERATOR_FUELS) + .generator(true) + .recipeModifier(ExoticCombustionEngineMachine::recipeModifier, true) + .appearanceBlock(casing) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("XXX", "XDX", "XXX") + .aisle("XCX", "CGC", "XCX") + .aisle("XCX", "CGC", "XCX") + .aisle("AAA", "AYA", "AAA") + .where('X', blocks(casing.get())) + .where('G', blocks(gear.get())) + .where('C', blocks(casing.get()).setMinGlobalLimited(3) + .or(autoAbilities(definition.getRecipeTypes(), false, false, true, true, true, true)) + .or(autoAbilities(true, true, false))) + .where('D', + ability(PartAbility.OUTPUT_ENERGY, + Stream.of(ULV, LV, MV, HV, EV, IV, LuV, ZPM, UV, UHV).filter(t -> t >= tier) + .mapToInt(Integer::intValue).toArray()) + .addTooltips(Component.translatable("gtceu.multiblock.pattern.error.limited.1", + GTValues.VN[tier]))) + .where('A', + blocks(intake.get()) + .addTooltips(Component.translatable("gtceu.multiblock.pattern.clear_amount_1"))) + .where('Y', controller(blocks(definition.getBlock()))) + .build()) + .recoveryItems( + () -> new ItemLike[] { + GTMaterialItems.MATERIAL_ITEMS.get(TagPrefix.dustTiny, GTMaterials.Ash).get() }) + .workableCasingModel(casingTexture, overlayModel) + .tooltips( + Component.translatable("gtceu.universal.tooltip.base_production_eut", V[tier]), + Component.translatable("cosmiccore.universal.tooltip.lube_info.0"), + Component.translatable("cosmiccore.universal.tooltip.lube_info.1"), + Component.translatable("cosmiccore.universal.tooltip.lube_info.2"), + Component.translatable("cosmiccore.universal.tooltip.lube_info.3"), + Component.translatable("cosmiccore.universal.boosting_agents.0"), + Component.translatable("cosmiccore.universal.boosting_agents.1"), + Component.translatable("cosmiccore.universal.boosting_agents.2"), + Component.translatable("cosmiccore.universal.boosting_agents.3")) + .register(); + } + + public static MultiblockMachineDefinition registerLargeTurbineCosmic( + String name, int tier, GTRecipeType recipeType, + Supplier casing, + Supplier gear, + ResourceLocation casingTexture, + ResourceLocation overlayModel, + boolean needsMuffler) { + return REGISTRATE.multiblock(name, holder -> new CosmicLargeTurbineMachine(holder, tier)) + .rotationState(RotationState.ALL) + .recipeType(recipeType) + .generator(true) + .recipeModifier(CosmicLargeTurbineMachine::recipeModifier, true) + .appearanceBlock(casing) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("CCCC", "CHHC", "CCCC") + .aisle("CHHC", "RGGR", "CHHC") + .aisle("CCCC", "CSHC", "CCCC") + .where('S', controller(blocks(definition.getBlock()))) + .where('G', blocks(gear.get())) + .where('C', blocks(casing.get())) + .where('R', + new TraceabilityPredicate( + new SimplePredicate( + state -> MetaMachine.getMachine(state.getWorld(), + state.getPos()) instanceof RotorHolderPartMachine rotorHolder && + state.getWorld() + .getBlockState(state.getPos() + .relative(rotorHolder.self().getFrontFacing())) + .isAir(), + () -> PartAbility.ROTOR_HOLDER.getAllBlocks().stream() + .map(BlockInfo::fromBlock).toArray(BlockInfo[]::new))) + .addTooltips(Component.translatable("gtceu.multiblock.pattern.clear_amount_3")) + .addTooltips(Component.translatable("gtceu.multiblock.pattern.error.limited.1", + VN[tier])) + .setExactLimit(1) + .or(abilities(PartAbility.OUTPUT_ENERGY)).setExactLimit(1)) + .where('H', blocks(casing.get()) + .or(autoAbilities(definition.getRecipeTypes(), false, false, true, true, true, true)) + .or(autoAbilities(true, needsMuffler, false))) + .build()) + .recoveryItems( + () -> new ItemLike[] { + GTMaterialItems.MATERIAL_ITEMS.get(TagPrefix.dustTiny, GTMaterials.Ash).get() }) + .workableCasingModel(casingTexture, overlayModel) + .tooltips( + Component.translatable("gtceu.universal.tooltip.base_production_eut", 3072), + Component.translatable("gtceu.multiblock.turbine.efficiency_tooltip", VNF[tier])) + .register(); + } + + public static MachineDefinition[] registerSimpleGenerator(String name, + GTRecipeType recipeType, + Int2IntFunction tankScalingFunction, + float hazardStrengthPerOperation, + int... tiers) { + return CosmicMachinesUtils.registerTieredMachines(name, + (holder, tier) -> new SimpleGeneratorMachine(holder, tier, hazardStrengthPerOperation * tier, + tankScalingFunction), + (tier, builder) -> builder + .langValue("%s %s Generator %s".formatted(VLVH[tier], toEnglishName(name), VLVT[tier])) + .editableUI(SimpleGeneratorMachine.EDITABLE_UI_CREATOR.apply(GTCEu.id(name), recipeType)) + .rotationState(RotationState.ALL) + .recipeType(recipeType) + .recipeModifier(SimpleGeneratorMachine::recipeModifier, true) + .addOutputLimit(ItemRecipeCapability.CAP, 0) + .addOutputLimit(FluidRecipeCapability.CAP, 0) + .simpleGeneratorModel(GTCEu.id("block/generators/" + name)) + .tooltips(workableTiered(tier, GTValues.V[tier], GTValues.V[tier] * 64, recipeType, + tankScalingFunction.applyAsInt(tier), false)) + .register(), + tiers); + } + + public static MachineDefinition[] registerTieredSingleBlockMachines(String name, + BiFunction factory, + BiFunction, MachineDefinition> builder, + int... tiers) { + return registerTieredMachines(name, factory, builder, tiers); + } + + public static MachineDefinition[] registerTieredMachines(String name, + BiFunction factory, + BiFunction, MachineDefinition> builder, + int... tiers) { + MachineDefinition[] definitions = new MachineDefinition[GTValues.TIER_COUNT]; + for (int tier : tiers) { + var register = REGISTRATE + .machine(GTValues.VN[tier].toLowerCase(Locale.ROOT) + "_" + name, + holder -> factory.apply(holder, tier)) + .tier(tier); + definitions[tier] = builder.apply(tier, register); + } + return definitions; + } + + public static Pair registerSteamMachines(String name, + BiFunction factory, + BiFunction, MachineDefinition> builder) { + MachineDefinition lowTier = builder.apply(false, + REGISTRATE.machine("lp_%s".formatted(name), holder -> factory.apply(holder, false)) + .langValue("I DO NOT EXIST") + .tier(0)); + MachineDefinition highTier = builder.apply(true, + REGISTRATE.machine("hp_%s".formatted(name), holder -> factory.apply(holder, true)) + .langValue("High Pressure " + FormattingUtil.toEnglishName(name)) + .tier(1)); + return Pair.of(lowTier, highTier); + } + + /** Fluid hatch helper that uses our mod's REGISTRATE (keeps datagen happy). */ + public static MachineDefinition[] registerFluidHatches(String name, String displayName, String tooltip, + IO io, int initialCapacity, int slots, + int[] tiers, PartAbility... abilities) { + final String pipeOverlay; + if (slots >= 9) { + pipeOverlay = "overlay_pipe_9x"; + } else if (slots >= 4) { + pipeOverlay = "overlay_pipe_4x"; + } else { + pipeOverlay = null; + } + final String ioOverlay = io == IO.OUT ? "overlay_pipe_out_emissive" : "overlay_pipe_in_emissive"; + final String emissiveOverlay = slots > 4 ? OVERLAY_FLUID_HATCH_HALF_PX_TEX : OVERLAY_FLUID_HATCH_TEX; + + return registerTieredMachines( + name, + (holder, tier) -> new FluidHatchPartMachine(holder, tier, io, initialCapacity, slots), + (tier, builder) -> builder + .langValue(VNF[tier] + ' ' + displayName) + .rotationState(RotationState.ALL) + .colorOverlayTieredHullModel(ioOverlay, pipeOverlay, emissiveOverlay) + .abilities(abilities) + .modelProperty(GTMachineModelProperties.IS_FORMED, false) + .tooltips(Component.translatable("gtceu.machine." + tooltip + ".tooltip")) + .allowCoverOnFront(true) + .tooltips( + slots == 1 ? Component.translatable( + "gtceu.universal.tooltip.fluid_storage_capacity", + FormattingUtil.formatNumbers( + FluidHatchPartMachine.getTankCapacity(initialCapacity, tier))) : + Component.translatable( + "gtceu.universal.tooltip.fluid_storage_capacity_mult", + slots, + FormattingUtil.formatNumbers( + FluidHatchPartMachine.getTankCapacity(initialCapacity, tier)))) + .register(), + tiers); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicModularMachines.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicModularMachines.java new file mode 100644 index 000000000..b2a5703c2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicModularMachines.java @@ -0,0 +1,67 @@ +package com.ghostipedia.cosmiccore.common.data; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.modular.modules.StarLadderDummy; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.registry.registrate.MultiblockMachineBuilder; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; +import com.gregtechceu.gtceu.common.machine.multiblock.electric.FusionReactorMachine; + +import java.util.Locale; +import java.util.function.BiFunction; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.GTValues.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.utils.FormattingUtil.toRomanNumeral; + +public class CosmicModularMachines { + + public static final MultiblockMachineDefinition[] STAR_LADDER_TEST_MODULE = registerTieredModules("name", + (holder, tier) -> new StarLadderDummy(holder, tier, 1, 1), + (tier, builder) -> builder + .rotationState(RotationState.ALL) + .langValue("Assembly Module MK %s".formatted(toRomanNumeral(tier - 5))) + .recipeType(GTRecipeTypes.ASSEMBLER_RECIPES) + .appearanceBlock(() -> FusionReactorMachine.getCasingState(tier)) + .pattern((definition) -> { + var casing = blocks(FusionReactorMachine.getCasingState(tier)); + return FactoryBlockPattern.start() + .aisle("A", "A", "A", "A") + .aisle("A", "A", "B", "A") + .where("B", controller(blocks(definition.getBlock()))) + .where('A', blocks(CosmicBlocks.CYCLOZINE_CHEMICALLY_REPELLING_CASING.get())) + .build(); + }) + .workableCasingModel( + CosmicCore.id("block/casings/solid/vomahine_certified_chemically_resistant_casing"), + GTCEu.id("block/multiblock/fusion_reactor")) + // .hasTESR(true) + .register(), + ZPM, UV, UHV); + + public static MultiblockMachineDefinition[] registerTieredModules( + String name, + BiFunction factory, + BiFunction, MultiblockMachineDefinition> builder, + int... tiers) { + MultiblockMachineDefinition[] definitions = new MultiblockMachineDefinition[GTValues.TIER_COUNT]; + for (int tier : tiers) { + var register = REGISTRATE + .multiblock(GTValues.VN[tier].toLowerCase(Locale.ROOT) + "_" + name, + holder -> factory.apply(holder, tier)) + .tier(tier); + definitions[tier] = builder.apply(tier, register); + } + return definitions; + } + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicSounds.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicSounds.java new file mode 100644 index 000000000..a513eb190 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/CosmicSounds.java @@ -0,0 +1,42 @@ +package com.ghostipedia.cosmiccore.common.data; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.api.sound.SoundEntry; + +import net.minecraft.core.registries.BuiltInRegistries; + +import static com.gregtechceu.gtceu.common.registry.GTRegistration.REGISTRATE; + +public class CosmicSounds { + + public static final SoundEntry BLACK_HOLE_CRY = REGISTRATE.sound(CosmicCore.id("ambient_drone")).build(); + public static final SoundEntry STELLAR_BODY_DYING = REGISTRATE.sound(CosmicCore.id("dying_star")).build(); + public static final SoundEntry ARCANE_DISTIL = REGISTRATE.sound(CosmicCore.id("arcane_distil")).build(); + public static final SoundEntry MINING_MACHINE = REGISTRATE.sound(CosmicCore.id("mining_machine")).build(); + public static final SoundEntry GAS_SUCC = REGISTRATE.sound(CosmicCore.id("gas_succ")).build(); + public static final SoundEntry HEAVY_ASSEM = REGISTRATE.sound(CosmicCore.id("heavy_assembler")).build(); + public static final SoundEntry LAMINATOR = REGISTRATE.sound(CosmicCore.id("laminator")).build(); + public static final SoundEntry FLUIDIZER = REGISTRATE.sound(CosmicCore.id("fluidizer")).build(); + public static final SoundEntry ORBITAL_FORGE = REGISTRATE.sound(CosmicCore.id("orbital_forge")).build(); + public static final SoundEntry CHEMVAT = REGISTRATE.sound(CosmicCore.id("icv")).build(); + public static final SoundEntry VOARX = REGISTRATE.sound(CosmicCore.id("vorax")).build(); + public static final SoundEntry DAWN_FORGE_SFX = REGISTRATE.sound(CosmicCore.id("dawnforge")).build(); + public static final SoundEntry SHAKE_CAN = REGISTRATE.sound(CosmicCore.id("shake")).build(); + + /** + * GTCEu registers every SoundEntry's SoundEvent in a single pass ({@code GTSoundEntries.init}) during its + * own RegisterEvent, which fires before ours (gtceu loads before cosmiccore), so our entries are built too + * late to be picked up. Register our own namespace's sounds here; GTCEu's pass has already run and will not + * run again, so there is no double registration. + */ + public static void init() { + for (SoundEntry entry : GTRegistries.SOUNDS) { + if (!entry.getId().getNamespace().equals(CosmicCore.MOD_ID)) continue; + entry.prepare(); + entry.register(soundEvent -> + GTRegistries.register(BuiltInRegistries.SOUND_EVENT, soundEvent.getLocation(), soundEvent)); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicDataGenerators.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicDataGenerators.java new file mode 100644 index 000000000..3452f4cb0 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicDataGenerators.java @@ -0,0 +1,35 @@ +package com.ghostipedia.cosmiccore.common.data.datagen; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import com.gregtechceu.gtceu.api.registry.registrate.SoundEntryBuilder; + +import net.minecraft.data.DataGenerator; +import net.minecraft.data.PackOutput; +import net.neoforged.neoforge.common.data.ExistingFileHelper; +import net.neoforged.neoforge.data.event.GatherDataEvent; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; + +@EventBusSubscriber(bus = EventBusSubscriber.Bus.MOD) +public class CosmicDataGenerators { + + @SubscribeEvent + public static void gatherData(GatherDataEvent event) { + DataGenerator generator = event.getGenerator(); + PackOutput packOutput = generator.getPackOutput(); + ExistingFileHelper existingFileHelper = event.getExistingFileHelper(); + var registries = event.getLookupProvider(); + + boolean server = event.includeServer(); + + // TODO DATAGEN FOR Materials + stats + traits (server) + // generator.addProvider(server, new CosmicTinkersMaterials(packOutput)); + // generator.addProvider(server, new CosmicMaterialStats(packOutput)); + // generator.addProvider(server, new CosmicMaterialTraits(packOutput)); + + if (event.includeClient()) { + generator.addProvider(true, new SoundEntryBuilder.SoundEntryProvider(packOutput, CosmicCore.MOD_ID)); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicMachineModels.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicMachineModels.java new file mode 100644 index 000000000..ad125991b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/datagen/CosmicMachineModels.java @@ -0,0 +1,31 @@ +package com.ghostipedia.cosmiccore.common.data.datagen; + +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.registry.registrate.MachineBuilder; +import com.gregtechceu.gtceu.client.model.machine.overlays.WorkableOverlays; + +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.client.model.generators.BlockModelBuilder; + +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.*; + +public class CosmicMachineModels { + + public static MachineBuilder.ModelInitializer createSeparateControllerCasingMachineModel(ResourceLocation controllerTexture, + ResourceLocation baseCasingTexture, + ResourceLocation overlayDir) { + return (ctx, prov, builder) -> { + WorkableOverlays overlays = WorkableOverlays.get(overlayDir, prov.getExistingFileHelper()); + + builder.forAllStates(state -> { + RecipeLogic.Status status = state.getValue(RecipeLogic.STATUS_PROPERTY); + + BlockModelBuilder model = prov.models().nested() + .parent(prov.models().getExistingFile(CUBE_ALL_SIDED_OVERLAY_MODEL)) + .texture("all", controllerTexture); + return addWorkableOverlays(overlays, status, model); + }); + builder.addTextureOverride("all", baseCasingTexture); + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/events/EndPortalInteractionEvent.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/events/EndPortalInteractionEvent.java new file mode 100644 index 000000000..7a134a4ea --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/events/EndPortalInteractionEvent.java @@ -0,0 +1,18 @@ +package com.ghostipedia.cosmiccore.common.data.events; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import net.neoforged.neoforge.event.entity.player.PlayerInteractEvent; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; + +@EventBusSubscriber(modid = CosmicCore.MOD_ID, bus = EventBusSubscriber.Bus.GAME) +public class EndPortalInteractionEvent { + + @SubscribeEvent + public static void denyRightClick(PlayerInteractEvent.RightClickBlock event) { + var player = event.getEntity(); + var level = event.getLevel(); + var hand = event.getHand(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java index dd03c412e..36a83ba3d 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/lang/CosmicLangHandler.java @@ -1,32 +1,2077 @@ package com.ghostipedia.cosmiccore.common.data.lang; -import com.gregtechceu.gtceu.utils.FormattingUtil; -import com.tterrag.registrate.providers.RegistrateLangProvider; -import net.minecraft.ChatFormatting; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.Style; +import com.gregtechceu.gtceu.data.lang.LangHandler; -import static com.gregtechceu.gtceu.data.lang.LangHandler.replace; +import com.tterrag.registrate.providers.RegistrateLangProvider; -public class CosmicLangHandler { +public class CosmicLangHandler extends LangHandler { public static void init(RegistrateLangProvider provider) { - replace(provider,"cosmiccore.recipe.soulIn","Soul Input: %s"); - replace(provider,"cosmiccore.recipe.soulOut", "Soul Output: %s"); - replace(provider,"cosmiccore.wire_coil.magnet_capacity", " §fMax Field Strength: §f%s Tesla"); - replace(provider,"cosmiccore.wire_coil.magnet_regen", " §5Field Regen Rate: %s Tesla/t"); - replace(provider,"cosmiccore.wire_coil.eu_multiplier", " §aMagnet EU Cost: §c%s EU/t"); - replace(provider,"cosmiccore.wire_coil.magnet_stats", "§8Magnet Stats"); - replace(provider,"tooltip.cosmiccore.soul_hatch.input", "§cMax Recipe Input§f:§6 %s"); - replace(provider,"tooltip.cosmiccore.soul_hatch.output", "§cMax Soul Network Capacity§f:§6 %s"); - replace(provider,"cosmiccore.multiblock.magnetic_field_strength", "§fMax Field Strength§f:§6 %s"); - replace(provider,"cosmiccore.multiblock.magnetic_regen", "§aField Recovery Rate§f:§6 %sT/t"); - replace(provider,"gtceu.naquahine_reactor", "§bNaquahine Reactor"); - replace(provider,"cosmiccore.multiblock.current_field_strength", "§fField Strength: %s"); - replace(provider,"cosmiccore.recipe.minField", "§fMin. Field Strength: %sT"); - replace(provider,"cosmiccore.recipe.fieldDecay", "§fField Decay: %sT/t"); - replace(provider,"cosmiccore.recipe.fieldSlam", "§fField Consumed: %sT"); - replace(provider,"tagprefix.leached_ore", "Leached %s Ore"); - replace(provider,"tagprefix.prisma_frothed_ore", "Prisma Frothed %s Ore"); + // Vein Survey Scanner + provider.add("cosmiccore.survey.mode.radial", "Mode: Radial Scan (360°)"); + provider.add("cosmiccore.survey.mode.directional", "Mode: Directional Cone (90°)"); + provider.add("cosmiccore.survey.mode.nearest", "Mode: Nearest Vein"); + provider.add("cosmiccore.survey.no_energy", "Not enough energy to scan!"); + provider.add("cosmiccore.survey.tooltip.radius", "Scan Radius: %d blocks"); + provider.add("cosmiccore.survey.tooltip.mode", "Current Mode: "); + provider.add("cosmiccore.survey.tooltip.filter", "Vein Filter: "); + provider.add("cosmiccore.survey.tooltip.use", "§7Use: Scan for veins"); + provider.add("cosmiccore.survey.tooltip.shift", "§7Shift+Use: Change mode"); + provider.add("cosmiccore.survey.header", "═══ Vein Survey ═══"); + provider.add("cosmiccore.survey.found", "Found %d veins within %dm"); + provider.add("cosmiccore.survey.found.directional", " (directional)"); + provider.add("cosmiccore.survey.types", "Types: "); + provider.add("cosmiccore.survey.nearest", "Nearest:"); + provider.add("cosmiccore.survey.nearest_vein", "Nearest vein:"); + provider.add("cosmiccore.survey.nearest_vein.filtered", "Nearest vein (%s):"); + provider.add("cosmiccore.survey.more", " ... and %d more"); + provider.add("cosmiccore.survey.no_veins", "No veins found"); + provider.add("cosmiccore.survey.no_veins.filtered", "No veins found matching '%s'"); + provider.add("cosmiccore.survey.no_veins.directional", "No veins found in that direction"); + provider.add("cosmiccore.survey.click_tp", "Click to teleport"); + provider.add("cosmiccore.survey.command.scanning", "Surveying veins within %d blocks..."); + provider.add("cosmiccore.survey.command.results", "=== Vein Survey Results ==="); + provider.add("cosmiccore.survey.command.vein_types", "Vein types: "); + provider.add("cosmiccore.survey.command.nearest_veins", "Nearest veins:"); + provider.add("cosmiccore.survey.command.more", "... and %d more veins"); + provider.add("cosmiccore.survey.command.no_veins_dimension", "No vein types registered for this dimension."); + provider.add("cosmiccore.survey.command.available_types", "Available vein types (%d):"); + provider.add("cosmiccore.survey.command.player_only", "This command must be run by a player."); + + // items + replace(provider, "item.gtceu.tool.luv_meld_tool", "%s Meld Multitool"); + provider.add("item.cosmiccore.portable_gravity_core.tooltip", "§aNormalizes Gravity to Match Earth."); + + // machine tooltips/names/etc + provider.add("gtceu.naquahine_reactor", "§bNaquahine Reactor"); + + provider.add("tooltip.gt_scythe.no_energy", "§cNot enough energy."); + provider.add("tooltip.gt_scythe.energy", "Energy: %s / %s EU"); + provider.add("tooltip.gt_scythe.per_hit", "Cost: %s EU / hit"); + + multiLang(provider, "cosmiccore.machine.fluid_drilling_rig.description", + "§bDrills infinite fluid from", + "§bliquid pockets suspended throughout the void."); + + provider.add("cosmiccore.universal.tooltip.energy_usage", + "§eConsumes 1 ZPM Amp while operating."); + provider.add("cosmiccore.machine.fluid_drilling_rig.production", + "§eProduction Multiplier: 256x"); + provider.add("cosmiccore.machine.fluid_drilling_rig.depletion", "§bDepletion Rate: 0%"); + + provider.add("block.gtceu.steam_mixing_vessel", "§6Large Steam Mixing Vessel"); + provider.add("block.gtceu.large_combustion_engine_cc", "Large Combustion Engine"); + provider.add("block.gtceu.extreme_combustion_engine_cc", "Extreme Combustion Engine"); + provider.add("block.gtceu.ludicrous_combustion_engine_cc", "Ludicrous Combustion Engine"); + provider.add("block.gtceu.ultimate_combustion_engine_cc", "Ultimate Combustion Engine"); + + provider.add("block.gtceu.steam_caster", "Steam Caster Solidifier"); + provider.add("block.gtceu.steam_fluid_output_hatch", "Bronze Output Hatch"); + provider.add("block.gtceu.steam_fluid_input_hatch", "Bronze Input Hatch"); + provider.add("gtceu.machine.steam_fluid_hatch_notice", + "This hatch is for Fluid ingredients! Not to power with steam!"); + + provider.add("block.gtceu.iv_naquahine_mini_reactor", "§3Micro Naquahine Reactor§r"); + provider.add("block.gtceu.luv_naquahine_mini_reactor", "§dAdvanced Micro Naquahine Reactor§r"); + provider.add("block.gtceu.zpm_naquahine_mini_reactor", "§cElite Micro Naquahine Reactor§r"); + provider.add("block.gtceu.uv_naquahine_mini_reactor", "§3Ultimate Micro Naquahine Reactor§r"); + provider.add("block.gtceu.uhv_naquahine_mini_reactor", "§4Epic Micro Naquahine Reactor§r"); + + provider.add("block.gtceu.hp_steam_bender", "High Pressure Steam Bender"); + replace(provider, "block.gtceu.lp_steam_bender", "I Don't Actually Exist"); + provider.add("block.gtceu.hp_steam_wiremill", "High Pressure Steam Wiremill"); + replace(provider, "block.gtceu.lp_steam_wiremill", "I Don't Actually Exist"); + + multiLang(provider, "cosmiccore.multiblock.naqreactor.tooltip", + "§cA massive reactor powered by explosions and reactive fuel", + "§bWill always attempt to parallel to 16x output.", + "§cOnly Accepts Laser hatches."); + + provider.add("gtceu.industrial_chemvat", "§aIndustrial Chemvat"); + multiLang(provider, "cosmiccore.multiblock.chemvat.tooltip", + "§aA massive chemical plant capable of parallel", + "§fWhen parallelized, adds the cumulative time of all recipes together.", + "§fReduces total time of any recipe ran by 75% afterwards.", + "§6Accepts Laser hatches.", + "§6Accepts Cosmic Parallel Hatches."); + + multiLang(provider, "cosmiccore.multiblock.star_ladder.tooltip", + "§cThe peaks of creation reach out into the stars", + "§c§lDANGER: DATA LOSS PRESENT", + "§c§lDANGER: RECOVERY IS POSSIBLE", + "§aPinacle Multiblock : The Final Goal of ACT1 (Steam to IV)"); + + // Star Ladder Uplink Fight + provider.add("cosmiccore.star_ladder.title", "STAR LADDER"); + provider.add("cosmiccore.star_ladder.initiate", "INITIATE UPLINK"); + provider.add("cosmiccore.star_ladder.interrupted", "UPLINK INTERRUPTED"); + provider.add("cosmiccore.star_ladder.resisting", "Something is resisting."); + provider.add("cosmiccore.star_ladder.demands_soul", "The Ladder demands Refined Soul."); + provider.add("cosmiccore.star_ladder.drain_rate", "Drain rate: %d/s"); + provider.add("cosmiccore.star_ladder.confirm", "CONFIRM"); + provider.add("cosmiccore.star_ladder.abort", "ABORT"); + provider.add("cosmiccore.star_ladder.established", "UPLINK ESTABLISHED"); + provider.add("cosmiccore.star_ladder.hub_name", "Research Hub"); + provider.add("cosmiccore.star_ladder.hub_tier", "Hub Tier: T%d"); + provider.add("cosmiccore.star_ladder.uplink_progress", "UPLINK PROGRESS"); + provider.add("cosmiccore.star_ladder.soul_drain", "SOUL DRAIN: %d/s"); + provider.add("cosmiccore.star_ladder.requisition", "REQUISITION:"); + + // Star Ladder — Interrupted sequence + provider.add("cosmiccore.star_ladder.whisper.interrupted.silence", "Silence."); + provider.add("cosmiccore.star_ladder.whisper.interrupted.pressure", "Pressure."); + provider.add("cosmiccore.star_ladder.whisper.interrupted.no", "Hm?"); + + // Star Ladder — Phase transitions + provider.add("cosmiccore.star_ladder.whisper.transition.phase_2", "Something shifts and groans."); + provider.add("cosmiccore.star_ladder.whisper.transition.phase_3", + "The barrier is cracking, the world is crying."); + provider.add("cosmiccore.star_ladder.whisper.transition.complete", + "A loud scream followed by complete silence, you've made it."); + + // Star Ladder — Phase 1 Ambient + provider.add("cosmiccore.star_ladder.whisper.ambient.p1.conduits_heating", "The conduits are heating up."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p1.groaning_walls", "Something groans in the walls."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p1.air_tastes_iron", "The air tastes like iron."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p1.floor_vibrating", "The floor is vibrating."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p1.low_hum", "A low hum, rising."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p1.sparks_corner", + "Sparks crackle at the corners of the terminal."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p1.lights_flicker", "The lights flicker and fail."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p1.smell_of_ozone", + "Smell of petrichor, the taste of sulfur."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p1.dust_falling", + "Dust falling from the ceiling, cracks in the walls."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p1.pipes_rattling", + "Pipes rattling somewhere deep, steam hisses."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p1.static_on_skin", + "Static crawling across your skin, the air electrified."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p1.shadows_wrong", + "The shadows are wrong, the stars sway."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p1.metal_ticking", + "Metal ticking as it expands, twisting."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p1.pressure_dropping", + "Pressure dropping, the rushing sound of air."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p1.something_woke_up", "Something woke up, and it's mad."); + + // Star Ladder — Phase 1 Observer + provider.add("cosmiccore.star_ladder.whisper.observer.p1.stop", "Curious."); + provider.add("cosmiccore.star_ladder.whisper.observer.p1.not_here", "This isn't your calling."); + provider.add("cosmiccore.star_ladder.whisper.observer.p1.leave", "Begone."); + provider.add("cosmiccore.star_ladder.whisper.observer.p1.no", "There is nothing for you here."); + + // Star Ladder — Phase 1 Reflection + provider.add("cosmiccore.star_ladder.whisper.reflection.p1.keep_feeding", "I need to keep fueling it."); + provider.add("cosmiccore.star_ladder.whisper.reflection.p1.hold", "Hold steady, my creation."); + provider.add("cosmiccore.star_ladder.whisper.reflection.p1.its_working", + "It works, I need to keep on pushing."); + + // Star Ladder — Phase 2 Ambient + provider.add("cosmiccore.star_ladder.whisper.ambient.p2.structure_resonating", + "The structure is resonating, a song is forming."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p2.heat_distortion", + "Heat distortion in the air, the sky burns orange."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p2.something_cracks", + "Something cracks, the earth shifts below."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p2.machine_screams", "The machine screams, it's in pain."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p2.ears_ringing", + "Your ears are ringing, you swear you hear words."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p2.metal_expanding", + "Metal expanding, popping, hissing, cracking."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p2.temperature_climbing", + "The temperature is climbing, your body is soaked in sweat."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p2.bolts_shearing", + "Bolts shearing off the frame, the structure feels unstable."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p2.gravity_hiccup", "Gravity hiccups, just for a moment."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p2.light_bends", + "Light bends where it shouldn't, your eyes are playing tricks."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p2.blood_in_mouth", "Taste of blood in your mouth grows."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p2.walls_humming", + "The walls are humming a note you can't name, discordantly."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p2.floor_buckling", + "The floor is buckling, the world is revolting."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p2.smell_of_burning", + "Smell of burning that isn't there, the taste of flesh and souls unknown."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p2.time_stutters", "Time stutters and jumps."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p2.vision_doubles", + "Your vision doubles, you see a woman cloaked in silver."); + + // Star Ladder — Phase 2 Observer + provider.add("cosmiccore.star_ladder.whisper.observer.p2.dont_understand", + "You don't understand what you're doing, this is beyond you."); + provider.add("cosmiccore.star_ladder.whisper.observer.p2.not_yours", + "This is not yours to take, you were mine to create"); + provider.add("cosmiccore.star_ladder.whisper.observer.p2.i_was_patient", "I was patient, you're testing that."); + provider.add("cosmiccore.star_ladder.whisper.observer.p2.you_were_warned", + "You're digging into things that should be left in the past"); + provider.add("cosmiccore.star_ladder.whisper.observer.p2.still_time", + "There is still time to stop, I'll neglect it this once."); + provider.add("cosmiccore.star_ladder.whisper.observer.p2.enough", "Enough."); + + // Star Ladder — Phase 2 Reflection + provider.add("cosmiccore.star_ladder.whisper.reflection.p2.channel_widening", + "The data stream is surging- I've made progress"); + provider.add("cosmiccore.star_ladder.whisper.reflection.p2.dont_stop", "Don't stop, this is it!"); + provider.add("cosmiccore.star_ladder.whisper.reflection.p2.halfway", "Still standing, halfway there."); + + // Star Ladder — Phase 3 Ambient + provider.add("cosmiccore.star_ladder.whisper.ambient.p3.everything_shaking", "Everything shakes in unison."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p3.veil_fraying", "The veil is fraying, the sky realigns"); + provider.add("cosmiccore.star_ladder.whisper.ambient.p3.light_bending_wrong", + "Light bends and reveals countless faces"); + provider.add("cosmiccore.star_ladder.whisper.ambient.p3.hands_shaking", + "Your hands are shaking, traces of blood not of yours cover them"); + provider.add("cosmiccore.star_ladder.whisper.ambient.p3.walls_breathing", + "The walls are breathing in tune with you."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p3.static_all_frequencies", + "Your mind feels the static noise of the world"); + provider.add("cosmiccore.star_ladder.whisper.ambient.p3.reality_thins", "Reality thickens and thins at random"); + provider.add("cosmiccore.star_ladder.whisper.ambient.p3.colors_wrong", + "You're perceiving new colors no human could"); + provider.add("cosmiccore.star_ladder.whisper.ambient.p3.sound_from_nowhere", "A sound from inside your mind"); + provider.add("cosmiccore.star_ladder.whisper.ambient.p3.edges_dissolving", + "The edge of consciousness dissolves"); + provider.add("cosmiccore.star_ladder.whisper.ambient.p3.gravity_uncertain", "Gravity feels like second nature"); + provider.add("cosmiccore.star_ladder.whisper.ambient.p3.air_tastes_of_stars", "The air tastes of star dust"); + provider.add("cosmiccore.star_ladder.whisper.ambient.p3.heartbeat_in_walls", + "You can hear your heartbeat in the walls"); + provider.add("cosmiccore.star_ladder.whisper.ambient.p3.ground_not_solid", "The ground shatters under you."); + provider.add("cosmiccore.star_ladder.whisper.ambient.p3.sky_too_close", "The heavens feel infinitely close"); + provider.add("cosmiccore.star_ladder.whisper.ambient.p3.something_looking_back", + "Something beyond you is glaring intensely"); + provider.add("cosmiccore.star_ladder.whisper.ambient.p3.tinnitus_screaming", "The sound is deafening"); + + // Star Ladder — Phase 3 Observer + provider.add("cosmiccore.star_ladder.whisper.observer.p3.fine", "Fine, make yourself into a monster"); + provider.add("cosmiccore.star_ladder.whisper.observer.p3.remember_this", "Remember this, you started this"); + provider.add("cosmiccore.star_ladder.whisper.observer.p3.you_chose_this", + "You chose this and there's no going back."); + provider.add("cosmiccore.star_ladder.whisper.observer.p3.will_not_forget", + "I will not forget, I won't let you forget."); + provider.add("cosmiccore.star_ladder.whisper.observer.p3.see_what_happens", "Let's see what happens, find me."); + provider.add("cosmiccore.star_ladder.whisper.observer.p3.door_opens_both_ways", + "The door opens both ways, to me, and to you."); + provider.add("cosmiccore.star_ladder.whisper.observer.p3.congratulations", + "Congratulations, you've done something beyond me."); + + // Star Ladder — Phase 3 Reflection + provider.add("cosmiccore.star_ladder.whisper.reflection.p3.almost_through", "Almost through, closing in."); + provider.add("cosmiccore.star_ladder.whisper.reflection.p3.one_more_push", "One more push, I can feel it"); + provider.add("cosmiccore.star_ladder.whisper.reflection.p3.can_feel_it", "I can feel everything around myself"); + + multiLang(provider, "cosmiccore.multiblock.iris.tooltip", + "§cYour Mind Shatters Trying to Understand This", + "§c§lDANGER: DO NOT RENDER THE JEI PREVIEW", + "§c§lDANGER: YOU WILL LAG OR CRASH YOUR GAME", + "§aFuture Multiblock - JEI preview will be disabled/optimized"); + + provider.add("block.gtceu.industrial_primitive_blast_furnace", "Industrial Primitive Blast Furnace"); + multiLang(provider, "cosmiccore.multiblock.ipbf.tooltip", + "§7§oTurn up the heat!", + "§fConsumes creosote with recipes to improve efficiency.", + "§aRecipes are §f25% §aFaster.", + "§aParallel Amount§f: §b8x§r"); + + provider.add("block.gtceu.high_pressure_assembler", "High Pressure Assembler"); + multiLang(provider, "cosmiccore.multiblock.hpsassem.tooltip", + "§7§oLet's build an empire!", + "§fA large but powerful assembler made of steel", + "§aParallel Amount§f: §b4x§r"); + + // Dimensional Energy Tooltip + multiLang(provider, "gtceu.machine.dec.tooltip", + "Stores power in an interdimensional pocket.", + "Can send/receive power to/from §bPower Substation Dimensional Interfaces", + "Can only create §cONE§r Power Substation per team/player.", + "§cDuplicates will not function.", + "§7Can Insert and Extract from your wireless networked linked to your §aPower Substation§r"); + + multiLang(provider, "cosmiccore.machine.capacitor_array.tooltip", + "§7Local Dense Power Storage§r", + "§7Can use any capacitor and be expanded vertically up to 18 times§r", + "§7Accepts §6Laser Hatches§r"); + + provider.add("emi.category.cosmiccore.asteroid_mining", "Asteroid Mining Operations"); + + // recipe stuff + provider.add("cosmiccore.recipe.soul_in", "Soul Input: %s"); + provider.add("cosmiccore.recipe.soul_out", "Soul Output: %s"); + provider.add("recipe.cosmiccore.raw_soul_in", "Raw Soul Input: %s"); + provider.add("recipe.cosmiccore.raw_soul_out", "Raw Soul Output: %s"); + provider.add("recipe.cosmiccore.refined_soul_in", "Refined Soul Input: %s"); + provider.add("recipe.cosmiccore.refined_soul_out", "Refined Soul Output: %s"); + provider.add("recipe.cosmiccore.proud_soul_in", "Proud Soul Input: %s"); + provider.add("recipe.cosmiccore.proud_soul_out", "Proud Soul Output: %s"); + provider.add("recipe.cosmiccore.greedy_soul_in", "Greedy Soul Input: %s"); + provider.add("recipe.cosmiccore.greedy_soul_out", "Greedy Soul Output: %s"); + provider.add("recipe.cosmiccore.lustful_soul_in", "Lustful Soul Input: %s"); + provider.add("recipe.cosmiccore.lustful_soul_out", "Lustful Soul Output: %s"); + provider.add("recipe.cosmiccore.envious_soul_in", "Envious Soul Input: %s"); + provider.add("recipe.cosmiccore.envious_soul_out", "Envious Soul Output: %s"); + provider.add("recipe.cosmiccore.gluttonous_soul_in", "Gluttonous Soul Input: %s"); + provider.add("recipe.cosmiccore.gluttonous_soul_out", "Gluttonous Soul Output: %s"); + provider.add("recipe.cosmiccore.wrathful_soul_in", "Wrathful Soul Input: %s"); + provider.add("recipe.cosmiccore.wrathful_soul_out", "Wrathful Soul Output: %s"); + provider.add("recipe.cosmiccore.slothful_soul_in", "Slothful Soul Input: %s"); + provider.add("recipe.cosmiccore.slothful_soul_out", "Slothful Soul Output: %s"); + provider.add("recipe.cosmiccore.temporal_soul_in", "Temporal Soul Input: %s"); + provider.add("recipe.cosmiccore.temporal_soul_out", "Temporal Soul Output: %s"); + provider.add("cosmiccore.recipe.sterile_in", "Sterilizer: %s %s"); + provider.add("cosmiccore.recipe.sterile_out", "ERROR?"); + provider.add("cosmiccore.recipe.ember_in", "Ember Input: %s"); + provider.add("cosmiccore.recipe.ember_out", "Ember Output: %s"); + provider.add("cosmiccore.wire_coil.magnet_capacity", " §fMax Field Strength: §f%s Tesla"); + provider.add("cosmiccore.wire_coil.magnet_regen", " §5Field Regen Rate: %s Tesla/t"); + provider.add("cosmiccore.wire_coil.eu_multiplier", " §aMagnet EU Cost: §c%s EU/t"); + provider.add("cosmiccore.wire_coil.magnet_stats", "§8Magnet Stats"); + provider.add("tooltip.cosmiccore.soul_hatch.input", "§cMax Recipe Input§f:§6 %s"); + provider.add("tooltip.cosmiccore.soul_hatch.output", "§cMax Soul Network Capacity§f:§6 %s"); + provider.add("tooltip.cosmiccore.ember_hatch.consumption", "§cMax Ember Consumption§f:§6 %s"); + provider.add("tooltip.cosmiccore.ember_hatch.capacity", "§cMax Ember capacity§f:§6 %s"); + provider.add("tooltip.cosmiccore.thermia_hatch_limit", "§cTemp. Limit: %sK"); + provider.add("cosmiccore.multiblock.magnetic_field_strength", "§fMax Field Strength§f:§6 %s"); + provider.add("cosmiccore.multiblock.magnetic_regen", "§aField Recovery Rate§f:§6 %sT/t"); + provider.add("gtceu.titan_fusion", "Titan Fusion Reactor"); // recipe type lang + + // SB Flavor Texts + provider.add("cosmiccore.vaccum_bubbler.desc", "Floatation Station Machination"); + provider.add("cosmiccore.thermomagnitizer.desc", "Heating and Magnets, what could go wrong"); + provider.add("cosmiccore.calx_reactor.desc", "Working wonders with the Arcane"); + provider.add("cosmiccore.mana_leaching_tub.desc", "Mana Soaker 9000"); + provider.add("cosmiccore.roaster.desc", "Marshmallows not included"); + + provider.add("tooltip.cosmiccore.asteroid_chip.unprogrammed", "Unprogrammed — no target data"); + provider.add("tooltip.cosmiccore.asteroid_chip.type", "Type: %s"); + provider.add("tooltip.cosmiccore.asteroid_chip.target", "Target ID: %s"); + provider.add("tooltip.cosmiccore.asteroid_chip.tier", "Acquisition Tier: %s"); + provider.add("tooltip.cosmiccore.asteroid_chip.lock", "Lock Strength: %s%%"); + provider.add("tooltip.cosmiccore.asteroid_chip.sector", "Sector: %s"); + provider.add("tooltip.cosmiccore.asteroid_chip.mode", "Mode: %s"); + + provider.add("tooltip.cosmiccore.asteroid.tiny", "Asteroid Size: Unknown"); + provider.add("tooltip.cosmiccore.asteroid.tier", "Asteroid Size: %s Kilotons"); + provider.add("cosmiccore.recipe.asteroid_weight_greater_1", "Greater Yields\nfrom Larger Asteroids"); + + // gui lines + provider.add("gui.cosmiccore.soul_hatch.label.import", "Soul Input Hatch"); + provider.add("gui.cosmiccore.soul_hatch.label.export", "Soul Output Hatch"); + provider.add("gui.cosmiccore.ember_hatch.label.import", "Ember Input Hatch"); + provider.add("gui.cosmiccore.ember_hatch.label.export", "Ember Output Hatch"); + provider.add("gui.cosmiccore.thermia_hatch.label.export", "§6Thermia Output Vent"); + provider.add("gui.cosmiccore.thermia_hatch.label.import", "§6Thermia Input Socket"); + provider.add("gui.cosmiccore.soul_hatch.owner", "Network Owner: %s"); + provider.add("gui.cosmiccore.soul_hatch.lp", "LP Stored: %s"); + provider.add("gui.cosmiccore.soul.network_contents", "Network Contents:"); + provider.add("gui.cosmiccore.soul.empty_network", "Network is empty."); + provider.add("gui.cosmiccore.soul.reset", "Soul network has been reset."); + provider.add("gui.cosmiccore.soul.raw.name", "Raw"); + provider.add("gui.cosmiccore.soul.refined.name", "Refined"); + provider.add("gui.cosmiccore.soul.proud.name", "Proud"); + provider.add("gui.cosmiccore.soul.greedy.name", "Greedy"); + provider.add("gui.cosmiccore.soul.lustful.name", "Lustful"); + provider.add("gui.cosmiccore.soul.envious.name", "Envious"); + provider.add("gui.cosmiccore.soul.gluttonous.name", "Gluttonous"); + provider.add("gui.cosmiccore.soul.wrathful.name", "Wrathful"); + provider.add("gui.cosmiccore.soul.slothful.name", "Slothful"); + provider.add("gui.cosmiccore.soul.temporal.name", "Temporal"); + provider.add("gui.cosmiccore.ember_hatch.ember", "Ember Stored: %s"); + provider.add("gui.cosmiccore.thermia_hatch.hatch_limit", "§cTemp. Limit:"); + provider.add("gui.cosmiccore.thermia_hatch.stored_temp", "§6Current Temp:"); + provider.add("gui.cosmiccore.sterilization_hatch", "Sterilization Hatch"); + provider.add("cosmiccore.multiblock.current_field_strength", "§fField Strength: %s"); + provider.add("cosmiccore.recipe.minField", "§fMin. Field Strength: %sT"); + provider.add("cosmiccore.recipe.fieldDecay", "§fField Decay: %sT/t"); + provider.add("cosmiccore.recipe.fieldSlam", "§fField Consumed: %sT"); + provider.add("cosmiccore.recipe.condition.titan.tooltip", "Requires Titan Reactor Tier: %s"); + + // Linked Partner Condition + provider.add("cosmiccore.recipe.condition.linked_partner.tooltip", "Requires %s linked partner(s)"); + provider.add("cosmiccore.recipe.condition.linked_partner.formed", + "Requires %s linked partner(s) with valid structure"); + provider.add("cosmiccore.recipe.condition.linked_partner.working", + "Requires %s linked partner(s) actively working"); + provider.add("cosmiccore.recipe.condition.linked_partner_dimension.tooltip", "Requires linked partner in %s"); + provider.add("cosmiccore.recipe.condition.linked_partner_dimension_item.tooltip", + "Requires %sx %s in partner in %s"); + provider.add("cosmiccore.recipe.condition.linked_partner_dimension_fluid.tooltip", + "Requires %smB %s in partner in %s"); + + provider.add("cosmiccore.multiblock.heat_value", "§6Current Heat: %s"); + provider.add("cosmiccore.multiblock.heat_capacity", "§cMax Heat: %s"); + + provider.add("cosmiccore.multiblock.current_contagion", "§6Contagion Strength: %s"); + provider.add("cosmiccore.multiblock.contagion_rate", "§cContagion Rate: %s/t"); + provider.add("cosmiccore.multiblock.cleaning_status", "§aCleaning Status: %s"); + provider.add("cosmiccore.multiblock.cleaning_status.error", "§cCleaning Status: §4No Cleaning Agent!"); + + provider.add("cosmic.multiblock.parallel", + "Overloading Parallels by 4x" + "\nMax Parallel: %d" + "\nOriginal Parallel: %d"); + provider.add("cosmic.multiblock.parallel.exact", "Performing %d Recipes in Parallel"); + + provider.add("cosmic.multiblock.parallel_fixed_64", "Max Parallel: %d"); + provider.add("cosmic.multiblock.parallel_fixed_64.exact", "Performing %d Recipes in Parallel"); + provider.add("cosmic.multiblock.orvex_tier", "§fReactor Tier§7: §6%s"); + provider.add("cosmic.multiblock.orvex_count", "§fOrvex Residue Extracted§7: %s"); + provider.add("cosmic.multiblock.orvex_upgrade_requires", "§fUpgrade Requires§7: %s"); + provider.add("cosmic.multiblock.orvex_upgrade_check", "§fUpgrade Status: §a%s"); + + provider.add("cosmiccore.multiblock.fuel_star", "§a§lFuel Star Core"); + provider.add("cosmiccore.multiblock.send_orbit_data", "§a§lSend Research Payload"); + provider.add("cosmiccore.multiblock.iris.star_stage_empty", "§aStar Core Stage§f: §6Compressed Gas Cloud"); + provider.add("cosmiccore.multiblock.iris.star_stage_early_star", "§aStar Core Stage§f: §6Infant Star"); + provider.add("cosmiccore.multiblock.iris.star_stage_request", + "§cStar Core Requires \n§r%s \n§cfor Next Stage."); + provider.add("cosmiccore.multiblock.iris.star_stage_sustain", + "§cStar Requires \n§r%s \n§cto avoid §lcataclysmic failure!"); + provider.add("cosmiccore.multiblock.advanced.star_ladder_tier", + "§aVomahine StarLadderOld Tether Tier§f: §b%s \n §aMax Research Modules§f: §b%s"); + provider.add("tagprefix.leached_ore", "Leached %s Ore"); + provider.add("tagprefix.prisma_frothed_ore", "Prisma Frothed %s Ore"); + provider.add("tagprefix.ultradense_plate", "Ultradense %s Plate"); + provider.add("tagprefix.heavy_beam", "Heavy %s Beam"); + provider.add("tagprefix.modular_shelling", "%s Modular Shelling"); + provider.add("tagprefix.plasmites", "%s Plasmites"); + provider.add("tagprefix.wire_spool", "%s Wire Spool"); + provider.add("tagprefix.shape_memory_foil", "%s Shaping Memory Foil"); + provider.add("tagprefix.alve_foil_insulator", "%s Alve Insulator"); + provider.add("tagprefix.raw_ore_cubic", "Cubic %s Ore"); + + provider.add("cosmiccore.multiblock.reboot_powergrid", "§aReboot All Connected Machines"); + provider.add("cosmiccore.multiblock.sleep_powergrid", "§cSuspend All Connected Machines"); + + provider.add("item.cosmiccore.debug.structure_writer.structural_scale", "Structure size: X:%s Y:%s Z:%s"); + provider.add("item.cosmiccore.debug.structure_writer.export_order", + "Pattern Export Order:\n §cC:%s§l§d/§aS:%s§l§d/§bA:%s"); + provider.add("item.cosmiccore.debug.structure_writer.export_to_log", "Print Aisles to Log"); + provider.add("item.cosmiccore.debug.structure_writer.rotate_along_x_axis", "Rotate X Axis"); + provider.add("item.cosmiccore.debug.structure_writer.rotate_along_y_axis", "Rotate Y Axis"); + provider.add("item.cosmiccore.debug.structure_writer.output_successful", + "Output Successful! Check your log file!"); + + // item tooltips + // TODO reorganize, use multiLang where applicable + provider.add("cosmiccore.lore.shard_small.0", "§6A shard from a past eternity"); + provider.add("cosmiccore.lore.shard_small.1", "§6it subtly echos to rewrite fate."); + provider.add("cosmiccore.lore.shard_large.0", "§aA large fragment from a past eternity"); + provider.add("cosmiccore.lore.shard_large.1", "§ait echos to rewrite fate."); + provider.add("cosmiccore.lore.shard_huge.0", "§3An abnormally massive cluster from past eternity."); + provider.add("cosmiccore.lore.shard_huge.1", "§3it screams and wails at you to undo history."); + provider.add("cosmiccore.lore.shard_huge.2", "§cYour mind shatters trying to understand this."); + + provider.add("cosmiccore.omnia_circuit.lv", "§6Works as any LV Circuit."); + provider.add("cosmiccore.omnia_circuit.mv", "§6Works as any MV Circuit."); + provider.add("cosmiccore.omnia_circuit.hv", "§6Works as any HV Circuit."); + provider.add("cosmiccore.omnia_circuit.ev", "§6Works as any EV Circuit."); + provider.add("cosmiccore.omnia_circuit.iv", "§6Works as any IV Circuit."); + provider.add("cosmiccore.omnia_circuit.luv", "§6Works as any LuV Circuit."); + provider.add("cosmiccore.omnia_circuit.zpm", "§6Works as any ZPM Circuit."); + provider.add("cosmiccore.omnia_circuit.uv", "§6Works as any UV Circuit."); + provider.add("cosmiccore.omnia_circuit.uhv", "§6Works as any UHV Circuit."); + provider.add("cosmiccore.omnia_circuit.uev", "§6Works as any UEV Circuit."); + provider.add("cosmiccore.omnia_circuit.uiv", "§6Works as any UIV Circuit."); + provider.add("cosmiccore.omnia_circuit.uxv", "§6Works as any UXV Circuit."); + provider.add("cosmiccore.omnia_circuit.opv", "§6Works as any OPV Circuit."); + + // Rune Lang + provider.add("cosmiccore.rune_vague", "§7§oLatent emotions seem to be missing."); + provider.add("cosmiccore.rune_emotion_weak.1", "§7§oAn incomplete ERA reaction is observed."); + provider.add("cosmiccore.rune_emotion_weak.2", + "§7§oStrong emotional and chemical reactions cause the slate to vibrate."); + provider.add("cosmiccore.arklys.1", "§6Ark - Structure"); + provider.add("cosmiccore.arklys.2", "§6Lys - Release"); + + provider.add("cosmiccore.tylomir.1", "§6Tylo - Formation"); + provider.add("cosmiccore.tylomir.2", "§6Mir - World"); + + provider.add("cosmiccore.khoruth.1", "§6Khor - Space"); + provider.add("cosmiccore.khoruth.2", "§6Ruth - Foundation"); + + provider.add("cosmiccore.zelothar.1", "§6Zelos - Zeal"); + provider.add("cosmiccore.zelothar.2", "§6Thar - Forge"); + + provider.add("cosmiccore.tenura.1", "§6Ten - Control"); + provider.add("cosmiccore.tenura.2", "§6Ura - Flow"); + + provider.add("cosmiccore.valdris.1", "§6Val - Overwhelm"); + provider.add("cosmiccore.valdris.2", "§6Dris - Connect"); + + provider.add("cosmiccore.conjuct_kholys.1", "§6Khor - Space"); + provider.add("cosmiccore.conjuct_kholys.2", "§6Lys - Release"); + provider.add("cosmiccore.conjuct_kholys_emotion.1", "§bE.R.A - Confidence"); + + provider.add("cosmiccore.conjuct_arklythar.1", "§6Ark - Structure"); + provider.add("cosmiccore.conjuct_arklythar.2", "§6Thar - Forge"); + provider.add("cosmiccore.conjuct_arklythar_emotion.1", "§bE.R.A - Resolve"); + + provider.add("cosmiccore.conjuct_valkruth.1", "§6Val - Overwhelming"); + provider.add("cosmiccore.conjuct_valkruth.2", "§6Ruth - Foundation"); + provider.add("cosmiccore.conjuct_valkruth_emotion.1", "§bE.R.A - Convergence"); + provider.add("gtceu.hellfire_foundry", "§cHellfire Foundry"); + + // embers lang + provider.add("cosmiccore.ember.capacity", "§cEmber Capacity:§6 %s"); + provider.add("cosmiccore.ember.transfer", "§cEmber Transfer Rate:§6 %s"); + + multiLang(provider, "item.cosmiccore.the_one_ring.tooltip", + "§6§oOne Ring to rule them all, One Ring to find them, One Ring to bring them all and in the darkness bind them.§r", + "You might find it hard to take off."); + + // generic machine tooltips + provider.add("item.cosmiccore.space_radio.tooltip", "§6Lets you hear sounds in space!"); + provider.add("item.cosmiccore.simple_rebreather.tooltip", + "§7Reduces oxygen drain in §bThin Air§7 environments."); + provider.add("item.cosmiccore.pressurized_rebreather.tooltip", + "§6Enables oxygen tank usage. Works in §cNo Air§6 environments."); + provider.add("cosmiccore.universal.tooltip.lube_info.0", + "§aProviding Better Lubricants increases the total EU created"); + provider.add("cosmiccore.universal.tooltip.lube_info.1", "§eLubricant§f: §c1x §fEU total @ 1000mb/hr"); + provider.add("cosmiccore.universal.tooltip.lube_info.2", + "§eAdv Lubricant§f: §c1.5x §fEU total @ 500mb/hr"); + provider.add("cosmiccore.universal.tooltip.lube_info.3", + "§eTears of the Universe§f: §c2x §fEU total @ 250mb/hr"); + + provider.add("cosmiccore.universal.boosting_agents.0", + "§aCan consume various boosters to increase EU/t multiplier"); + provider.add("cosmiccore.errors.bad_fuel", + "§aInsufficient Fuel Quality! \n Fuel Output Must be >720 EU total per unit"); + provider.add("cosmiccore.universal.boosting_agents.1", "§6Oxygen §ffor §a3x §fEu/t @ §b20mb/s "); + provider.add("cosmiccore.universal.boosting_agents.2", "§6Liquid Oxygen §ffor §a6x §fEu/t @ §b80mb/s "); + provider.add("cosmiccore.universal.boosting_agents.3", "§6Ichor §ffor §a9x §fEu/t @ §b10mb/s "); + + provider.add("cosmiccore.multiblock.booster_used", "Booster: %s"); + provider.add("cosmiccore.multiblock.lubricant_used", "Lubricant: %s"); + + provider.add("behavior.wireless_data.owner.player", "§3Player Name: §r"); + provider.add("behavior.wireless_data.owner.network", "§3Network Owner: §r"); + provider.add("behavior.wireless_data.owner.team", "§3Team Name: §r"); + provider.add("cosmiccore.wireless_charger.mode.0", "Set charger mode: SUPERCHARGER [Range - %s blocks]"); + provider.add("cosmiccore.wireless_charger.mode.1", "Set charger mode: STANDARD [Range - %s blocks]"); + provider.add("cosmiccore.wireless_charger.range.single", + "When in Supercharger mode, supplies 4A within %s blocks"); + provider.add("cosmiccore.wireless_charger.range.mixed", + "When in Standard Charge mode, supplies 1A within %s blocks"); + provider.add("cosmiccore.wireless_charger.enter_range", + "You have entered charging range [Range - %s blocks]"); + provider.add("cosmiccore.wireless_charger.left_range", "You have left charging range [Range - %s blocks]"); + provider.add("cosmiccore.circuit.lore.tier.max.0", "MAX Tier Circuit"); + provider.add("cosmiccore.circuit.lore.tier.max.1", "Not a processor- but an Obituary."); + provider.add("cosmiccore.circuit.lore.tier.max.2", "Input: Existence."); + provider.add("cosmiccore.circuit.lore.tier.max.3", "Output: A single conclusion."); + + provider.add("cosmiccore.lore.broken_virtue.0", "Perpetuity Shudders Softly"); + provider.add("cosmiccore.lore.broken_virtue.1", "Something has gone very wrong."); + + // Sanguine Warptech + provider.add("cosmiccore.armor.sanguinewarptech.hud.LP", "§4Life Force: §c%s"); + provider.add("cosmiccore.armor.sanguinewarptech.hud.shieldstate", "Sanguine Shield: %s"); + provider.add("cosmiccore.armor.sanguinewarptech.message.death_defiance", + "Your sanguine armor protected you from death!"); + + // Dimensional Energy Storage + provider.add("cosmic.multiblock.capacitor.info.tittle.global", "Global Network Info"); + provider.add("cosmic.multiblock.capacitor.info.tittle.local", "Local Buffer Info "); + provider.add("cosmic.multiblock.capacitor.info.global", "Global"); + provider.add("cosmic.multiblock.capacitor.info.local", "Local"); + provider.add("cosmic.multiblock.capacitor.buffered", "§7Buffered: %s §7EU"); + provider.add("cosmic.multiblock.capacitor.duplicate.multiblock.1", "This multiblock is a duplicate"); + provider.add("cosmic.multiblock.capacitor.duplicate.multiblock.2", "Only one can exist"); + provider.add("cosmic.multiblock.capacitor.owner.null", "Owner not found"); + + // Wireless Energy Command + provider.add("cosmic.command.wireless.energy.player", "§aPlayer:§a %s"); + provider.add("cosmic.command.wireless.energy.team", "§aTeam:§a %s"); + provider.add("cosmic.command.wireless.energy.header", "§eWireless Energy Network Info (§e %s §e)§e:"); + provider.add("cosmic.command.wireless.energy.capacity", " §bCapacity:§b %s EU"); + provider.add("cosmic.command.wireless.energy.stored", " §bStored:§b %s EU"); + provider.add("cosmic.command.wireless.energy.input", " §bInput:§b %s EU/t"); + provider.add("cosmic.command.wireless.energy.output", " §bOutput:§b %s EU/t"); + provider.add("cosmic.command.wireless.energy.buffered", " §bBuffered:§b %s EU"); + provider.add("cosmic.command.wireless.energy.active", " §bActive:§b %s"); + provider.add("cosmic.command.wireless.energy.location.format", "%s : x=%d y=%d z=%d"); + provider.add("cosmic.command.wireless.energy.no.capacitor", "No Formed Capacitor"); + provider.add("cosmic.command.wireless.energy.capacitor", " §bCapacitor Location:§b "); + + // Wireless Energy Curio + provider.add("cosmic.gui.wireless.energy.player", "§aPlayer:§a %s"); + provider.add("cosmic.gui.wireless.energy.team", "§aTeam:§a %s"); + provider.add("cosmic.gui.wireless.energy.header", "§eWireless Energy Network Info (§e %s §e)§e:"); + provider.add("cosmic.gui.wireless.energy.capacity", " §bCapacity:§b %s EU"); + provider.add("cosmic.gui.wireless.energy.stored", "§eStorage §b%s §f%s/%s"); + provider.add("cosmic.gui.wireless.energy.net", " §aEU NET: %s EU/t"); + provider.add("cosmic.gui.wireless.energy.input", "§aIN:§b %s EU/t"); + provider.add("cosmic.gui.wireless.energy.output", "§cOUTt:§b %s EU/t"); + provider.add("cosmic.gui.wireless.energy.buffered", " §bBuffered:§b %s EU"); + provider.add("cosmic.gui.wireless.energy.active", " §bActive:§b %s"); + provider.add("cosmic.gui.wireless.energy.location.format", "%s : x=%d y=%d z=%d"); + provider.add("cosmic.gui.wireless.energy.no.capacitor", "No Formed Capacitor"); + provider.add("cosmic.gui.wireless.energy.capacitor", " §bCapacitor Location:§b "); + + replace(provider, "item.cosmiccore.infinite_spray_can", "§lPrismatic Spray Can"); + + // AE2 EU Display Mixin + provider.add("gui.ae2.units.eu", "EU"); + + // HPCA + provider.add("cosmiccore.multiblock.hpca.incomplete-array", "Incomplete Array will not generate"); + + // Drone Station + provider.add("cosmiccore.multiblock.drone_station_machine.drone_amount", "Currently serving %s drones"); + provider.add("cosmiccore.multiblock.drone_station_machine.no_drones", "No drones connected"); + provider.add("cosmiccore.multiblock.drone_station_machine.current_tier", "Current tier: %s"); + + provider.add("cosmiccore.multiblock.drone_maintenance_interface.connection_location", + "Currently connected to (%s, %s, %s)"); + provider.add("cosmiccore.multiblock.drone_maintenance_interface.no_connection", "Not connected"); + + provider.add("debug.owner.uuid", "§aOwner UUID:§a %s"); + provider.add("debug.team.uuid", "§aTeam UUID:§a %s"); + + provider.add("cosmiccore.item.spraycan.tooltip.lclick", "§4Left Click: §8Cycle color"); + provider.add("cosmiccore.item.spraycan.tooltip.lclick_sneak", "§4Left Click + Sneak: §8Cycle color"); + provider.add("cosmiccore.item.spraycan.tooltip.rclick", "§4Right Click: §8Paint block"); + provider.add("cosmiccore.item.spraycan.tooltip.rclick_sneak", "§5Right Click + Sneak: §8Open UI"); + provider.add("cosmiccore.item.spraycan.tooltip.rclick_offhand", "§5Right Click in Offhand: §8Place & paint"); + provider.add("cosmiccore.item.spraycan.tooltip.locked", "Spraycan is locked"); + provider.add("cosmiccore.item.spraycan.tooltip.current_color", "Current Color: %s"); + provider.add("cosmiccore.item.spraycan.tooltip.solvent_mode", "Spraycan in SOLVENT mode"); + provider.add("cosmiccore.item.spraycan.gui.title", "Prismatic Spray Can"); + provider.add("cosmiccore.item.spraycan.gui.solvent", "Solvent (Strip Color)"); + provider.add("cosmiccore.item.spraycan.locked", "Spray Can is locked"); + provider.add("cosmiccore.item.spraycan.actionbar.color", "Spray Can Color: %s"); + provider.add("cosmiccore.item.spraycan.now_locked", "Spray Can locked"); + provider.add("cosmiccore.item.spraycan.now_unlocked", "Spray Can unlocked"); + + provider.add("cosmiccore.item.linked_terminal.boundTo", "Bound to %s"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_oxygen", "Lofty Oxygen"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_hydrogen", "Lofty Hydrogen"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_nitrogen", "Lofty Nitrogen"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_argon", "Lofty Argon"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_rose_polymer", "Rose Polymer"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_citrus_polymer", "Citrus Polymer"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_waxy_polymer", "Waxy Polymer"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_pale", "Pale"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_soul", "Soul"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_runic", "Runic"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_ambrosic", "Ambrosic"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_biohazard", "Biohazard"); + + provider.add("allele.forestry.bee_species.cosmiccore.bee_abrasive", "Abrasive"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_energized", "Energized"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_slick", "Slick"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_pyrolytic", "Pyrolytic"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_lunar", "Lunar"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_solar", "Solar"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_cosmos", "Cosmos"); + + provider.add("allele.forestry.bee_species.cosmiccore.bee_hadal", "Hadal"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_shaman", "Shaman"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_ashen", "Ashen"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_fracking", "Fracking"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_fate", "Fate"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_grand_garden", "Grand Garden"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_architect", "Architect"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_inquisitive", "Inquisitive"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_hellsmith", "Hellsmith"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_radoxia", "Radoxia"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_absent", "Absent"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_illusive", "Illusive"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_constructive", "Constructive"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_prismatic", "Prismatic"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_hydraulic", "Hydraulic"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_cobbled", "Cobbled"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_exhaustive", "Exhaustive"); + provider.add("allele.forestry.bee_species.cosmiccore.bee_virtue", "Virtue"); + + provider.add("item.cosmiccore.bee_comb_lofty_oxygen", "Lofty Oxygen Comb"); + provider.add("item.cosmiccore.bee_comb_lofty_hydrogen", "Lofty Hydrogen Comb"); + provider.add("item.cosmiccore.bee_comb_lofty_nitrogen", "Lofty Nitrogen Comb"); + provider.add("item.cosmiccore.bee_comb_lofty_argon", "Lofty Argon Comb"); + provider.add("item.cosmiccore.bee_comb_rose_polymer", "Rose Polymer Comb"); + provider.add("item.cosmiccore.bee_comb_citrus_polymer", "Citrus Polymer Comb"); + provider.add("item.cosmiccore.bee_comb_waxy_polymer", "Waxy Polymer Comb"); + provider.add("item.cosmiccore.bee_comb_pale", "Pale Comb"); + provider.add("item.cosmiccore.bee_comb_soul", "Soul Comb"); + provider.add("item.cosmiccore.bee_comb_runic", "Runic Comb"); + provider.add("item.cosmiccore.bee_comb_ambrosic", "Ambrosic Comb"); + provider.add("item.cosmiccore.bee_comb_biohazard", "Biohazard Comb"); + + provider.add("item.cosmiccore.bee_comb_abrasive", "Abrasive Comb"); + provider.add("item.cosmiccore.bee_comb_energized", "Energized Comb"); + provider.add("item.cosmiccore.bee_comb_slick", "Slick Comb"); + provider.add("item.cosmiccore.bee_comb_pyrolytic", "Pyrolytic Comb"); + provider.add("item.cosmiccore.bee_comb_lunar", "Lunar Comb"); + provider.add("item.cosmiccore.bee_comb_solar", "Solar Comb"); + provider.add("item.cosmiccore.bee_comb_cosmos", "Cosmos Comb"); + + provider.add("item.cosmiccore.bee_comb_hadal", "Hadal Comb"); + provider.add("item.cosmiccore.bee_comb_shaman", "Shaman Comb"); + provider.add("item.cosmiccore.bee_comb_ashen", "Ashen Comb"); + provider.add("item.cosmiccore.bee_comb_fracking", "Fracking Comb"); + provider.add("item.cosmiccore.bee_comb_fate", "Fate Comb"); + provider.add("item.cosmiccore.bee_comb_grand_garden", "Grand Garden Comb"); + provider.add("item.cosmiccore.bee_comb_architect", "Architect Comb"); + provider.add("item.cosmiccore.bee_comb_inquisitive", "Inquisitive Comb"); + provider.add("item.cosmiccore.bee_comb_hellsmith", "Hellsmith Comb"); + provider.add("item.cosmiccore.bee_comb_radoxia", "Radoxia Comb"); + provider.add("item.cosmiccore.bee_comb_absent", "Absent Comb"); + provider.add("item.cosmiccore.bee_comb_illusive", "Illusive Comb"); + provider.add("item.cosmiccore.bee_comb_constructive", "Constructive Comb"); + provider.add("item.cosmiccore.bee_comb_prismatic", "Prismatic Comb"); + provider.add("item.cosmiccore.bee_comb_hydraulic", "Hydraulic Comb"); + provider.add("item.cosmiccore.bee_comb_cobbled", "Cobbled Comb"); + provider.add("item.cosmiccore.bee_comb_exhaustive", "Exhaustive Comb"); + provider.add("item.cosmiccore.bee_comb_virtue", "Virtue Comb"); + + provider.add("gui.cosmiccore.iapiary", "Industrial Apiary"); + provider.add("gui.cosmiccore.iapiary.yield", "Yield: %d"); + provider.add("gui.cosmiccore.iapiary.duration", "Duration: %d"); + provider.add("gui.cosmiccore.iapiary.production_amp", "Production Amp: %d"); + + provider.add("item.cosmicbees.bee.modifier.aging_multiplier", "Age Multiplier"); + provider.add("item.cosmiccore.decaying_cosmic_upgrade", "Decaying Upgrade"); + provider.add("item.cosmiccore.decaying_cosmic_upgrade.tooltip", + "§cInstantly Kills Bees and overloads the lifetime cycle"); + + provider.add("item.cosmiccore.wailing_cosmic_upgrade", "Wailing Upgrade"); + provider.add("item.cosmiccore.wailing_cosmic_upgrade.tooltip", "§cMaximum Mutation"); + + multiLang(provider, "cosmiccore.machine.me.stocking_item.tooltip", + "§fAutomatically pulls products into a singular item slot§r", + "§bAllows Advanced Automation of the Assembly line§r", + "§fCan be set to automatically pull the first item from AE2§r", + "§bor manually filtered.§r", + "§fFilter data can be copy/pasted with a data stick§r", + "§b'If you're wondering how to parallel assembly lines§r", + "§fthis is how. Welcome to subnets!§r"); + + // Cross-Dimensional Multiblock Linking + provider.add("cosmiccore.datastick.link_copied", "Link: %s"); + provider.add("cosmiccore.link.copied", "Link data copied from %s"); + provider.add("cosmiccore.link.established", "Link established: %s ↔ %s"); + + // Link validation errors + provider.add("cosmiccore.link.not_ready", "Machine not ready for linking"); + provider.add("cosmiccore.link.invalid_data", "Invalid link data on datastick"); + provider.add("cosmiccore.link.cannot_self_link", "Cannot link a machine to itself"); + provider.add("cosmiccore.link.partner_not_loaded", "Partner machine must be loaded to establish link"); + provider.add("cosmiccore.link.partner_missing", "Partner machine no longer exists"); + provider.add("cosmiccore.link.not_linkable", "Target machine does not support linking"); + provider.add("cosmiccore.link.different_owner", "Cannot link machines owned by different teams"); + provider.add("cosmiccore.link.incompatible_roles", "Incompatible link roles: %s cannot link to %s"); + provider.add("cosmiccore.link.limit_reached_self", "This machine has reached its link limit"); + provider.add("cosmiccore.link.limit_reached_partner", "Partner machine has reached its link limit"); + provider.add("cosmiccore.link.incompatible_self", "This machine cannot link to that type"); + provider.add("cosmiccore.link.incompatible_partner", "Partner machine cannot link to this type"); + provider.add("cosmiccore.link.already_linked", "These machines are already linked"); + provider.add("cosmiccore.link.too_far", "Partner is too far away to force-load for linking"); + + // Link runtime status + provider.add("cosmiccore.recipe.waiting_for_partner", "Waiting for linked partner"); + provider.add("cosmiccore.link.partner_offline", "Linked partner offline"); + provider.add("cosmiccore.multiblock.drone_station_machine.tier.0", "Plasmatic"); + provider.add("cosmiccore.multiblock.drone_station_machine.tier.1", "Sanguine"); + provider.add("cosmiccore.multiblock.drone_station_machine.tier.2", "Industrial"); + provider.add("cosmiccore.multiblock.drone_station_machine.tier.3", "Robust"); + provider.add("cosmiccore.multiblock.drone_station_machine.tier.4", "Rusty"); + provider.add("cosmiccore.multiblock.drone_station_machine.tier.5", "None"); + provider.add("cosmiccore.calorific.tooltip.prefix", "§5Calorific:§r %s"); + provider.add("cosmiccore.lubricant.tooltip.prefix", "§6Lubricant:§r Tier %s"); + provider.add("cosmiccore.booster.tooltip.prefix", "§bBooster:§r Tier %s"); + + // Dreamer's Basin - Multithreaded Machine + multiLang(provider, "cosmiccore.machine.dreamers_basin.tooltip", + "§bRuns multiple unique recipes simultaneously", + "§fEach thread requires a uniquely §6colored§f input bus/hatch", + "§fMax threads = Energy Hatch amperage (4A=4, 16A=16)", + "§aAll threads share output buses/hatches"); + + // Multithreaded Machine Display (base) + provider.add("cosmiccore.machine.multithreaded.thread_status", "§b=== Thread Status ==="); + provider.add("cosmiccore.machine.multithreaded.max_threads", "§7Max Threads: §f%s"); + provider.add("cosmiccore.machine.multithreaded.active_threads", "§7Active: §a%s§7/§f%s"); + + // Dreamer's Basin Custom UI + provider.add("cosmiccore.machine.dreamers_basin.thread_header", "Thread Status"); + provider.add("cosmiccore.machine.dreamers_basin.threads_summary", "%s running / %s active / %s max"); + provider.add("cosmiccore.machine.dreamers_basin.eu_budget_header", "Energy Budget"); + provider.add("cosmiccore.machine.dreamers_basin.eu_per_thread", "%s EU/t per thread (%s)"); + provider.add("cosmiccore.machine.dreamers_basin.time_remaining", "Time: %s remaining"); + provider.add("cosmiccore.machine.dreamers_basin.status_idle", "Idle - No recipe"); + provider.add("cosmiccore.machine.dreamers_basin.status_waiting", "Waiting for inputs"); + provider.add("cosmiccore.machine.dreamers_basin.status_suspended", "Suspended"); + provider.add("cosmiccore.machine.dreamers_basin.status_unknown", "Unknown"); + + // Dreamer's Basin Hover Tooltips + provider.add("cosmiccore.machine.dreamers_basin.tooltip.crafting", "Crafting:"); + provider.add("cosmiccore.machine.dreamers_basin.tooltip.no_recipe", "No recipe data"); + provider.add("cosmiccore.machine.dreamers_basin.tooltip.processing", " Processing..."); + provider.add("cosmiccore.machine.dreamers_basin.tooltip.duration", "Recipe duration: %s"); + + // Ore Extraction Drill + provider.add("cosmiccore.machine.ore_extraction_drill.tooltip.0", + "§bExtracts ores from a 9x9 chunk area below the drill while only requiring the drill to be chunk loaded"); + provider.add("cosmiccore.machine.ore_extraction_drill.tooltip.1", + "§fRemoval Chance: §e%s §f(chance to deplete ore per extraction)"); + provider.add("cosmiccore.machine.ore_extraction_drill.tooltip.2", + "§fEffective Yield: §a%sx §f(average extractions per ore)"); + provider.add("cosmiccore.machine.ore_extraction_drill.tooltip.3", + "§7Use screwdriver to restart scan after completion, will run until no ore is present"); + provider.add("cosmiccore.machine.ore_extraction_drill.restarted", + "Drill scan restarted"); + + // Stellar Iris Widget UI + provider.add("cosmiccore.stellar.prestige.title", "STELLAR CONVERGENCE"); + provider.add("cosmiccore.stellar.prestige.points_earned", "POINTS EARNED"); + provider.add("cosmiccore.stellar.prestige.total_points", "Total: %s points"); + provider.add("cosmiccore.stellar.prestige.current_tier", "CURRENT TIER"); + provider.add("cosmiccore.stellar.prestige.next_tier", "%s pts for %s"); + provider.add("cosmiccore.stellar.prestige.max_tier", "MAXIMUM TIER REACHED"); + provider.add("cosmiccore.stellar.prestige.tier_up", "TIER UP!"); + provider.add("cosmiccore.stellar.prestige.continue", "[Click anywhere to continue]"); + + provider.add("cosmiccore.stellar.prestige.tier.novice", "NOVICE"); + provider.add("cosmiccore.stellar.prestige.tier.apprentice", "APPRENTICE"); + provider.add("cosmiccore.stellar.prestige.tier.journeyman", "JOURNEYMAN"); + provider.add("cosmiccore.stellar.prestige.tier.expert", "EXPERT"); + provider.add("cosmiccore.stellar.prestige.tier.master", "MASTER"); + provider.add("cosmiccore.stellar.prestige.tier.grandmaster", "GRANDMASTER"); + provider.add("cosmiccore.stellar.prestige.tier.unknown", "UNKNOWN"); + + provider.add("cosmiccore.stellar.ignition.requires_star", "REQUIRES ACTIVE STAR"); + provider.add("cosmiccore.stellar.ignition.breaking", "!!! BREAKING !!!"); + provider.add("cosmiccore.stellar.ignition.ignite", "IGNITE"); + + provider.add("cosmiccore.stellar.module.status", "Status"); + provider.add("cosmiccore.stellar.module.status.processing", "PROCESSING"); + provider.add("cosmiccore.stellar.module.status.idle", "IDLE"); + provider.add("cosmiccore.stellar.module.status.offline", "OFFLINE"); + provider.add("cosmiccore.stellar.module.status.ready", "READY"); + provider.add("cosmiccore.stellar.module.status.iris_inactive", "IRIS INACTIVE"); + provider.add("cosmiccore.stellar.module.status.disconnected", "DISCONNECTED"); + provider.add("cosmiccore.stellar.module.status.power_fail", "POWER FAIL"); + provider.add("cosmiccore.stellar.module.status.no_wireless", "NO WIRELESS"); + + provider.add("cosmiccore.stellar.module.max_eut", "Max EU/t"); + provider.add("cosmiccore.stellar.module.parallel", "Parallel"); + provider.add("cosmiccore.stellar.module.parallel_max", "%sx (max %s)"); + provider.add("cosmiccore.stellar.module.current", "Current"); + provider.add("cosmiccore.stellar.module.speed_bonus", "Speed Bonus"); + provider.add("cosmiccore.stellar.module.iris_limit", "Iris Limit"); + provider.add("cosmiccore.stellar.module.stage", "Stage"); + provider.add("cosmiccore.stellar.module.waiting_iris", "Waiting for Iris"); + provider.add("cosmiccore.stellar.module.not_linked", "Not linked to Stellar Iris"); + provider.add("cosmiccore.stellar.module.config", "Module Config"); + + provider.add("cosmiccore.stellar.power.title", "Power Control Panel"); + provider.add("cosmiccore.stellar.power.max_parallel", "Maximum Parallel"); + provider.add("cosmiccore.stellar.power.voltage_per_parallel", "Voltage Per Parallel"); + + provider.add("cosmiccore.stellar.stage.initialization", "INITIALIZATION"); + provider.add("cosmiccore.stellar.stage.stellar_ignition", "STELLAR IGNITION"); + provider.add("cosmiccore.stellar.stage.stellar_operations", "STELLAR OPERATIONS"); + provider.add("cosmiccore.stellar.stage.critical_mass", "CRITICAL MASS"); + provider.add("cosmiccore.stellar.stage.singularity_control", "SINGULARITY CONTROL"); + provider.add("cosmiccore.stellar.stage.emergency_protocols", "EMERGENCY PROTOCOLS"); + provider.add("cosmiccore.stellar.stage.controlled_shutdown", "CONTROLLED SHUTDOWN"); + + provider.add("cosmiccore.stellar.context.empty_line1", "Insert star seed and"); + provider.add("cosmiccore.stellar.context.empty_line2", "provide stellar gases"); + provider.add("cosmiccore.stellar.context.empty_line3", "to begin ignition."); + provider.add("cosmiccore.stellar.context.growing_line1", "Stellar fusion"); + provider.add("cosmiccore.stellar.context.growing_line2", "initiating..."); + provider.add("cosmiccore.stellar.context.star_line1", "Stable fusion active"); + provider.add("cosmiccore.stellar.context.star_line2", "Processing available"); + provider.add("cosmiccore.stellar.context.superstar_line1", "WARNING: Critical mass"); + provider.add("cosmiccore.stellar.context.superstar_line2", "Collapse imminent"); + provider.add("cosmiccore.stellar.context.blackhole_line1", "Singularity contained"); + provider.add("cosmiccore.stellar.context.blackhole_line2", "Exotic processing"); + provider.add("cosmiccore.stellar.context.death_line1", "CRITICAL FAILURE"); + provider.add("cosmiccore.stellar.context.death_line2", "SOUL FUSE ENGAGED"); + provider.add("cosmiccore.stellar.context.death_graceful_line1", "Controlled shutdown"); + provider.add("cosmiccore.stellar.context.death_graceful_line2", "in progress..."); + + provider.add("cosmiccore.stellar.slot.star_seed", "Star Seed"); + + // ========================================================================= + // REFLECTION SYSTEM + // ========================================================================= + initReflectionLang(provider); + } + + private static void initReflectionLang(RegistrateLangProvider provider) { + // UI Elements - Basic + provider.add("reflection.cosmiccore.ui.void_title", "The Mirror"); + provider.add("reflection.cosmiccore.ui.constellation_title", "The Threads"); + provider.add("reflection.cosmiccore.ui.available_bargains", "Available Bargains"); + provider.add("reflection.cosmiccore.ui.your_bargains", "Your Bargains"); + provider.add("reflection.cosmiccore.ui.defiance", "Defiance"); + provider.add("reflection.cosmiccore.ui.continue", "[Continue]"); + provider.add("reflection.cosmiccore.ui.acknowledge", "[I understand]"); + provider.add("reflection.cosmiccore.ui.back", "[Back]"); + provider.add("reflection.cosmiccore.ui.exit", "[Leave]"); + provider.add("reflection.cosmiccore.ui.leave", "[Leave this place]"); + provider.add("reflection.cosmiccore.ui.view_bargains", "[View Available Bargains]"); + provider.add("reflection.cosmiccore.ui.view_active", "[View Your Bargains]"); + provider.add("reflection.cosmiccore.ui.enter_defiance", "[Enter Defiance Mode]"); + provider.add("reflection.cosmiccore.ui.defy_bargain", "[Defy This Bargain]"); + provider.add("reflection.cosmiccore.ui.confirm_defiance", "[Confirm Defiance]"); + provider.add("reflection.cosmiccore.ui.cancel", "[Cancel]"); + provider.add("reflection.cosmiccore.ui.select", "[Select]"); + provider.add("reflection.cosmiccore.ui.no_bargains", "No bargains accepted yet."); + provider.add("reflection.cosmiccore.ui.defiance_warning", + "Defying a bargain will cost you power but restore some of your soul."); + provider.add("reflection.cosmiccore.ui.powers", "Powers:"); + provider.add("reflection.cosmiccore.ui.drawbacks", "Drawbacks:"); + provider.add("reflection.cosmiccore.ui.soul_erosion", "Soul Erosion: %d%%"); + provider.add("reflection.cosmiccore.ui.soul_erosion_display", "Soul Erosion: %s%%"); + provider.add("reflection.cosmiccore.ui.soul_label", "Soul"); + provider.add("reflection.cosmiccore.ui.dialogue_continue", "Click to continue..."); + provider.add("reflection.cosmiccore.ui.no_available_bargains", "No threads within reach... for now."); + provider.add("reflection.cosmiccore.ui.select_to_view", "Select a bargain to view details"); + provider.add("reflection.cosmiccore.ui.cost", "Cost: %d erosion"); + provider.add("reflection.cosmiccore.ui.erosion", "erosion"); + provider.add("reflection.cosmiccore.ui.of", "of"); + provider.add("reflection.cosmiccore.ui.defy", "Defy"); + provider.add("reflection.cosmiccore.ui.tooltip.no_details", "No additional details"); + + // Scroll indicators + provider.add("reflection.cosmiccore.ui.scroll_up", "\u25B2 Scroll up"); + provider.add("reflection.cosmiccore.ui.scroll_down", "\u25BC Scroll down"); + + // Hub menu options + provider.add("reflection.cosmiccore.ui.review_bargains", "[Examine your %s threads]"); + provider.add("reflection.cosmiccore.ui.browse_bargains", "[Reach for %s threads]"); + provider.add("reflection.cosmiccore.ui.gaze_constellation", "[Look at the threads]"); + provider.add("reflection.cosmiccore.ui.just_look", "[Just... look at yourself]"); + provider.add("reflection.cosmiccore.ui.unlock_cost", "Cost: %d soul erosion"); + provider.add("reflection.cosmiccore.ui.defiance_cost", "Defiance will cost %d erosion"); + + // Hub option details + provider.add("reflection.cosmiccore.ui.hub.review.power", "See what you've pulled loose"); + provider.add("reflection.cosmiccore.ui.hub.review.drawback", "Consider defying a thread"); + provider.add("reflection.cosmiccore.ui.hub.browse.power", "See what threads are within reach"); + provider.add("reflection.cosmiccore.ui.hub.browse.response", "Threads scatter in the dark. So many."); + provider.add("reflection.cosmiccore.ui.hub.browse.response_empty", "Nothing within reach. Yet."); + provider.add("reflection.cosmiccore.ui.hub.reflect.power", "Look at what you've become"); + provider.add("reflection.cosmiccore.ui.hub.review_response", "The pulled threads glow faintly."); + provider.add("reflection.cosmiccore.ui.hub.reflect_response", "You look at yourself. Really look."); + provider.add("reflection.cosmiccore.ui.hub.leave_response", "You turn away from the mirror."); + + // Hub greetings — self-observations, not entity dialogue + provider.add("reflection.cosmiccore.ui.hub.greeting.many_bargains_high.0", + "So many gaps in the shell. You can see your core through them."); + provider.add("reflection.cosmiccore.ui.hub.greeting.many_bargains_high.1", + "Do you even remember what the shell looked like whole?"); + provider.add("reflection.cosmiccore.ui.hub.greeting.many_bargains.0", + "The shell is thinning. Threads trail outward into the dark."); + provider.add("reflection.cosmiccore.ui.hub.greeting.many_bargains.1", + "Each thread pulled leaves a little more exposed."); + provider.add("reflection.cosmiccore.ui.hub.greeting.has_bargains.0", + "Threads trail from you into the starfield. You've been busy."); + provider.add("reflection.cosmiccore.ui.hub.greeting.has_bargains.1", + "More threads still wait. Pinned in the dark."); + provider.add("reflection.cosmiccore.ui.hub.greeting.has_scars.0", + "Scars where threads were defied. Knots that won't untangle."); + provider.add("reflection.cosmiccore.ui.hub.greeting.has_scars.1", + "You pulled, then pushed back. The marks remain."); + provider.add("reflection.cosmiccore.ui.hub.greeting.has_scars.2", + "Was the cost of keeping them too high?"); + provider.add("reflection.cosmiccore.ui.hub.greeting.erosion_no_bargains.0", + "Your shell is worn, but no threads trail from it. Strange."); + provider.add("reflection.cosmiccore.ui.hub.greeting.erosion_no_bargains.1", + "Something else has been wearing at you."); + provider.add("reflection.cosmiccore.ui.hub.greeting.erosion_no_bargains.2", + "The threads still wait. Maybe it's time."); + provider.add("reflection.cosmiccore.ui.hub.greeting.fresh.0", + "The shell is whole. Dense. Untouched."); + provider.add("reflection.cosmiccore.ui.hub.greeting.fresh.1", + "Threads pin the starfield around you. Waiting."); + provider.add("reflection.cosmiccore.ui.hub.greeting.question", "You look into the mirror."); + + // Reflection dialogues (erosion-based) — self-observations + provider.add("reflection.cosmiccore.ui.reflection.no_erosion.0", "Whole. Dense. Untouched."); + provider.add("reflection.cosmiccore.ui.reflection.no_erosion.1", + "The threads wait in the dark, pinned and patient."); + provider.add("reflection.cosmiccore.ui.reflection.no_erosion.2", "You haven't pulled anything yet."); + provider.add("reflection.cosmiccore.ui.reflection.low_erosion.0", + "A thread or two trails from the shell. Just the start."); + provider.add("reflection.cosmiccore.ui.reflection.low_erosion.1", "The gaps are small. Barely visible."); + provider.add("reflection.cosmiccore.ui.reflection.mid_erosion.0", + "The shell is thinning. Your core glows through the gaps."); + provider.add("reflection.cosmiccore.ui.reflection.mid_erosion.1", + "You're getting used to the feeling of less."); + provider.add("reflection.cosmiccore.ui.reflection.high_erosion.0", + "So many threads pulled loose. The shell is fragile now."); + provider.add("reflection.cosmiccore.ui.reflection.high_erosion.1", + "Your core is almost fully visible. Raw. Exposed."); + provider.add("reflection.cosmiccore.ui.reflection.extreme_erosion.0", + "Almost nothing left to pull. The shell is threadbare."); + provider.add("reflection.cosmiccore.ui.reflection.extreme_erosion.1", + "One more thread and there's nothing between your core and the void."); + provider.add("reflection.cosmiccore.ui.reflection.has_bargains.0", + "Threads trail from you into the starfield."); + provider.add("reflection.cosmiccore.ui.reflection.has_bargains.1", + "Each one a piece of yourself, pulled loose."); + + // Browsing bargains + provider.add("reflection.cosmiccore.ui.browse.interesting_choice", "You reach for a thread."); + + // Defiance UI — self-talk, not entity warning + provider.add("reflection.cosmiccore.ui.defiance.question", "Push this thread back?"); + provider.add("reflection.cosmiccore.ui.defiance.lose_power", "The power from this thread will fade"); + provider.add("reflection.cosmiccore.ui.defiance.scar_remains", + "A knot will remain where it was \u2014 forever"); + provider.add("reflection.cosmiccore.ui.defiance.confirm", "[Yes, push it back]"); + provider.add("reflection.cosmiccore.ui.defiance.cancel", "[No, leave it]"); + provider.add("reflection.cosmiccore.ui.defiance.so_be_it", "The thread tears loose. It hurts."); + provider.add("reflection.cosmiccore.ui.defiance.wise", "You let it stay. The thread holds."); + provider.add("reflection.cosmiccore.ui.defiance.will_lose", "You will lose: %s"); + provider.add("reflection.cosmiccore.ui.defiance.cost_amount", "This will cost %d erosion"); + provider.add("reflection.cosmiccore.ui.defiance.cannot_undo", "This cannot be undone"); + provider.add("reflection.cosmiccore.ui.defiance.warning1", "Push back the thread of %s?"); + provider.add("reflection.cosmiccore.ui.defiance.warning2", "The cost of defiance is %d erosion."); + provider.add("reflection.cosmiccore.ui.defiance.warning3", "The power will leave. The scar will not."); + provider.add("reflection.cosmiccore.ui.defiance.warning4", "Are you certain?"); + + // Constellation UI + provider.add("reflection.cosmiccore.ui.forever_scarred", "Forever Scarred"); + provider.add("reflection.cosmiccore.ui.click_to_bargain", "Click to bargain"); + provider.add("reflection.cosmiccore.ui.click_to_defy", "Click to defy (%d erosion)"); + provider.add("reflection.cosmiccore.ui.power", "Power"); + provider.add("reflection.cosmiccore.ui.drawback", "Drawback"); + + // ========================================================================= + // BARGAINS + // ========================================================================= + + // --- Quake Movement Bargain (quake_movement) --- + provider.add("reflection.cosmiccore.bargain.quake_movement.name", "Velocity"); + provider.add("reflection.cosmiccore.bargain.quake_movement.description", + "Something in your legs remembers a different way to move"); + provider.add("reflection.cosmiccore.bargain.quake_movement.dialogue.0", + "This thread hums with motion. Your legs ache just touching it."); + provider.add("reflection.cosmiccore.bargain.quake_movement.dialogue.1", + "There's a memory in it \u2014 of moving differently. Before physics became rigid."); + provider.add("reflection.cosmiccore.bargain.quake_movement.dialogue.2", + "Your muscles twitch. They want to remember."); + provider.add("reflection.cosmiccore.bargain.quake_movement.dialogue.3", + "Pull it, and your body will never be content with stillness again."); + provider.add("reflection.cosmiccore.bargain.quake_movement.question", + "Your legs remember something. Do you let them?"); + provider.add("reflection.cosmiccore.bargain.quake_movement.answer.yes.text", "Let them remember."); + provider.add("reflection.cosmiccore.bargain.quake_movement.answer.yes.response", + "Your joints crack. Your muscles rewire. Movement becomes instinct."); + provider.add("reflection.cosmiccore.bargain.quake_movement.answer.yes.power.0", + "Bunny hopping preserves and builds momentum"); + provider.add("reflection.cosmiccore.bargain.quake_movement.answer.yes.power.1", + "Air strafing for mid-air direction control"); + provider.add("reflection.cosmiccore.bargain.quake_movement.answer.yes.drawback.0", + "Movement feels unnatural to observers"); + provider.add("reflection.cosmiccore.bargain.quake_movement.answer.refuse.text", + "Leave it. My feet know their own rhythm."); + provider.add("reflection.cosmiccore.bargain.quake_movement.answer.refuse.response", + "The thread stills. The ache fades. For now."); + provider.add("reflection.cosmiccore.bargain.quake_movement.on_accept", + "Something unravels. Your stride breaks open into something new."); + provider.add("reflection.cosmiccore.bargain.quake_movement.on_defy", + "The speed fades like a dream you can't quite hold onto."); + + // --- Depths Bargain (depths) --- + provider.add("reflection.cosmiccore.bargain.depths.name", "The Depths"); + provider.add("reflection.cosmiccore.bargain.depths.description", "Your breath stretches beyond mortal limits"); + provider.add("reflection.cosmiccore.bargain.depths.dialogue.0", + "This thread is cold. Wet. It smells like deep water."); + provider.add("reflection.cosmiccore.bargain.depths.dialogue.1", + "You remember the burn in your lungs. The panic of drowning."); + provider.add("reflection.cosmiccore.bargain.depths.dialogue.2", + "Something in this thread could stretch your breath. Remake it."); + provider.add("reflection.cosmiccore.bargain.depths.dialogue.3", + "But there's a sharpness at the end. A finality."); + provider.add("reflection.cosmiccore.bargain.depths.dialogue.4", + "When the breath runs out, there will be no warning."); + provider.add("reflection.cosmiccore.bargain.depths.dialogue.5", + "No gasps. No fading. Just silence."); + provider.add("reflection.cosmiccore.bargain.depths.question", + "The thread could reshape your breath. Do you pull it?"); + provider.add("reflection.cosmiccore.bargain.depths.answer.embrace.text", "Pull it. Remake me for the depths."); + provider.add("reflection.cosmiccore.bargain.depths.answer.embrace.response", + "Your chest feels hollow. The new capacity needs room."); + provider.add("reflection.cosmiccore.bargain.depths.answer.embrace.power.0", "5x oxygen capacity underwater"); + provider.add("reflection.cosmiccore.bargain.depths.answer.embrace.power.1", + "Extended breath in toxic atmospheres"); + provider.add("reflection.cosmiccore.bargain.depths.answer.embrace.drawback.0", + "Instant death when oxygen fully depletes"); + provider.add("reflection.cosmiccore.bargain.depths.answer.embrace.drawback.1", + "No drowning damage warning - just death"); + provider.add("reflection.cosmiccore.bargain.depths.answer.refuse.text", + "Leave it. I'll keep my mortal breath."); + provider.add("reflection.cosmiccore.bargain.depths.answer.refuse.response", + "The thread sinks back into the dark. The depths wait."); + provider.add("reflection.cosmiccore.bargain.depths.on_accept", + "Something shifts in your chest. The air tastes different now."); + provider.add("reflection.cosmiccore.bargain.depths.on_defy", + "Your lungs remember panic, remember struggle. You are mortal again."); + + // --- Swiftness Bargain (swiftness) --- + provider.add("reflection.cosmiccore.bargain.swiftness.name", "Swiftness"); + provider.add("reflection.cosmiccore.bargain.swiftness.description", + "The world slows down around you"); + provider.add("reflection.cosmiccore.bargain.swiftness.dialogue.0", + "This thread vibrates. Fast. Everything around it seems sluggish."); + provider.add("reflection.cosmiccore.bargain.swiftness.dialogue.1", + "Your blood aches to race. Your legs want to blur."); + provider.add("reflection.cosmiccore.bargain.swiftness.dialogue.2", + "But speed has a hunger to it. Stillness will gnaw at you."); + provider.add("reflection.cosmiccore.bargain.swiftness.question", + "The thread hums with speed. Do you pull it?"); + provider.add("reflection.cosmiccore.bargain.swiftness.answer.accept.text", "Pull it. Let me run."); + provider.add("reflection.cosmiccore.bargain.swiftness.answer.accept.response", + "Lightning arcs through your muscles. You twitch with restless energy."); + provider.add("reflection.cosmiccore.bargain.swiftness.answer.accept.power.0", "+40% movement speed"); + provider.add("reflection.cosmiccore.bargain.swiftness.answer.accept.power.1", "Sprint without hunger drain"); + provider.add("reflection.cosmiccore.bargain.swiftness.answer.accept.drawback.0", + "Increased hunger when standing still"); + provider.add("reflection.cosmiccore.bargain.swiftness.answer.refuse.text", + "Leave it. I'm content with my pace."); + provider.add("reflection.cosmiccore.bargain.swiftness.answer.refuse.response", + "The vibration stills. The world keeps its pace."); + provider.add("reflection.cosmiccore.bargain.swiftness.on_accept", + "Something unwinds. The world blurs at the edges."); + provider.add("reflection.cosmiccore.bargain.swiftness.on_defy", + "The world speeds back up around you. Merely human once more."); + + // --- Stride Bargain (stride) --- + provider.add("reflection.cosmiccore.bargain.stride.name", "Stride"); + provider.add("reflection.cosmiccore.bargain.stride.description", "The ground rises to meet your feet"); + provider.add("reflection.cosmiccore.bargain.stride.dialogue.0", + "A smooth thread. Flat. The ground seems to yield just touching it."); + provider.add("reflection.cosmiccore.bargain.stride.dialogue.1", + "Every ledge, every small obstacle \u2014 they'd simply accommodate you."); + provider.add("reflection.cosmiccore.bargain.stride.dialogue.2", + "Your feet would never need to leave the ground."); + provider.add("reflection.cosmiccore.bargain.stride.dialogue.3", + "But edges would lose their grip on you too. No catching yourself."); + provider.add("reflection.cosmiccore.bargain.stride.question", + "The ground could flatten before you. Do you pull?"); + provider.add("reflection.cosmiccore.bargain.stride.answer.accept.text", "Pull it. Let the world flatten."); + provider.add("reflection.cosmiccore.bargain.stride.answer.accept.response", + "The earth shifts slightly. Terrain reshapes itself for your step."); + provider.add("reflection.cosmiccore.bargain.stride.answer.accept.power.0", "Auto step-up to 1 block height"); + provider.add("reflection.cosmiccore.bargain.stride.answer.accept.power.1", "Smooth terrain traversal"); + provider.add("reflection.cosmiccore.bargain.stride.answer.accept.drawback.0", "Cannot crouch-walk off edges"); + provider.add("reflection.cosmiccore.bargain.stride.answer.refuse.text", "Leave it. I'll climb my own way."); + provider.add("reflection.cosmiccore.bargain.stride.answer.refuse.response", + "The thread settles back. The world keeps its edges."); + provider.add("reflection.cosmiccore.bargain.stride.on_accept", + "Something loosens underfoot. The world smooths itself for you."); + provider.add("reflection.cosmiccore.bargain.stride.on_defy", + "Every ledge is a challenge again. The ground doesn't care about you."); + + // --- Darksight Bargain (darksight) --- + provider.add("reflection.cosmiccore.bargain.darksight.name", "Darksight"); + provider.add("reflection.cosmiccore.bargain.darksight.description", "Your eyes learn to drink the shadow"); + provider.add("reflection.cosmiccore.bargain.darksight.dialogue.0", + "This thread is dark. Obviously. But it's warm somehow."); + provider.add("reflection.cosmiccore.bargain.darksight.dialogue.1", + "You can feel what it offers \u2014 the shadow surrendering its secrets."); + provider.add("reflection.cosmiccore.bargain.darksight.dialogue.2", + "Every hidden corner, laid bare. No torch needed."); + provider.add("reflection.cosmiccore.bargain.darksight.dialogue.3", + "But there's a sting at the other end. The sun. It would burn."); + provider.add("reflection.cosmiccore.bargain.darksight.dialogue.4", + "Trade daylight for the gift of seeing in the dark."); + provider.add("reflection.cosmiccore.bargain.darksight.question", + "The thread would open your eyes to the dark. Do you pull?"); + provider.add("reflection.cosmiccore.bargain.darksight.answer.yes.text", "Pull it. Let me see."); + provider.add("reflection.cosmiccore.bargain.darksight.answer.yes.response", + "Your pupils dilate... and keep dilating. The dark becomes your domain."); + provider.add("reflection.cosmiccore.bargain.darksight.answer.yes.power.0", "Permanent Night Vision effect"); + provider.add("reflection.cosmiccore.bargain.darksight.answer.yes.power.1", "See in complete darkness"); + provider.add("reflection.cosmiccore.bargain.darksight.answer.yes.drawback.0", + "Blindness effect in bright sunlight"); + provider.add("reflection.cosmiccore.bargain.darksight.answer.yes.drawback.1", + "Must stay underground during day"); + provider.add("reflection.cosmiccore.bargain.darksight.answer.refuse.text", + "Leave it. The light serves me well enough."); + provider.add("reflection.cosmiccore.bargain.darksight.answer.refuse.response", + "The thread fades. The torchlight feels brighter for a moment."); + provider.add("reflection.cosmiccore.bargain.darksight.on_accept", + "The shadows retreat from your vision. You see everything now."); + provider.add("reflection.cosmiccore.bargain.darksight.on_defy", + "Light floods back. The darkness closes its secrets to you once more."); + + // --- Carapace Bargain (carapace) --- + provider.add("reflection.cosmiccore.bargain.carapace.name", "Carapace"); + provider.add("reflection.cosmiccore.bargain.carapace.description", + "Your flesh hardens into something enduring"); + provider.add("reflection.cosmiccore.bargain.carapace.dialogue.0", + "This thread is rigid. Hard. Your skin tightens just touching it."); + provider.add("reflection.cosmiccore.bargain.carapace.dialogue.1", + "It would harden you. Blows would glance off. Damage would diminish."); + provider.add("reflection.cosmiccore.bargain.carapace.dialogue.2", + "But there's a numbness woven through it."); + provider.add("reflection.cosmiccore.bargain.carapace.dialogue.3", + "Touch would become distant. Healing, slower."); + provider.add("reflection.cosmiccore.bargain.carapace.dialogue.4", + "Survival at the cost of sensation."); + provider.add("reflection.cosmiccore.bargain.carapace.question", + "The thread would harden your flesh. Do you pull?"); + provider.add("reflection.cosmiccore.bargain.carapace.answer.survive.text", "Pull it. I choose survival."); + provider.add("reflection.cosmiccore.bargain.carapace.answer.survive.response", + "Your skin tightens. Hardens. Something more durable."); + provider.add("reflection.cosmiccore.bargain.carapace.answer.survive.power.0", + "+8 armor points (4 full armor icons)"); + provider.add("reflection.cosmiccore.bargain.carapace.answer.survive.power.1", "Stacks with worn armor"); + provider.add("reflection.cosmiccore.bargain.carapace.answer.survive.drawback.0", + "-20% healing from all sources"); + provider.add("reflection.cosmiccore.bargain.carapace.answer.survive.drawback.1", + "Reduced potion effectiveness"); + provider.add("reflection.cosmiccore.bargain.carapace.answer.refuse.text", + "Leave it. I'd rather feel than merely endure."); + provider.add("reflection.cosmiccore.bargain.carapace.answer.refuse.response", + "The rigidity eases. Your skin stays soft. Fragile. Yours."); + provider.add("reflection.cosmiccore.bargain.carapace.on_accept", + "Your flesh ripples and tightens. It doesn't hurt. That's the point."); + provider.add("reflection.cosmiccore.bargain.carapace.on_defy", + "Sensation floods back \u2014 every breeze, every texture. You are soft again."); + + // --- Soft Landing Bargain (soft_landing) --- + provider.add("reflection.cosmiccore.bargain.soft_landing.name", "Soft Landing"); + provider.add("reflection.cosmiccore.bargain.soft_landing.description", + "Gravity loosens its grip on you"); + provider.add("reflection.cosmiccore.bargain.soft_landing.dialogue.0", + "This thread is light. Weightless. It drifts when you touch it."); + provider.add("reflection.cosmiccore.bargain.soft_landing.dialogue.1", + "You remember falling. The sickening moment before impact."); + provider.add("reflection.cosmiccore.bargain.soft_landing.dialogue.2", + "This would soften every landing. The ground would forgive you."); + provider.add("reflection.cosmiccore.bargain.soft_landing.dialogue.3", + "But something else loosens with it. You'd be more fragile overall."); + provider.add("reflection.cosmiccore.bargain.soft_landing.dialogue.4", + "Lighter. Softer. Easier to break in other ways."); + provider.add("reflection.cosmiccore.bargain.soft_landing.question", + "The thread would catch your falls. Do you pull?"); + provider.add("reflection.cosmiccore.bargain.soft_landing.answer.yes.text", + "Pull it. Take away the fear of falling."); + provider.add("reflection.cosmiccore.bargain.soft_landing.answer.yes.response", + "Weight leaves you. The ground will catch you now."); + provider.add("reflection.cosmiccore.bargain.soft_landing.answer.yes.power.0", "80% fall damage immunity"); + provider.add("reflection.cosmiccore.bargain.soft_landing.answer.yes.power.1", "Short falls do almost nothing"); + provider.add("reflection.cosmiccore.bargain.soft_landing.answer.yes.drawback.0", + "+15% damage taken from all sources"); + provider.add("reflection.cosmiccore.bargain.soft_landing.answer.yes.drawback.1", + "Reduced knockback resistance"); + provider.add("reflection.cosmiccore.bargain.soft_landing.answer.refuse.text", + "Leave it. Fear keeps me cautious."); + provider.add("reflection.cosmiccore.bargain.soft_landing.answer.refuse.response", + "The thread settles. Gravity keeps its hold."); + provider.add("reflection.cosmiccore.bargain.soft_landing.on_accept", + "Your relationship with gravity shifts. It still pulls, but gently now."); + provider.add("reflection.cosmiccore.bargain.soft_landing.on_defy", + "Weight crashes back into your bones. Every fall matters again."); + + // --- Cinder Bargain (cinder) --- + provider.add("reflection.cosmiccore.bargain.cinder.name", "Cinder"); + provider.add("reflection.cosmiccore.bargain.cinder.description", "Fire cannot harm what has already burned"); + provider.add("reflection.cosmiccore.bargain.cinder.dialogue.0", + "This thread is hot. It smolders. Your fingers don't burn \u2014 they should."); + provider.add("reflection.cosmiccore.bargain.cinder.dialogue.1", + "Ash and ember. Something in this thread has already burned completely."); + provider.add("reflection.cosmiccore.bargain.cinder.dialogue.2", + "Pull it, and fire would lose its claim on you. You'd walk through infernos."); + provider.add("reflection.cosmiccore.bargain.cinder.dialogue.3", + "But the cold would sharpen. Water would sting. Heat is a one-way door."); + provider.add("reflection.cosmiccore.bargain.cinder.dialogue.4", + "Burn once, completely, and never burn again."); + provider.add("reflection.cosmiccore.bargain.cinder.question", + "The thread smolders with old fire. Do you pull?"); + provider.add("reflection.cosmiccore.bargain.cinder.answer.burn.text", "Pull it. Burn me completely."); + provider.add("reflection.cosmiccore.bargain.cinder.answer.burn.response", + "Heat floods through you, then recedes. Fire will never frighten you again."); + provider.add("reflection.cosmiccore.bargain.cinder.answer.burn.power.0", "Complete fire and lava immunity"); + provider.add("reflection.cosmiccore.bargain.cinder.answer.burn.power.1", "Can swim in lava safely"); + provider.add("reflection.cosmiccore.bargain.cinder.answer.burn.drawback.0", + "2x damage from freezing and cold sources"); + provider.add("reflection.cosmiccore.bargain.cinder.answer.burn.drawback.1", + "Water extinguishes slower, feels unpleasant"); + provider.add("reflection.cosmiccore.bargain.cinder.answer.refuse.text", + "Leave it. Fire should be respected."); + provider.add("reflection.cosmiccore.bargain.cinder.answer.refuse.response", + "The thread cools. The heat stays outside where it belongs."); + provider.add("reflection.cosmiccore.bargain.cinder.on_accept", + "Something inside ignites and dies in the same instant. Ash. Freedom."); + provider.add("reflection.cosmiccore.bargain.cinder.on_defy", + "The warmth drains away. Flames flicker hungrily when they see you now."); + + // --- Vitality Bargain (vitality) --- + provider.add("reflection.cosmiccore.bargain.vitality.name", "Vitality"); + provider.add("reflection.cosmiccore.bargain.vitality.description", "More life, but slower to mend"); + provider.add("reflection.cosmiccore.bargain.vitality.dialogue.0", + "This thread throbs. You can feel a pulse in it. A second heartbeat."); + provider.add("reflection.cosmiccore.bargain.vitality.dialogue.1", + "More blood. More breath. More heartbeats before the end."); + provider.add("reflection.cosmiccore.bargain.vitality.dialogue.2", + "But the excess stretches you thin. Healing would slow."); + provider.add("reflection.cosmiccore.bargain.vitality.dialogue.3", + "A bigger vessel, but one that takes longer to refill."); + provider.add("reflection.cosmiccore.bargain.vitality.dialogue.4", + "Recovery for resilience. That's the trade."); + provider.add("reflection.cosmiccore.bargain.vitality.question", + "The thread pulses with life. Do you pull?"); + provider.add("reflection.cosmiccore.bargain.vitality.answer.accept.text", "Pull it. Give me more life."); + provider.add("reflection.cosmiccore.bargain.vitality.answer.accept.response", + "Your heart swells. Literally. It has more to pump now."); + provider.add("reflection.cosmiccore.bargain.vitality.answer.accept.power.0", "+10 max health (5 extra hearts)"); + provider.add("reflection.cosmiccore.bargain.vitality.answer.accept.power.1", + "Increased damage absorption buffer"); + provider.add("reflection.cosmiccore.bargain.vitality.answer.accept.drawback.0", + "-50% natural regeneration rate"); + provider.add("reflection.cosmiccore.bargain.vitality.answer.accept.drawback.1", + "Healing potions 30% less effective"); + provider.add("reflection.cosmiccore.bargain.vitality.answer.refuse.text", + "Leave it. I'll work with what I have."); + provider.add("reflection.cosmiccore.bargain.vitality.answer.refuse.response", + "The pulse fades. Your heart keeps its rhythm."); + provider.add("reflection.cosmiccore.bargain.vitality.on_accept", + "Your veins surge with new vigor. Everything feels more present."); + provider.add("reflection.cosmiccore.bargain.vitality.on_defy", + "The excess drains away. You are mortal-sized once more."); + + // --- Satiated Bargain (satiated) --- + provider.add("reflection.cosmiccore.bargain.satiated.name", "Satiated"); + provider.add("reflection.cosmiccore.bargain.satiated.description", "Hunger fades to a distant memory"); + provider.add("reflection.cosmiccore.bargain.satiated.dialogue.0", + "This thread is hollow. Empty. Your stomach quiets near it."); + provider.add("reflection.cosmiccore.bargain.satiated.dialogue.1", + "The constant gnawing would stop. Fullness would be your natural state."); + provider.add("reflection.cosmiccore.bargain.satiated.dialogue.2", + "You'd eat for taste, for ritual \u2014 never for need."); + provider.add("reflection.cosmiccore.bargain.satiated.dialogue.3", + "But taste itself would dull. Food becomes fuel. Nothing more."); + provider.add("reflection.cosmiccore.bargain.satiated.dialogue.4", + "And without hunger's edge, your body forgets how to mend itself."); + provider.add("reflection.cosmiccore.bargain.satiated.question", + "The thread would silence your hunger. Do you pull?"); + provider.add("reflection.cosmiccore.bargain.satiated.answer.empty.text", "Pull it. Free me from this hunger."); + provider.add("reflection.cosmiccore.bargain.satiated.answer.empty.response", + "The gnawing stops. Silence in your belly. Freedom."); + provider.add("reflection.cosmiccore.bargain.satiated.answer.empty.power.0", "Hunger depletes 80% slower"); + provider.add("reflection.cosmiccore.bargain.satiated.answer.empty.power.1", "Food provides 3x saturation"); + provider.add("reflection.cosmiccore.bargain.satiated.answer.empty.drawback.0", + "You can not regenerate health normally"); + provider.add("reflection.cosmiccore.bargain.satiated.answer.empty.drawback.1", + "Cannot benefit from food-based buffs"); + provider.add("reflection.cosmiccore.bargain.satiated.answer.refuse.text", + "Leave it. I enjoy my meals."); + provider.add("reflection.cosmiccore.bargain.satiated.answer.refuse.response", + "The emptiness settles back. Your stomach growls. Familiar."); + provider.add("reflection.cosmiccore.bargain.satiated.on_accept", + "The gnawing stops. Silence in your belly. Freedom."); + provider.add("reflection.cosmiccore.bargain.satiated.on_defy", + "Hunger returns with a vengeance. You remember what need feels like."); + + // --- Back Bargain (back) --- + provider.add("reflection.cosmiccore.bargain.back.name", "The Way Back"); + provider.add("reflection.cosmiccore.bargain.back.description", "A thread to where you last fell"); + provider.add("reflection.cosmiccore.bargain.back.dialogue.0", + "This thread feels like deja vu. Like remembering where you left something."); + provider.add("reflection.cosmiccore.bargain.back.dialogue.1", + "Death scatters you. But this would leave a trail back."); + provider.add("reflection.cosmiccore.bargain.back.dialogue.2", + "A connection to where you fell. Follow it back, once per death."); + provider.add("reflection.cosmiccore.bargain.back.question", + "The thread would remember your deaths. Do you pull?"); + provider.add("reflection.cosmiccore.bargain.back.answer.accept.text", "Pull it. Let me find my way back."); + provider.add("reflection.cosmiccore.bargain.back.answer.accept.response", + "Death becomes a waypoint now. Not an ending \u2014 a detour."); + provider.add("reflection.cosmiccore.bargain.back.answer.accept.power.0", + "Teleport to death location (once per death)"); + provider.add("reflection.cosmiccore.bargain.back.answer.accept.power.1", "Death marker visible through walls"); + provider.add("reflection.cosmiccore.bargain.back.answer.accept.drawback.0", "5 erosion cost per teleport use"); + provider.add("reflection.cosmiccore.bargain.back.answer.accept.drawback.1", "Marker fades after 10 minutes"); + provider.add("reflection.cosmiccore.bargain.back.answer.refuse.text", + "Leave it. Death should have consequences."); + provider.add("reflection.cosmiccore.bargain.back.answer.refuse.response", + "The thread dims. Death keeps its finality."); + provider.add("reflection.cosmiccore.bargain.back.on_accept", + "A thread connects you to your last breath. You can follow it back."); + provider.add("reflection.cosmiccore.bargain.back.on_defy", "The thread snaps. Death becomes final once more."); + + // --- Home Bargain (home) --- + provider.add("reflection.cosmiccore.bargain.home.name", "Homeward"); + provider.add("reflection.cosmiccore.bargain.home.description", "Home is never more than a thought away"); + provider.add("reflection.cosmiccore.bargain.home.dialogue.0", + "This thread is warm. Familiar. It smells like your bed, your walls."); + provider.add("reflection.cosmiccore.bargain.home.dialogue.1", + "Home. The anchor. It could be instant. Unbreakable."); + provider.add("reflection.cosmiccore.bargain.home.dialogue.2", + "But the tether costs something each time. And wandering far dulls you."); + provider.add("reflection.cosmiccore.bargain.home.question", + "The thread leads home. Do you pull?"); + provider.add("reflection.cosmiccore.bargain.home.answer.accept.text", "Pull it. Bind me to home."); + provider.add("reflection.cosmiccore.bargain.home.answer.accept.response", + "A cord stretches between you and home. Pull it anytime."); + provider.add("reflection.cosmiccore.bargain.home.answer.accept.power.0", "Instant teleport to spawn/bed point"); + provider.add("reflection.cosmiccore.bargain.home.answer.accept.power.1", "5 minute cooldown between uses"); + provider.add("reflection.cosmiccore.bargain.home.answer.accept.drawback.0", "10 erosion cost per teleport"); + provider.add("reflection.cosmiccore.bargain.home.answer.accept.drawback.1", "-10% XP gain while far from home"); + provider.add("reflection.cosmiccore.bargain.home.answer.refuse.text", + "Leave it. Home should be earned."); + provider.add("reflection.cosmiccore.bargain.home.answer.refuse.response", + "The warmth fades. Home stays where it is. You'll walk."); + provider.add("reflection.cosmiccore.bargain.home.on_accept", + "A cord of void stretches between you and home. Pull it anytime."); + provider.add("reflection.cosmiccore.bargain.home.on_defy", + "The cord dissolves. Home is a journey again, not a shortcut."); + + // --- Ascension Bargain (ascension) --- + provider.add("reflection.cosmiccore.bargain.ascension.name", "Ascension"); + provider.add("reflection.cosmiccore.bargain.ascension.description", "The sky opens. The ground becomes alien."); + provider.add("reflection.cosmiccore.bargain.ascension.dialogue.0", + "This thread drifts upward. It tugs at you. Your feet feel heavy."); + provider.add("reflection.cosmiccore.bargain.ascension.dialogue.1", + "Not gliding. Not falling with style. True flight."); + provider.add("reflection.cosmiccore.bargain.ascension.dialogue.2", + "The sky would open like a door. You'd never need the ground again."); + provider.add("reflection.cosmiccore.bargain.ascension.dialogue.3", + "But the ground would become alien. Uncomfortable. Wrong."); + provider.add("reflection.cosmiccore.bargain.ascension.dialogue.4", + "Your legs would grow sluggish. Walking would feel like punishment."); + provider.add("reflection.cosmiccore.bargain.ascension.dialogue.5", + "You'd belong to the sky. Not the earth."); + provider.add("reflection.cosmiccore.bargain.ascension.question", + "The thread pulls upward. Do you follow it?"); + provider.add("reflection.cosmiccore.bargain.ascension.answer.ready.text", "Pull it. I'm ready to fly."); + provider.add("reflection.cosmiccore.bargain.ascension.answer.ready.response", + "Weight leaves you. The sky opens. You are no longer earth-bound."); + provider.add("reflection.cosmiccore.bargain.ascension.answer.ready.power.0", + "Creative-style flight (toggle with jump while airborne)"); + provider.add("reflection.cosmiccore.bargain.ascension.answer.ready.power.1", + "Fly indefinitely without hunger or stamina cost"); + provider.add("reflection.cosmiccore.bargain.ascension.answer.ready.power.2", + "Full 3D movement control while flying"); + provider.add("reflection.cosmiccore.bargain.ascension.answer.ready.power.3", + "No fall damage while flight is active"); + provider.add("reflection.cosmiccore.bargain.ascension.answer.ready.drawback.0", + "-30% movement speed when not flying"); + provider.add("reflection.cosmiccore.bargain.ascension.answer.ready.drawback.1", + "Vulnerable in no-fly zones or enclosed spaces"); + provider.add("reflection.cosmiccore.bargain.ascension.answer.refuse.text", + "Leave it. The ground has served me well."); + provider.add("reflection.cosmiccore.bargain.ascension.answer.refuse.response", + "The thread floats back. Your feet stay heavy. Grounded."); + provider.add("reflection.cosmiccore.bargain.ascension.on_accept", + "Something unravels downward. The sky opens. You rise."); + provider.add("reflection.cosmiccore.bargain.ascension.on_defy", + "Gravity reclaims you. The ground pulls you back, possessively."); + + // --- Violence Bargain (violence) --- + provider.add("reflection.cosmiccore.bargain.violence.name", "Violence"); + provider.add("reflection.cosmiccore.bargain.violence.description", + "Your restraints dissolve. Everything becomes breakable."); + provider.add("reflection.cosmiccore.bargain.violence.dialogue.0", + "This thread is sharp. Ragged. It wants to cut something."); + provider.add("reflection.cosmiccore.bargain.violence.dialogue.1", + "You hold back every swing. Some part of you fears the damage you could do."); + provider.add("reflection.cosmiccore.bargain.violence.dialogue.2", + "This would remove that restraint. Let it flow freely."); + provider.add("reflection.cosmiccore.bargain.violence.dialogue.3", + "But violence flows both ways. You'd break things easier \u2014 and break easier."); + provider.add("reflection.cosmiccore.bargain.violence.dialogue.4", + "No shields. No hiding. Just force."); + provider.add("reflection.cosmiccore.bargain.violence.question", + "The thread is sharp and eager. Do you pull?"); + provider.add("reflection.cosmiccore.bargain.violence.answer.accept.text", "Pull it. Remove my restraints."); + provider.add("reflection.cosmiccore.bargain.violence.answer.accept.response", + "Power surges through your arms. Everything looks so breakable now."); + provider.add("reflection.cosmiccore.bargain.violence.answer.accept.power.0", "+30% melee damage dealt"); + provider.add("reflection.cosmiccore.bargain.violence.answer.accept.power.1", "+15% attack speed"); + provider.add("reflection.cosmiccore.bargain.violence.answer.accept.drawback.0", + "+20% damage taken from all sources"); + provider.add("reflection.cosmiccore.bargain.violence.answer.accept.drawback.1", "Cannot use shields"); + provider.add("reflection.cosmiccore.bargain.violence.answer.refuse.text", + "Leave it. Restraint is its own strength."); + provider.add("reflection.cosmiccore.bargain.violence.answer.refuse.response", + "The sharpness dulls. Your fists unclench."); + provider.add("reflection.cosmiccore.bargain.violence.on_accept", + "Something snaps loose inside. The rage was always there. Now it's free."); + provider.add("reflection.cosmiccore.bargain.violence.on_defy", + "The rage drains away. Your blows return to mortal weight."); + + // --- Reach Bargain (reach) --- + provider.add("reflection.cosmiccore.bargain.reach.name", "Reach"); + provider.add("reflection.cosmiccore.bargain.reach.description", "Your grasp extends beyond what's natural"); + provider.add("reflection.cosmiccore.bargain.reach.dialogue.0", + "This thread stretches. Long. Your arms ache near it."); + provider.add("reflection.cosmiccore.bargain.reach.dialogue.1", + "Everything just slightly out of reach \u2014 this thread would close that gap."); + provider.add("reflection.cosmiccore.bargain.reach.dialogue.2", + "Build farther. Strike farther. But your hands would feel wrong."); + provider.add("reflection.cosmiccore.bargain.reach.dialogue.3", + "Slower to work. Harder to pick things up close. The price of extension."); + provider.add("reflection.cosmiccore.bargain.reach.question", + "The thread stretches outward. Do you pull?"); + provider.add("reflection.cosmiccore.bargain.reach.answer.further.text", + "Pull it. Stretch me further."); + provider.add("reflection.cosmiccore.bargain.reach.answer.further.response", + "Something shifts in your shoulders. Your arms remember being longer."); + provider.add("reflection.cosmiccore.bargain.reach.answer.further.power.0", + "+3 block reach (build from further)"); + provider.add("reflection.cosmiccore.bargain.reach.answer.further.power.1", "+2 attack reach"); + provider.add("reflection.cosmiccore.bargain.reach.answer.further.drawback.0", "-15% mining speed"); + provider.add("reflection.cosmiccore.bargain.reach.answer.further.drawback.1", "Item pickup range reduced"); + provider.add("reflection.cosmiccore.bargain.reach.answer.refuse.text", + "Leave it. My reach is sufficient."); + provider.add("reflection.cosmiccore.bargain.reach.answer.refuse.response", + "The thread contracts. The world stays at arm's length."); + provider.add("reflection.cosmiccore.bargain.reach.on_accept", + "Something shifts in your shoulders. Your arms remember being longer."); + provider.add("reflection.cosmiccore.bargain.reach.on_defy", + "Your arms contract back to normal. The world feels close and small again."); + + // --- Void Anchor Bargain (void_anchor) --- + provider.add("reflection.cosmiccore.bargain.void_anchor.name", "Void Anchor"); + provider.add("reflection.cosmiccore.bargain.void_anchor.description", + "The void cannot destroy what belongs to it"); + provider.add("reflection.cosmiccore.bargain.void_anchor.dialogue.0", + "This thread is cold. Not cold like ice \u2014 cold like absence. Like nothing."); + provider.add("reflection.cosmiccore.bargain.void_anchor.dialogue.1", + "You've felt the pull of the void beneath the world. That endless fall."); + provider.add("reflection.cosmiccore.bargain.void_anchor.dialogue.2", + "This thread would mark you. Make you part of that darkness."); + provider.add("reflection.cosmiccore.bargain.void_anchor.dialogue.3", + "The void can't destroy what it recognizes as its own."); + provider.add("reflection.cosmiccore.bargain.void_anchor.dialogue.4", + "Fall as far as you like. The darkness would catch you. Welcome you."); + provider.add("reflection.cosmiccore.bargain.void_anchor.dialogue.5", + "But the light would sting. Sunlight would feel wrong on marked skin."); + provider.add("reflection.cosmiccore.bargain.void_anchor.question", + "The thread reaches into the nothing. Do you pull?"); + provider.add("reflection.cosmiccore.bargain.void_anchor.answer.anchor.text", + "Pull it. Mark me for the void."); + provider.add("reflection.cosmiccore.bargain.void_anchor.answer.anchor.response", + "Something cold touches your soul. The void knows you now."); + provider.add("reflection.cosmiccore.bargain.void_anchor.answer.anchor.power.0", "Void damage immunity (Y < 0)"); + provider.add("reflection.cosmiccore.bargain.void_anchor.answer.anchor.power.1", + "Teleport to surface when entering void"); + provider.add("reflection.cosmiccore.bargain.void_anchor.answer.anchor.drawback.0", + "-25% damage in lit areas (sky access)"); + provider.add("reflection.cosmiccore.bargain.void_anchor.answer.anchor.drawback.1", + "Takes damage from direct sunlight exposure"); + provider.add("reflection.cosmiccore.bargain.void_anchor.answer.refuse.text", + "Leave it. I'll stay in the light."); + provider.add("reflection.cosmiccore.bargain.void_anchor.answer.refuse.response", + "The cold recedes. The void forgets you were here. For now."); + provider.add("reflection.cosmiccore.bargain.void_anchor.on_accept", + "Something cold marks you. Deep. Permanent. The void won't hurt you now."); + provider.add("reflection.cosmiccore.bargain.void_anchor.on_defy", + "The mark burns away. The void forgets you. It will not be merciful next time."); + + // THRESHOLD ENCOUNTERS — REMOVED + // The shell visual progression tells this story now. No narrated milestones needed. + + // Stellar Iris Module System + provider.add("cosmiccore.multiblock.stellar_module.not_connected", "§cNot Connected to Stellar Iris"); + provider.add("cosmiccore.multiblock.stellar_module.iris_not_formed", "§cStellar Iris Not Formed"); + provider.add("cosmiccore.multiblock.stellar_module.iris_not_ready", "§eStellar Iris Not Ready"); + provider.add("cosmiccore.multiblock.stellar_module.connected", "§aConnected to Stellar Iris"); + provider.add("cosmiccore.multiblock.stellar_module.stage", "§7Iris Stage: §e%s"); + provider.add("cosmiccore.multiblock.stellar_module.speed_bonus", "§7Speed Bonus: §a%s"); + provider.add("cosmiccore.multiblock.stellar_module.parallel", "§7Parallel Limit: §b%s"); + provider.add("cosmiccore.multiblock.stellar_module.no_wireless", "§cNo Wireless Energy Network"); + provider.add("cosmiccore.multiblock.stellar_module.energy_usage", "§eWireless EU/t: §f%s"); + provider.add("cosmiccore.multiblock.stellar_module.loading", "§7Loading..."); + provider.add("cosmiccore.multiblock.stellar_module.power_failure", "§c§lPOWER FAILURE - Insufficient Energy!"); + provider.add("cosmiccore.multiblock.stellar_module.power_config", "§7Config: §b%s §7@ §a%dx §7Parallel"); + provider.add("cosmiccore.multiblock.pattern.stellar_module_slot", "§7Module Slot (Air or Formed Module)"); + + // JADE + provider.add("config.jade.plugin_cosmiccore.pcb_parallel", "[CosmicCore] PCB Foundry Parallel"); + provider.add("config.jade.plugin_cosmiccore.stellar_module", "[CosmicCore] Stellar Module Info"); + provider.add("config.jade.plugin_cosmiccore.drone_station", "[CosmicCore] Drone Station Info"); + provider.add("config.jade.plugin_cosmiccore.drone_maintenance_interface", + "[CosmicCore] Drone Maintenance Interface"); + + // JADE Stellar Module Provider + provider.add("cosmiccore.jade.stellar_module.not_connected", "Iris: Not Connected"); + provider.add("cosmiccore.jade.stellar_module.iris_not_ready", "Iris: Not Ready"); + provider.add("cosmiccore.jade.stellar_module.connected", "Iris: Connected"); + provider.add("cosmiccore.jade.stellar_module.stage", "Stage: %s"); + provider.add("cosmiccore.jade.stellar_module.speed_bonus", "Speed: %s"); + provider.add("cosmiccore.jade.stellar_module.no_wireless", "No Wireless Network"); + provider.add("cosmiccore.jade.stellar_module.energy_usage", "Usage: %s"); + + // Stellar Iris GUI - Module Toggle + provider.add("cosmiccore.gui.stellar.show_star", "Show Star View"); + provider.add("cosmiccore.gui.stellar.show_modules", "Show Module Control"); + + // EMI Bookmark Keybinds + provider.add("key.categories.cosmiccore.emi", "CosmicCore - EMI"); + provider.add("key.cosmiccore.emi.next_bookmark_group", "Next Bookmark Group"); + provider.add("key.cosmiccore.emi.prev_bookmark_group", "Previous Bookmark Group"); + provider.add("key.cosmiccore.emi.create_bookmark_group", "Create Bookmark Group"); + + // ========================================================================= + // STELLAR IRIS UPGRADE TREE + // ========================================================================= + + // Branch names + provider.add("cosmiccore.stellar.branch.ignition", "Ignition"); + provider.add("cosmiccore.stellar.branch.fusion", "Fusion"); + provider.add("cosmiccore.stellar.branch.collapse", "Collapse"); + provider.add("cosmiccore.stellar.branch.void", "Void"); + + // UI strings + provider.add("cosmiccore.stellar.convergence.title", "Stellar Convergence"); + provider.add("cosmiccore.stellar.upgrade.cost", "Cost: %d pts"); + provider.add("cosmiccore.stellar.upgrade.tier_required", "Requires Tier %d"); + provider.add("cosmiccore.stellar.upgrade.level", "Level %d / %d"); + provider.add("cosmiccore.stellar.upgrade.max_level", "MAX LEVEL"); + provider.add("cosmiccore.stellar.upgrade.owned", "OWNED"); + provider.add("cosmiccore.stellar.upgrade.available", "Click to unlock"); + provider.add("cosmiccore.stellar.upgrade.locked", "Locked"); + provider.add("cosmiccore.stellar.upgrade.tier_locked", "Tier too low"); + provider.add("cosmiccore.stellar.upgrade.not_enough_points", "Not enough points"); + provider.add("cosmiccore.stellar.upgrade.prereqs_needed", "Prerequisites needed"); + + // === IGNITION BRANCH (Star Lifecycle) === + provider.add("cosmiccore.stellar.upgrade.thermal_stabilizer", "Thermal Stabilizer"); + provider.add("cosmiccore.stellar.upgrade.thermal_stabilizer.desc", "Stars decay 15% slower"); + + provider.add("cosmiccore.stellar.upgrade.plasma_conduits", "Plasma Conduits"); + provider.add("cosmiccore.stellar.upgrade.plasma_conduits.desc", "-10% fuel consumption per tick"); + + provider.add("cosmiccore.stellar.upgrade.fusion_catalyst", "Fusion Catalyst"); + provider.add("cosmiccore.stellar.upgrade.fusion_catalyst.desc", "Stars grow to next stage 25% faster"); + + provider.add("cosmiccore.stellar.upgrade.magnetic_confinement", "Magnetic Confinement"); + provider.add("cosmiccore.stellar.upgrade.magnetic_confinement.desc", + "Star stage cannot drop during active processing"); + + provider.add("cosmiccore.stellar.upgrade.core_harmonics", "Core Harmonics"); + provider.add("cosmiccore.stellar.upgrade.core_harmonics.desc", "-20% additional fuel consumption"); + + provider.add("cosmiccore.stellar.upgrade.proton_recycler", "Proton Recycler"); + provider.add("cosmiccore.stellar.upgrade.proton_recycler.desc", "8% chance to not consume fuel on tick"); + + provider.add("cosmiccore.stellar.upgrade.stellar_regeneration", "Stellar Regeneration"); + provider.add("cosmiccore.stellar.upgrade.stellar_regeneration.desc", + "3% chance per tick for star to gain stage"); + + provider.add("cosmiccore.stellar.upgrade.eternal_ember", "Eternal Ember"); + provider.add("cosmiccore.stellar.upgrade.eternal_ember.desc", "Stars at STAR stage never naturally decay"); + + provider.add("cosmiccore.stellar.upgrade.phoenix_protocol", "Phoenix Protocol"); + provider.add("cosmiccore.stellar.upgrade.phoenix_protocol.desc", + "When star would die, 25% chance to return to STAR stage instead"); + + provider.add("cosmiccore.stellar.upgrade.solar_dominion", "Solar Dominion"); + provider.add("cosmiccore.stellar.upgrade.solar_dominion.desc", "All star lifecycle bonuses increased by 50%"); + + provider.add("cosmiccore.stellar.upgrade.perpetual_ignition", "Perpetual Ignition"); + provider.add("cosmiccore.stellar.upgrade.perpetual_ignition.desc", + "Stars are immune to decay. Fuel costs halved."); + + provider.add("cosmiccore.stellar.upgrade.supernova_core", "Supernova Core"); + provider.add("cosmiccore.stellar.upgrade.supernova_core.desc", + "Stars at SUPERSTAR+ generate bonus prestige shards passively"); + + provider.add("cosmiccore.stellar.upgrade.plasma_hurricane", "Plasma Hurricane"); + provider.add("cosmiccore.stellar.upgrade.plasma_hurricane.desc", + "Star growth speed increased by 40%"); + + provider.add("cosmiccore.stellar.upgrade.stellar_nursery", "Stellar Nursery"); + provider.add("cosmiccore.stellar.upgrade.stellar_nursery.desc", + "New stars begin at GROWING stage instead of EMPTY"); + + provider.add("cosmiccore.stellar.upgrade.corona_expansion", "Corona Expansion"); + provider.add("cosmiccore.stellar.upgrade.corona_expansion.desc", + "Module connection range doubled"); + + provider.add("cosmiccore.stellar.upgrade.helios_forge", "Helios Forge"); + provider.add("cosmiccore.stellar.upgrade.helios_forge.desc", + "Unlock Helios-tier recipes requiring extreme stellar conditions"); + + provider.add("cosmiccore.stellar.upgrade.fusion_overdrive", "Fusion Overdrive"); + provider.add("cosmiccore.stellar.upgrade.fusion_overdrive.desc", + "+50% processing speed, +25% fuel consumption"); + + provider.add("cosmiccore.stellar.upgrade.dyson_lattice", "Dyson Lattice"); + provider.add("cosmiccore.stellar.upgrade.dyson_lattice.desc", + "Passive energy generation scales with star stage (up to 32k EU/t)"); + + provider.add("cosmiccore.stellar.upgrade.solar_genesis", "Solar Genesis"); + provider.add("cosmiccore.stellar.upgrade.solar_genesis.desc", + "Can spawn secondary micro-stars that provide bonus parallels"); + + provider.add("cosmiccore.stellar.upgrade.primordial_flame", "Primordial Flame"); + provider.add("cosmiccore.stellar.upgrade.primordial_flame.desc", + "The first fire. All Ignition bonuses doubled. Stars cannot die."); + + // === FUSION BRANCH (Processing Power) === + provider.add("cosmiccore.stellar.upgrade.graviton_lens", "Graviton Lens"); + provider.add("cosmiccore.stellar.upgrade.graviton_lens.desc", "+1 parallel per star stage"); + + provider.add("cosmiccore.stellar.upgrade.superconducting_grid", "Superconducting Grid"); + provider.add("cosmiccore.stellar.upgrade.superconducting_grid.desc", "-10% energy cost for all recipes"); + + provider.add("cosmiccore.stellar.upgrade.temporal_acceleration", "Temporal Acceleration"); + provider.add("cosmiccore.stellar.upgrade.temporal_acceleration.desc", "+15% processing speed"); + + provider.add("cosmiccore.stellar.upgrade.parallel_manifold", "Parallel Manifold"); + provider.add("cosmiccore.stellar.upgrade.parallel_manifold.desc", "+2 base parallel limit"); + + provider.add("cosmiccore.stellar.upgrade.stellar_compression", "Stellar Compression"); + provider.add("cosmiccore.stellar.upgrade.stellar_compression.desc", "+25% speed at SUPERSTAR or higher"); + + provider.add("cosmiccore.stellar.upgrade.mass_efficiency", "Mass Efficiency"); + provider.add("cosmiccore.stellar.upgrade.mass_efficiency.desc", "-15% additional energy cost"); + + provider.add("cosmiccore.stellar.upgrade.relativistic_processing", "Relativistic Processing"); + provider.add("cosmiccore.stellar.upgrade.relativistic_processing.desc", + "Recipes under 20 ticks complete instantly"); + + provider.add("cosmiccore.stellar.upgrade.quantum_tunneling", "Quantum Tunneling"); + provider.add("cosmiccore.stellar.upgrade.quantum_tunneling.desc", "10% chance to complete recipe instantly"); + + provider.add("cosmiccore.stellar.upgrade.hyperdense_core", "Hyperdense Core"); + provider.add("cosmiccore.stellar.upgrade.hyperdense_core.desc", "+50% parallel limit from all sources"); + + provider.add("cosmiccore.stellar.upgrade.tachyon_weave", "Tachyon Weave"); + provider.add("cosmiccore.stellar.upgrade.tachyon_weave.desc", "+30% processing speed, stacks additively"); + + provider.add("cosmiccore.stellar.upgrade.singularity_engine", "Singularity Engine"); + provider.add("cosmiccore.stellar.upgrade.singularity_engine.desc", + "Double all speed/parallel bonuses. Energy costs -40%."); + + provider.add("cosmiccore.stellar.upgrade.neutron_cascade", "Neutron Cascade"); + provider.add("cosmiccore.stellar.upgrade.neutron_cascade.desc", + "Recipe completions have 15% chance to trigger twice"); + + provider.add("cosmiccore.stellar.upgrade.warp_field_matrix", "Warp Field Matrix"); + provider.add("cosmiccore.stellar.upgrade.warp_field_matrix.desc", + "Items teleport directly to output buses (no transport needed)"); + + provider.add("cosmiccore.stellar.upgrade.particle_storm", "Particle Storm"); + provider.add("cosmiccore.stellar.upgrade.particle_storm.desc", + "+4 base parallels, unlocks particle storm recipes"); + + provider.add("cosmiccore.stellar.upgrade.subspace_harmonics", "Subspace Harmonics"); + provider.add("cosmiccore.stellar.upgrade.subspace_harmonics.desc", + "Energy costs scale inversely with recipe duration"); + + provider.add("cosmiccore.stellar.upgrade.antimatter_injection", "Antimatter Injection"); + provider.add("cosmiccore.stellar.upgrade.antimatter_injection.desc", + "Unlock antimatter fuel. +100% speed when fueled with antimatter"); + + provider.add("cosmiccore.stellar.upgrade.zero_point_tap", "Zero Point Tap"); + provider.add("cosmiccore.stellar.upgrade.zero_point_tap.desc", + "5% of energy cost is refunded after recipe completion"); + + provider.add("cosmiccore.stellar.upgrade.quark_gluon_plasma", "Quark-Gluon Plasma"); + provider.add("cosmiccore.stellar.upgrade.quark_gluon_plasma.desc", + "Unlock QGP recipes. +8 parallels for QGP recipes only"); + + provider.add("cosmiccore.stellar.upgrade.planck_resonance", "Planck Resonance"); + provider.add("cosmiccore.stellar.upgrade.planck_resonance.desc", + "Minimum recipe time reduced to 1 tick"); + + provider.add("cosmiccore.stellar.upgrade.omega_compression", "Omega Compression"); + provider.add("cosmiccore.stellar.upgrade.omega_compression.desc", + "Ultimate processing. All Fusion bonuses tripled. Unlock Omega recipes."); + + // === COLLAPSE BRANCH (Prestige & Points) === + provider.add("cosmiccore.stellar.upgrade.shard_collector", "Shard Collector"); + provider.add("cosmiccore.stellar.upgrade.shard_collector.desc", "+20% prestige points earned"); + + provider.add("cosmiccore.stellar.upgrade.resonant_sacrifice", "Resonant Sacrifice"); + provider.add("cosmiccore.stellar.upgrade.resonant_sacrifice.desc", + "Prestige at SUPERSTAR gives BLACK_HOLE rewards"); + + provider.add("cosmiccore.stellar.upgrade.early_harvest", "Early Harvest"); + provider.add("cosmiccore.stellar.upgrade.early_harvest.desc", "Can prestige at STAR stage (50% points)"); + + provider.add("cosmiccore.stellar.upgrade.efficient_consumption", "Efficient Consumption"); + provider.add("cosmiccore.stellar.upgrade.efficient_consumption.desc", + "15% chance prestige doesn't consume prestige item"); + + provider.add("cosmiccore.stellar.upgrade.point_amplifier", "Point Amplifier"); + provider.add("cosmiccore.stellar.upgrade.point_amplifier.desc", + "+30% prestige points (stacks with Shard Collector)"); + + provider.add("cosmiccore.stellar.upgrade.dual_sacrifice", "Dual Sacrifice"); + provider.add("cosmiccore.stellar.upgrade.dual_sacrifice.desc", "Can consume 2 prestige items for 2.5x points"); + + provider.add("cosmiccore.stellar.upgrade.prestige_momentum", "Prestige Momentum"); + provider.add("cosmiccore.stellar.upgrade.prestige_momentum.desc", + "Each consecutive prestige gives +10% points (max 50%)"); + + provider.add("cosmiccore.stellar.upgrade.echo_of_collapse", "Echo of Collapse"); + provider.add("cosmiccore.stellar.upgrade.echo_of_collapse.desc", + "Prestige grants a temporary 20% speed boost for 5 minutes"); + + provider.add("cosmiccore.stellar.upgrade.entropy_harvest", "Entropy Harvest"); + provider.add("cosmiccore.stellar.upgrade.entropy_harvest.desc", + "Gain bonus points based on star lifetime before prestige"); + + provider.add("cosmiccore.stellar.upgrade.infinite_recursion", "Infinite Recursion"); + provider.add("cosmiccore.stellar.upgrade.infinite_recursion.desc", + "Prestige gives 2x points. 25% chance to keep prestige item."); + + provider.add("cosmiccore.stellar.upgrade.cascading_collapse", "Cascading Collapse"); + provider.add("cosmiccore.stellar.upgrade.cascading_collapse.desc", + "Prestige triggers grant bonus points to connected modules"); + + provider.add("cosmiccore.stellar.upgrade.temporal_echo", "Temporal Echo"); + provider.add("cosmiccore.stellar.upgrade.temporal_echo.desc", + "Store up to 3 prestige charges, release all at once for 3x value"); + + provider.add("cosmiccore.stellar.upgrade.mass_conversion", "Mass Conversion"); + provider.add("cosmiccore.stellar.upgrade.mass_conversion.desc", + "Convert excess materials into prestige points (1000:1 ratio)"); + + provider.add("cosmiccore.stellar.upgrade.stellar_debt", "Stellar Debt"); + provider.add("cosmiccore.stellar.upgrade.stellar_debt.desc", + "Borrow prestige points from future prestiges (150% payback)"); + + provider.add("cosmiccore.stellar.upgrade.entropy_engine", "Entropy Engine"); + provider.add("cosmiccore.stellar.upgrade.entropy_engine.desc", + "Failed recipes contribute to prestige point pool"); + + provider.add("cosmiccore.stellar.upgrade.sacrifice_amplifier", "Sacrifice Amplifier"); + provider.add("cosmiccore.stellar.upgrade.sacrifice_amplifier.desc", + "Prestige items give 4x points but are always consumed"); + + provider.add("cosmiccore.stellar.upgrade.cosmic_tithe", "Cosmic Tithe"); + provider.add("cosmiccore.stellar.upgrade.cosmic_tithe.desc", + "Passively generate prestige points (1/min per tier)"); + + provider.add("cosmiccore.stellar.upgrade.annihilation_yield", "Annihilation Yield"); + provider.add("cosmiccore.stellar.upgrade.annihilation_yield.desc", + "BLACK_HOLE prestige gives 5x base points, destroys the star"); + + provider.add("cosmiccore.stellar.upgrade.heat_death", "Heat Death"); + provider.add("cosmiccore.stellar.upgrade.heat_death.desc", + "The end of all things. All Collapse bonuses tripled. Prestige is instant."); + + // === VOID BRANCH (Exotic Abilities) === + provider.add("cosmiccore.stellar.upgrade.hawking_radiator", "Hawking Radiator"); + provider.add("cosmiccore.stellar.upgrade.hawking_radiator.desc", "BLACK_HOLE generates 2048 EU/t passively"); + + provider.add("cosmiccore.stellar.upgrade.chromatic_tuning", "Chromatic Tuning"); + provider.add("cosmiccore.stellar.upgrade.chromatic_tuning.desc", + "Custom star color provides +5% to matching element recipes"); + + provider.add("cosmiccore.stellar.upgrade.exotic_matter_tap", "Exotic Matter Tap"); + provider.add("cosmiccore.stellar.upgrade.exotic_matter_tap.desc", "Unlock exotic matter processing recipes"); + + provider.add("cosmiccore.stellar.upgrade.void_whispers", "Void Whispers"); + provider.add("cosmiccore.stellar.upgrade.void_whispers.desc", "BLACK_HOLE stage provides +50% speed bonus"); + + provider.add("cosmiccore.stellar.upgrade.event_horizon_lock", "Event Horizon Lock"); + provider.add("cosmiccore.stellar.upgrade.event_horizon_lock.desc", "BLACK_HOLE never decays to DEATH"); + + provider.add("cosmiccore.stellar.upgrade.singularity_siphon", "Singularity Siphon"); + provider.add("cosmiccore.stellar.upgrade.singularity_siphon.desc", + "BLACK_HOLE stage reduces recipe energy cost by 20%"); + + provider.add("cosmiccore.stellar.upgrade.gravitational_mastery", "Gravitational Mastery"); + provider.add("cosmiccore.stellar.upgrade.gravitational_mastery.desc", + "BLACK_HOLE stage grants +3 parallels"); + + provider.add("cosmiccore.stellar.upgrade.void_harvester", "Void Harvester"); + provider.add("cosmiccore.stellar.upgrade.void_harvester.desc", "BLACK_HOLE prestige gives 3x base points"); + + provider.add("cosmiccore.stellar.upgrade.eldritch_insight", "Eldritch Insight"); + provider.add("cosmiccore.stellar.upgrade.eldritch_insight.desc", + "Reveals hidden recipe bonuses based on star configuration"); + + provider.add("cosmiccore.stellar.upgrade.abyss_walker", "Abyss Walker"); + provider.add("cosmiccore.stellar.upgrade.abyss_walker.desc", + "Void energy passively accumulates, boosting exotic recipes"); + + provider.add("cosmiccore.stellar.upgrade.eternal_void", "Eternal Void"); + provider.add("cosmiccore.stellar.upgrade.eternal_void.desc", + "All BLACK_HOLE bonuses are doubled. Void effects persist 30s after leaving BLACK_HOLE."); + + provider.add("cosmiccore.stellar.upgrade.dark_matter_lens", "Dark Matter Lens"); + provider.add("cosmiccore.stellar.upgrade.dark_matter_lens.desc", + "BLACK_HOLE passively produces Dark Matter (1/min)"); + + provider.add("cosmiccore.stellar.upgrade.negative_mass", "Negative Mass"); + provider.add("cosmiccore.stellar.upgrade.negative_mass.desc", + "Recipes in BLACK_HOLE have inverted energy costs (gain EU)"); + + provider.add("cosmiccore.stellar.upgrade.vacuum_decay", "Vacuum Decay"); + provider.add("cosmiccore.stellar.upgrade.vacuum_decay.desc", + "Chance to void input items for 10x output"); + + provider.add("cosmiccore.stellar.upgrade.photon_sphere", "Photon Sphere"); + provider.add("cosmiccore.stellar.upgrade.photon_sphere.desc", + "Light-based recipes get +200% speed in BLACK_HOLE"); + + provider.add("cosmiccore.stellar.upgrade.schwarzschild_radius", "Schwarzschild Radius"); + provider.add("cosmiccore.stellar.upgrade.schwarzschild_radius.desc", + "Increase BLACK_HOLE event horizon - more items can process simultaneously"); + + provider.add("cosmiccore.stellar.upgrade.ergosphere_tap", "Ergosphere Tap"); + provider.add("cosmiccore.stellar.upgrade.ergosphere_tap.desc", + "Extract rotational energy from BLACK_HOLE (8192 EU/t passive)"); + + provider.add("cosmiccore.stellar.upgrade.penrose_process", "Penrose Process"); + provider.add("cosmiccore.stellar.upgrade.penrose_process.desc", + "Throw matter into BLACK_HOLE to extract 130% of its energy value"); + + provider.add("cosmiccore.stellar.upgrade.kerr_extraction", "Kerr Extraction"); + provider.add("cosmiccore.stellar.upgrade.kerr_extraction.desc", + "Spinning BLACK_HOLE grants +6 parallels and exotic byproducts"); + + provider.add("cosmiccore.stellar.upgrade.false_vacuum", "False Vacuum"); + provider.add("cosmiccore.stellar.upgrade.false_vacuum.desc", + "Reality unravels. All Void bonuses tripled. Unlock False Vacuum recipes."); + + // === REPEATABLE UPGRADES === + provider.add("cosmiccore.stellar.upgrade.stellar_efficiency", "Stellar Efficiency"); + provider.add("cosmiccore.stellar.upgrade.stellar_efficiency.desc", "+2% speed per level (max 10 levels)"); + + provider.add("cosmiccore.stellar.upgrade.parallel_threading", "Parallel Threading"); + provider.add("cosmiccore.stellar.upgrade.parallel_threading.desc", "+1 parallel per level (max 8 levels)"); + + provider.add("cosmiccore.stellar.upgrade.energy_optimization", "Energy Optimization"); + provider.add("cosmiccore.stellar.upgrade.energy_optimization.desc", + "-3% energy cost per level (max 10 levels)"); + + provider.add("cosmiccore.stellar.upgrade.fuel_efficiency", "Fuel Efficiency"); + provider.add("cosmiccore.stellar.upgrade.fuel_efficiency.desc", + "-2% fuel consumption per level (max 10 levels)"); + + provider.add("cosmiccore.stellar.upgrade.prestige_amplifier", "Prestige Amplifier"); + provider.add("cosmiccore.stellar.upgrade.prestige_amplifier.desc", + "+5% prestige points per level (max 10 levels)"); + + provider.add("cosmiccore.stellar.upgrade.decay_resistance", "Decay Resistance"); + provider.add("cosmiccore.stellar.upgrade.decay_resistance.desc", + "+3% decay resistance per level (max 10 levels)"); + + provider.add("cosmiccore.stellar.upgrade.growth_catalyst", "Growth Catalyst"); + provider.add("cosmiccore.stellar.upgrade.growth_catalyst.desc", "+3% growth speed per level (max 10 levels)"); + + provider.add("cosmiccore.stellar.upgrade.void_attunement", "Void Attunement"); + provider.add("cosmiccore.stellar.upgrade.void_attunement.desc", + "+2% bonus from void effects per level (max 10 levels)"); + + // Cosmic Boots + provider.add("key.categories.cosmiccore.boots", "Cosmic Boots"); + provider.add("key.cosmiccore.boots.speed_increase", "Boots: Increase Speed"); + provider.add("key.cosmiccore.boots.speed_decrease", "Boots: Decrease Speed"); + provider.add("key.cosmiccore.boots.jump_increase", "Boots: Increase Jump"); + provider.add("key.cosmiccore.boots.jump_decrease", "Boots: Decrease Jump"); + provider.add("key.cosmiccore.boots.toggle_step", "Boots: Toggle Step Assist"); + provider.add("key.cosmiccore.boots.toggle_inertia", "Boots: Toggle Inertia Dampening"); + + // Quake Movement (Reflection Bargain) + provider.add("key.categories.cosmiccore.movement", "Quake Movement"); + provider.add("key.cosmiccore.movement.dash", "Dash"); + + // Boot tooltips + provider.add("cosmiccore.boots.speed_modifier", "Speed Modifier: %s"); + provider.add("cosmiccore.boots.jump_modifier", "Jump Modifier: %s"); + provider.add("cosmiccore.boots.step_assist", "Step Assist: %s"); + provider.add("cosmiccore.boots.inertia_cancel", "Inertia Dampening: %s"); + + // Boot HUD + provider.add("cosmiccore.boots.hud.speed", "Speed: %s %s"); + provider.add("cosmiccore.boots.hud.speed_simple", "Speed: %s"); + provider.add("cosmiccore.boots.hud.jump", "Jump: %s"); + + // Boot action messages + provider.add("cosmiccore.boots.message.speed", "Speed Modifier: %s"); + provider.add("cosmiccore.boots.message.jump", "Jump Modifier: %s"); + provider.add("cosmiccore.boots.message.step", "Step Assist: %s"); + provider.add("cosmiccore.boots.message.inertia", "Inertia Dampening: %s"); + + // Max speed tooltip + provider.add("cosmiccore.boots.max_speed", "Max Speed: %s"); + + // Soul Shapes + provider.add("cosmiccore.soul_shape.unshaped.name", "Unshaped"); + provider.add("cosmiccore.soul_shape.unshaped.tagline", "Your soul remains formless, undefined."); + provider.add("cosmiccore.soul_shape.unshaped.description", + "You have not yet chosen a shape. Your potential is limitless, but so is your lack of direction."); + + provider.add("cosmiccore.soul_shape.revenant.name", "The Revenant"); + provider.add("cosmiccore.soul_shape.revenant.tagline", "I was the first to die. I'll be the last to fall."); + provider.add("cosmiccore.soul_shape.revenant.description", + "You've died so many times that death itself is just a phase. Death-related bargains are empowered."); + provider.add("cosmiccore.soul_shape.revenant.super.name", "Defy"); + provider.add("cosmiccore.soul_shape.revenant.super.description", + "When you would die, you don't. Enter a fury state with massive lifesteal. Heal to full or die for real."); + + provider.add("cosmiccore.soul_shape.hollow.name", "The Hollow"); + provider.add("cosmiccore.soul_shape.hollow.tagline", "I am empty. Consume All."); + provider.add("cosmiccore.soul_shape.hollow.description", + "You gain nothing passively. You take. Everything you have, you took from something else."); + provider.add("cosmiccore.soul_shape.hollow.super.name", "Devour"); + provider.add("cosmiccore.soul_shape.hollow.super.description", + "Consume an entity whole. Gain Nourishment and leech a stat from what you ate."); + + provider.add("cosmiccore.soul_shape.engine.name", "The Engine"); + provider.add("cosmiccore.soul_shape.engine.tagline", "The factory must grow. And I must too."); + provider.add("cosmiccore.soul_shape.engine.description", + "You are the cog work. Efficiency. Throughput. Optimization. Speed-related bargains are empowered."); + provider.add("cosmiccore.soul_shape.engine.super.name", "Overclock"); + provider.add("cosmiccore.soul_shape.engine.super.description", + "Overclock for a breif moment. Attack, move, mine, and build at massively boosted speeds."); + + provider.add("cosmiccore.soul_shape.globedancer.name", "The Globedancer"); + provider.add("cosmiccore.soul_shape.globedancer.tagline", "I am never where you strike."); + provider.add("cosmiccore.soul_shape.globedancer.description", + "Movement is identity. You are not hit because you are not there. Mobility bargains are empowered, defense is cursed."); + provider.add("cosmiccore.soul_shape.globedancer.super.name", "Slipstream"); + provider.add("cosmiccore.soul_shape.globedancer.super.description", + "Become untouchable. No fall damage, no collision. Pure fluid motion."); + + provider.add("cosmiccore.soul_shape.bulwark.name", "The Bulwark"); + provider.add("cosmiccore.soul_shape.bulwark.tagline", "I endure what would break you."); + provider.add("cosmiccore.soul_shape.bulwark.description", + "You don't dodge. You don't retreat. You take it. Defensive bargains are empowered, mobility is cursed."); + provider.add("cosmiccore.soul_shape.bulwark.super.name", "Last Stand"); + provider.add("cosmiccore.soul_shape.bulwark.super.description", + "Plant yourself. Emit a damaging aura, take massively reduced damage, reflect damage to attackers."); + + provider.add("cosmiccore.soul_shape.bloodthirst.name", "The Bloodthirst"); + provider.add("cosmiccore.soul_shape.bloodthirst.tagline", "I end things before they begin."); + provider.add("cosmiccore.soul_shape.bloodthirst.description", + "Kill or be killed. Damage bargains are empowered, defense is cursed."); + provider.add("cosmiccore.soul_shape.bloodthirst.super.name", "Rip and Tear"); + provider.add("cosmiccore.soul_shape.bloodthirst.super.description", + "Enter a frenzy. Kill a mob, dash to the next, execute low-health enemies. RIP. AND. TEAR."); + + // Soul Mutilator Item + provider.add("item.cosmiccore.soul_mutilator.tooltip", "A twisted instrument that can reshape your very soul."); + provider.add("item.cosmiccore.soul_mutilator.tooltip.warning", "This choice is permanent. Choose wisely."); + provider.add("cosmiccore.soul_mutilator.not_awakened", "Your soul has not yet awakened. Die a few more times."); + provider.add("cosmiccore.soul_mutilator.already_shaped", "Your soul is already shaped as %s."); + provider.add("cosmiccore.soul_mutilator.select_shape", "Select a Soul Shape:"); + provider.add("cosmiccore.soul_mutilator.shape_selected", "Your soul has been mutilated into %s."); + + // Soul Shape UI (Mirror of Erosion integration) + provider.add("reflection.cosmiccore.ui.hub.mutilate_soul", "[Reshape Your Core]"); + provider.add("reflection.cosmiccore.ui.soul_shape.select_header", "Choose Your Shape"); + provider.add("reflection.cosmiccore.ui.soul_shape.warning_permanent", + "This choice is permanent and cannot be undone."); + provider.add("reflection.cosmiccore.ui.soul_shape.intro.0", + "The blade rests against your core. This will redefine what you are."); + provider.add("reflection.cosmiccore.ui.soul_shape.intro.1", + "Once cut, the shape is permanent. Your core can only be shaped once."); + provider.add("reflection.cosmiccore.ui.soul_shape.intro.2", + "Think through this carefully. There's no going back."); + provider.add("reflection.cosmiccore.ui.soul_shape.transforming.0", "You cut."); + provider.add("reflection.cosmiccore.ui.soul_shape.transforming.1", + "Your entire being feels on fire as you shift into %s..."); + provider.add("reflection.cosmiccore.ui.soul_shape.complete.0", + "You are now %s. Something fundamental changed."); + provider.add("reflection.cosmiccore.ui.soul_shape.complete.1", + "There's no returning to what you were."); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/CosmicElements.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/CosmicElements.java index 6ee590b94..2385789ad 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/CosmicElements.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/CosmicElements.java @@ -1,18 +1,24 @@ package com.ghostipedia.cosmiccore.common.data.materials; +import com.ghostipedia.cosmiccore.CosmicCore; + import com.gregtechceu.gtceu.api.data.chemical.Element; import com.gregtechceu.gtceu.api.registry.GTRegistries; -import com.gregtechceu.gtceu.common.data.GTElements; + +import java.util.Locale; public class CosmicElements { - public static final Element Pi = createAndRegister(1, 0, -1, null, "Prisma", "Pi", false); - public static final Element ViR = createAndRegister(35, 450, -1, null, "Virtue", "ERROR", false); - public static Element createAndRegister(long protons, long neutrons, long halfLifeSeconds, String decayTo, String name, String symbol, boolean isIsotope) { + + public static final Element ViR = createAndRegister(35, 450, -1, null, "Virtue", "", false); + public static final Element Pi = createAndRegister(1, 0, -1, null, "Prisma", "", false); + public static final Element Vir = createAndRegister(1, 0, -1, null, "Vitrius", "", false); + + public static Element createAndRegister(long protons, long neutrons, long halfLifeSeconds, String decayTo, + String name, String symbol, boolean isIsotope) { Element element = new Element(protons, neutrons, halfLifeSeconds, decayTo, name, symbol, isIsotope); - GTRegistries.ELEMENTS.register(name, element); + GTRegistries.register(GTRegistries.ELEMENTS, CosmicCore.id(name.toLowerCase(Locale.ROOT)), element); return element; } - public static void init() { - } + public static void init() {} } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/CosmicMaterialSet.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/CosmicMaterialSet.java new file mode 100644 index 000000000..706e352f4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/CosmicMaterialSet.java @@ -0,0 +1,24 @@ +package com.ghostipedia.cosmiccore.common.data.materials; + +import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconSet; + +import static com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconSet.*; + +public class CosmicMaterialSet { + + public static final MaterialIconSet INFINITY = new MaterialIconSet("infinity", SHINY); + public static final MaterialIconSet CHRONON = new MaterialIconSet("chronon", SHINY); + public static final MaterialIconSet NEUTRONITE = new MaterialIconSet("neutronite", SHINY); + public static final MaterialIconSet NEUTRONIUM_CCORE = new MaterialIconSet("neutronium", SHINY); + public static final MaterialIconSet COSMIC_NEUTRONIUM_CCORE = new MaterialIconSet("cosmic_neutronium", SHINY); + public static final MaterialIconSet TRINAVINE = new MaterialIconSet("trinavine", SHINY); + public static final MaterialIconSet STARMETAL = new MaterialIconSet("starmetal", SHINY); + public static final MaterialIconSet NEVRAMITE = new MaterialIconSet("nevramite", DULL); + public static final MaterialIconSet VOIDSPARK = new MaterialIconSet("voidspark", DULL); + public static final MaterialIconSet SOL = new MaterialIconSet("sol", DULL); + public static final MaterialIconSet CHLOROPHYTE = new MaterialIconSet("chlorophyte", SHINY); + public static final MaterialIconSet CRYSTAL = new MaterialIconSet("crystal", DULL); + public static final MaterialIconSet MAGIC = new MaterialIconSet("magic", DULL); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/CosmicMaterials.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/CosmicMaterials.java index 4cd8c81f0..2a1191047 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/CosmicMaterials.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/materials/CosmicMaterials.java @@ -1,7 +1,9 @@ package com.ghostipedia.cosmiccore.common.data.materials; import com.ghostipedia.cosmiccore.CosmicCore; -import com.gregtechceu.gtceu.GTCEu; +import com.ghostipedia.cosmiccore.api.data.material.property.CCoreMaterialIconSet; +import com.ghostipedia.cosmiccore.api.item.MeldingOmniTool; + import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialIconSet; @@ -10,20 +12,19 @@ import com.gregtechceu.gtceu.api.data.chemical.material.properties.ToolProperty; import com.gregtechceu.gtceu.api.fluids.FluidBuilder; import com.gregtechceu.gtceu.api.fluids.FluidState; -import com.gregtechceu.gtceu.api.registry.registrate.forge.GTFluidBuilder; -import com.gregtechceu.gtceu.common.data.GTElements; -import com.gregtechceu.gtceu.common.data.GTMaterials; -import com.gregtechceu.gtceu.data.recipe.misc.alloyblast.CustomAlloyBlastRecipeProducer; -import net.minecraftforge.eventbus.api.SubscribeEvent; +import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKeys; +import static com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterialSet.MAGIC; import static com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialFlags.*; import static com.gregtechceu.gtceu.common.data.GTMaterials.*; public class CosmicMaterials { + public static Material Prisma; public static Material DilutedPrisma; public static Material Virtue; public static Material PrismaticTungstensteel; + public static Material VoidSpark; public static Material ResonantVirtueMeld; public static Material NaquadicSuperalloy; public static Material Trinavine; @@ -33,10 +34,113 @@ public class CosmicMaterials { public static Material ProgrammableMatter; public static Material ShimmeringNeutronium; public static Material CausalFabric; + public static Material Potential; + public static Material FalseInfinity; + public static Material SuitableInfinity; + public static Material LogicalInfinity; + public static Material Taranium; + public static Material Spacetime; + public static Material StygianPlague; + public static Material EnragedStygianPlague; + public static Material Cosmocite; + public static Material TearsOfTheUniverse; + public static Material Ichor; + public static Material Ichorium; + public static Material Chronon; + public static Material Temmerite; + public static Material Triphenylphosphine; + public static Material Neutronite; + public static Material Vitrius; + public static Material SolSteel; + public static Material StarMetal; + public static Material Nevramite; + public static Material PaleSteel; + public static Material PaleOil; + public static Material PaleOreBad; + public static Material Moondrop; + public static Material Somanone; + + public static Material AuricForcinium; + public static Material SuperheavyBedrockAlloy; + public static Material Chlorophyte; + public static Material DraconicTarragon; + public static Material Kuvite; + public static Material BlinkwardAlloy; + + public static Material Lumium; + public static Material Signalum; + public static Material Enderium; + public static Material Tenbrium; + public static Material Halizine; + public static Material Rosmotosin; + + public static Material VibrantAlloy; + public static Material EnergeticAlloy; + public static Material MelodicAlloy; + public static Material StarstruckHalite; + + public static Material Lignite; + public static Material Anthracene; + + // Homage Fluids + public static Material EssenceOfTerraFirmaGreg; + public static Material EssenceOfMoni; + + public static Material basicNutrientProductionFluid; + public static Material advancedNutrientProductionFluid; + public static Material superNutrientProductionFluid; + public static Material perfectedNutrientProductionFluid; + + public static Material basicNutrientOverclockFluid; + public static Material advancedNutrientOverclockFluid; + public static Material superNutrientOverclockFluid; + public static Material perfectedNutrientOverclockFluid; public static void register() { + // Nutrient Fluids (Production) + + basicNutrientProductionFluid = new Material.Builder(CosmicCore.id("basic_production_nutrient")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .formula("\uD80C\uDDA6") + .buildAndRegister(); + advancedNutrientProductionFluid = new Material.Builder(CosmicCore.id("advanced_production_nutrient")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .formula("\uD80C\uDDA6") + .buildAndRegister(); + superNutrientProductionFluid = new Material.Builder(CosmicCore.id("super_production_nutrient")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .formula("\uD80C\uDDA6") + .buildAndRegister(); + perfectedNutrientProductionFluid = new Material.Builder(CosmicCore.id("perfect_production_nutrient")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .formula("\uD80C\uDDA6") + .buildAndRegister(); + + basicNutrientOverclockFluid = new Material.Builder(CosmicCore.id("basic_overclock_nutrient")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .formula("\uD80C\uDDA6") + .buildAndRegister(); + advancedNutrientOverclockFluid = new Material.Builder(CosmicCore.id("advanced_overclock_nutrient")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .formula("\uD80C\uDDA6") + .buildAndRegister(); + superNutrientOverclockFluid = new Material.Builder(CosmicCore.id("super_overclock_nutrient")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .formula("\uD80C\uDDA6") + .buildAndRegister(); + perfectedNutrientOverclockFluid = new Material.Builder(CosmicCore.id("perfect_overclock_nutrient")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .formula("\uD80C\uDDA6") + .buildAndRegister(); + Prisma = new Material.Builder(CosmicCore.id("prisma")) .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .formula("֍") + .element(CosmicElements.Pi) + .buildAndRegister(); + Vitrius = new Material.Builder(CosmicCore.id("vitrius")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .formula("֍⋄") .element(CosmicElements.Pi) .buildAndRegister(); DilutedPrisma = new Material.Builder(CosmicCore.id("diluted_prisma")) @@ -45,8 +149,16 @@ public static void register() { .components(Prisma, 1, Water, 4) .flags(DISABLE_DECOMPOSITION) .buildAndRegister(); + Moondrop = new Material.Builder(CosmicCore.id("moondrop")) + .formula("☽") + .ore() + .gem() + .dust() + .color(0xE8F1FF).secondaryColor(0x2A2F6E).iconSet(MaterialIconSet.EMERALD) + .buildAndRegister(); Virtue = new Material.Builder(CosmicCore.id("virtue_meld")) .liquid(new FluidBuilder().temperature(666)) + .formula("߷") .element(CosmicElements.ViR) .buildAndRegister(); TriniumNaqide = new Material.Builder(CosmicCore.id("trinium_naqide")) @@ -60,19 +172,214 @@ public static void register() { PrismaticTungstensteel = new Material.Builder(CosmicCore.id("prismatic_tungstensteel")) .ingot() .liquid(new FluidBuilder().temperature(933)) - .color(0x6f42cf).secondaryColor(0xc71414).iconSet(MaterialIconSet.BRIGHT) - .flags(GENERATE_ROUND,GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) + .color(0x6f42cf).secondaryColor(0xc71414).iconSet(CCoreMaterialIconSet.PRISMATIC) + .flags(GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, GENERATE_FRAME, + GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) .components(Prisma, 1, TungstenSteel, 1) .cableProperties(GTValues.V[4], 1, 1) .fluidPipeProperties(1166, 100, true) .blastTemp(3600, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) .buildAndRegister(); + + EnergeticAlloy = new Material.Builder(CosmicCore.id("energetic_alloy")) + .ingot() + .liquid(new FluidBuilder().temperature(933)) + .color(0xffb545).secondaryColor(0xe13923).iconSet(MaterialIconSet.METALLIC) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .components(Gold, 1, RedSteel, 1, Glowstone, 4) + .blastTemp(2700, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.HV], 1200) + .buildAndRegister(); + + VibrantAlloy = new Material.Builder(CosmicCore.id("vibrant_alloy")) + .ingot() + .formula( + "Au((CuAu4)(ZnCu3)Fe2(Ni(AuAgCu3)Fe3)4)?4(Ma2FeMnNi(Si(Fe2S2)5(Cr2(ZiAbAl)Hg3)(Ti2LPt)(BeK4N5)(CS)", + true) + .liquid(new FluidBuilder().temperature(1100)) + .color(0xa4ff70).secondaryColor(0x24e048).iconSet(MaterialIconSet.METALLIC) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(3600, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + MelodicAlloy = new Material.Builder(CosmicCore.id("melodic_alloy")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0xc48aff).secondaryColor(0x6A3CBF).iconSet(MaterialIconSet.METALLIC) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .components(BlackSteel, 2, Moondrop, 4, EnderPearl, 2, Hafnium, 3) + .blastTemp(4500, BlastProperty.GasTier.HIGHER, GTValues.VA[GTValues.IV], 2430) + .buildAndRegister(); + + SuperheavyBedrockAlloy = new Material.Builder(CosmicCore.id("superheavy_bedrock_alloy")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0x2F2C3A).secondaryColor(0x424145).iconSet(MAGIC) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + Chlorophyte = new Material.Builder(CosmicCore.id("chlorophyte")) + .ingot() + .liquid(new FluidBuilder().temperature(1340).customStill()) + .iconSet(CosmicMaterialSet.CHLOROPHYTE) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + DraconicTarragon = new Material.Builder(CosmicCore.id("draconic_tarragon")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0x86045).secondaryColor(0xA0684E).iconSet(MAGIC) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + Kuvite = new Material.Builder(CosmicCore.id("kuvite")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0xff6a4d).secondaryColor(0xa1311b).iconSet(CosmicMaterialSet.CRYSTAL) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + BlinkwardAlloy = new Material.Builder(CosmicCore.id("blinkward_alloy")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0xb4c267).secondaryColor(0x2abd6c).iconSet(CosmicMaterialSet.CRYSTAL) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + StarstruckHalite = new Material.Builder(CosmicCore.id("starstruck_halite")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0x45a2ff).secondaryColor(0x3fa115).iconSet(CosmicMaterialSet.CRYSTAL) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + Lumium = new Material.Builder(CosmicCore.id("lumium")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0xf6ff99).secondaryColor(0xff7400).iconSet(MaterialIconSet.SHINY) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + Signalum = new Material.Builder(CosmicCore.id("signalum")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0xff6b0f).secondaryColor(0xc32e00).iconSet(MaterialIconSet.SHINY) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + Enderium = new Material.Builder(CosmicCore.id("enderium")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0x1f6b62).secondaryColor(0x16455f).iconSet(MaterialIconSet.SHINY) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + Tenbrium = new Material.Builder(CosmicCore.id("tenbrium")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0x8a8a8a).secondaryColor(0x404040).iconSet(MaterialIconSet.SHINY) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + Halizine = new Material.Builder(CosmicCore.id("halizine")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0x8b1a7d).secondaryColor(0x3d0835).iconSet(MaterialIconSet.SHINY) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + Rosmotosin = new Material.Builder(CosmicCore.id("rosmotosin")) + .ingot() + .liquid(new FluidBuilder().temperature(1340)) + .color(0xdc143c).secondaryColor(0x8b0000).iconSet(CosmicMaterialSet.CRYSTAL) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .blastTemp(4500, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + VoidSpark = new Material.Builder(CosmicCore.id("voidspark")) + .ingot() + .liquid(new FluidBuilder().temperature(933)) + .formula("\uD802\uDC05") + .color(0x5b2a9c).secondaryColor(0x2567b8).iconSet(CCoreMaterialIconSet.VOIDSPARKICO) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .components(Prisma, 1, TungstenSteel, 1) + .blastTemp(3600, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + SolSteel = new Material.Builder(CosmicCore.id("sol_steel")) + .ingot() + .liquid(new FluidBuilder().temperature(933)) + .formula(" ⃘ ") + .color(0xf0891a).secondaryColor(0xf0891a).iconSet(CCoreMaterialIconSet.SOL_STEEL) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .components(Prisma, 1, TungstenSteel, 1) + .cableProperties(GTValues.V[8], 4, 1) + .fluidPipeProperties(65000, 9500, true, true, true, true) + .blastTemp(3600, BlastProperty.GasTier.HIGH, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + StarMetal = new Material.Builder(CosmicCore.id("starmetal")) + .ingot() + .liquid(new FluidBuilder().temperature(9800)) + .formula("✬") + .iconSet(CCoreMaterialIconSet.STARMETALICO) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .cableProperties(GTValues.V[8], 4, 1) + .fluidPipeProperties(65000, 9500, true, true, true, false) + .blastTemp(8400, BlastProperty.GasTier.HIGHEST, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + + Nevramite = new Material.Builder(CosmicCore.id("nevramite")) + .ingot() + .liquid(new FluidBuilder().temperature(9800)) + .plasma(109000) + .formula("✫") + .color(0x372536) + .iconSet(CosmicMaterialSet.NEVRAMITE) + .components(Osmium, 8, Gadolinium, 3, Rhenium, 3, Molybdenum, 2, ActivatedCarbon, 1, StarMetal, 1) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .cableProperties(GTValues.V[8], 4, 1) + .fluidPipeProperties(65000, 9500, true, true, true, false) + .blastTemp(8400, BlastProperty.GasTier.HIGHEST, GTValues.VA[GTValues.EV], 1200) + .buildAndRegister(); + ResonantVirtueMeld = new Material.Builder(CosmicCore.id("resonant_virtue_meld")) .ingot() .liquid(new FluidBuilder().temperature(1240)) - .color(0xff8400).secondaryColor(0xcffee00).iconSet(MaterialIconSet.SHINY) - .flags(GENERATE_ROTOR,GENERATE_BOLT_SCREW,GENERATE_ROUND,GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) - .components(Virtue, 4, Naquadah, 1,TungstenSteel, 15, Chromium, 3, Molybdenum, 6, Vanadium, 3,Prisma,8) + .color(0x1acde1).secondaryColor(0x00935d).iconSet(MaterialIconSet.SHINY) + .flags(GENERATE_ROTOR, GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, + GENERATE_RING, GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) + .components(Virtue, 4, Naquadah, 1, TungstenSteel, 15, Chromium, 3, Molybdenum, 6, Vanadium, 3, Prisma, + 8) .cableProperties(GTValues.V[5], 4, 6) .blastTemp(4200, BlastProperty.GasTier.HIGHER, GTValues.VA[GTValues.IV], 1800) .buildAndRegister().setFormula("ERROR4Nq((FeW)5CrMo2V)3Pi8"); @@ -80,61 +387,276 @@ public static void register() { .ingot() .liquid(new FluidBuilder().temperature(1300)) .color(0x001f04).secondaryColor(0x000000).iconSet(MaterialIconSet.RADIOACTIVE) - .flags(GENERATE_BOLT_SCREW,GENERATE_ROUND,GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) .components(BlackSteel, 4, NaquadahEnriched, 3, RhodiumPlatedPalladium, 6) .cableProperties(GTValues.V[6], 4, 6) - .blastTemp(5400, BlastProperty.GasTier.HIGHER, GTValues.VA[GTValues.LuV],2400) + .blastTemp(5400, BlastProperty.GasTier.HIGHER, GTValues.VA[GTValues.LuV], 2400) .buildAndRegister(); - //TODO: Pack Progression Materials in core when needed. For now things below this are sorted out well enough - I don't really feel like having to write 10000000 elements and placeholder materials just to do component based auto-gen rn + // TODO: Pack Progression Materials in core when needed. For now things below this are sorted out well enough - + // I don't really feel like having to write 10000000 elements and placeholder materials just to do component + // based auto-gen rn Trinavine = new Material.Builder(CosmicCore.id("trinavine")) .ingot() + .formula("⋖Tv⋗") .liquid(new FluidBuilder().temperature(1500)) - .color(0xdb5e5e).secondaryColor(0x5e0f3d).iconSet(MaterialIconSet.BRIGHT) - .flags(GENERATE_BOLT_SCREW,GENERATE_ROUND,GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) - .cableProperties(GTValues.V[7], 4, 6) - .blastTemp(7000, BlastProperty.GasTier.HIGHER, GTValues.VA[GTValues.ZPM],5600) + .color(0xfe2d2d).secondaryColor(0x353535).iconSet(CosmicMaterialSet.TRINAVINE) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, GENERATE_DENSE) + .cableProperties(GTValues.V[7], 4, 3) + .toolStats(ToolProperty.Builder.of(16, 40, 8192, 6, MeldingOmniTool.MELD_TOOL_LUV).magnetic() + .unbreakable().build()) + .blastTemp(5400, BlastProperty.GasTier.HIGHER, GTValues.VA[GTValues.LuV], 900) .buildAndRegister(); LivingIgniclad = new Material.Builder(CosmicCore.id("living_igniclad")) .ingot() .liquid(new FluidBuilder().temperature(1760)) .color(0x940002).secondaryColor(0xe35e17) - .flags(GENERATE_BOLT_SCREW,GENERATE_ROUND,GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) .cableProperties(GTValues.V[8], 4, 6) - .blastTemp(9000, BlastProperty.GasTier.HIGHER, GTValues.VA[GTValues.UV],5600) + .blastTemp(9000, BlastProperty.GasTier.HIGHER, GTValues.VA[GTValues.UV], 5600) .buildAndRegister(); PsionicGalvorn = new Material.Builder(CosmicCore.id("psionic_galvorn")) .ingot() .liquid(new FluidBuilder().temperature(1760)) .color(0x004094).secondaryColor(0x0962ab) - .flags(GENERATE_BOLT_SCREW,GENERATE_ROUND,GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) .cableProperties(GTValues.V[9], 4, 6) - .blastTemp(10500, BlastProperty.GasTier.HIGHER, GTValues.VA[GTValues.UV],5600) + .blastTemp(10500, BlastProperty.GasTier.HIGHER, GTValues.VA[GTValues.UV], 5600) .buildAndRegister(); ProgrammableMatter = new Material.Builder(CosmicCore.id("programmable_matter")) .ingot() .liquid(new FluidBuilder().temperature(1760)) .color(0x003e4f).secondaryColor(0x0a2830) - .flags(GENERATE_BOLT_SCREW,GENERATE_ROUND,GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) .cableProperties(GTValues.V[10], 4, 6) - .blastTemp(13000, BlastProperty.GasTier.HIGHEST, GTValues.VA[GTValues.UHV],5600) + .blastTemp(13000, BlastProperty.GasTier.HIGHEST, GTValues.VA[GTValues.UHV], 5600) .buildAndRegister(); ShimmeringNeutronium = new Material.Builder(CosmicCore.id("shimmering_neutronium")) .ingot() .liquid(new FluidBuilder().temperature(1760)) .color(0xc7e9f2).secondaryColor(0xffffff) - .flags(GENERATE_BOLT_SCREW,GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) + .flags(GENERATE_BOLT_SCREW, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, GENERATE_FRAME, + GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) .cableProperties(GTValues.V[11], 4, 6) - .blastTemp(15000, BlastProperty.GasTier.HIGHEST, GTValues.VA[GTValues.UEV],5600) + .blastTemp(15000, BlastProperty.GasTier.HIGHEST, GTValues.VA[GTValues.UEV], 5600) .buildAndRegister(); CausalFabric = new Material.Builder(CosmicCore.id("causal_fabric")) .ingot() .liquid(new FluidBuilder().temperature(1760)) .color(0x270054).secondaryColor(0x481c7a) - .flags(GENERATE_BOLT_SCREW,GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) + .flags(GENERATE_BOLT_SCREW, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, GENERATE_FRAME, + GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) .cableProperties(GTValues.V[11], 4, 6) - .blastTemp(19000, BlastProperty.GasTier.HIGHEST, GTValues.VA[GTValues.UIV],5600) + .blastTemp(19000, BlastProperty.GasTier.HIGHEST, GTValues.VA[GTValues.UIV], 5600) + .buildAndRegister(); + Triphenylphosphine = new Material.Builder(CosmicCore.id("triphenylphosphine")) + .liquid(new FluidBuilder().temperature(300)) + .color(0xfca103).secondaryColor(0xfcbe03).iconSet(MaterialIconSet.BRIGHT) + .buildAndRegister(); + // Misc Materials + Neutronite = new Material.Builder(CosmicCore.id("neutronite")) + .ingot() + .formula("⦽") + .blastTemp(8900) + .liquid(new FluidBuilder().temperature(7500)) + .cableProperties(GTValues.V[6], 12, 4) + .fluidPipeProperties(65000, 3500, true, true, true, true) + .iconSet(CCoreMaterialIconSet.VIBRANIUM)// .color(0x489BC3).secondaryColor(0x51ADCA) + .toolStats(ToolProperty.Builder.of(90.0F, 50.0F, 65535, 6) + .attackSpeed(0.5F).enchantability(33).magnetic().unbreakable().build()) + .flags( + GENERATE_PLATE, + GENERATE_DENSE, + GENERATE_ROD, + GENERATE_BOLT_SCREW, + GENERATE_FRAME, + GENERATE_GEAR, + GENERATE_SMALL_GEAR, + GENERATE_SPRING, + GENERATE_SPRING_SMALL, + GENERATE_FOIL, + GENERATE_RING, + GENERATE_SPRING, + GENERATE_SPRING_SMALL, + GENERATE_SMALL_GEAR, + GENERATE_FINE_WIRE, + GENERATE_ROTOR, + GENERATE_ROUND) + .buildAndRegister(); + // TODO - Colors , Textures, Fluid Textures, they're all gonna look the same in game for now. + // TODO - Infinity Line Scripts On KubeJS side. + // Potential = new Material.Builder(CosmicCore.id("potential")) + // .dust() + // .liquid(new FluidBuilder().temperature(1500)) + // .color(0x828282).secondaryColor(0x5e0f3d).iconSet(MaterialIconSet.BRIGHT) + // .flags(DISABLE_DECOMPOSITION) + // .buildAndRegister(); + // FalseInfinity = new Material.Builder(CosmicCore.id("false_infinity")) + // .liquid(new FluidBuilder().temperature(3500)) + // .color(0x508582).secondaryColor(0x5e0f3d).iconSet(MaterialIconSet.BRIGHT) + // .flags(DISABLE_DECOMPOSITION) + // .buildAndRegister(); + // SuitableInfinity = new Material.Builder(CosmicCore.id("suitable_infinity")) + // .liquid(new FluidBuilder().temperature(7900)) + // .color(0x508582).secondaryColor(0x5e0f3d).iconSet(MaterialIconSet.BRIGHT) + // .flags(DISABLE_DECOMPOSITION) + // .buildAndRegister(); + // TODO - Actual Textures for the entire material set... Let's do something that isn't the typical rainbow + // infinity, maybe make it something special. + LogicalInfinity = new Material.Builder(CosmicCore.id("infinity")) + .ingot() + .liquid(new FluidBuilder().temperature(10750)) + .iconSet(CosmicMaterialSet.INFINITY) + .flags(GENERATE_ROTOR, GENERATE_FRAME, GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, + GENERATE_SMALL_GEAR, GENERATE_RING, GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, + GENERATE_FINE_WIRE) + .cableProperties(GTValues.V[7], 16, 0, true) + .buildAndRegister(); + // TODO - Taranium Bedrock Soot + Adamantium Processing + Taranium = new Material.Builder(CosmicCore.id("taranium")) + .ingot() + .liquid(new FluidBuilder().temperature(18000)) + .color(0x383838).secondaryColor(0x5e0f3d).iconSet(MaterialIconSet.BRIGHT) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) + .cableProperties(GTValues.V[12], 64, 0, true) + .buildAndRegister(); + // Todo Temporal Tear + Chronon = new Material.Builder(CosmicCore.id("chronon")) + .ingot() + .liquid(new FluidBuilder().temperature(100000000)) + .iconSet(CCoreMaterialIconSet.CHRONIC) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) + .cableProperties(GTValues.V[12], 64, 0, true) + .buildAndRegister(); + // ZPM Magnet Material + // the current tier, but super easy after lol + Temmerite = new Material.Builder(CosmicCore.id("temmerite")) + .ingot() + .formula("⦽") + .liquid(new FluidBuilder().temperature(19500)) + .color(0x42f5a1).secondaryColor(0x42f5e0).iconSet(MaterialIconSet.BRIGHT) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) + .cableProperties(GTValues.V[12], 64, 0, true) + .buildAndRegister(); + // If For some reason using hebrew as denotations for absolute constants upsets people, go back to using Greek, + // I doubt it'll be an issue but denote this just incase. + // TODO - Thaumic Tinker Inspired chaos Ft Virtue Meld, Make your dead gods cry rivers of mutated blood - + // Resistant to Acausal decay and contains the Universe constance of "Dalet" (ד) + Ichor = new Material.Builder(CosmicCore.id("ichor")) + .formula("⦿") + .liquid(new FluidBuilder().temperature(19500)) + .color(0xfca103).secondaryColor(0xfcbe03).iconSet(MaterialIconSet.BRIGHT) + .buildAndRegister(); + // TODO - The Finalized Version of Virtue Meld, only present on Grand Virtues. Resistant to Atemporal decay and + // contains the Universe constance of "Alef" (א) + Ichorium = new Material.Builder(CosmicCore.id("ichorium")) + .formula("⦾") + .ingot() + .liquid(new FluidBuilder().temperature(19500)) + .color(0xfca103).secondaryColor(0xfcbe03).iconSet(MaterialIconSet.BRIGHT) + .flags(GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_RING, + GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE) + .cableProperties(GTValues.V[12], 64, 0, true) .buildAndRegister(); + // TODO - A ????? of nothing from the empty space between each instance of cylindrical multiverses. Dissolves + // the Constant of "Resh" (ר) + Cosmocite = new Material.Builder(CosmicCore.id("cosmocite")) + .liquid(new FluidBuilder().temperature(12123500)) + .color(0xdb5e5e).secondaryColor(0x5e0f3d).iconSet(MaterialIconSet.SHINY) + .buildAndRegister(); + // TODO - A ????? of ???? comprised of the collective agony of Universe 0S37 (I keep forgetting the descriptor + // for the main universe the game is in) . Dissolves the Constant of "Waw/Vav" (ו) + TearsOfTheUniverse = new Material.Builder(CosmicCore.id("universe_tears")) + .liquid(new FluidBuilder().temperature(1)) + .color(0xdb5e5e).secondaryColor(0x5e0f3d).iconSet(MaterialIconSet.SHINY) + .buildAndRegister(); + // TODO - A dangerous bioweapon unleashed on many orbital bodies in space, entirely designed to sterilize life + // from anything it touches. + // Oh it's also like, self-aware but not fully sentient. Only works on impulse kinda - I'm not lore dumping more + // here lmfao + StygianPlague = new Material.Builder(CosmicCore.id("stygian_plague")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill().temperature(240)) + .color(0x4f035e).iconSet(MaterialIconSet.SHINY) + .buildAndRegister(); + // TODO - Now it's mad. Now it's airborne vs waterborne, and it knows how to mentally abuse you. + EnragedStygianPlague = new Material.Builder(CosmicCore.id("enraged_stygian_plague")) + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill().temperature(350)) + .color(0x5e031d).iconSet(MaterialIconSet.SHINY) + .buildAndRegister(); + // TODO - OMG! ! ! ! GTNH ! ! ! !?!?!?! SPACE!?!?!TIMEE?E!?!?!?!?! WOEAEAOWE SO FUNNY, Fuck off - Make this part + // of the fuel for the Temporal Tear. + Spacetime = new Material.Builder(CosmicCore.id("spacetime")) + .liquid(new FluidBuilder().temperature(10)) + .color(0xdb5e5e).secondaryColor(0x5e0f3d).iconSet(MaterialIconSet.SHINY) + .buildAndRegister(); + + PaleSteel = new Material.Builder(CosmicCore.id("pale_steel")) + .formula("✧⚙") + .ingot() + .liquid(new FluidBuilder().temperature(50)) + .flags(GENERATE_ROTOR, GENERATE_FRAME, GENERATE_BOLT_SCREW, GENERATE_ROUND, GENERATE_GEAR, + GENERATE_SMALL_GEAR, GENERATE_RING, GENERATE_FRAME, GENERATE_SPRING, GENERATE_SPRING_SMALL, + GENERATE_FINE_WIRE) + .color(0xE8F3FF).secondaryColor(0x1F2A36).iconSet(MaterialIconSet.METALLIC) + .buildAndRegister(); + PaleOil = new Material.Builder(CosmicCore.id("pale_oil")) + .formula("✧⚙") + .liquid(new FluidBuilder().state(FluidState.LIQUID).customStill()) + .color(0xE8F3FF).secondaryColor(0x1F2A36).iconSet(MaterialIconSet.METALLIC) + .buildAndRegister(); + PaleOreBad = new Material.Builder(CosmicCore.id("reclaimed_pale_ore")) + .formula("✧⚙") + .ore() + .flags(DISABLE_DECOMPOSITION, NO_SMELTING, NO_UNIFICATION, NO_SMELTING, NO_ORE_SMELTING, + NO_ORE_PROCESSING_TAB, NO_SMASHING) + .color(0xE8F3FF).secondaryColor(0x1F2A36).iconSet(MaterialIconSet.METALLIC) + .buildAndRegister(); + + Somanone = new Material.Builder(CosmicCore.id("somanone")) + .formula("✧+") + .ore() + .gem() + .dust() + .color(0x36E3C3).secondaryColor(0x111827).iconSet(MaterialIconSet.DIAMOND) + .buildAndRegister(); + } + + public static void modifyMaterials() { + var rubyOreProp = Ruby.getProperty(PropertyKey.ORE); + var ilmeniteOreProp = Ilmenite.getProperty(PropertyKey.ORE); + var aluminiumOreProp = Aluminium.getProperty(PropertyKey.ORE); + var bauxiteOreProp = Bauxite.getProperty(PropertyKey.ORE); + var nickelOreProp = Nickel.getProperty(PropertyKey.ORE); + var chromiteOreProp = Chromite.getProperty(PropertyKey.ORE); + + rubyOreProp.getOreByProducts().clear(); + ilmeniteOreProp.getOreByProducts().clear(); + bauxiteOreProp.getOreByProducts().clear(); + aluminiumOreProp.getOreByProducts().clear(); + nickelOreProp.getOreByProducts().clear(); + chromiteOreProp.getOreByProducts().clear(); + rubyOreProp.setOreByProducts(Cinnabar, GarnetRed, GarnetRed); + ilmeniteOreProp.setOreByProducts(Iron, Ilmenite, Ilmenite); + aluminiumOreProp.setOreByProducts(Bauxite, Bauxite, Ilmenite, Ilmenite); + bauxiteOreProp.setOreByProducts(Grossular, Gallium, Gallium); + nickelOreProp.setOreByProducts(Cobalt, Iron, Cooperite); + nickelOreProp.setWashedIn(Mercury); + chromiteOreProp.setOreByProducts(Iron, Magnesium, Chromite); + Holmium.setMaterialARGB(0xf07a96); + Holmium.setMaterialSecondaryARGB(0xfc9db3); + Neutronium.setMaterialIconSet(CCoreMaterialIconSet.VIBRANIUM_NEUTRONIUM); + Neutronium.addFlags(NO_SMELTING, NO_ORE_SMELTING); + Neutronium.setProperty(PropertyKey.BLAST, new BlastProperty(15000)); + Chlorine.getProperty(PropertyKey.FLUID).getStorage().enqueueRegistration(FluidStorageKeys.PLASMA, + new FluidBuilder().state(FluidState.PLASMA)); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicCoreOreRecipeHandler.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicCoreOreRecipeHandler.java index 6eb4c15b7..f25612e65 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicCoreOreRecipeHandler.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicCoreOreRecipeHandler.java @@ -1,18 +1,19 @@ package com.ghostipedia.cosmiccore.common.data.recipe; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; + import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.chemical.material.Material; -import com.gregtechceu.gtceu.api.data.chemical.material.properties.OreProperty; import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; -import com.gregtechceu.gtceu.api.data.tag.TagPrefix; -import com.gregtechceu.gtceu.utils.GTUtil; -import net.minecraft.data.recipes.FinishedRecipe; +import com.gregtechceu.gtceu.common.data.GTMaterials; + +import net.minecraft.data.recipes.RecipeOutput; import net.minecraft.world.item.ItemStack; -import java.util.function.Consumer; +import org.jetbrains.annotations.NotNull; -import static com.ghostipedia.cosmiccore.api.data.CosmicCoreTagPrefix.*; +import static com.ghostipedia.cosmiccore.api.data.CosmicTagPrefix.*; import static com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials.DilutedPrisma; import static com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials.Prisma; import static com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes.*; @@ -20,108 +21,200 @@ import static com.gregtechceu.gtceu.common.data.GTMaterials.*; import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.*; - public class CosmicCoreOreRecipeHandler { - public static void init(Consumer provider) { - crushed.executeHandler(provider, PropertyKey.ORE, CosmicCoreOreRecipeHandler::processcrushedLeached); - crushedRefined.executeHandler(provider, PropertyKey.ORE, CosmicCoreOreRecipeHandler::processRefinedFrothed); - crushedLeached.executeHandler(provider, PropertyKey.ORE, CosmicCoreOreRecipeHandler::processLeachedRefined); - prismaFrothed.executeHandler(provider, PropertyKey.ORE, CosmicCoreOreRecipeHandler::processFrothedPure); + public static void init(RecipeOutput provider, @NotNull Material material) { + processCrushedLeachedBad(provider, material); + processCrushedLeachedGood(provider, material); + processRefinedFrothed(provider, material); + processLeachedRefined(provider, material); + processFrothedPure(provider, material); + processRawOretoFinalStates(provider, material); + processRawOretoFinalStatesAugmented(provider, material); + // todo old + // crushed.executeHandler(provider, PropertyKey.ORE, CosmicCoreOreRecipeHandler::processcrushedLeached); + // crushedRefined.executeHandler(provider, PropertyKey.ORE, CosmicCoreOreRecipeHandler::processRefinedFrothed); + // crushedLeached.executeHandler(provider, PropertyKey.ORE, CosmicCoreOreRecipeHandler::processLeachedRefined); + // prismaFrothed.executeHandler(provider, PropertyKey.ORE, CosmicCoreOreRecipeHandler::processFrothedPure); } - public static void processcrushedLeached(TagPrefix crushedPrefix, Material material, OreProperty property, - Consumer provider) { + public static void processCrushedLeachedBad(RecipeOutput provider, Material material) { + if (!material.shouldGenerateRecipesFor(crushed) || !material.hasProperty(PropertyKey.ORE)) return; + var property = material.getProperty(PropertyKey.ORE); ItemStack leachedStack = ChemicalHelper.get(crushedLeached, material); - Material byproduct = GTUtil.selectItemInList( - 0, material, property.getOreByProducts(), Material.class); - Material byproduct2 = GTUtil.selectItemInList( - Integer.MAX_VALUE, material, property.getOreByProducts(), Material.class); + Material byproduct = property.getOreByProduct(0); + Material byproduct2 = property.getOreByProduct(1); - var builder = LEACHING_PLANT.recipeBuilder("crushed" + material.getName() + "_to_crushedleached") - .inputItems(crushedPrefix, material) + var builder = LEACHING_PLANT.recipeBuilder("crushed_" + material.getName() + "_to_crushedleached") + .inputItems(crushedPurified, material) .inputFluids(Water.getFluid(100)) .inputFluids(SulfuricAcid.getFluid(200)) + .circuitMeta(1) .outputItems(leachedStack) .chancedOutput(leachedStack, 5500, 750); - if (byproduct != null && !ChemicalHelper.get(dustPure, byproduct).isEmpty()) { + if (byproduct != GTMaterials.NULL && !ChemicalHelper.get(dustPure, byproduct).isEmpty()) { builder.chancedOutput(dustPure, byproduct, 1500, 1350); } - if (byproduct2 != null && !ChemicalHelper.get(dustPure, byproduct2).isEmpty()) { + if (byproduct2 != GTMaterials.NULL && !ChemicalHelper.get(dustPure, byproduct2).isEmpty()) { builder.chancedOutput(dustPure, byproduct2, 2200, 1150); } builder.outputFluids(DilutedSulfuricAcid.getFluid(300)); builder.duration(60).EUt(GTValues.VA[GTValues.HV]).save(provider); } - public static void processRefinedFrothed(TagPrefix refinedPrefix, Material material, OreProperty property, - Consumer provider) { + + public static void processCrushedLeachedGood(RecipeOutput provider, Material material) { + if (!material.shouldGenerateRecipesFor(crushed) || !material.hasProperty(PropertyKey.ORE)) return; + var property = material.getProperty(PropertyKey.ORE); + ItemStack leachedStack = ChemicalHelper.get(crushedLeached, material); + + Material byproduct = property.getOreByProduct(0); + Material byproduct2 = property.getOreByProduct(1); + + var builder = LEACHING_PLANT.recipeBuilder("crushed_" + material.getName() + "_to_crushedleached_optimized") + .inputItems(crushedPurified, material) + .chancedInput(CosmicItems.ABRASIVE_ROSIN_MILLSTONES.asStack(), 2500, 0) + .inputFluids(Water.getFluid(100)) + .inputFluids(SulfuricAcid.getFluid(200)) + .circuitMeta(2) + .outputItems(leachedStack, 2); + if (byproduct != GTMaterials.NULL && !ChemicalHelper.get(dustPure, byproduct).isEmpty()) { + builder.chancedOutput(dustPure, byproduct, 1500, 1350); + } + if (byproduct2 != GTMaterials.NULL && !ChemicalHelper.get(dustPure, byproduct2).isEmpty()) { + builder.chancedOutput(dustPure, byproduct2, 2200, 1150); + } + builder.outputFluids(DilutedSulfuricAcid.getFluid(300)); + builder.duration(60).EUt(GTValues.VA[GTValues.HV]).save(provider); + } + + public static void processRefinedFrothed(RecipeOutput provider, Material material) { + if (!material.shouldGenerateRecipesFor(crushedRefined) || !material.hasProperty(PropertyKey.ORE)) return; + var property = material.getProperty(PropertyKey.ORE); ItemStack frothedStack = ChemicalHelper.get(prismaFrothed, material); - Material byproduct = GTUtil.selectItemInList( - 0, material, property.getOreByProducts(), Material.class); - Material byproduct2 = GTUtil.selectItemInList( - 1, material, property.getOreByProducts(), Material.class); - Material byproduct3 = GTUtil.selectItemInList( - 2, material, property.getOreByProducts(), Material.class); - Material byproduct4 = GTUtil.selectItemInList( - Integer.MAX_VALUE, material, property.getOreByProducts(), Material.class); - - var builder = CHROMATIC_FLOTATION_PLANT.recipeBuilder("refined" + material.getName() + "_to_frothed") - .inputItems(refinedPrefix, material) + Material byproduct = property.getOreByProduct(0); + Material byproduct2 = property.getOreByProduct(1); + Material byproduct3 = property.getOreByProduct(2); + Material byproduct4 = property.getOreByProduct(Integer.MAX_VALUE); + + var builder = CHROMATIC_FLOTATION_PLANT.recipeBuilder("refined_" + material.getName() + "_to_frothed") + .inputItems(crushedRefined, material) .inputFluids(Prisma.getFluid(1000)) - .outputItems(GTUtil.copyAmount(2,frothedStack)); - if (byproduct != null && !ChemicalHelper.get(dustImpure, byproduct).isEmpty()) { + .outputItems(frothedStack.copyWithCount(2)); + if (byproduct != GTMaterials.NULL && !ChemicalHelper.get(dustImpure, byproduct).isEmpty()) { builder.chancedOutput(dustImpure, byproduct, 3500, 1450); } - if (byproduct2 != null && !ChemicalHelper.get(dustImpure, byproduct2).isEmpty()) { + if (byproduct2 != GTMaterials.NULL && !ChemicalHelper.get(dustImpure, byproduct2).isEmpty()) { builder.chancedOutput(dustImpure, byproduct2, 1800, 1750); } - if (byproduct3 != null && !ChemicalHelper.get(dustPure, byproduct3).isEmpty()) { + if (byproduct3 != GTMaterials.NULL && !ChemicalHelper.get(dustPure, byproduct3).isEmpty()) { builder.chancedOutput(dustImpure, byproduct3, 1500, 1950); } - if (byproduct4 != null && !ChemicalHelper.get(dustPure, byproduct4).isEmpty()) { + if (byproduct4 != GTMaterials.NULL && !ChemicalHelper.get(dustPure, byproduct4).isEmpty()) { builder.chancedOutput(dustImpure, byproduct4, 1500, 1950); } builder.outputFluids(Prisma.getFluid(500)); builder.duration(40).EUt(GTValues.VA[GTValues.IV]).save(provider); } - public static void processLeachedRefined(TagPrefix leachedPrefix, Material material, OreProperty property, - Consumer provider) { + public static void processLeachedRefined(RecipeOutput provider, Material material) { + if (!material.shouldGenerateRecipesFor(crushedLeached) || !material.hasProperty(PropertyKey.ORE)) return; ItemStack refinedStack = ChemicalHelper.get(crushedRefined, material); + var property = material.getProperty(PropertyKey.ORE); - Material byproduct = GTUtil.selectItemInList( - 1, material, property.getOreByProducts(), Material.class); + Material byproduct = property.getOreByProduct(1); - var builder = THERMAL_CENTRIFUGE_RECIPES.recipeBuilder("leached" + material.getName() + "_to_refined") - .inputItems(leachedPrefix, material) + var builder = THERMAL_CENTRIFUGE_RECIPES.recipeBuilder("leached_" + material.getName() + "_to_refined") + .inputItems(crushedLeached, material) .outputItems(refinedStack); - if (byproduct != null && !ChemicalHelper.get(dust, byproduct).isEmpty()) { + if (byproduct != GTMaterials.NULL && !ChemicalHelper.get(dust, byproduct).isEmpty()) { builder.chancedOutput(dust, byproduct, 2500, 1000); } builder.duration(40).EUt(GTValues.VA[GTValues.HV]).save(provider); } - - - - - public static void processFrothedPure(TagPrefix frothedPrefix, Material material, OreProperty property, - Consumer provider) { + public static void processFrothedPure(RecipeOutput provider, Material material) { + if (!material.shouldGenerateRecipesFor(prismaFrothed) || !material.hasProperty(PropertyKey.ORE)) return; + ItemStack refinedStack = ChemicalHelper.get(prismaFrothed, material); ItemStack pureStack = ChemicalHelper.get(dustPure, material); + var property = material.getProperty(PropertyKey.ORE); - Material byproduct = GTUtil.selectItemInList( - Integer.MAX_VALUE, material, property.getOreByProducts(), Material.class); + Material byproduct = property.getOreByProduct(0); - var builder = CHEMICAL_BATH_RECIPES.recipeBuilder("frothed" + material.getName() + "_to_purified") - .inputItems(frothedPrefix, material) + var builder = CHEMICAL_BATH_RECIPES.recipeBuilder("frothed_" + material.getName() + "_to_purified") + .inputItems(prismaFrothed, material) .inputFluids(Water.getFluid(1000)) .outputItems(pureStack); - if (byproduct != null && !ChemicalHelper.get(dustPure, byproduct).isEmpty()) { + if (byproduct != GTMaterials.NULL && !ChemicalHelper.get(dustPure, byproduct).isEmpty()) { builder.chancedOutput(dustPure, byproduct, 1500, 1950); } builder.outputFluids(DilutedPrisma.getFluid(1250)); builder.duration(40).EUt(GTValues.VA[GTValues.IV]).save(provider); } + + // Prismatic Foundry + + public static void processRawOretoFinalStates(RecipeOutput provider, Material material) { + if (!material.shouldGenerateRecipesFor(rawOre) || !material.hasProperty(PropertyKey.ORE)) return; + var property = material.getProperty(PropertyKey.ORE); + ItemStack frothedStack = ChemicalHelper.get(dust, material); + + Material byproduct = property.getOreByProduct(0); + Material byproduct2 = property.getOreByProduct(1); + Material byproduct3 = property.getOreByProduct(2); + Material byproduct4 = property.getOreByProduct(Integer.MAX_VALUE); + + var builder = PRISMA_FOUNDRY.recipeBuilder("raw_ore_prismf_" + material.getName() + "_to_dusts") + .inputItems(rawOre, material) + .inputFluids(GTMaterials.Blaze.getFluid(250)) + .inputFluids(Water.getFluid(2750)) + .circuitMeta(1) + .outputItems(frothedStack.copyWithCount(6)); + if (byproduct != GTMaterials.NULL && !ChemicalHelper.get(dust, byproduct).isEmpty()) { + builder.chancedOutput(dust, byproduct, 3, 3500, 0); + } + if (byproduct2 != GTMaterials.NULL && !ChemicalHelper.get(dust, byproduct2).isEmpty()) { + builder.chancedOutput(dust, byproduct2, 3, 3500, 0); + } + if (byproduct3 != GTMaterials.NULL && !ChemicalHelper.get(dust, byproduct3).isEmpty()) { + builder.chancedOutput(dust, byproduct3, 3, 3500, 0); + } + if (byproduct4 != GTMaterials.NULL && !ChemicalHelper.get(dust, byproduct4).isEmpty()) { + builder.chancedOutput(dust, byproduct4, 3, 3500, 0); + } + builder.duration(40).EUt(GTValues.V[GTValues.HV]).save(provider); + } + + public static void processRawOretoFinalStatesAugmented(RecipeOutput provider, Material material) { + if (!material.shouldGenerateRecipesFor(rawOre) || !material.hasProperty(PropertyKey.ORE)) return; + var property = material.getProperty(PropertyKey.ORE); + ItemStack frothedStack = ChemicalHelper.get(dust, material); + + Material byproduct = property.getOreByProduct(0); + Material byproduct2 = property.getOreByProduct(1); + Material byproduct3 = property.getOreByProduct(2); + Material byproduct4 = property.getOreByProduct(Integer.MAX_VALUE); + + var builder = PRISMA_FOUNDRY.recipeBuilder("raw_ore_prismf_" + material.getName() + "_to_dusts_improved") + .inputItems(rawOre, material) + .chancedInput(CosmicItems.ABRASIVE_ROSIN_MILLSTONES.asStack(), 5500, 0) + .inputFluids(GTMaterials.Blaze.getFluid(25)) + .inputFluids(Water.getFluid(2750)) + .circuitMeta(2) + .outputItems(frothedStack.copyWithCount(9)); + if (byproduct != GTMaterials.NULL && !ChemicalHelper.get(dust, byproduct).isEmpty()) { + builder.chancedOutput(dust, byproduct, 5, 5500, 0); + } + if (byproduct2 != GTMaterials.NULL && !ChemicalHelper.get(dust, byproduct2).isEmpty()) { + builder.chancedOutput(dust, byproduct2, 5, 5500, 0); + } + if (byproduct3 != GTMaterials.NULL && !ChemicalHelper.get(dust, byproduct3).isEmpty()) { + builder.chancedOutput(dust, byproduct3, 5, 5500, 0); + } + if (byproduct4 != GTMaterials.NULL && !ChemicalHelper.get(dust, byproduct4).isEmpty()) { + builder.chancedOutput(dust, byproduct4, 5, 5500, 0); + } + builder.duration(40).EUt(GTValues.V[GTValues.HV]).save(provider); + } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicMaterialRecipeHandlers.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicMaterialRecipeHandlers.java new file mode 100644 index 000000000..cb9f2aa60 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicMaterialRecipeHandlers.java @@ -0,0 +1,90 @@ +package com.ghostipedia.cosmiccore.common.data.recipe; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.data.chemical.material.info.MaterialFlags; +import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; + +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.resources.ResourceLocation; + +import org.jetbrains.annotations.NotNull; + +import static com.ghostipedia.cosmiccore.api.data.CosmicTagPrefix.*; +import static com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes.*; +import static com.gregtechceu.gtceu.api.data.tag.TagPrefix.*; + +public class CosmicMaterialRecipeHandlers { + + public static void init(@NotNull RecipeOutput provider, @NotNull Material material) { + processHeavyBeam(provider, material); + processModularShelling(provider, material); + processUltraDensePlate(provider, material); + processWireSpool(provider, material); + } + + private static void processHeavyBeam(@NotNull RecipeOutput provider, @NotNull Material material) { + if (!material.shouldGenerateRecipesFor(rod) || !material.shouldGenerateRecipesFor(plate) || + !material.hasProperty(PropertyKey.INGOT)) + return; + HEAVY_ASSEMBLER.recipeBuilder("heavy_assemble_" + material.getName() + "_to_heavy_beam") + .inputItems(plate, material, 2) + .inputItems(plate, material, 2) + .inputItems(plate, material, 2) + .inputItems(plate, material, 2) + .inputItems(rod, material, 4) + .inputItems(rod, material, 4) + .inputItems(rod, material, 4) + .inputItems(rod, material, 4) + .outputItems(heavyBeam, material, 1) + .duration((int) material.getMass() * 2) + .EUt(GTValues.VA[GTValues.LuV], 6) + .circuitMeta(1) + .save(provider); + } + + private static void processModularShelling(@NotNull RecipeOutput provider, @NotNull Material material) { + if (!material.hasFlag(MaterialFlags.GENERATE_PLATE) || !material.hasFlag(MaterialFlags.GENERATE_BOLT_SCREW) || + !material.hasFlag(MaterialFlags.GENERATE_FRAME) || !material.hasProperty(PropertyKey.INGOT)) + return; + + HEAVY_ASSEMBLER.recipeBuilder("heavy_assemble_" + material.getName() + "_modular_shelling") + + .inputItems(frameGt, material, 4) + .inputItems(heavyBeam, material, 4) + .inputItems(plate, material, 16) + .inputItems(bolt, material, 32) + .outputItems(modularShelling, material, 1) + .duration((int) material.getMass() * 4) + .EUt(GTValues.VA[GTValues.LuV], 6) + .circuitMeta(3) + .save(provider); + } + + private static void processUltraDensePlate(@NotNull RecipeOutput provider, @NotNull Material material) { + if (!material.hasFlag(MaterialFlags.GENERATE_PLATE) || !material.hasProperty(PropertyKey.INGOT)) return; + + ORBITAL_FORGE_EBF.recipeBuilder("heavy_forging_" + material.getName() + "_ultra_dense_plate") + .inputItems(plate, material, 64) + .outputItems(ultraDense, material, 1) + .duration((int) material.getMass() * 3) + .EUt(GTValues.VA[GTValues.LuV], 6) + .blastFurnaceTemp(9500) + .circuitMeta(7) + .dimension(ResourceLocation.parse("frontiers:sun_orbit")) + .save(provider); + } + + private static void processWireSpool(@NotNull RecipeOutput provider, @NotNull Material material) { + if (!material.hasProperty(PropertyKey.WIRE) || !material.hasProperty(PropertyKey.INGOT)) + return; + + HEAVY_ASSEMBLER.recipeBuilder("heavy_assemble_" + material.getName() + "_wire_spool") + .inputItems(wireGtSingle, material, 16) + .outputItems(largeWireSpool, material, 1) + .duration((int) material.getMass() * 4) + .EUt(GTValues.VA[GTValues.LuV], 6) + .circuitMeta(3) + .save(provider); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicRecipeModifiers.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicRecipeModifiers.java index f2fb2bab3..81e998d5d 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicRecipeModifiers.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/CosmicRecipeModifiers.java @@ -1,30 +1,363 @@ package com.ghostipedia.cosmiccore.common.data.recipe; -import com.ghostipedia.cosmiccore.api.machine.multiblock.MagnetWorkableElectricMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; import com.ghostipedia.cosmiccore.common.machine.multiblock.electric.MagneticFieldMachine; -import com.gregtechceu.gtceu.api.GTValues; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.LarvaMachine; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.TitanFusionReactorMachine; +import com.ghostipedia.cosmiccore.common.machine.multiblock.part.ModuleHatchPartMachine; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.multiblock.CoilWorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; +import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; +import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; +import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import org.jetbrains.annotations.NotNull; +import java.util.Collections; +import java.util.Map; + public class CosmicRecipeModifiers { - public static GTRecipe magnetRecipe(MetaMachine machine, @NotNull GTRecipe recipe) { - if (machine instanceof MagneticFieldMachine magnetMachine) { - final var magnetStrength = magnetMachine.getFieldStrength(); - if (!recipe.data.contains("min_field") || recipe.data.getInt("min_field") > magnetStrength) { - return null; - } - if(!magnetMachine.isGenerator()){ - if (RecipeHelper.getRecipeEUtTier(recipe) > magnetMachine.getTier()) { - return null; + + public static final RecipeModifier COSMIC_MODULES = CosmicRecipeModifiers::moduleParallel; + + /** + * Recipe modifier for Stellar Modules. + * Uses the module's configured voltage and parallel settings. + * - Applies overclocking based on configured voltage per parallel + * - Applies parallelization up to the effective parallel limit (min of configured and Iris limit) + */ + public static final RecipeModifier STELLAR_MODULE_OVERCLOCK = CosmicRecipeModifiers::stellarModuleOverclock; + + /** + * Stellar module overclock logic. + * Uses configuredVoltagePerParallel for OC tier and configuredMaxParallel for parallels. + */ + public static @NotNull ModifierFunction stellarModuleOverclock(MetaMachine machine, GTRecipe recipe) { + if (!(machine instanceof StellarBaseModule module)) { + return ModifierFunction.NULL; + } + + // Check if recipe tier is within our configured tier + int recipeTier = RecipeHelper.getRecipeEUtTier(recipe); + int moduleTier = module.getOverclockTier(); + if (recipeTier > moduleTier) { + return ModifierFunction.NULL; // Recipe requires higher tier than configured + } + + // Get the effective parallel limit (min of user config and Iris limit) + int maxParallels = module.getEffectiveParallelLimit(); + + // Calculate actual parallels based on available resources + int actualParallels = ParallelLogic.getParallelAmount(machine, recipe, maxParallels); + if (actualParallels == 0) { + return ModifierFunction.NULL; + } + + // Calculate maximum voltage for overclocking + // Total voltage = voltage per parallel * number of parallels + long maxVoltage = module.getConfiguredVoltagePerParallel() * actualParallels; + + // Apply overclock using non-perfect subtick logic + // This uses the configured voltage as the maximum + var ocModifier = OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK.getModifier( + machine, recipe, maxVoltage, false); // Don't let OC logic add more parallels + + // Apply parallel modifier + if (actualParallels > 1) { + var parallelModifier = ModifierFunction.builder() + .modifyAllContents(ContentModifier.multiplier(actualParallels)) + .eutMultiplier(actualParallels) + .parallels(actualParallels) + .build(); + return ocModifier.andThen(parallelModifier); + } + + return ocModifier; + } + + public static ModifierFunction asteroidYieldModifier(MetaMachine machine, GTRecipe recipe) { + if (!(machine instanceof IRecipeLogicMachine recipeLogicMachine)) { + return ModifierFunction.NULL; + } + int size = 1; + var handlers = recipeLogicMachine.getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP); + for (var handler : handlers) { + for (var content : handler.getContents()) { + if (content instanceof ItemStack stack && !stack.isEmpty()) { + size = Math.max(size, LarvaMachine.getAsteroidSize(stack)); + } } + } + if (size == 1) return ModifierFunction.IDENTITY; + int cap = ParallelLogic.limitByOutputMerging(recipeLogicMachine, recipe, size, + recipeLogicMachine::canVoidRecipeOutputs, Collections.emptyList()); + if (cap <= 1) return ModifierFunction.IDENTITY; + + return ModifierFunction.builder() + .outputModifier(ContentModifier.multiplier(cap)) + .build(); + } + + public static ModifierFunction vomahineReactorOC(MetaMachine machine, GTRecipe recipe) { + if (!(machine instanceof MagneticFieldMachine magnetMachine)) { + return RecipeModifier.nullWrongType(MagneticFieldMachine.class, machine); + } + final var magnetStrength = magnetMachine.getFieldStrength(); + long EUt = recipe.getOutputEUt().getTotalEU(); + int actualParallel = ParallelLogic.getParallelAmount(magnetMachine, recipe, 16); + long maxReactorVoltage = magnetMachine.getOverclockVoltage(); + float recipeDuration = (recipe.duration); + float durationModifier = recipeDuration * actualParallel / 20; + // Parallel is ALWAYS capped to 16 + // Check that the damn thing actually creates EU + if (EUt <= 0 || maxReactorVoltage <= EUt) return ModifierFunction.NULL; + if (!recipe.data.contains("min_field") || recipe.data.getInt("min_field") > magnetStrength) { + return ModifierFunction.NULL; + } + if (!magnetMachine.isGenerator()) { + if (RecipeHelper.getRecipeEUtTier(recipe) > magnetMachine.getTier()) { + return ModifierFunction.NULL; + } + } + // EU Outputs is always 16A of the respective recipe (If it can). + return ModifierFunction.builder() + .inputModifier(ContentModifier.multiplier(actualParallel)) + // .durationMultiplier(durationModifier) this just actually causes hell on earth so ignore for now + .eutMultiplier(actualParallel) + .parallels(actualParallel) + .build(); + } - return recipe; + public static ModifierFunction chemicalVatLogic(MetaMachine machine, GTRecipe recipe) { + if (machine instanceof WorkableMultiblockMachine vatMachine) { + if (vatMachine.getParallelHatch().isPresent()) { + int actualParallel = ParallelLogic.getParallelAmount(vatMachine, recipe, + vatMachine.getParallelHatch().get().getCurrentParallel()); + + return ModifierFunction.builder() + .modifyAllContents(ContentModifier.multiplier(actualParallel)) + .eutMultiplier(actualParallel * 0.75F) + .parallels(actualParallel) + .durationMultiplier(actualParallel / 4F) + .build(); + } } - return null; + return ModifierFunction.IDENTITY; } + + public static @NotNull ModifierFunction groveMulti(@NotNull MetaMachine machine, @NotNull GTRecipe recipe) { + if (!(machine instanceof IRecipeLogicMachine rlm)) return ModifierFunction.NULL; + final Item match = BuiltInRegistries.ITEM.get(ResourceLocation.parse("ars_nouveau:drygmy_charm")); + var handlers = rlm.getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP); + int count = 0; + for (var handler : handlers) { + for (var content : handler.getContents()) { + if (content instanceof ItemStack stack && !stack.isEmpty()) { + if (stack.is(match)) count += stack.getCount(); + } + } + } + + if (count == 1) return ModifierFunction.IDENTITY; + int multiplier = ParallelLogic.limitByOutputMerging(rlm, recipe, count, rlm::canVoidRecipeOutputs, + Collections.emptyList()); + if (multiplier == 1) return ModifierFunction.IDENTITY; + if (multiplier == 0) return ModifierFunction.NULL; + return ModifierFunction.builder() + .outputModifier(ContentModifier.multiplier(multiplier)) + .build(); + } + + public static @NotNull ModifierFunction innateParallel4x(MetaMachine machine, GTRecipe recipe) { + if (machine instanceof WorkableMultiblockMachine parallelMachine) { + if (parallelMachine.getParallelHatch().isPresent()) { + int actualParallel = ParallelLogic.getParallelAmount(parallelMachine, recipe, + parallelMachine.getParallelHatch().get().getCurrentParallel() * 4); + + return ModifierFunction.builder() + .modifyAllContents(ContentModifier.multiplier(actualParallel)) + .eutMultiplier(actualParallel) + .parallels(actualParallel) + .build(); + } + } + return ModifierFunction.IDENTITY; + } + + public static @NotNull ModifierFunction titanReactorParallel(MetaMachine machine, GTRecipe recipe) { + if (machine instanceof TitanFusionReactorMachine parallelMachine) { + int actualParallel = ParallelLogic.getParallelAmount(parallelMachine, recipe, + 64 * (parallelMachine.getReactorTier() - 2)); + return ModifierFunction.builder() + .modifyAllContents(ContentModifier.multiplier(actualParallel)) + .eutMultiplier(actualParallel) + .parallels(actualParallel) + .build(); + } + return ModifierFunction.IDENTITY; + } + + private static Map moduleParallels = null; + + public static Map getModuleParallels() { + if (moduleParallels == null) { + moduleParallels = new Object2IntOpenHashMap<>(); + moduleParallels.put(CosmicItems.PARA_MOD_1.asItem().getDescriptionId(), 16); + moduleParallels.put(CosmicItems.PARA_MOD_2.asItem().getDescriptionId(), 32); + moduleParallels.put(CosmicItems.PARA_MOD_3.asItem().getDescriptionId(), 64); + moduleParallels.put(CosmicItems.PARA_MOD_4.asItem().getDescriptionId(), 256); + } + return moduleParallels; + } + + public static @NotNull ModifierFunction moduleParallel(MetaMachine machine, GTRecipe recipe) { + if (!(machine instanceof MultiblockControllerMachine multi)) return ModifierFunction.IDENTITY; + int extraParallels = 0; + for (var part : multi.getParts()) { + if (part instanceof ModuleHatchPartMachine modulePart) { + for (int i = 0; i < modulePart.getInventory().getSlots(); i++) { + ItemStack stack = modulePart.getInventory().getStackInSlot(i); + extraParallels += getModuleParallels().getOrDefault(stack.getDescriptionId(), 0); + } + } + } + if (extraParallels == 0) return ModifierFunction.IDENTITY; + + final int finalExtraParallels = extraParallels; + return (functionRecipe) -> { + // If we are at only 1 parallel so far, + // set the max parallels to extraParallels instead of adding to functionRecipe.parallels + int actualParallel; + if (functionRecipe.parallels == 1) { + actualParallel = ParallelLogic.getParallelAmount(machine, recipe, finalExtraParallels); + } else { + actualParallel = ParallelLogic.getParallelAmount(machine, recipe, + functionRecipe.parallels + finalExtraParallels); + + } + + if (recipe.getType() == GTRecipeTypes.ASSEMBLY_LINE_RECIPES) { + if (actualParallel > 64) { + actualParallel = 64; + } + } + + // Set the contents to actualParallel, which means adding actualParallel-1 + var newRecipe = ModifierFunction.builder() + .modifyAllContents(ContentModifier.addition(actualParallel - 1)) + .eutModifier(ContentModifier.addition(actualParallel - 1)) + .parallels(actualParallel - 1) + .build().apply(functionRecipe); + newRecipe.parallels = actualParallel; + return newRecipe; + }; + } + /* + * public static @NotNull BiFunction sterileHatch(FluidStack stack, boolean + * perTick) { + * return (machine, recipe) -> { + * if (machine instanceof MultiblockControllerMachine controller && controller.isFormed()) { + * var parts = controller.getParts(); + * var sterileHatch = parts.stream() + * .filter(part -> part instanceof SterilizationHatchPartMachine) + * .findAny(); + * if (sterileHatch.isPresent()) { + * var copy = recipe.copy(); + * + * // Change the tickInputs or inputs depending on perTick + * var inputsMap = perTick ? + * copy.tickInputs : + * copy.inputs; + * var inputs = inputsMap.getOrDefault(FluidRecipeCapability.CAP, new ArrayList<>()); + * + * inputs.add(new Content(FluidIngredient.of( + * TagUtil.createFluidTag(BuiltInRegistries.FLUID.getKey(stack.getFluid()).getPath()), + * stack.getAmount(), stack.getTag()), 10000, 10000, 0)); + * + * if(perTick) { + * inputsMap.put(FluidRecipeCapability.CAP, inputs); + * } else { + * inputsMap.put(FluidRecipeCapability.CAP, inputs); + * } + * return (c) -> copy; + * } + * return ModifierFunction.IDENTITY; + * } + * return ModifierFunction.NULL; + * }; + * } + */ + + // .recipeModifiers(true, + // (machine, recipe, OCParams, OCResult) -> { + // if (machine instanceof IRecipeCapabilityHolder holder) { + // // Find all the items in the combined Item Input inventories and create oversized ItemStacks + // Object2IntMap ingredientStacks = + // Objects.requireNonNullElseGet(holder.getCapabilitiesProxy().get(IO.IN, ItemRecipeCapability.CAP), + // Collections::>emptyList) + // .stream() + // .map(container -> + // container.getContents().stream().filter(ItemStack.class::isInstance).map(ItemStack.class::cast).toList()) + // .flatMap(container -> GTHashMaps.fromItemStackCollection(container).object2IntEntrySet().stream()) + // .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, Integer::sum, () -> new + // Object2IntOpenCustomHashMap<>(ItemStackHashStrategy.comparingAllButCount()))); + // ItemStack stack = new ItemStack(BuiltInRegistries.ITEM.get(new + // ResourceLocation("ars_nouveau:drygmy_charm"))); + // //Never let the multiplier be 0 (THIS IS NOT ACTUALLY PARALLEL, It's just being used to to some goober + // grade math) + // if (ingredientStacks.getInt(stack) >= 1) { + // var maxParallel = ingredientStacks.getInt(stack) / 2; + // recipe = copyOutputs(recipe, ContentModifier.multiplier(maxParallel)); + // } + // } + // return recipe; + // }, + // GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK)) + + // TODO; FIX IT! + // public static GTRecipe vomahineChemicalPlantParallel(MetaMachine machine, @NotNull GTRecipe recipe, OCParams + // ocParams, OCResult ocResult) { + // if (machine instanceof WorkableElectricMultiblockMachine vomahineMachine) { + // Optional optional = vomahineMachine.getParts().stream().filter(IParallelHatch.class::isInstance) + // .map(IParallelHatch.class::cast).findAny(); + // if (optional.isPresent()) { + // IParallelHatch hatch = optional.get(); + // if (hatch.getCurrentParallel() != 0) { + // var result = GTRecipeModifiers.accurateParallel(machine, recipe, hatch.getCurrentParallel(), false); + // recipe = result.getFirst() == recipe ? result.getFirst().copy() : result.getFirst(); + // var smartDuration = (recipe.duration * hatch.getCurrentParallel()) / 2; + // int parallelValue = result.getSecond(); + // recipe.duration = smartDuration; + // ocResult.init(RecipeHelper.getInputEUt(recipe), smartDuration, parallelValue, ocResult.getOcLevel()); + // return recipe; + // } + // } + // var result = GTRecipeModifiers.accurateParallel(machine, recipe, 0, false); + // recipe = result.getFirst() == recipe ? result.getFirst().copy() : result.getFirst(); + // var smartDuration = recipe.duration / 2; + // int parallelValue = result.getSecond(); + // recipe.duration = smartDuration; + // ocResult.init(RecipeHelper.getInputEUt(recipe), smartDuration, parallelValue, ocResult.getOcLevel()); + // return recipe; + // } + // return null; + // } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/RecipeTags.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/RecipeTags.java deleted file mode 100644 index aab487195..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/recipe/RecipeTags.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.ghostipedia.cosmiccore.common.data.recipe; - -import com.ghostipedia.cosmiccore.common.data.tag.TagUtil; -import net.minecraft.tags.TagKey; -import net.minecraft.world.level.block.Block; - - -public class RecipeTags { - - public static final TagKey MINEABLE_WITH_WRENCH = TagUtil.createBlockTag("mineable/wrench"); -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/CosmicTagsHandler.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/CosmicTagsHandler.java index 15d79ee6e..1b50b11f0 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/CosmicTagsHandler.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/CosmicTagsHandler.java @@ -1,23 +1,26 @@ package com.ghostipedia.cosmiccore.common.data.tag; +import com.ghostipedia.cosmiccore.common.data.tag.block.CosmicBlockTagsLoader; import com.ghostipedia.cosmiccore.common.data.tag.item.CosmicItemTagsLoader; -import com.tterrag.registrate.providers.RegistrateTagsProvider; -import net.minecraft.world.entity.Entity; + import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.material.Fluid; +import com.tterrag.registrate.providers.RegistrateTagsProvider; + public class CosmicTagsHandler { public static void initItem(RegistrateTagsProvider provider) { CosmicItemTagsLoader.init(provider); } - public static void initBlock(RegistrateTagsProvider provider) {} + public static void initBlock(RegistrateTagsProvider provider) { + CosmicBlockTagsLoader.init(provider); + } public static void initFluid(RegistrateTagsProvider provider) {} public static void initEntity(RegistrateTagsProvider> provider) {} - } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/TagUtil.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/TagUtil.java index 756f437ab..54d2e2f7d 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/TagUtil.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/TagUtil.java @@ -1,5 +1,7 @@ package com.ghostipedia.cosmiccore.common.data.tag; -import com.lowdragmc.lowdraglib.Platform; + +import com.ghostipedia.cosmiccore.CosmicCore; + import net.minecraft.core.Registry; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; @@ -8,16 +10,16 @@ import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.material.Fluid; -import com.ghostipedia.cosmiccore.CosmicCore; public class TagUtil { + public static TagKey optionalTag(ResourceKey> registry, ResourceLocation id) { return TagKey.create(registry, id); } public static TagKey createTag(ResourceKey> registry, String path, boolean vanilla) { - if (vanilla) return optionalTag(registry, new ResourceLocation("minecraft", path)); - return optionalTag(registry, new ResourceLocation("forge", path)); + if (vanilla) return optionalTag(registry, ResourceLocation.fromNamespaceAndPath("minecraft", path)); + return optionalTag(registry, ResourceLocation.fromNamespaceAndPath("forge", path)); } public static TagKey createModTag(ResourceKey> registry, String path) { @@ -55,5 +57,4 @@ public static TagKey createFluidTag(String path) { public static TagKey createModFluidTag(String path) { return createModTag(Registries.FLUID, path); } - } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/block/CosmicBlockTags.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/block/CosmicBlockTags.java new file mode 100644 index 000000000..cbc8c4f37 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/block/CosmicBlockTags.java @@ -0,0 +1,12 @@ +package com.ghostipedia.cosmiccore.common.data.tag.block; + +import com.ghostipedia.cosmiccore.common.data.tag.TagUtil; + +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.block.Block; + +public class CosmicBlockTags { + + public static final TagKey OVERWORLD_ORE_REPLACEABLES = TagUtil + .createModBlockTag("overworld_ore_replaceables"); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/block/CosmicBlockTagsLoader.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/block/CosmicBlockTagsLoader.java new file mode 100644 index 000000000..bcab6e940 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/block/CosmicBlockTagsLoader.java @@ -0,0 +1,24 @@ +package com.ghostipedia.cosmiccore.common.data.tag.block; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.block.Block; + +import com.tterrag.registrate.providers.RegistrateTagsProvider; + +public class CosmicBlockTagsLoader { + + public static void init(RegistrateTagsProvider provider) { + var overworldTag = provider.addTag(CosmicBlockTags.OVERWORLD_ORE_REPLACEABLES) + .addTag(BlockTags.STONE_ORE_REPLACEABLES) + .addTag(BlockTags.DEEPSLATE_ORE_REPLACEABLES); + + overworldTag.addOptional(ResourceLocation.fromNamespaceAndPath("create", "scoria")); + overworldTag.addOptional(ResourceLocation.fromNamespaceAndPath("create", "scorchia")); + overworldTag.addOptional(ResourceLocation.fromNamespaceAndPath("create", "crimsite")); + overworldTag.addOptional(ResourceLocation.fromNamespaceAndPath("create", "limestone")); + overworldTag.addOptional(ResourceLocation.fromNamespaceAndPath("create", "asurine")); + overworldTag.addOptional(ResourceLocation.fromNamespaceAndPath("create", "ochrum")); + overworldTag.addOptional(ResourceLocation.fromNamespaceAndPath("create", "veridium")); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java index 8e207275d..4d92d583a 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTags.java @@ -1,6 +1,7 @@ package com.ghostipedia.cosmiccore.common.data.tag.item; import com.ghostipedia.cosmiccore.common.data.tag.TagUtil; + import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; @@ -8,5 +9,4 @@ public class CosmicItemTags { public static final TagKey NANOMUSCLE_SPACE_SUITE = TagUtil.createModItemTag("nano_space_suite"); public static final TagKey QUARKTECH_SPACE_SUITE = TagUtil.createModItemTag("quantum_space_suite"); - } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTagsLoader.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTagsLoader.java index 7234e4755..d989f6d9f 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTagsLoader.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/tag/item/CosmicItemTagsLoader.java @@ -1,33 +1,32 @@ package com.ghostipedia.cosmiccore.common.data.tag.item; import com.gregtechceu.gtceu.common.data.GTItems; -import com.tterrag.registrate.providers.RegistrateTagsProvider; -import com.tterrag.registrate.util.entry.ItemEntry; -import earth.terrarium.adastra.common.tags.ModItemTags; + import net.minecraft.tags.TagEntry; import net.minecraft.tags.TagKey; import net.minecraft.world.item.Item; +import com.tterrag.registrate.providers.RegistrateTagsProvider; +import com.tterrag.registrate.util.entry.ItemEntry; + import java.util.stream.Stream; public class CosmicItemTagsLoader { - public static ItemEntry[] NANO_SPACE_SUITE = {GTItems.NANO_HELMET, GTItems.NANO_LEGGINGS, GTItems.NANO_BOOTS}; - public static ItemEntry[] QUANTUM_SPACE_SUITE = {GTItems.QUANTUM_HELMET, GTItems.QUANTUM_LEGGINGS, GTItems.QUANTUM_BOOTS}; - public static ItemEntry[] SPACE_SUITES = Stream.of(NANO_SPACE_SUITE, QUANTUM_SPACE_SUITE).flatMap(Stream::of).toArray(ItemEntry[]::new); + public static ItemEntry[] NANO_SPACE_SUITE = { GTItems.NANO_HELMET, GTItems.NANO_LEGGINGS, GTItems.NANO_BOOTS }; + public static ItemEntry[] QUANTUM_SPACE_SUITE = { GTItems.QUANTUM_HELMET, GTItems.QUANTUM_LEGGINGS, + GTItems.QUANTUM_BOOTS }; + public static ItemEntry[] SPACE_SUITES = Stream.of(NANO_SPACE_SUITE, QUANTUM_SPACE_SUITE).flatMap(Stream::of) + .toArray(ItemEntry[]::new); public static void init(RegistrateTagsProvider provider) { create(provider, CosmicItemTags.NANOMUSCLE_SPACE_SUITE, NANO_SPACE_SUITE); create(provider, CosmicItemTags.QUARKTECH_SPACE_SUITE, QUANTUM_SPACE_SUITE); - - create(provider, ModItemTags.SPACE_SUITS, SPACE_SUITES); - create(provider, ModItemTags.FREEZE_RESISTANT_ARMOR, SPACE_SUITES); - create(provider, ModItemTags.HEAT_RESISTANT_ARMOR, SPACE_SUITES); + // TODO(stellaris): re-add AA ModItemTags (SPACE_SUITS / FREEZE_RESISTANT_ARMOR / HEAT_RESISTANT_ARMOR) post-Ad-Astra } private static void create(RegistrateTagsProvider provider, TagKey tagKey, ItemEntry... items) { var builder = provider.addTag(tagKey); for (ItemEntry itemEntry : items) builder.add(TagEntry.element(itemEntry.getId())); } - } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/temperature/attribute/FireResApplicator.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/temperature/attribute/FireResApplicator.java new file mode 100644 index 000000000..d9eddafe2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/temperature/attribute/FireResApplicator.java @@ -0,0 +1,52 @@ +package com.ghostipedia.cosmiccore.common.data.temperature.attribute; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.player.Player; +import net.neoforged.neoforge.event.entity.living.MobEffectEvent; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; + +import sfiomn.legendarysurvivaloverhaul.api.temperature.TemperatureUtil; + +import java.util.UUID; + +@EventBusSubscriber(modid = CosmicCore.MOD_ID, bus = EventBusSubscriber.Bus.GAME) +public class FireResApplicator { + + public static final UUID heatResModifierID = UUID.fromString("9b3cd493-22a7-4b4b-921e-f0c740300a7f"); + public static final UUID coldResModifierID = UUID.fromString("9df8481a-c770-4ffd-a8c9-c61989922b44"); + + @SubscribeEvent + public static void onPotionEffect(MobEffectEvent.Added event) { + if (event.getEntity() instanceof Player player && + event.getEffectInstance().getEffect() == MobEffects.FIRE_RESISTANCE) { + TemperatureUtil.internal.addHeatResistanceModifier(player, 500.0, heatResModifierID); + } + if (event.getEntity() instanceof Player player && + event.getEffectInstance().getEffect() == MobEffects.WATER_BREATHING) { + + } + } + + @SubscribeEvent + public static void onPotionEffect(MobEffectEvent.Expired event) { + if (event.getEntity() instanceof Player player) { + if (event.getEffectInstance() != null && + event.getEffectInstance().getEffect() == MobEffects.FIRE_RESISTANCE) { + TemperatureUtil.internal.addHeatResistanceModifier(player, 0.0, heatResModifierID); + } + } + } + + @SubscribeEvent + public static void onPotionEffect(MobEffectEvent.Remove event) { + if (event.getEntity() instanceof Player player) { + if (event.getEffectInstance() != null && + event.getEffectInstance().getEffect() == MobEffects.FIRE_RESISTANCE) { + TemperatureUtil.internal.addHeatResistanceModifier(player, 0.0, heatResModifierID); + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/CosmicOreVeins.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/CosmicOreVeins.java new file mode 100644 index 000000000..9fc9fda4f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/CosmicOreVeins.java @@ -0,0 +1,452 @@ +package com.ghostipedia.cosmiccore.common.data.worldgen; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.*; + +import com.gregtechceu.gtceu.api.data.worldgen.GTOreDefinition; +import com.gregtechceu.gtceu.api.data.worldgen.generator.VeinGenerator; +import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.common.data.GTMaterials; + +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.core.RegistryAccess; +import net.minecraft.resources.ResourceLocation; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Supplier; + +/** + * Explicit ore vein generator definitions for CosmicCore. + * Each vein can be individually tuned with full control over generator parameters. + * + * Generator Types: + * - BRANCHING: Meandering river-like branches that snake and split recursively + * - CLUSTER: Distinct ore pockets connected by thin channels + * - FRACTURE: "Shattered Geode" - hollow shell with inward spikes and outward cracks + * - SHELL: Concentric layers with core/inner/outer materials + * - STRINGER: Large blobby core with many thin tendrils (octopus-like) + */ +public class CosmicOreVeins { + + private static final Logger LOGGER = LoggerFactory.getLogger(CosmicOreVeins.class); + + private static final Map> VEIN_GENERATORS = new HashMap<>(); + + // Track which veins we've registered to know which GT veins to disable + private static final Set REGISTERED_VEIN_IDS = new HashSet<>(); + + public static void init() { + // ============================================ + // OVERWORLD - STONE LAYER + // ============================================ + + // Coal - large scattered pockets + register("coal_vein", () -> { + var gen = new ClusterVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 12, 0.07f, 0.03f, 0.85f, 0.02f); + gen.oreBlock(GTMaterials.Coal, 5); + return gen.build(); + }); + + // Iron - branching veins + register("iron_vein", () -> { + var gen = new BranchingVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 5, 0.12f, 0.18f, 0.35f, 0.55f, 0.06f); + gen.oreBlock(GTMaterials.Goethite, 3); + gen.oreBlock(GTMaterials.YellowLimonite, 2); + gen.oreBlock(GTMaterials.Hematite, 2); + gen.oreBlock(GTMaterials.Malachite, 1); + return gen.build(); + }); + + // Magnetite - branching with gold + register("magnetite_vein_ow", () -> { + var gen = new BranchingVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 4, 0.14f, 0.16f, 0.4f, 0.6f, 0.08f); + gen.oreBlock(GTMaterials.Magnetite, 3); + gen.oreBlock(GTMaterials.VanadiumMagnetite, 2); + gen.rareBlock(GTMaterials.Gold, 1); + return gen.build(); + }); + + // Copper/Tin - stringer (octopus-like tendrils) + register("copper_tin_vein", () -> { + var gen = new StringerVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 18, 0.30f, 0.055f, 0.65f, 0.5f, 0.04f); + gen.oreBlock(GTMaterials.Chalcopyrite, 3); + gen.oreBlock(GTMaterials.Zeolite, 2); + gen.oreBlock(GTMaterials.Cassiterite, 2); + gen.rareBlock(GTMaterials.Realgar, 1); + return gen.build(); + }); + + // Cassiterite (Tin) - stringer + register("cassiterite_vein", () -> { + var gen = new StringerVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 15, 0.28f, 0.06f, 0.6f, 0.55f, 0.03f); + gen.oreBlock(GTMaterials.Tin, 3); + gen.oreBlock(GTMaterials.Cassiterite, 2); + return gen.build(); + }); + + // Galena (Lead/Silver) - branching + register("galena_vein", () -> { + var gen = new BranchingVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 4, 0.13f, 0.15f, 0.45f, 0.5f, 0.1f); + gen.oreBlock(GTMaterials.Galena, 3); + gen.oreBlock(GTMaterials.Silver, 2); + gen.oreBlock(GTMaterials.Lead, 2); + return gen.build(); + }); + + // Salt - cluster pockets + register("salts_vein", () -> { + var gen = new ClusterVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 10, 0.065f, 0.025f, 0.9f, 0.05f); + gen.oreBlock(GTMaterials.RockSalt, 3); + gen.oreBlock(GTMaterials.Salt, 3); + gen.oreBlock(GTMaterials.Lepidolite, 2); + gen.rareBlock(GTMaterials.Spodumene, 1); + return gen.build(); + }); + + // Apatite - cluster + register("apatite_vein", () -> { + var gen = new ClusterVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 8, 0.06f, 0.025f, 0.85f, 0.06f); + gen.oreBlock(GTMaterials.Apatite, 3); + gen.oreBlock(GTMaterials.TricalciumPhosphate, 2); + gen.rareBlock(GTMaterials.Pyrochlore, 1); + return gen.build(); + }); + + // Garnet - shell layers + register("garnet_vein", () -> { + var gen = new ShellVeinGenerator(new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), + 0.25f, 0.55f, 0.3f, 0.25f); + gen.coreBlock(GTMaterials.GarnetRed, 3); + gen.innerBlock(GTMaterials.GarnetYellow, 3); + gen.outerBlock(GTMaterials.Amethyst, 2); + gen.outerBlock(GTMaterials.Opal, 1); + return gen.build(); + }); + + // Garnet/Tin Sand - shell + register("garnet_tin_vein", () -> { + var gen = new ShellVeinGenerator(new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), + 0.25f, 0.6f, 0.3f, 0.15f); + gen.coreBlock(GTMaterials.CassiteriteSand, 3); + gen.innerBlock(GTMaterials.GarnetSand, 3); + gen.outerBlock(GTMaterials.Asbestos, 2); + gen.outerBlock(GTMaterials.Diatomite, 1); + return gen.build(); + }); + + // Lubricant materials - shell + register("lubricant_vein", () -> { + var gen = new ShellVeinGenerator(new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), + 0.3f, 0.6f, 0.2f, 0.2f); + gen.coreBlock(GTMaterials.Soapstone, 3); + gen.innerBlock(GTMaterials.Talc, 3); + gen.outerBlock(GTMaterials.GlauconiteSand, 2); + gen.outerBlock(GTMaterials.Pentlandite, 1); + return gen.build(); + }); + + // Mineral Sand - shell + register("mineral_sand_vein", () -> { + var gen = new ShellVeinGenerator(new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), + 0.25f, 0.55f, 0.3f, 0.25f); + gen.coreBlock(GTMaterials.BasalticMineralSand, 3); + gen.innerBlock(GTMaterials.GraniticMineralSand, 3); + gen.outerBlock(GTMaterials.FullersEarth, 2); + gen.outerBlock(GTMaterials.Gypsum, 1); + return gen.build(); + }); + + // Oilsands - cluster + register("oilsands_vein", () -> { + var gen = new ClusterVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 6, 0.08f, 0.04f, 0.7f, 0.0f); + gen.oreBlock(GTMaterials.Oilsands, 5); + return gen.build(); + }); + + // ============================================ + // OVERWORLD - DEEPSLATE LAYER + // ============================================ + + // Copper - stringer + register("copper_vein", () -> { + var gen = new StringerVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 16, 0.32f, 0.055f, 0.6f, 0.5f, 0.05f); + gen.oreBlock(GTMaterials.Chalcopyrite, 3); + gen.oreBlock(GTMaterials.Iron, 2); + gen.oreBlock(GTMaterials.Pyrite, 2); + gen.oreBlock(GTMaterials.Copper, 1); + return gen.build(); + }); + + // Diamond - shell (valuable core) + register("diamond_vein", () -> { + var gen = new ShellVeinGenerator(new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), + 0.2f, 0.5f, 0.2f, 0.1f); + gen.coreBlock(GTMaterials.Diamond, 2); + gen.innerBlock(GTMaterials.Graphite, 3); + gen.outerBlock(GTMaterials.Coal, 3); + return gen.build(); + }); + + // Lapis - shell + register("lapis_vein", () -> { + var gen = new ShellVeinGenerator(new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), + 0.25f, 0.55f, 0.25f, 0.15f); + gen.coreBlock(GTMaterials.Lazurite, 3); + gen.innerBlock(GTMaterials.Sodalite, 3); + gen.innerBlock(GTMaterials.Lapis, 2); + gen.outerBlock(GTMaterials.Calcite, 3); + return gen.build(); + }); + + // Redstone - fracture (shattered geode) + register("redstone_vein_ow", () -> { + var gen = new FractureVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 14.0f, 0.1f, 10, 7.0f); + gen.oreBlock(GTMaterials.Redstone, 4); + gen.oreBlock(GTMaterials.Chromite, 2); + gen.rareBlock(GTMaterials.Cinnabar, 1); + return gen.build(); + }); + + // Sapphire - shell + register("sapphire_vein", () -> { + var gen = new ShellVeinGenerator(new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), + 0.25f, 0.55f, 0.2f, 0.12f); + gen.coreBlock(GTMaterials.Almandine, 3); + gen.innerBlock(GTMaterials.Pyrope, 3); + gen.outerBlock(GTMaterials.Sapphire, 2); + gen.outerBlock(GTMaterials.GreenSapphire, 1); + return gen.build(); + }); + + // Olivine - shell + register("olivine_vein", () -> { + var gen = new ShellVeinGenerator(new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), + 0.3f, 0.6f, 0.25f, 0.18f); + gen.coreBlock(GTMaterials.Bentonite, 3); + gen.innerBlock(GTMaterials.Magnesite, 3); + gen.outerBlock(GTMaterials.Olivine, 2); + gen.outerBlock(GTMaterials.GlauconiteSand, 1); + return gen.build(); + }); + + // Mica/Bauxite - cluster + register("mica_vein", () -> { + var gen = new ClusterVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 9, 0.055f, 0.025f, 0.85f, 0.08f); + gen.oreBlock(GTMaterials.Kyanite, 3); + gen.oreBlock(GTMaterials.Mica, 2); + gen.oreBlock(GTMaterials.Bauxite, 2); + gen.rareBlock(GTMaterials.Pollucite, 1); + return gen.build(); + }); + + // Manganese - branching + register("manganese_vein_ow", () -> { + var gen = new BranchingVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 4, 0.12f, 0.14f, 0.4f, 0.5f, 0.08f); + gen.oreBlock(GTMaterials.Grossular, 3); + gen.oreBlock(GTMaterials.Spessartine, 2); + gen.oreBlock(GTMaterials.Pyrolusite, 2); + gen.rareBlock(GTMaterials.Tantalite, 1); + return gen.build(); + }); + + // ============================================ + // NETHER + // ============================================ + + // Sulfur - fracture + register("sulfur_vein", () -> { + var gen = new FractureVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 12.0f, 0.08f, 9, 6.0f); + gen.oreBlock(GTMaterials.Sulfur, 3); + gen.oreBlock(GTMaterials.Pyrite, 2); + gen.oreBlock(GTMaterials.Sphalerite, 2); + return gen.build(); + }); + + // Tetrahedrite - fracture + register("tetrahedrite_vein", () -> { + var gen = new FractureVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 11.0f, 0.1f, 8, 5.5f); + gen.oreBlock(GTMaterials.Tetrahedrite, 3); + gen.oreBlock(GTMaterials.Copper, 2); + gen.rareBlock(GTMaterials.Stibnite, 1); + return gen.build(); + }); + + // Redstone (Nether) - fracture + register("redstone_vein", () -> { + var gen = new FractureVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 13.0f, 0.1f, 9, 6.5f); + gen.oreBlock(GTMaterials.Redstone, 4); + gen.oreBlock(GTMaterials.Chromite, 2); + gen.rareBlock(GTMaterials.Cinnabar, 1); + return gen.build(); + }); + + // Banded Iron - branching + register("banded_iron_vein", () -> { + var gen = new BranchingVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 5, 0.14f, 0.18f, 0.35f, 0.55f, 0.1f); + gen.oreBlock(GTMaterials.Goethite, 3); + gen.oreBlock(GTMaterials.YellowLimonite, 2); + gen.oreBlock(GTMaterials.Hematite, 2); + gen.rareBlock(GTMaterials.Gold, 1); + return gen.build(); + }); + + // Beryllium - shell + register("beryllium_vein", () -> { + var gen = new ShellVeinGenerator(new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), + 0.25f, 0.55f, 0.2f, 0.15f); + gen.coreBlock(GTMaterials.Beryllium, 3); + gen.innerBlock(GTMaterials.Emerald, 2); + gen.outerBlock(GTMaterials.Thorium, 2); + return gen.build(); + }); + + // Certus Quartz - cluster (GTCEu uses "certus_quartz" not "certus_quartz_vein") + register("certus_quartz", () -> { + var gen = new ClusterVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 8, 0.06f, 0.028f, 0.85f, 0.06f); + gen.oreBlock(GTMaterials.Quartzite, 3); + gen.oreBlock(GTMaterials.CertusQuartz, 2); + gen.oreBlock(GTMaterials.Barite, 1); + return gen.build(); + }); + + // Manganese (Nether) - branching + register("manganese_vein", () -> { + var gen = new BranchingVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 4, 0.12f, 0.15f, 0.4f, 0.5f, 0.1f); + gen.oreBlock(GTMaterials.Grossular, 3); + gen.oreBlock(GTMaterials.Pyrolusite, 2); + gen.rareBlock(GTMaterials.Tantalite, 1); + return gen.build(); + }); + + // Molybdenum - stringer + register("molybdenum_vein", () -> { + var gen = new StringerVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 14, 0.25f, 0.05f, 0.55f, 0.5f, 0.08f); + gen.oreBlock(GTMaterials.Wulfenite, 3); + gen.oreBlock(GTMaterials.Molybdenite, 2); + gen.oreBlock(GTMaterials.Molybdenum, 2); + gen.rareBlock(GTMaterials.Powellite, 1); + return gen.build(); + }); + + // Monazite - stringer + register("monazite_vein", () -> { + var gen = new StringerVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 12, 0.28f, 0.055f, 0.5f, 0.55f, 0.1f); + gen.oreBlock(GTMaterials.Bastnasite, 3); + gen.oreBlock(GTMaterials.Monazite, 2); + gen.rareBlock(GTMaterials.Neodymium, 1); + return gen.build(); + }); + + // Nether Quartz - cluster + register("nether_quartz_vein", () -> { + var gen = new ClusterVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 10, 0.065f, 0.03f, 0.8f, 0.03f); + gen.oreBlock(GTMaterials.NetherQuartz, 3); + gen.oreBlock(GTMaterials.Quartzite, 2); + return gen.build(); + }); + + // Saltpeter - cluster + register("saltpeter_vein", () -> { + var gen = new ClusterVeinGenerator(new ArrayList<>(), new ArrayList<>(), + 9, 0.055f, 0.025f, 0.85f, 0.06f); + gen.oreBlock(GTMaterials.Saltpeter, 3); + gen.oreBlock(GTMaterials.Diatomite, 2); + gen.oreBlock(GTMaterials.Electrotine, 2); + gen.rareBlock(GTMaterials.Alunite, 1); + return gen.build(); + }); + + // Topaz - shell + register("topaz_vein", () -> { + var gen = new ShellVeinGenerator(new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), + 0.25f, 0.55f, 0.2f, 0.15f); + gen.coreBlock(GTMaterials.BlueTopaz, 2); + gen.coreBlock(GTMaterials.Topaz, 2); + gen.innerBlock(GTMaterials.Chalcocite, 3); + gen.outerBlock(GTMaterials.Bornite, 3); + return gen.build(); + }); + } + + // ============================================ + // REGISTRATION + // ============================================ + + private static void register(String veinId, Supplier generatorSupplier) { + String lowerId = veinId.toLowerCase(); + VEIN_GENERATORS.put(lowerId, generatorSupplier); + REGISTERED_VEIN_IDS.add(lowerId); + } + + public static void applyOverrides(RegistryAccess registryAccess) { + int replaced = 0; + int skipped = 0; + + Registry registry = registryAccess.registryOrThrow(GTRegistries.ORE_VEIN_REGISTRY); + + for (Holder.Reference holder : registry.holders().toList()) { + ResourceLocation id = holder.key().location(); + if (!id.getNamespace().equals("gtceu")) continue; + + String path = id.getPath().toLowerCase(); + Supplier generatorSupplier = VEIN_GENERATORS.get(path); + + if (generatorSupplier != null) { + VeinGenerator generator = generatorSupplier.get(); + if (generator != null) { + holder.value().veinGenerator(generator); + replaced++; + LOGGER.debug("Replaced vein generator for: {}", id); + } + } else { + // TODO(cosmiccore-42): GTCEu 8.0 turned ore veins into a frozen datapack registry; + // there is no supported runtime removal (IMappedRegistryAccess#gtceu$remove is @TestOnly + // and throws on frozen registries). Veins without a custom override can no longer be + // removed here -- this needs a datapack/server-load hook redesign to suppress them. + skipped++; + } + } + + LOGGER.info("CosmicOreVeins: Replaced {} vein generators, {} GT veins left intact (removal unsupported)", + replaced, skipped); + } + + public static boolean hasOverride(String veinId) { + return VEIN_GENERATORS.containsKey(veinId.toLowerCase()); + } + + public static Set getRegisteredVeinIds() { + return Set.copyOf(REGISTERED_VEIN_IDS); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/CosmicVeinOverrides.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/CosmicVeinOverrides.java new file mode 100644 index 000000000..6416266de --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/CosmicVeinOverrides.java @@ -0,0 +1,317 @@ +package com.ghostipedia.cosmiccore.common.data.worldgen; + +import com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.*; + +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.data.worldgen.GTOreDefinition; +import com.gregtechceu.gtceu.api.data.worldgen.generator.VeinGenerator; +import com.gregtechceu.gtceu.api.registry.GTRegistries; + +import net.minecraft.resources.ResourceLocation; + +import java.util.*; +import java.util.Set; + +public class CosmicVeinOverrides { + + public enum VeinShape { + BRANCHING, + SHELL, + CLUSTER, // Replaced LENS - multiple connected ore pockets + STRINGER, + FRACTURE + } + + private static final Map VEIN_SHAPE_OVERRIDES = new HashMap<>(); + private static final Map MATERIAL_SHAPE_HINTS = new HashMap<>(); + + // For testing: shapes in this set will use their custom generator + // Shapes NOT in this set will use a "completed" generator (Branching) so GT veins don't show + private static final Set SHAPES_UNDER_TEST = Set.of( + VeinShape.CLUSTER, + VeinShape.FRACTURE); + + static { + initMaterialHints(); + initSpecificOverrides(); + } + + private static void initMaterialHints() { + MATERIAL_SHAPE_HINTS.put("iron", VeinShape.BRANCHING); + MATERIAL_SHAPE_HINTS.put("magnetite", VeinShape.BRANCHING); + MATERIAL_SHAPE_HINTS.put("hematite", VeinShape.BRANCHING); + MATERIAL_SHAPE_HINTS.put("goethite", VeinShape.BRANCHING); + + MATERIAL_SHAPE_HINTS.put("copper", VeinShape.STRINGER); + MATERIAL_SHAPE_HINTS.put("chalcopyrite", VeinShape.STRINGER); + MATERIAL_SHAPE_HINTS.put("malachite", VeinShape.STRINGER); + MATERIAL_SHAPE_HINTS.put("bornite", VeinShape.STRINGER); + + MATERIAL_SHAPE_HINTS.put("gold", VeinShape.FRACTURE); + MATERIAL_SHAPE_HINTS.put("pyrite", VeinShape.FRACTURE); + MATERIAL_SHAPE_HINTS.put("sphalerite", VeinShape.FRACTURE); // Zinc ore - more common + MATERIAL_SHAPE_HINTS.put("zinc", VeinShape.FRACTURE); + MATERIAL_SHAPE_HINTS.put("tetrahedrite", VeinShape.FRACTURE); // Copper-antimony ore + + MATERIAL_SHAPE_HINTS.put("diamond", VeinShape.SHELL); + MATERIAL_SHAPE_HINTS.put("graphite", VeinShape.SHELL); + MATERIAL_SHAPE_HINTS.put("kimberlite", VeinShape.SHELL); + + MATERIAL_SHAPE_HINTS.put("coal", VeinShape.CLUSTER); + MATERIAL_SHAPE_HINTS.put("lignite", VeinShape.CLUSTER); + + MATERIAL_SHAPE_HINTS.put("salt", VeinShape.CLUSTER); + MATERIAL_SHAPE_HINTS.put("rock_salt", VeinShape.CLUSTER); + MATERIAL_SHAPE_HINTS.put("lepidolite", VeinShape.CLUSTER); + + MATERIAL_SHAPE_HINTS.put("bauxite", VeinShape.CLUSTER); + MATERIAL_SHAPE_HINTS.put("aluminium", VeinShape.CLUSTER); + + MATERIAL_SHAPE_HINTS.put("sulfur", VeinShape.FRACTURE); + MATERIAL_SHAPE_HINTS.put("cinnabar", VeinShape.FRACTURE); + MATERIAL_SHAPE_HINTS.put("stibnite", VeinShape.FRACTURE); // Antimony ore + MATERIAL_SHAPE_HINTS.put("realgar", VeinShape.FRACTURE); // Arsenic ore + + MATERIAL_SHAPE_HINTS.put("tin", VeinShape.STRINGER); + MATERIAL_SHAPE_HINTS.put("cassiterite", VeinShape.STRINGER); + + MATERIAL_SHAPE_HINTS.put("lead", VeinShape.BRANCHING); + MATERIAL_SHAPE_HINTS.put("galena", VeinShape.BRANCHING); + MATERIAL_SHAPE_HINTS.put("silver", VeinShape.BRANCHING); + + MATERIAL_SHAPE_HINTS.put("nickel", VeinShape.SHELL); + MATERIAL_SHAPE_HINTS.put("pentlandite", VeinShape.SHELL); + MATERIAL_SHAPE_HINTS.put("garnierite", VeinShape.SHELL); + + MATERIAL_SHAPE_HINTS.put("redstone", VeinShape.FRACTURE); + + MATERIAL_SHAPE_HINTS.put("lapis", VeinShape.SHELL); + MATERIAL_SHAPE_HINTS.put("lazurite", VeinShape.SHELL); + MATERIAL_SHAPE_HINTS.put("sodalite", VeinShape.SHELL); + + MATERIAL_SHAPE_HINTS.put("uranium", VeinShape.FRACTURE); + MATERIAL_SHAPE_HINTS.put("uraninite", VeinShape.FRACTURE); + MATERIAL_SHAPE_HINTS.put("pitchblende", VeinShape.FRACTURE); + + MATERIAL_SHAPE_HINTS.put("olivine", VeinShape.SHELL); + MATERIAL_SHAPE_HINTS.put("bentonite", VeinShape.CLUSTER); + MATERIAL_SHAPE_HINTS.put("magnesite", VeinShape.CLUSTER); + + MATERIAL_SHAPE_HINTS.put("monazite", VeinShape.STRINGER); + MATERIAL_SHAPE_HINTS.put("bastnasite", VeinShape.STRINGER); + } + + private static void initSpecificOverrides() { + VEIN_SHAPE_OVERRIDES.put("magnetite_vein_ow", VeinShape.BRANCHING); + VEIN_SHAPE_OVERRIDES.put("cassiterite_vein", VeinShape.STRINGER); + VEIN_SHAPE_OVERRIDES.put("galena_vein", VeinShape.BRANCHING); + VEIN_SHAPE_OVERRIDES.put("salt_vein", VeinShape.CLUSTER); + VEIN_SHAPE_OVERRIDES.put("coal_vein", VeinShape.CLUSTER); + VEIN_SHAPE_OVERRIDES.put("diamond_vein", VeinShape.SHELL); + VEIN_SHAPE_OVERRIDES.put("gold_vein", VeinShape.FRACTURE); + VEIN_SHAPE_OVERRIDES.put("sphalerite_vein", VeinShape.FRACTURE); // Common zinc vein + VEIN_SHAPE_OVERRIDES.put("tetrahedrite_vein", VeinShape.FRACTURE); // Common early game vein + VEIN_SHAPE_OVERRIDES.put("pyrite_vein", VeinShape.FRACTURE); // Another common vein + VEIN_SHAPE_OVERRIDES.put("lapis_vein", VeinShape.SHELL); + VEIN_SHAPE_OVERRIDES.put("redstone_vein_ow", VeinShape.FRACTURE); + VEIN_SHAPE_OVERRIDES.put("sulfur_vein", VeinShape.FRACTURE); + VEIN_SHAPE_OVERRIDES.put("cinnabar_vein", VeinShape.FRACTURE); // Mercury ore + VEIN_SHAPE_OVERRIDES.put("stibnite_vein", VeinShape.FRACTURE); // Antimony vein + VEIN_SHAPE_OVERRIDES.put("bauxite_vein_ow", VeinShape.CLUSTER); + VEIN_SHAPE_OVERRIDES.put("nickel_vein", VeinShape.SHELL); + VEIN_SHAPE_OVERRIDES.put("copper_tin_vein", VeinShape.STRINGER); + VEIN_SHAPE_OVERRIDES.put("chalcopyrite_vein", VeinShape.STRINGER); + VEIN_SHAPE_OVERRIDES.put("iron_vein", VeinShape.BRANCHING); + VEIN_SHAPE_OVERRIDES.put("olivine_vein", VeinShape.SHELL); + VEIN_SHAPE_OVERRIDES.put("monazite_vein", VeinShape.STRINGER); + VEIN_SHAPE_OVERRIDES.put("uranium_vein", VeinShape.FRACTURE); + } + + public static void applyVeinOverrides() { + var registry = GTRegistries.builtinRegistry().registryOrThrow(GTRegistries.ORE_VEIN_REGISTRY); + for (var holder : registry.holders().toList()) { + GTOreDefinition vein = holder.value(); + ResourceLocation id = holder.key().location(); + + VeinShape shape = determineVeinShape(id, vein); + if (shape != null) { + VeinGenerator newGenerator = createGenerator(shape, vein); + if (newGenerator != null) { + vein.veinGenerator(newGenerator); + } + } + } + } + + private static VeinShape determineVeinShape(ResourceLocation id, GTOreDefinition vein) { + String path = id.getPath().toLowerCase(Locale.ROOT); + + if (VEIN_SHAPE_OVERRIDES.containsKey(path)) { + return VEIN_SHAPE_OVERRIDES.get(path); + } + + VeinGenerator generator = vein.veinGenerator(); + if (generator == null) return inferShapeFromVeinName(path); + + List materials = generator.getAllMaterials(); + if (materials == null) return inferShapeFromVeinName(path); + + for (Material material : materials) { + if (material == null) continue; + String matName = material.getName().toLowerCase(Locale.ROOT); + if (MATERIAL_SHAPE_HINTS.containsKey(matName)) { + return MATERIAL_SHAPE_HINTS.get(matName); + } + } + + return inferShapeFromVeinName(path); + } + + private static VeinShape inferShapeFromVeinName(String path) { + if (path.contains("iron") || path.contains("magnetite") || path.contains("hematite")) { + return VeinShape.BRANCHING; + } + if (path.contains("copper") || path.contains("tin") || path.contains("cassiterite")) { + return VeinShape.STRINGER; + } + if (path.contains("gold") || path.contains("uranium") || path.contains("pyrite") || + path.contains("sphalerite") || path.contains("tetrahedrite") || path.contains("zinc")) { + return VeinShape.FRACTURE; + } + if (path.contains("diamond") || path.contains("lapis") || path.contains("nickel") || path.contains("olivine")) { + return VeinShape.SHELL; + } + if (path.contains("coal") || path.contains("salt") || path.contains("bauxite")) { + return VeinShape.CLUSTER; + } + if (path.contains("redstone") || path.contains("sulfur") || path.contains("cinnabar") || + path.contains("stibnite") || path.contains("realgar")) { + return VeinShape.FRACTURE; + } + + return null; + } + + private static VeinGenerator createGenerator(VeinShape shape, GTOreDefinition vein) { + VeinGenerator original = vein.veinGenerator(); + if (original == null) return null; + + List materials = original.getAllMaterials(); + if (materials == null || materials.isEmpty()) return null; + + Material primary = materials.get(0); + Material secondary = materials.size() > 1 ? materials.get(1) : primary; + Material rare = materials.size() > 2 ? materials.get(2) : null; + + // If this shape is under test, use its custom generator + // Otherwise, use a completed generator (Branching) to prevent GT default veins + if (!SHAPES_UNDER_TEST.contains(shape)) { + // Use Branching for all "completed" vein types during testing + return createBranchingGenerator(primary, secondary, rare); + } + + return switch (shape) { + case BRANCHING -> createBranchingGenerator(primary, secondary, rare); + case STRINGER -> createStringerGenerator(primary, secondary, rare); + case SHELL -> createShellGenerator(materials, rare); + case CLUSTER -> createClusterGenerator(primary, secondary, rare); + case FRACTURE -> createFractureGenerator(primary, secondary, rare); + }; + } + + private static VeinGenerator createBranchingGenerator(Material primary, Material secondary, Material rare) { + // Meandering river-like branches that snake and split recursively + // 4 main branches, 0.15 thickness, 0.15 node size, 0.4 noise, 60% split chance + var gen = new BranchingVeinGenerator( + new ArrayList<>(), new ArrayList<>(), + 4, 0.15f, 0.15f, 0.4f, 0.6f, 0.08f); + gen.oreBlock(primary, 3); + gen.oreBlock(secondary, 2); + if (rare != null) gen.rareBlock(rare, 1); + return gen.build(); + } + + private static VeinGenerator createShellGenerator(List materials, Material rare) { + // Shell veins with noisy boundaries and ore mixing for natural look + // 0.3f inner ratio, 0.6f outer ratio, 0.25f noise intensity, 0.18f ore mixing + var gen = new ShellVeinGenerator( + new ArrayList<>(), new ArrayList<>(), new ArrayList<>(), + 0.3f, 0.6f, 0.25f, 0.18f); + + if (materials.size() >= 3) { + // Multiple ores in each shell for variety + gen.coreBlock(materials.get(0), 3); + gen.coreBlock(materials.get(1), 1); // Some inner material bleeds into core + + gen.innerBlock(materials.get(1), 3); + gen.innerBlock(materials.get(0), 1); // Some core material in inner + gen.innerBlock(materials.get(2), 1); // Some outer material in inner + + gen.outerBlock(materials.get(2), 3); + gen.outerBlock(materials.get(1), 2); // Significant inner material in outer + if (materials.size() > 3) { + gen.outerBlock(materials.get(3), 1); // Additional variety if available + } + } else if (materials.size() == 2) { + gen.coreBlock(materials.get(0), 3); + gen.coreBlock(materials.get(1), 1); + + gen.innerBlock(materials.get(1), 2); + gen.innerBlock(materials.get(0), 2); + + gen.outerBlock(materials.get(1), 3); + gen.outerBlock(materials.get(0), 1); + } else { + gen.coreBlock(materials.get(0), 1); + gen.innerBlock(materials.get(0), 1); + gen.outerBlock(materials.get(0), 1); + } + + return gen.build(); + } + + private static VeinGenerator createClusterGenerator(Material primary, Material secondary, Material rare) { + // Large spread-out vein with distinct ore pockets connected by thin channels + // 10 nodes, 6% node size, 2.5% channel thickness, 90% scatter for separation + var gen = new ClusterVeinGenerator( + new ArrayList<>(), new ArrayList<>(), + 10, 0.06f, 0.025f, 0.90f, 0.06f); + gen.oreBlock(primary, 3); + gen.oreBlock(secondary, 2); + if (rare != null) gen.rareBlock(rare, 1); + return gen.build(); + } + + private static VeinGenerator createStringerGenerator(Material primary, Material secondary, Material rare) { + // Large blobby core with many thin tendrils - octopus/jellyfish-like + // 20 stringers, 0.35 core (large!), 0.06 thickness (thin!), 0.7 noise (very blobby), 0.5 density + var gen = new StringerVeinGenerator( + new ArrayList<>(), new ArrayList<>(), + 20, 0.35f, 0.06f, 0.7f, 0.5f, 0.04f); + gen.oreBlock(primary, 3); + gen.oreBlock(secondary, 2); + if (rare != null) gen.rareBlock(rare, 1); + return gen.build(); + } + + private static VeinGenerator createFractureGenerator(Material primary, Material secondary, Material rare) { + // "Shattered Geode" - hollow geode shell with crystal spikes pointing inward, + // surrounded by radiating cracks extending outward like shattered glass + // 12 block geode radius, 8% rare chance (higher in geode), 8 cracks, 6 block spikes + var gen = new FractureVeinGenerator( + new ArrayList<>(), new ArrayList<>(), + 12.0f, 0.08f, 8, 6.0f); + gen.oreBlock(primary, 3); + gen.oreBlock(secondary, 2); + if (rare != null) gen.rareBlock(rare, 1); + return gen.build(); + } + + public static void registerOverride(String veinPath, VeinShape shape) { + VEIN_SHAPE_OVERRIDES.put(veinPath.toLowerCase(Locale.ROOT), shape); + } + + public static void registerMaterialHint(String materialName, VeinShape shape) { + MATERIAL_SHAPE_HINTS.put(materialName.toLowerCase(Locale.ROOT), shape); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/CosmicWorldGenLayers.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/CosmicWorldGenLayers.java new file mode 100644 index 000000000..be4128d44 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/CosmicWorldGenLayers.java @@ -0,0 +1,101 @@ +package com.ghostipedia.cosmiccore.common.data.worldgen; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.tag.block.CosmicBlockTags; + +import com.gregtechceu.gtceu.api.data.worldgen.GTOreDefinition; +import com.gregtechceu.gtceu.api.data.worldgen.IWorldGenLayer; +import com.gregtechceu.gtceu.api.data.worldgen.SimpleWorldGenLayer; +import com.gregtechceu.gtceu.api.data.worldgen.WorldGenLayers; +import com.gregtechceu.gtceu.api.registry.GTRegistries; + +import net.minecraft.core.RegistryAccess; +import net.minecraft.util.valueproviders.ConstantInt; +import net.minecraft.util.valueproviders.IntProvider; +import net.minecraft.util.valueproviders.UniformInt; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.levelgen.structure.templatesystem.TagMatchTest; + +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.neoforge.event.AddReloadListenerEvent; + +import java.util.Set; + +@EventBusSubscriber(modid = CosmicCore.MOD_ID) +public class CosmicWorldGenLayers { + + public static SimpleWorldGenLayer OVERWORLD; + + public static void init() { + OVERWORLD = new SimpleWorldGenLayer( + "overworld", + () -> new TagMatchTest(CosmicBlockTags.OVERWORLD_ORE_REPLACEABLES), + Set.of(Level.OVERWORLD)); + + WorldGenLayers.STONE.setLevels(Set.of()); + WorldGenLayers.DEEPSLATE.setLevels(Set.of()); + } + + @SubscribeEvent + public static void onAddReloadListeners(AddReloadListenerEvent event) { + // GTCEu 8.0 turned ore veins into a datapack registry (gtceu:ore_vein) that is only populated + // once datapacks load. AddReloadListenerEvent is where GTCEu itself refreshes its frozen registry, + // so it is the earliest point our vein post-processing can safely read gtceu:ore_vein. + migrateOreVeinsToOverworldLayer(event.getRegistryAccess()); + } + + public static void migrateOreVeinsToOverworldLayer(RegistryAccess registryAccess) { + // Initialize our vein definitions first + CosmicOreVeins.init(); + + var registry = registryAccess.registryOrThrow(GTRegistries.ORE_VEIN_REGISTRY); + for (var holder : registry.holders().toList()) { + GTOreDefinition vein = holder.value(); + IWorldGenLayer currentLayer = vein.layer(); + if (currentLayer == WorldGenLayers.STONE || currentLayer == WorldGenLayers.DEEPSLATE) { + vein.layer(OVERWORLD); + vein.clusterSize(scaleIntProvider(vein.clusterSize())); + } + } + + // Apply our custom vein generators (replaces GT generators, disables veins we don't have) + CosmicOreVeins.applyOverrides(registryAccess); + } + + private static IntProvider scaleIntProvider(IntProvider provider) { + int min = provider.getMinValue(); + int max = provider.getMaxValue(); + + // Use a single multiplier based on the average size to avoid min > max issues + int avgSize = (min + max) / 2; + float multiplier = getClusterSizeMultiplier(avgSize); + + int scaledMin = Math.round(min * multiplier); + int scaledMax = Math.round(max * multiplier); + + // Safety: ensure min <= max + if (scaledMin > scaledMax) { + int temp = scaledMin; + scaledMin = scaledMax; + scaledMax = temp; + } + + if (scaledMin == scaledMax) { + return ConstantInt.of(scaledMin); + } + return UniformInt.of(scaledMin, scaledMax); + } + + private static float getClusterSizeMultiplier(int originalSize) { + // Modest base multiplier - generators now handle their own style-specific sizing + // This just provides a gentle boost, generators have minimums built in + if (originalSize < 20) { + return 2.0f; + } else if (originalSize < 35) { + return 1.75f; + } else { + return 1.5f; + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/CosmicVeinGenerators.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/CosmicVeinGenerators.java new file mode 100644 index 000000000..b3aea131d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/CosmicVeinGenerators.java @@ -0,0 +1,42 @@ +package com.ghostipedia.cosmiccore.common.data.worldgen.generator; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.*; + +import com.gregtechceu.gtceu.api.data.worldgen.WorldGeneratorUtils; +import com.gregtechceu.gtceu.api.data.worldgen.generator.VeinGenerator; + +import net.minecraft.resources.ResourceLocation; + +import com.mojang.serialization.MapCodec; + +import java.util.function.Supplier; + +public class CosmicVeinGenerators { + + public static MapCodec FRACTURE; + public static MapCodec BRANCHING; + public static MapCodec LENS; + public static MapCodec CLUSTER; + public static MapCodec STRINGER; + public static MapCodec SHELL; + + public static void init() { + FRACTURE = register("fracture", FractureVeinGenerator.CODEC, FractureVeinGenerator::new); + BRANCHING = register("branching", BranchingVeinGenerator.CODEC, BranchingVeinGenerator::new); + LENS = register("lens", LensVeinGenerator.CODEC, LensVeinGenerator::new); + CLUSTER = register("cluster", ClusterVeinGenerator.CODEC, ClusterVeinGenerator::new); + STRINGER = register("stringer", StringerVeinGenerator.CODEC, StringerVeinGenerator::new); + SHELL = register("shell", ShellVeinGenerator.CODEC, ShellVeinGenerator::new); + } + + private static MapCodec register( + String name, + MapCodec codec, + Supplier factory) { + ResourceLocation id = ResourceLocation.fromNamespaceAndPath(CosmicCore.MOD_ID, name); + WorldGeneratorUtils.VEIN_GENERATORS.put(id, codec); + WorldGeneratorUtils.VEIN_GENERATOR_FUNCTIONS.put(id, factory); + return codec; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/BranchingVeinGenerator.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/BranchingVeinGenerator.java new file mode 100644 index 000000000..34fce44b6 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/BranchingVeinGenerator.java @@ -0,0 +1,347 @@ +package com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins; + +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.data.worldgen.GTOreDefinition; +import com.gregtechceu.gtceu.api.data.worldgen.generator.VeinGenerator; +import com.gregtechceu.gtceu.api.data.worldgen.ores.OreBlockPlacer; +import com.gregtechceu.gtceu.utils.GTUtil; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.BulkSectionAccess; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.levelgen.XoroshiroRandomSource; + +import com.mojang.datafixers.util.Either; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.annotation.ParametersAreNonnullByDefault; + +import static com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.VeinGeneratorUtil.*; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +@Accessors(fluent = true, chain = true) +public class BranchingVeinGenerator extends VeinGenerator { + + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + OreBlockDef.CODEC.listOf().fieldOf("ore_blocks").forGetter(it -> it.oreBlocks), + OreBlockDef.CODEC.listOf().fieldOf("rare_blocks").forGetter(it -> it.rareBlocks), + Codec.INT.fieldOf("branch_count").orElse(4).forGetter(it -> it.branchCount), + Codec.FLOAT.fieldOf("branch_thickness_ratio").orElse(0.15f).forGetter(it -> it.branchThicknessRatio), + Codec.FLOAT.fieldOf("core_radius_ratio").orElse(0.15f).forGetter(it -> it.coreRadiusRatio), + Codec.FLOAT.fieldOf("core_noise_intensity").orElse(0.4f).forGetter(it -> it.coreNoiseIntensity), + Codec.FLOAT.fieldOf("sub_branch_chance").orElse(0.6f).forGetter(it -> it.subBranchChance), + Codec.FLOAT.fieldOf("rare_block_chance").orElse(0.08f).forGetter(it -> it.rareBlockChance)) + .apply(instance, BranchingVeinGenerator::new)); + + public List oreBlocks = new ArrayList<>(); + public List rareBlocks = new ArrayList<>(); + @Setter + public int branchCount = 4; + @Setter + public float branchThicknessRatio = 0.15f; + @Setter + public float coreRadiusRatio = 0.15f; + @Setter + public float coreNoiseIntensity = 0.4f; + @Setter + public float subBranchChance = 0.6f; + @Setter + public float rareBlockChance = 0.08f; + + public BranchingVeinGenerator() {} + + public BranchingVeinGenerator(List oreBlocks, List rareBlocks, + int branchCount, float branchThicknessRatio, float coreRadiusRatio, + float coreNoiseIntensity, float subBranchChance, float rareBlockChance) { + this.oreBlocks = oreBlocks; + this.rareBlocks = rareBlocks; + this.branchCount = branchCount; + this.branchThicknessRatio = branchThicknessRatio; + this.coreRadiusRatio = coreRadiusRatio; + this.coreNoiseIntensity = coreNoiseIntensity; + this.subBranchChance = subBranchChance; + this.rareBlockChance = rareBlockChance; + } + + @Override + public List getAllEntries() { + List entries = new ArrayList<>(); + for (var def : oreBlocks) VeinGenerator.mapTarget(def.block(), def.weight()).forEach(entries::add); + for (var def : rareBlocks) VeinGenerator.mapTarget(def.block(), def.weight()).forEach(entries::add); + return entries; + } + + private static class Segment { + + float x1, y1, z1, x2, y2, z2, thickness; + int depth; + } + + @Override + public Map generate(WorldGenLevel level, RandomSource random, GTOreDefinition entry, + BlockPos origin) { + Map generatedBlocks = new Object2ObjectOpenHashMap<>(); + + int size = entry.clusterSize().sample(random); + int baseRadius = Math.max(70, Mth.ceil(size * 0.9f)); + int actualBranchCount = branchCount + random.nextInt(3) - 1; + long noiseSeed = random.nextLong(); + float nodeRadius = Math.max(6.0f, coreRadiusRatio * baseRadius); + float mainThickness = Math.max(5.0f, branchThicknessRatio * baseRadius); + + List allSegments = new ArrayList<>(); + + for (int b = 0; b < actualBranchCount; b++) { + double theta = (b * 2.0 * Math.PI / actualBranchCount) + (random.nextDouble() - 0.5) * 0.8; + double phi = (random.nextDouble() - 0.5) * 0.6; + + float dirX = (float) (Math.cos(theta) * Math.cos(phi)); + float dirY = (float) (Math.sin(phi) * 0.4f); + float dirZ = (float) (Math.sin(theta) * Math.cos(phi)); + + generateMeanderingBranch( + allSegments, random, + 0, 0, 0, + dirX, dirY, dirZ, + mainThickness, + baseRadius * (0.8f + random.nextFloat() * 0.4f), + 0, + 3, + subBranchChance); + } + + float minX = 0, maxX = 0, minY = 0, maxY = 0, minZ = 0, maxZ = 0; + for (Segment seg : allSegments) { + minX = Math.min(minX, Math.min(seg.x1, seg.x2) - seg.thickness); + maxX = Math.max(maxX, Math.max(seg.x1, seg.x2) + seg.thickness); + minY = Math.min(minY, Math.min(seg.y1, seg.y2) - seg.thickness); + maxY = Math.max(maxY, Math.max(seg.y1, seg.y2) + seg.thickness); + minZ = Math.min(minZ, Math.min(seg.z1, seg.z2) - seg.thickness); + maxZ = Math.max(maxZ, Math.max(seg.z1, seg.z2) + seg.thickness); + } + + var posMin = origin.offset((int) minX - 2, (int) minY - 2, (int) minZ - 2); + var posMax = origin.offset((int) maxX + 2, (int) maxY + 2, (int) maxZ + 2); + + for (BlockPos pos : BlockPos.betweenClosed(posMin, posMax)) { + float dx = pos.getX() - origin.getX(); + float dy = pos.getY() - origin.getY(); + float dz = pos.getZ() - origin.getZ(); + + float distFromOrigin = (float) Math.sqrt(dx * dx + dy * dy + dz * dz); + + float noise = noise3D(pos.getX() * 0.12f, pos.getY() * 0.12f, pos.getZ() * 0.12f, noiseSeed); + float noisyNodeRadius = nodeRadius * (1.0f + noise * coreNoiseIntensity); + boolean inNode = distFromOrigin <= noisyNodeRadius; + + boolean inSegment = false; + int closestDepth = 0; + if (!inNode) { + float minDist = Float.MAX_VALUE; + for (Segment seg : allSegments) { + float dist = distanceToLineSegment(dx, dy, dz, seg.x1, seg.y1, seg.z1, seg.x2, seg.y2, seg.z2); + if (dist <= seg.thickness && dist < minDist) { + minDist = dist; + inSegment = true; + closestDepth = seg.depth; + } + } + } + + if (!inNode && !inSegment) continue; + + if (random.nextFloat() > 0.15f) continue; + + BlockPos.MutableBlockPos mutablePos = new BlockPos.MutableBlockPos(pos.getX(), pos.getY(), pos.getZ()); + long randomSeed = random.nextLong(); + boolean isMainBranch = inNode || closestDepth == 0; + + generatedBlocks.put(mutablePos.immutable(), + (access, section) -> placeBlock(section, randomSeed, entry, mutablePos, access, isMainBranch)); + } + + return generatedBlocks; + } + + private void generateMeanderingBranch(List segments, RandomSource random, + float startX, float startY, float startZ, + float dirX, float dirY, float dirZ, + float thickness, float remainingLength, + int depth, int maxDepth, float splitChance) { + if (remainingLength <= 0 || thickness < 2.0f || depth > maxDepth) return; + float segmentLength = Math.min(remainingLength, 8 + random.nextFloat() * 12); + float endX = startX + dirX * segmentLength; + float endY = startY + dirY * segmentLength; + float endZ = startZ + dirZ * segmentLength; + + // Create segment and wander directions randomly + Segment seg = new Segment(); + seg.x1 = startX; + seg.y1 = startY; + seg.z1 = startZ; + seg.x2 = endX; + seg.y2 = endY; + seg.z2 = endZ; + seg.thickness = thickness; + seg.depth = depth; + segments.add(seg); + float newRemaining = remainingLength - segmentLength; + float turnAmount = 0.3f + random.nextFloat() * 0.4f; + float newDirX = dirX + (random.nextFloat() - 0.5f) * turnAmount * 2; + float newDirY = dirY + (random.nextFloat() - 0.5f) * turnAmount * 0.5f; + float newDirZ = dirZ + (random.nextFloat() - 0.5f) * turnAmount * 2; + + float len = (float) Math.sqrt(newDirX * newDirX + newDirY * newDirY + newDirZ * newDirZ); + if (len > 0) { + newDirX /= len; + newDirY /= len; + newDirZ /= len; + } + + float newThickness = thickness * (0.92f + random.nextFloat() * 0.08f); + if (depth < maxDepth && random.nextFloat() < splitChance && newRemaining > 20) { + float splitAngle = (random.nextBoolean() ? 1 : -1) * (0.5f + random.nextFloat() * 0.7f); + float splitDirX = (float) (newDirX * Math.cos(splitAngle) - newDirZ * Math.sin(splitAngle)); + float splitDirZ = (float) (newDirX * Math.sin(splitAngle) + newDirZ * Math.cos(splitAngle)); + float splitDirY = newDirY + (random.nextFloat() - 0.5f) * 0.3f; + float splitLen = (float) Math.sqrt(splitDirX * splitDirX + splitDirY * splitDirY + splitDirZ * splitDirZ); + if (splitLen > 0) { + splitDirX /= splitLen; + splitDirY /= splitLen; + splitDirZ /= splitLen; + } + generateMeanderingBranch( + segments, random, + endX, endY, endZ, + splitDirX, splitDirY, splitDirZ, + newThickness * (0.5f + random.nextFloat() * 0.3f), + newRemaining * (0.4f + random.nextFloat() * 0.3f), + depth + 1, maxDepth, + splitChance * 0.7f); + } + if (newRemaining > 0) { + generateMeanderingBranch( + segments, random, + endX, endY, endZ, + newDirX, newDirY, newDirZ, + newThickness, + newRemaining, + depth, maxDepth, + splitChance); + } + } + + private float distanceToLineSegment(float px, float py, float pz, + float x1, float y1, float z1, + float x2, float y2, float z2) { + float dx = x2 - x1; + float dy = y2 - y1; + float dz = z2 - z1; + float lengthSq = dx * dx + dy * dy + dz * dz; + + if (lengthSq == 0) { + return (float) Math.sqrt((px - x1) * (px - x1) + (py - y1) * (py - y1) + (pz - z1) * (pz - z1)); + } + + float t = Math.max(0, Math.min(1, ((px - x1) * dx + (py - y1) * dy + (pz - z1) * dz) / lengthSq)); + + float closestX = x1 + t * dx; + float closestY = y1 + t * dy; + float closestZ = z1 + t * dz; + + return (float) Math.sqrt( + (px - closestX) * (px - closestX) + + (py - closestY) * (py - closestY) + + (pz - closestZ) * (pz - closestZ)); + } + + private float noise3D(float x, float y, float z, long seed) { + long posHash = Float.floatToIntBits(x * 73856093) ^ + Float.floatToIntBits(y * 19349663) ^ + Float.floatToIntBits(z * 83492791); + RandomSource noise = new XoroshiroRandomSource(seed ^ posHash); + return noise.nextFloat() * 2.0f - 1.0f; + } + + private void placeBlock(LevelChunkSection section, long randomSeed, GTOreDefinition entry, + BlockPos.MutableBlockPos pos, BulkSectionAccess access, boolean isMainBranch) { + RandomSource random = new XoroshiroRandomSource(randomSeed); + int sectionX = SectionPos.sectionRelative(pos.getX()); + int sectionY = SectionPos.sectionRelative(pos.getY()); + int sectionZ = SectionPos.sectionRelative(pos.getZ()); + + BlockState current = section.getBlockState(sectionX, sectionY, sectionZ); + + float adjustedRareChance = isMainBranch ? rareBlockChance * 1.5f : rareBlockChance; + if (!rareBlocks.isEmpty() && random.nextFloat() < adjustedRareChance) { + var ore = GTUtil.getRandomItem(random, rareBlocks); + if (ore != null) placeOre(ore.block(), current, access, section, random, pos, entry); + } else { + var ore = GTUtil.getRandomItem(random, oreBlocks); + if (ore != null) placeOre(ore.block(), current, access, section, random, pos, entry); + } + } + + @Override + public VeinGenerator build() { + return this; + } + + @Override + public VeinGenerator copy() { + return new BranchingVeinGenerator(new ArrayList<>(oreBlocks), new ArrayList<>(rareBlocks), + branchCount, branchThicknessRatio, coreRadiusRatio, coreNoiseIntensity, subBranchChance, + rareBlockChance); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + public BranchingVeinGenerator oreBlock(Material mat, int weight) { + oreBlocks.add(new OreBlockDef(Either.right(mat), weight)); + return this; + } + + public BranchingVeinGenerator rareBlock(Material mat, int weight) { + rareBlocks.add(new OreBlockDef(Either.right(mat), weight)); + return this; + } + + public BranchingVeinGenerator branchAngleVariance(float variance) { + this.coreNoiseIntensity = variance; + return this; + } + + public BranchingVeinGenerator branchSplitChance(float chance) { + this.subBranchChance = chance; + return this; + } + + public BranchingVeinGenerator widthDecay(float decay) { + this.branchThicknessRatio = decay; + return this; + } + + public BranchingVeinGenerator lengthMultiplier(float multiplier) { + this.coreRadiusRatio = multiplier; + return this; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/ClusterVeinGenerator.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/ClusterVeinGenerator.java new file mode 100644 index 000000000..597335419 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/ClusterVeinGenerator.java @@ -0,0 +1,345 @@ +package com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins; + +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.data.worldgen.GTOreDefinition; +import com.gregtechceu.gtceu.api.data.worldgen.generator.VeinGenerator; +import com.gregtechceu.gtceu.api.data.worldgen.ores.OreBlockPlacer; +import com.gregtechceu.gtceu.utils.GTUtil; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.BulkSectionAccess; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.levelgen.XoroshiroRandomSource; + +import com.mojang.datafixers.util.Either; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.annotation.ParametersAreNonnullByDefault; + +import static com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.VeinGeneratorUtil.*; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +@Accessors(fluent = true, chain = true) +public class ClusterVeinGenerator extends VeinGenerator { + + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + OreBlockDef.CODEC.listOf().fieldOf("ore_blocks").forGetter(it -> it.oreBlocks), + OreBlockDef.CODEC.listOf().fieldOf("rare_blocks").forGetter(it -> it.rareBlocks), + Codec.INT.fieldOf("node_count").orElse(8).forGetter(it -> it.nodeCount), + Codec.FLOAT.fieldOf("node_size_ratio").orElse(0.2f).forGetter(it -> it.nodeSizeRatio), + Codec.FLOAT.fieldOf("channel_thickness_ratio").orElse(0.08f).forGetter(it -> it.channelThicknessRatio), + Codec.FLOAT.fieldOf("scatter_amount").orElse(0.7f).forGetter(it -> it.scatterAmount), + Codec.FLOAT.fieldOf("rare_block_chance").orElse(0.06f).forGetter(it -> it.rareBlockChance)) + .apply(instance, ClusterVeinGenerator::new)); + + public List oreBlocks = new ArrayList<>(); + public List rareBlocks = new ArrayList<>(); + @Setter + public int nodeCount = 10; + @Setter + public float nodeSizeRatio = 0.06f; + @Setter + public float channelThicknessRatio = 0.025f; + @Setter + public float scatterAmount = 0.9f; + @Setter + public float rareBlockChance = 0.06f; + + public ClusterVeinGenerator() {} + + public ClusterVeinGenerator(List oreBlocks, List rareBlocks, + int nodeCount, float nodeSizeRatio, float channelThicknessRatio, + float scatterAmount, float rareBlockChance) { + this.oreBlocks = oreBlocks; + this.rareBlocks = rareBlocks; + this.nodeCount = nodeCount; + this.nodeSizeRatio = nodeSizeRatio; + this.channelThicknessRatio = channelThicknessRatio; + this.scatterAmount = scatterAmount; + this.rareBlockChance = rareBlockChance; + } + + @Override + public List getAllEntries() { + List entries = new ArrayList<>(); + for (var def : oreBlocks) VeinGenerator.mapTarget(def.block(), def.weight()).forEach(entries::add); + for (var def : rareBlocks) VeinGenerator.mapTarget(def.block(), def.weight()).forEach(entries::add); + return entries; + } + + private static class Node { + + float x, y, z, radius, noiseSeed; + } + + @Override + public Map generate(WorldGenLevel level, RandomSource random, GTOreDefinition entry, + BlockPos origin) { + Map generatedBlocks = new Object2ObjectOpenHashMap<>(); + + int size = entry.clusterSize().sample(random); + int radius = Math.max(80, Mth.ceil(size * 1.5f)); + int actualNodeCount = nodeCount + random.nextInt(4) - 2; + float baseNodeSize = Math.max(8.0f, Math.min(15.0f, radius * 0.12f)); + float channelThickness = Math.max(4.0f, Math.min(8.0f, radius * 0.06f)); + + List nodes = new ArrayList<>(); + long noiseSeed = random.nextLong(); + + Node centerNode = new Node(); + centerNode.x = (random.nextFloat() - 0.5f) * radius * 0.2f; + centerNode.y = (random.nextFloat() - 0.5f) * radius * 0.2f; + centerNode.z = (random.nextFloat() - 0.5f) * radius * 0.2f; + centerNode.radius = baseNodeSize * (1.2f + random.nextFloat() * 0.3f); + centerNode.noiseSeed = random.nextFloat() * 1000; + nodes.add(centerNode); + + for (int i = 1; i < actualNodeCount; i++) { + Node node = new Node(); + float scatter = scatterAmount * radius; + float minSeparation = baseNodeSize * 4.0f; + + for (int attempts = 0; attempts < 10; attempts++) { + float theta = random.nextFloat() * (float) Math.PI * 2; + float phi = (random.nextFloat() - 0.5f) * (float) Math.PI; + float dist = scatter * (0.4f + random.nextFloat() * 0.6f); + + node.x = (float) (Math.cos(theta) * Math.cos(phi) * dist); + node.y = (float) (Math.sin(phi) * dist * 0.5f); + node.z = (float) (Math.sin(theta) * Math.cos(phi) * dist); + + boolean valid = true; + for (Node existing : nodes) { + float dx = node.x - existing.x; + float dy = node.y - existing.y; + float dz = node.z - existing.z; + if (Math.sqrt(dx * dx + dy * dy + dz * dz) < minSeparation) { + valid = false; + break; + } + } + if (valid) break; + } + + node.radius = baseNodeSize * (0.7f + random.nextFloat() * 0.6f); + node.noiseSeed = random.nextFloat() * 1000; + nodes.add(node); + } + + List channels = new ArrayList<>(); + for (int i = 0; i < nodes.size(); i++) { + int connections = 1 + random.nextInt(3); + List nearest = findNearestNodes(nodes, i, connections + 1); + for (int j = 0; j < Math.min(connections, nearest.size()); j++) { + int other = nearest.get(j); + if (other != i) { + boolean exists = false; + for (int[] ch : channels) { + if ((ch[0] == i && ch[1] == other) || (ch[0] == other && ch[1] == i)) { + exists = true; + break; + } + } + if (!exists) { + channels.add(new int[] { i, other }); + } + } + } + } + + for (Node node : nodes) { + int nodeRadius = Mth.ceil(node.radius * 1.4f); + int nodeCenterX = origin.getX() + Mth.floor(node.x); + int nodeCenterY = origin.getY() + Mth.floor(node.y); + int nodeCenterZ = origin.getZ() + Mth.floor(node.z); + + for (int lx = -nodeRadius; lx <= nodeRadius; lx++) { + for (int ly = -nodeRadius; ly <= nodeRadius; ly++) { + for (int lz = -nodeRadius; lz <= nodeRadius; lz++) { + float distToNode = (float) Math.sqrt(lx * lx + ly * ly + lz * lz); + + int px = nodeCenterX + lx; + int py = nodeCenterY + ly; + int pz = nodeCenterZ + lz; + + float noise = noise3D(px + node.noiseSeed, py, pz, noiseSeed); + float noisyRadius = node.radius * (1.0f + noise * 0.3f); + + if (distToNode > noisyRadius) continue; + + BlockPos blockPos = new BlockPos(px, py, pz); + if (generatedBlocks.containsKey(blockPos)) continue; + + if (random.nextFloat() > 0.95f * entry.density()) continue; + + long randomSeed = random.nextLong(); + generatedBlocks.put(blockPos, + (access, section) -> placeBlock(section, randomSeed, entry, + new BlockPos.MutableBlockPos(px, py, pz), access, true)); + } + } + } + } + + int channelRadius = Mth.ceil(channelThickness * 1.3f); + for (int[] channel : channels) { + Node n1 = nodes.get(channel[0]); + Node n2 = nodes.get(channel[1]); + + float cx1 = n1.x, cy1 = n1.y, cz1 = n1.z; + float cx2 = n2.x, cy2 = n2.y, cz2 = n2.z; + float length = (float) Math + .sqrt((cx2 - cx1) * (cx2 - cx1) + (cy2 - cy1) * (cy2 - cy1) + (cz2 - cz1) * (cz2 - cz1)); + + int steps = Mth.ceil(length); + for (int step = 0; step <= steps; step++) { + float t = steps > 0 ? (float) step / steps : 0; + float cx = cx1 + t * (cx2 - cx1); + float cy = cy1 + t * (cy2 - cy1); + float cz = cz1 + t * (cz2 - cz1); + + int centerX = origin.getX() + Mth.floor(cx); + int centerY = origin.getY() + Mth.floor(cy); + int centerZ = origin.getZ() + Mth.floor(cz); + + for (int lx = -channelRadius; lx <= channelRadius; lx++) { + for (int ly = -channelRadius; ly <= channelRadius; ly++) { + for (int lz = -channelRadius; lz <= channelRadius; lz++) { + float distSq = lx * lx + ly * ly + lz * lz; + if (distSq > channelThickness * channelThickness) continue; + + int px = centerX + lx; + int py = centerY + ly; + int pz = centerZ + lz; + + BlockPos blockPos = new BlockPos(px, py, pz); + if (generatedBlocks.containsKey(blockPos)) continue; + + float noise = noise3D(px, py, pz, noiseSeed + 1); + float effectiveThickness = channelThickness * (0.8f + 0.4f * noise); + if (distSq > effectiveThickness * effectiveThickness) continue; + + if (random.nextFloat() > 0.9f * entry.density()) continue; + + long randomSeed = random.nextLong(); + generatedBlocks.put(blockPos, + (access, section) -> placeBlock(section, randomSeed, entry, + new BlockPos.MutableBlockPos(px, py, pz), access, false)); + } + } + } + } + } + + return generatedBlocks; + } + + private List findNearestNodes(List nodes, int fromIndex, int count) { + Node from = nodes.get(fromIndex); + List distances = new ArrayList<>(); + for (int i = 0; i < nodes.size(); i++) { + if (i == fromIndex) continue; + Node to = nodes.get(i); + float dist = (from.x - to.x) * (from.x - to.x) + + (from.y - to.y) * (from.y - to.y) + + (from.z - to.z) * (from.z - to.z); + distances.add(new float[] { i, dist }); + } + distances.sort((a, b) -> Float.compare(a[1], b[1])); + + List result = new ArrayList<>(); + for (int i = 0; i < Math.min(count, distances.size()); i++) { + result.add((int) distances.get(i)[0]); + } + return result; + } + + private float noise3D(float x, float y, float z, long seed) { + long posHash = Float.floatToIntBits(x * 73856093) ^ + Float.floatToIntBits(y * 19349663) ^ + Float.floatToIntBits(z * 83492791); + RandomSource noise = new XoroshiroRandomSource(seed ^ posHash); + return noise.nextFloat() * 2.0f - 1.0f; + } + + private void placeBlock(LevelChunkSection section, long randomSeed, GTOreDefinition entry, + BlockPos.MutableBlockPos pos, BulkSectionAccess access, boolean isNode) { + RandomSource random = new XoroshiroRandomSource(randomSeed); + int sectionX = SectionPos.sectionRelative(pos.getX()); + int sectionY = SectionPos.sectionRelative(pos.getY()); + int sectionZ = SectionPos.sectionRelative(pos.getZ()); + + BlockState current = section.getBlockState(sectionX, sectionY, sectionZ); + + float adjustedRareChance = isNode ? rareBlockChance * 2.5f : rareBlockChance; + if (!rareBlocks.isEmpty() && random.nextFloat() < adjustedRareChance) { + var ore = GTUtil.getRandomItem(random, rareBlocks); + if (ore != null) placeOre(ore.block(), current, access, section, random, pos, entry); + } else { + var ore = GTUtil.getRandomItem(random, oreBlocks); + if (ore != null) placeOre(ore.block(), current, access, section, random, pos, entry); + } + } + + @Override + public VeinGenerator build() { + return this; + } + + @Override + public VeinGenerator copy() { + return new ClusterVeinGenerator(new ArrayList<>(oreBlocks), new ArrayList<>(rareBlocks), + nodeCount, nodeSizeRatio, channelThicknessRatio, scatterAmount, rareBlockChance); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + public ClusterVeinGenerator oreBlock(Material mat, int weight) { + oreBlocks.add(new OreBlockDef(Either.right(mat), weight)); + return this; + } + + public ClusterVeinGenerator rareBlock(Material mat, int weight) { + rareBlocks.add(new OreBlockDef(Either.right(mat), weight)); + return this; + } + + public ClusterVeinGenerator pocketCount(int count) { + this.nodeCount = count; + return this; + } + + public ClusterVeinGenerator pocketRadius(float radius) { + this.nodeSizeRatio = radius; + return this; + } + + public ClusterVeinGenerator channelRadius(float radius) { + this.channelThicknessRatio = radius; + return this; + } + + public ClusterVeinGenerator pocketDensity(float density) { + this.scatterAmount = density; + return this; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/FractureVeinGenerator.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/FractureVeinGenerator.java new file mode 100644 index 000000000..37a7d77d6 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/FractureVeinGenerator.java @@ -0,0 +1,333 @@ +package com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins; + +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.data.worldgen.GTOreDefinition; +import com.gregtechceu.gtceu.api.data.worldgen.generator.VeinGenerator; +import com.gregtechceu.gtceu.api.data.worldgen.ores.OreBlockPlacer; +import com.gregtechceu.gtceu.utils.GTUtil; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.levelgen.XoroshiroRandomSource; + +import com.mojang.datafixers.util.Either; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.annotation.ParametersAreNonnullByDefault; + +import static com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.VeinGeneratorUtil.*; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +@Accessors(fluent = true, chain = true) +public class FractureVeinGenerator extends VeinGenerator { + + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + OreBlockDef.CODEC.listOf().fieldOf("ore_blocks").forGetter(it -> it.oreBlocks), + OreBlockDef.CODEC.listOf().fieldOf("rare_blocks").forGetter(it -> it.rareBlocks), + Codec.FLOAT.fieldOf("geode_radius").orElse(12.0f).forGetter(it -> it.geodeRadius), + Codec.FLOAT.fieldOf("rare_block_chance").orElse(0.08f).forGetter(it -> it.rareBlockChance), + Codec.INT.fieldOf("crack_count").orElse(8).forGetter(it -> it.crackCount), + Codec.FLOAT.fieldOf("spike_length").orElse(6.0f).forGetter(it -> it.spikeLength)) + .apply(instance, FractureVeinGenerator::new)); + + public List oreBlocks = new ArrayList<>(); + public List rareBlocks = new ArrayList<>(); + @Setter + public float geodeRadius = 12.0f; + @Setter + public float rareBlockChance = 0.08f; + @Setter + public int crackCount = 8; + @Setter + public float spikeLength = 6.0f; + + public FractureVeinGenerator() {} + + public FractureVeinGenerator(List oreBlocks, List rareBlocks, float geodeRadius, + float rareBlockChance, int crackCount, float spikeLength) { + this.oreBlocks = oreBlocks; + this.rareBlocks = rareBlocks; + this.geodeRadius = geodeRadius; + this.rareBlockChance = rareBlockChance; + this.crackCount = crackCount; + this.spikeLength = spikeLength; + } + + @Override + public List getAllEntries() { + List entries = new ArrayList<>(); + for (var def : oreBlocks) VeinGenerator.mapTarget(def.block(), def.weight()).forEach(entries::add); + for (var def : rareBlocks) VeinGenerator.mapTarget(def.block(), def.weight()).forEach(entries::add); + return entries; + } + + private static class Crack { + + float dirX, dirY, dirZ, length, thickness, noiseSeed; + } + + private static class Spike { + + float dirX, dirY, dirZ, baseX, baseY, baseZ, length, thickness; + } + + @Override + public Map generate(WorldGenLevel level, RandomSource random, GTOreDefinition entry, + BlockPos origin) { + Map generatedBlocks = new Object2ObjectOpenHashMap<>(); + + int size = entry.clusterSize().sample(random); + long noiseSeed = random.nextLong(); + + float actualGeodeRadius = geodeRadius * (0.8f + (size / 100.0f) * 0.4f); + float shellThickness = 3.0f + random.nextFloat() * 2.0f; + float innerRadius = actualGeodeRadius - shellThickness; + + int geodeRadiusInt = Mth.ceil(actualGeodeRadius * 1.2f); + for (int lx = -geodeRadiusInt; lx <= geodeRadiusInt; lx++) { + for (int ly = -geodeRadiusInt; ly <= geodeRadiusInt; ly++) { + for (int lz = -geodeRadiusInt; lz <= geodeRadiusInt; lz++) { + float dist = (float) Math.sqrt(lx * lx + ly * ly + lz * lz); + + float noise = noise3D(lx * 0.2f, ly * 0.2f, lz * 0.2f, noiseSeed); + float noisyOuterRadius = actualGeodeRadius * (1.0f + noise * 0.15f); + float noisyInnerRadius = innerRadius * (1.0f + noise * 0.2f); + + if (dist < noisyInnerRadius || dist > noisyOuterRadius) continue; + + int px = origin.getX() + lx; + int py = origin.getY() + ly; + int pz = origin.getZ() + lz; + BlockPos blockPos = new BlockPos(px, py, pz); + + if (generatedBlocks.containsKey(blockPos)) continue; + if (random.nextFloat() > 0.92f * entry.density()) continue; + + long randomSeed = random.nextLong(); + boolean isInnerSurface = dist < (noisyInnerRadius + noisyOuterRadius) / 2; + generatedBlocks.put(blockPos, + (access, section) -> placeBlock(section, randomSeed, entry, + new BlockPos.MutableBlockPos(px, py, pz), access, isInnerSurface)); + } + } + } + + int actualSpikeCount = 12 + random.nextInt(8); + List spikes = new ArrayList<>(); + + for (int i = 0; i < actualSpikeCount; i++) { + Spike spike = new Spike(); + + float theta = random.nextFloat() * (float) (2 * Math.PI); + float phi = (float) Math.acos(2 * random.nextFloat() - 1); + + spike.dirX = (float) (Math.sin(phi) * Math.cos(theta)); + spike.dirY = (float) Math.cos(phi); + spike.dirZ = (float) (Math.sin(phi) * Math.sin(theta)); + + float baseNoise = noise3D(spike.dirX * 10, spike.dirY * 10, spike.dirZ * 10, noiseSeed + 100); + float baseRadius = innerRadius * (1.0f + baseNoise * 0.15f); + spike.baseX = spike.dirX * baseRadius; + spike.baseY = spike.dirY * baseRadius; + spike.baseZ = spike.dirZ * baseRadius; + + spike.length = spikeLength * (0.5f + random.nextFloat() * 1.0f); + spike.thickness = 1.5f + random.nextFloat() * 1.5f; + + spikes.add(spike); + } + + for (Spike spike : spikes) { + int steps = Mth.ceil(spike.length); + for (int step = 0; step <= steps; step++) { + float t = steps > 0 ? (float) step / steps : 0; + + // Position along spike (moving inward toward center) + float cx = spike.baseX - spike.dirX * spike.length * t; + float cy = spike.baseY - spike.dirY * spike.length * t; + float cz = spike.baseZ - spike.dirZ * spike.length * t; + + float currentThickness = spike.thickness * (1.0f - t * 0.7f); + int thicknessInt = Math.max(1, Mth.ceil(currentThickness)); + + for (int lx = -thicknessInt; lx <= thicknessInt; lx++) { + for (int ly = -thicknessInt; ly <= thicknessInt; ly++) { + for (int lz = -thicknessInt; lz <= thicknessInt; lz++) { + float distSq = lx * lx + ly * ly + lz * lz; + if (distSq > currentThickness * currentThickness) continue; + + int px = origin.getX() + Mth.floor(cx) + lx; + int py = origin.getY() + Mth.floor(cy) + ly; + int pz = origin.getZ() + Mth.floor(cz) + lz; + + BlockPos blockPos = new BlockPos(px, py, pz); + if (generatedBlocks.containsKey(blockPos)) continue; + if (random.nextFloat() > 0.95f * entry.density()) continue; + + long randomSeed = random.nextLong(); + boolean isTip = t > 0.7f; + generatedBlocks.put(blockPos, + (access, section) -> placeBlock(section, randomSeed, entry, + new BlockPos.MutableBlockPos(px, py, pz), access, isTip)); + } + } + } + } + } + + int actualCrackCount = crackCount + random.nextInt(5); + List cracks = new ArrayList<>(); + + for (int i = 0; i < actualCrackCount; i++) { + Crack crack = new Crack(); + + float theta = random.nextFloat() * (float) (2 * Math.PI); + float phi = (float) Math.acos(2 * random.nextFloat() - 1); + + crack.dirX = (float) (Math.sin(phi) * Math.cos(theta)); + crack.dirY = (float) Math.cos(phi) * 0.6f; + crack.dirZ = (float) (Math.sin(phi) * Math.sin(theta)); + + float len = (float) Math.sqrt(crack.dirX * crack.dirX + crack.dirY * crack.dirY + crack.dirZ * crack.dirZ); + crack.dirX /= len; + crack.dirY /= len; + crack.dirZ /= len; + + crack.length = actualGeodeRadius * (1.5f + random.nextFloat() * 2.0f); + crack.thickness = 2.0f + random.nextFloat() * 2.0f; + crack.noiseSeed = random.nextFloat() * 1000; + + cracks.add(crack); + } + + for (Crack crack : cracks) { + int steps = Mth.ceil(crack.length); + float startDist = actualGeodeRadius; + + for (int step = 0; step <= steps; step++) { + float t = steps > 0 ? (float) step / steps : 0; + float dist = startDist + crack.length * t; + + float wobbleX = noise3D(t * 5 + crack.noiseSeed, 0, 0, noiseSeed) * 3.0f; + float wobbleY = noise3D(0, t * 5 + crack.noiseSeed, 0, noiseSeed) * 2.0f; + float wobbleZ = noise3D(0, 0, t * 5 + crack.noiseSeed, noiseSeed) * 3.0f; + + float cx = crack.dirX * dist + wobbleX; + float cy = crack.dirY * dist + wobbleY; + float cz = crack.dirZ * dist + wobbleZ; + + float currentThickness = crack.thickness * (1.0f - t * 0.6f); + int thicknessInt = Math.max(1, Mth.ceil(currentThickness)); + float placementChance = 0.9f - t * 0.4f; + + for (int lx = -thicknessInt; lx <= thicknessInt; lx++) { + for (int ly = -thicknessInt; ly <= thicknessInt; ly++) { + for (int lz = -thicknessInt; lz <= thicknessInt; lz++) { + float distSq = lx * lx + ly * ly + lz * lz; + if (distSq > currentThickness * currentThickness) continue; + + int px = origin.getX() + Mth.floor(cx) + lx; + int py = origin.getY() + Mth.floor(cy) + ly; + int pz = origin.getZ() + Mth.floor(cz) + lz; + + BlockPos blockPos = new BlockPos(px, py, pz); + if (generatedBlocks.containsKey(blockPos)) continue; + if (random.nextFloat() > placementChance * entry.density()) continue; + + long randomSeed = random.nextLong(); + generatedBlocks.put(blockPos, + (access, section) -> placeBlock(section, randomSeed, entry, + new BlockPos.MutableBlockPos(px, py, pz), access, false)); + } + } + } + } + } + + return generatedBlocks; + } + + private float noise3D(float x, float y, float z, long seed) { + long posHash = Float.floatToIntBits(x * 73856093) ^ + Float.floatToIntBits(y * 19349663) ^ + Float.floatToIntBits(z * 83492791); + RandomSource noise = new XoroshiroRandomSource(seed ^ posHash); + return noise.nextFloat() * 2.0f - 1.0f; + } + + private void placeBlock(LevelChunkSection section, long randomSeed, GTOreDefinition entry, + BlockPos.MutableBlockPos pos, net.minecraft.world.level.chunk.BulkSectionAccess access, + boolean atIntersection) { + RandomSource random = new XoroshiroRandomSource(randomSeed); + int sectionX = SectionPos.sectionRelative(pos.getX()); + int sectionY = SectionPos.sectionRelative(pos.getY()); + int sectionZ = SectionPos.sectionRelative(pos.getZ()); + + BlockState current = section.getBlockState(sectionX, sectionY, sectionZ); + + float adjustedRareChance = atIntersection ? rareBlockChance * 3.0f : rareBlockChance; + if (!rareBlocks.isEmpty() && random.nextFloat() < adjustedRareChance) { + var ore = GTUtil.getRandomItem(random, rareBlocks); + if (ore != null) placeOre(ore.block(), current, access, section, random, pos, entry); + } else { + var ore = GTUtil.getRandomItem(random, oreBlocks); + if (ore != null) placeOre(ore.block(), current, access, section, random, pos, entry); + } + } + + @Override + public VeinGenerator build() { + return this; + } + + @Override + public VeinGenerator copy() { + return new FractureVeinGenerator(new ArrayList<>(oreBlocks), new ArrayList<>(rareBlocks), + geodeRadius, rareBlockChance, crackCount, spikeLength); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + public FractureVeinGenerator oreBlock(Material mat, int weight) { + oreBlocks.add(new OreBlockDef(Either.right(mat), weight)); + return this; + } + + public FractureVeinGenerator rareBlock(Material mat, int weight) { + rareBlocks.add(new OreBlockDef(Either.right(mat), weight)); + return this; + } + + public FractureVeinGenerator shellRadius(float radius) { + this.geodeRadius = radius; + return this; + } + + public FractureVeinGenerator shellThickness(float thickness) { + return this; + } + + public FractureVeinGenerator spikeCount(int count) { + this.crackCount = count; + return this; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/LensVeinGenerator.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/LensVeinGenerator.java new file mode 100644 index 000000000..46f0ad6c5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/LensVeinGenerator.java @@ -0,0 +1,158 @@ +package com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins; + +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.data.worldgen.GTOreDefinition; +import com.gregtechceu.gtceu.api.data.worldgen.generator.VeinGenerator; +import com.gregtechceu.gtceu.api.data.worldgen.ores.OreBlockPlacer; +import com.gregtechceu.gtceu.utils.GTUtil; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.BulkSectionAccess; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.levelgen.XoroshiroRandomSource; + +import com.mojang.datafixers.util.Either; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.annotation.ParametersAreNonnullByDefault; + +import static com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.VeinGeneratorUtil.*; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +@Accessors(fluent = true, chain = true) +public class LensVeinGenerator extends VeinGenerator { + + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + OreBlockDef.CODEC.listOf().fieldOf("ore_blocks").forGetter(it -> it.oreBlocks), + OreBlockDef.CODEC.listOf().fieldOf("rare_blocks").forGetter(it -> it.rareBlocks), + Codec.FLOAT.fieldOf("vertical_scale").orElse(0.3f).forGetter(it -> it.verticalScale), + Codec.FLOAT.fieldOf("rare_block_chance").orElse(0.05f).forGetter(it -> it.rareBlockChance)) + .apply(instance, LensVeinGenerator::new)); + + public List oreBlocks = new ArrayList<>(); + public List rareBlocks = new ArrayList<>(); + @Setter + public float verticalScale = 0.3f; + @Setter + public float rareBlockChance = 0.05f; + + public LensVeinGenerator() {} + + public LensVeinGenerator(List oreBlocks, List rareBlocks, + float verticalScale, float rareBlockChance) { + this.oreBlocks = oreBlocks; + this.rareBlocks = rareBlocks; + this.verticalScale = verticalScale; + this.rareBlockChance = rareBlockChance; + } + + @Override + public List getAllEntries() { + List entries = new ArrayList<>(); + for (var def : oreBlocks) VeinGenerator.mapTarget(def.block(), def.weight()).forEach(entries::add); + for (var def : rareBlocks) VeinGenerator.mapTarget(def.block(), def.weight()).forEach(entries::add); + return entries; + } + + @Override + public Map generate(WorldGenLevel level, RandomSource random, GTOreDefinition entry, + BlockPos origin) { + Map generatedBlocks = new Object2ObjectOpenHashMap<>(); + + int size = entry.clusterSize().sample(random); + int horizontalRadius = Mth.ceil(size / 2f); + int verticalRadius = Math.max(2, Mth.ceil(horizontalRadius * verticalScale)); + + float tiltX = (random.nextFloat() - 0.5f) * 0.2f; + float tiltZ = (random.nextFloat() - 0.5f) * 0.2f; + + var posMin = origin.offset(-horizontalRadius, -verticalRadius, -horizontalRadius); + var posMax = origin.offset(+horizontalRadius, +verticalRadius, +horizontalRadius); + + for (BlockPos pos : BlockPos.betweenClosed(posMin, posMax)) { + int dx = pos.getX() - origin.getX(); + int dy = pos.getY() - origin.getY(); + int dz = pos.getZ() - origin.getZ(); + + float adjustedDy = dy - dx * tiltX - dz * tiltZ; + + float normalizedX = dx / (float) horizontalRadius; + float normalizedY = adjustedDy / (float) verticalRadius; + float normalizedZ = dz / (float) horizontalRadius; + float ellipsoidDist = normalizedX * normalizedX + normalizedY * normalizedY + normalizedZ * normalizedZ; + + if (ellipsoidDist > 1.0f) continue; + + float falloff = edgeFalloff((float) Math.sqrt(ellipsoidDist), 0.5f); + if (random.nextFloat() > falloff * entry.density()) continue; + + BlockPos.MutableBlockPos mutablePos = new BlockPos.MutableBlockPos(pos.getX(), pos.getY(), pos.getZ()); + long randomSeed = random.nextLong(); + + generatedBlocks.put(mutablePos.immutable(), + (access, section) -> placeBlock(section, randomSeed, entry, mutablePos, access)); + } + + return generatedBlocks; + } + + private void placeBlock(LevelChunkSection section, long randomSeed, GTOreDefinition entry, + BlockPos.MutableBlockPos pos, BulkSectionAccess access) { + RandomSource random = new XoroshiroRandomSource(randomSeed); + int sectionX = SectionPos.sectionRelative(pos.getX()); + int sectionY = SectionPos.sectionRelative(pos.getY()); + int sectionZ = SectionPos.sectionRelative(pos.getZ()); + + BlockState current = section.getBlockState(sectionX, sectionY, sectionZ); + + if (!rareBlocks.isEmpty() && random.nextFloat() < rareBlockChance) { + var ore = GTUtil.getRandomItem(random, rareBlocks); + if (ore != null) placeOre(ore.block(), current, access, section, random, pos, entry); + } else { + var ore = GTUtil.getRandomItem(random, oreBlocks); + if (ore != null) placeOre(ore.block(), current, access, section, random, pos, entry); + } + } + + @Override + public VeinGenerator build() { + return this; + } + + @Override + public VeinGenerator copy() { + return new LensVeinGenerator(new ArrayList<>(oreBlocks), new ArrayList<>(rareBlocks), verticalScale, + rareBlockChance); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + public LensVeinGenerator oreBlock(Material mat, int weight) { + oreBlocks.add(new OreBlockDef(Either.right(mat), weight)); + return this; + } + + public LensVeinGenerator rareBlock(Material mat, int weight) { + rareBlocks.add(new OreBlockDef(Either.right(mat), weight)); + return this; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/ShellVeinGenerator.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/ShellVeinGenerator.java new file mode 100644 index 000000000..33dae3f8b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/ShellVeinGenerator.java @@ -0,0 +1,228 @@ +package com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins; + +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.data.worldgen.GTOreDefinition; +import com.gregtechceu.gtceu.api.data.worldgen.generator.VeinGenerator; +import com.gregtechceu.gtceu.api.data.worldgen.ores.OreBlockPlacer; +import com.gregtechceu.gtceu.utils.GTUtil; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.BulkSectionAccess; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.levelgen.XoroshiroRandomSource; + +import com.mojang.datafixers.util.Either; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.annotation.ParametersAreNonnullByDefault; + +import static com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.VeinGeneratorUtil.*; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +@Accessors(fluent = true, chain = true) +public class ShellVeinGenerator extends VeinGenerator { + + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + OreBlockDef.CODEC.listOf().fieldOf("inner_blocks").forGetter(it -> it.innerBlocks), + OreBlockDef.CODEC.listOf().fieldOf("outer_blocks").forGetter(it -> it.outerBlocks), + OreBlockDef.CODEC.listOf().fieldOf("core_blocks").forGetter(it -> it.coreBlocks), + Codec.FLOAT.fieldOf("inner_radius_ratio").orElse(0.4f).forGetter(it -> it.innerRadiusRatio), + Codec.FLOAT.fieldOf("outer_radius_ratio").orElse(0.7f).forGetter(it -> it.outerRadiusRatio), + Codec.FLOAT.fieldOf("shell_noise_intensity").orElse(0.25f).forGetter(it -> it.shellNoiseIntensity), + Codec.FLOAT.fieldOf("ore_mixing_chance").orElse(0.15f).forGetter(it -> it.oreMixingChance)) + .apply(instance, ShellVeinGenerator::new)); + + public List innerBlocks = new ArrayList<>(); + public List outerBlocks = new ArrayList<>(); + public List coreBlocks = new ArrayList<>(); + @Setter + public float innerRadiusRatio = 0.4f; + @Setter + public float outerRadiusRatio = 0.7f; + @Setter + public float shellNoiseIntensity = 0.25f; + @Setter + public float oreMixingChance = 0.15f; + + public ShellVeinGenerator() {} + + public ShellVeinGenerator(List innerBlocks, List outerBlocks, + List coreBlocks, float innerRadiusRatio, float outerRadiusRatio, + float shellNoiseIntensity, float oreMixingChance) { + this.innerBlocks = innerBlocks; + this.outerBlocks = outerBlocks; + this.coreBlocks = coreBlocks; + this.innerRadiusRatio = innerRadiusRatio; + this.outerRadiusRatio = outerRadiusRatio; + this.shellNoiseIntensity = shellNoiseIntensity; + this.oreMixingChance = oreMixingChance; + } + + @Override + public List getAllEntries() { + List entries = new ArrayList<>(); + for (var def : coreBlocks) VeinGenerator.mapTarget(def.block(), def.weight()).forEach(entries::add); + for (var def : innerBlocks) VeinGenerator.mapTarget(def.block(), def.weight()).forEach(entries::add); + for (var def : outerBlocks) VeinGenerator.mapTarget(def.block(), def.weight()).forEach(entries::add); + return entries; + } + + @Override + public Map generate(WorldGenLevel level, RandomSource random, GTOreDefinition entry, + BlockPos origin) { + Map generatedBlocks = new Object2ObjectOpenHashMap<>(); + + int size = entry.clusterSize().sample(random); + int radius = Math.max(32, Mth.ceil(size * 0.5f)); + + float innerRadius = radius * innerRadiusRatio; + float outerRadius = radius * outerRadiusRatio; + + long noiseSeed = random.nextLong(); + + var posMin = origin.offset(-radius, -radius, -radius); + var posMax = origin.offset(+radius, +radius, +radius); + + for (BlockPos pos : BlockPos.betweenClosed(posMin, posMax)) { + int dx = pos.getX() - origin.getX(); + int dy = pos.getY() - origin.getY(); + int dz = pos.getZ() - origin.getZ(); + float dist = (float) Math.sqrt(dx * dx + dy * dy + dz * dz); + + if (dist > radius) continue; + + float normalizedDist = dist / radius; + float falloff = edgeFalloff(normalizedDist, 0.6f); + if (random.nextFloat() > falloff * entry.density()) continue; + + float noise1 = noise3D(pos.getX() * 0.12f, pos.getY() * 0.12f, pos.getZ() * 0.12f, noiseSeed); + float noise2 = noise3D(pos.getX() * 0.25f, pos.getY() * 0.25f, pos.getZ() * 0.25f, noiseSeed + 100); + float combinedNoise = noise1 * 0.7f + noise2 * 0.3f; + + float noisyInnerRadius = innerRadius * (1.0f + combinedNoise * shellNoiseIntensity); + float noisyOuterRadius = outerRadius * (1.0f + combinedNoise * shellNoiseIntensity * 0.8f); + + final Zone primaryZone; + final boolean nearBoundary; + + if (dist <= noisyInnerRadius) { + primaryZone = Zone.CORE; + nearBoundary = dist > noisyInnerRadius * 0.75f; + } else if (dist <= noisyOuterRadius) { + primaryZone = Zone.INNER; + nearBoundary = dist < noisyInnerRadius * 1.25f || dist > noisyOuterRadius * 0.85f; + } else { + primaryZone = Zone.OUTER; + nearBoundary = dist < noisyOuterRadius * 1.15f; + } + + if (random.nextFloat() > 0.45f) continue; + + BlockPos.MutableBlockPos mutablePos = new BlockPos.MutableBlockPos(pos.getX(), pos.getY(), pos.getZ()); + long randomSeed = random.nextLong(); + + generatedBlocks.put(mutablePos.immutable(), + (access, section) -> placeBlock(section, randomSeed, entry, mutablePos, access, primaryZone, + nearBoundary)); + } + + return generatedBlocks; + } + + private float noise3D(float x, float y, float z, long seed) { + long posHash = Float.floatToIntBits(x * 73856093) ^ + Float.floatToIntBits(y * 19349663) ^ + Float.floatToIntBits(z * 83492791); + RandomSource noise = new XoroshiroRandomSource(seed ^ posHash); + return noise.nextFloat() * 2.0f - 1.0f; + } + + private void placeBlock(LevelChunkSection section, long randomSeed, GTOreDefinition entry, + BlockPos.MutableBlockPos pos, BulkSectionAccess access, Zone zone, boolean nearBoundary) { + RandomSource random = new XoroshiroRandomSource(randomSeed); + int sectionX = SectionPos.sectionRelative(pos.getX()); + int sectionY = SectionPos.sectionRelative(pos.getY()); + int sectionZ = SectionPos.sectionRelative(pos.getZ()); + + BlockState current = section.getBlockState(sectionX, sectionY, sectionZ); + + List primaryBlocks = switch (zone) { + case CORE -> coreBlocks.isEmpty() ? innerBlocks : coreBlocks; + case INNER -> innerBlocks.isEmpty() ? outerBlocks : innerBlocks; + case OUTER -> outerBlocks.isEmpty() ? innerBlocks : outerBlocks; + }; + + List adjacentBlocks = switch (zone) { + case CORE -> innerBlocks.isEmpty() ? outerBlocks : innerBlocks; + case INNER -> random.nextBoolean() ? + (coreBlocks.isEmpty() ? innerBlocks : coreBlocks) : + (outerBlocks.isEmpty() ? innerBlocks : outerBlocks); + case OUTER -> innerBlocks.isEmpty() ? (coreBlocks.isEmpty() ? outerBlocks : coreBlocks) : innerBlocks; + }; + + if (primaryBlocks.isEmpty()) return; + + List blocksToUse; + if (nearBoundary && random.nextFloat() < oreMixingChance && !adjacentBlocks.isEmpty()) { + blocksToUse = adjacentBlocks; + } else { + blocksToUse = primaryBlocks; + } + + var ore = GTUtil.getRandomItem(random, blocksToUse); + if (ore != null) placeOre(ore.block(), current, access, section, random, pos, entry); + } + + private enum Zone { + CORE, + INNER, + OUTER + } + + @Override + public VeinGenerator build() { + return this; + } + + @Override + public VeinGenerator copy() { + return new ShellVeinGenerator(new ArrayList<>(innerBlocks), new ArrayList<>(outerBlocks), + new ArrayList<>(coreBlocks), innerRadiusRatio, outerRadiusRatio, shellNoiseIntensity, oreMixingChance); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + public ShellVeinGenerator coreBlock(Material mat, int weight) { + coreBlocks.add(new OreBlockDef(Either.right(mat), weight)); + return this; + } + + public ShellVeinGenerator innerBlock(Material mat, int weight) { + innerBlocks.add(new OreBlockDef(Either.right(mat), weight)); + return this; + } + + public ShellVeinGenerator outerBlock(Material mat, int weight) { + outerBlocks.add(new OreBlockDef(Either.right(mat), weight)); + return this; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/StringerVeinGenerator.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/StringerVeinGenerator.java new file mode 100644 index 000000000..0afae9eff --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/StringerVeinGenerator.java @@ -0,0 +1,272 @@ +package com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins; + +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.data.worldgen.GTOreDefinition; +import com.gregtechceu.gtceu.api.data.worldgen.generator.VeinGenerator; +import com.gregtechceu.gtceu.api.data.worldgen.ores.OreBlockPlacer; +import com.gregtechceu.gtceu.utils.GTUtil; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.BulkSectionAccess; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.levelgen.XoroshiroRandomSource; + +import com.mojang.datafixers.util.Either; +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.annotation.ParametersAreNonnullByDefault; + +import static com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.VeinGeneratorUtil.*; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +@Accessors(fluent = true, chain = true) +public class StringerVeinGenerator extends VeinGenerator { + + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> instance.group( + OreBlockDef.CODEC.listOf().fieldOf("ore_blocks").forGetter(it -> it.oreBlocks), + OreBlockDef.CODEC.listOf().fieldOf("rare_blocks").forGetter(it -> it.rareBlocks), + Codec.INT.fieldOf("stringer_count").orElse(16).forGetter(it -> it.stringerCount), + Codec.FLOAT.fieldOf("core_radius_ratio").orElse(0.25f).forGetter(it -> it.coreRadiusRatio), + Codec.FLOAT.fieldOf("stringer_thickness_ratio").orElse(0.1f).forGetter(it -> it.stringerThicknessRatio), + Codec.FLOAT.fieldOf("core_noise_intensity").orElse(0.6f).forGetter(it -> it.coreNoiseIntensity), + Codec.FLOAT.fieldOf("ore_density").orElse(0.6f).forGetter(it -> it.oreDensity), + Codec.FLOAT.fieldOf("rare_block_chance").orElse(0.04f).forGetter(it -> it.rareBlockChance)) + .apply(instance, StringerVeinGenerator::new)); + + public List oreBlocks = new ArrayList<>(); + public List rareBlocks = new ArrayList<>(); + @Setter + public int stringerCount = 16; + @Setter + public float coreRadiusRatio = 0.25f; + @Setter + public float stringerThicknessRatio = 0.1f; + @Setter + public float coreNoiseIntensity = 0.6f; + @Setter + public float oreDensity = 0.6f; + @Setter + public float rareBlockChance = 0.04f; + + public StringerVeinGenerator() {} + + public StringerVeinGenerator(List oreBlocks, List rareBlocks, + int stringerCount, float coreRadiusRatio, float stringerThicknessRatio, + float coreNoiseIntensity, float oreDensity, float rareBlockChance) { + this.oreBlocks = oreBlocks; + this.rareBlocks = rareBlocks; + this.stringerCount = stringerCount; + this.coreRadiusRatio = coreRadiusRatio; + this.stringerThicknessRatio = stringerThicknessRatio; + this.coreNoiseIntensity = coreNoiseIntensity; + this.oreDensity = oreDensity; + this.rareBlockChance = rareBlockChance; + } + + @Override + public List getAllEntries() { + List entries = new ArrayList<>(); + for (var def : oreBlocks) VeinGenerator.mapTarget(def.block(), def.weight()).forEach(entries::add); + for (var def : rareBlocks) VeinGenerator.mapTarget(def.block(), def.weight()).forEach(entries::add); + return entries; + } + + @Override + public Map generate(WorldGenLevel level, RandomSource random, GTOreDefinition entry, + BlockPos origin) { + Map generatedBlocks = new Object2ObjectOpenHashMap<>(); + + int size = entry.clusterSize().sample(random); + int radius = Math.max(55, Mth.ceil(size * 0.7f)); + float coreRadius = Math.max(5.0f, radius * coreRadiusRatio); + float baseStringerThickness = Math.max(2.0f, radius * stringerThicknessRatio); + int actualStringerCount = stringerCount + random.nextInt(6) - 3; + + long noiseSeed = random.nextLong(); + double[][] stringerDirs = new double[actualStringerCount][3]; + float[] stringerThickness = new float[actualStringerCount]; + float[] stringerLengths = new float[actualStringerCount]; + + for (int i = 0; i < actualStringerCount; i++) { + double theta = i * 2.399963 + random.nextDouble() * 0.5; + double phi = (random.nextDouble() - 0.5) * 1.4; + stringerDirs[i][0] = Math.cos(theta) * Math.cos(phi); + stringerDirs[i][1] = Math.sin(phi) * 0.6; + stringerDirs[i][2] = Math.sin(theta) * Math.cos(phi); + stringerThickness[i] = baseStringerThickness * (0.5f + random.nextFloat() * 0.7f); + stringerLengths[i] = 0.8f + random.nextFloat() * 0.4f; + } + + var posMin = origin.offset(-radius, -radius, -radius); + var posMax = origin.offset(+radius, +radius, +radius); + + for (BlockPos pos : BlockPos.betweenClosed(posMin, posMax)) { + int dx = pos.getX() - origin.getX(); + int dy = pos.getY() - origin.getY(); + int dz = pos.getZ() - origin.getZ(); + float distFromOrigin = (float) Math.sqrt(dx * dx + dy * dy + dz * dz); + + if (distFromOrigin > radius) continue; + + float noise1 = noise3D(pos.getX() * 0.15f, pos.getY() * 0.15f, pos.getZ() * 0.15f, noiseSeed); + float noise2 = noise3D(pos.getX() * 0.3f, pos.getY() * 0.3f, pos.getZ() * 0.3f, noiseSeed + 100); + float combinedNoise = noise1 * 0.7f + noise2 * 0.3f; + float noisyRadius = coreRadius * (1.0f + combinedNoise * coreNoiseIntensity); + boolean inCore = distFromOrigin <= noisyRadius; + + boolean inBlob = false; + if (!inCore && distFromOrigin <= coreRadius * 2.0f) { + float blobNoise = noise3D(pos.getX() * 0.2f, pos.getY() * 0.2f, pos.getZ() * 0.2f, noiseSeed + 50); + if (blobNoise > 0.4f) { + float blobRadius = coreRadius * 0.4f * blobNoise; + if (distFromOrigin <= coreRadius + blobRadius) { + inBlob = true; + } + } + } + + boolean inStringer = false; + + if (!inCore && !inBlob) { + for (int i = 0; i < actualStringerCount; i++) { + float maxLen = radius * stringerLengths[i]; + float distToStringer = distanceToRay(dx, dy, dz, + stringerDirs[i][0], stringerDirs[i][1], stringerDirs[i][2], (int) maxLen); + + float progress = Math.max(0, distFromOrigin - coreRadius) / (maxLen - coreRadius); + float taperFactor = 1.0f - progress * 0.5f; + + float effectiveThickness = stringerThickness[i] * taperFactor; + + if (distToStringer <= effectiveThickness) { + inStringer = true; + break; + } + } + } + + if (!inCore && !inBlob && !inStringer) continue; + + if (random.nextFloat() > oreDensity) continue; + + float normalizedDist = distFromOrigin / radius; + float falloff = edgeFalloff(normalizedDist, 0.75f); + if (random.nextFloat() > falloff * entry.density()) continue; + + BlockPos.MutableBlockPos mutablePos = new BlockPos.MutableBlockPos(pos.getX(), pos.getY(), pos.getZ()); + long randomSeed = random.nextLong(); + boolean isInCore = inCore || inBlob; + + generatedBlocks.put(mutablePos.immutable(), + (access, section) -> placeBlock(section, randomSeed, entry, mutablePos, access, isInCore)); + } + + return generatedBlocks; + } + + private float noise3D(float x, float y, float z, long seed) { + long posHash = Float.floatToIntBits(x * 73856093) ^ + Float.floatToIntBits(y * 19349663) ^ + Float.floatToIntBits(z * 83492791); + RandomSource noise = new XoroshiroRandomSource(seed ^ posHash); + return noise.nextFloat() * 2.0f - 1.0f; + } + + private float distanceToRay(int px, int py, int pz, double dx, double dy, double dz, int maxLen) { + double t = Math.max(0, Math.min(maxLen, px * dx + py * dy + pz * dz)); + double closestX = t * dx; + double closestY = t * dy; + double closestZ = t * dz; + return (float) Math.sqrt( + (px - closestX) * (px - closestX) + + (py - closestY) * (py - closestY) + + (pz - closestZ) * (pz - closestZ)); + } + + private void placeBlock(LevelChunkSection section, long randomSeed, GTOreDefinition entry, + BlockPos.MutableBlockPos pos, BulkSectionAccess access, boolean isCore) { + RandomSource random = new XoroshiroRandomSource(randomSeed); + int sectionX = SectionPos.sectionRelative(pos.getX()); + int sectionY = SectionPos.sectionRelative(pos.getY()); + int sectionZ = SectionPos.sectionRelative(pos.getZ()); + + BlockState current = section.getBlockState(sectionX, sectionY, sectionZ); + + float adjustedRareChance = isCore ? rareBlockChance * 2 : rareBlockChance; + if (!rareBlocks.isEmpty() && random.nextFloat() < adjustedRareChance) { + var ore = GTUtil.getRandomItem(random, rareBlocks); + if (ore != null) placeOre(ore.block(), current, access, section, random, pos, entry); + } else { + var ore = GTUtil.getRandomItem(random, oreBlocks); + if (ore != null) placeOre(ore.block(), current, access, section, random, pos, entry); + } + } + + @Override + public VeinGenerator build() { + return this; + } + + @Override + public VeinGenerator copy() { + return new StringerVeinGenerator(new ArrayList<>(oreBlocks), new ArrayList<>(rareBlocks), + stringerCount, coreRadiusRatio, stringerThicknessRatio, coreNoiseIntensity, oreDensity, + rareBlockChance); + } + + @Override + public MapCodec codec() { + return CODEC; + } + + public StringerVeinGenerator oreBlock(Material mat, int weight) { + oreBlocks.add(new OreBlockDef(Either.right(mat), weight)); + return this; + } + + public StringerVeinGenerator rareBlock(Material mat, int weight) { + rareBlocks.add(new OreBlockDef(Either.right(mat), weight)); + return this; + } + + public StringerVeinGenerator tendrilCount(int count) { + this.stringerCount = count; + return this; + } + + public StringerVeinGenerator coreRadius(float radius) { + this.coreRadiusRatio = radius; + return this; + } + + public StringerVeinGenerator tendrilRadius(float radius) { + this.stringerThicknessRatio = radius; + return this; + } + + public StringerVeinGenerator coreDensity(float density) { + this.oreDensity = density; + return this; + } + + public StringerVeinGenerator tendrilCurvature(float curvature) { + this.coreNoiseIntensity = curvature; + return this; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/VeinGeneratorUtil.java b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/VeinGeneratorUtil.java new file mode 100644 index 000000000..166fbbafb --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/data/worldgen/generator/veins/VeinGeneratorUtil.java @@ -0,0 +1,82 @@ +package com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins; + +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.data.worldgen.GTOreDefinition; +import com.gregtechceu.gtceu.api.data.worldgen.ores.OreVeinUtil; +import com.gregtechceu.gtceu.api.registry.GTRegistries; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.SectionPos; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.BulkSectionAccess; +import net.minecraft.world.level.chunk.LevelChunkSection; +import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration.TargetBlockState; + +import com.mojang.datafixers.util.Either; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + +import java.util.List; + +public final class VeinGeneratorUtil { + + public static final Codec, Material>> BLOCK_ENTRY_CODEC = Codec + .either(TargetBlockState.CODEC.listOf(), GTRegistries.MATERIALS.byNameCodec()); + + private VeinGeneratorUtil() {} + + public static float smoothstep(float edge0, float edge1, float x) { + float t = Math.max(0, Math.min(1, (x - edge0) / (edge1 - edge0))); + return t * t * (3 - 2 * t); + } + + public static float edgeFalloff(float normalizedDistance, float falloffStart) { + if (normalizedDistance <= falloffStart) return 1.0f; + return 1.0f - smoothstep(falloffStart, 1.0f, normalizedDistance); + } + + public static void placeOre( + Either, Material> block, + BlockState current, + BulkSectionAccess level, + LevelChunkSection section, + RandomSource random, + BlockPos pos, + GTOreDefinition entry) { + int x = SectionPos.sectionRelative(pos.getX()); + int y = SectionPos.sectionRelative(pos.getY()); + int z = SectionPos.sectionRelative(pos.getZ()); + + block.ifLeft(blockStates -> { + for (TargetBlockState targetState : blockStates) { + if (!OreVeinUtil.canPlaceOre(current, level::getBlockState, random, entry, targetState, pos)) + continue; + if (targetState.state.isAir()) + continue; + section.setBlockState(x, y, z, targetState.state, false); + break; + } + }).ifRight(material -> { + if (!OreVeinUtil.canPlaceOre(current, level::getBlockState, random, entry, pos)) + return; + BlockState currentState = level.getBlockState(pos); + var prefix = ChemicalHelper.getOrePrefix(currentState); + if (prefix.isEmpty()) return; + Block toPlace = ChemicalHelper.getBlock(prefix.get(), material); + if (toPlace == null || toPlace.defaultBlockState().isAir()) + return; + section.setBlockState(x, y, z, toPlace.defaultBlockState(), false); + }); + } + + public record OreBlockDef(Either, Material> block, int weight) + implements com.gregtechceu.gtceu.utils.WeightedEntry { + + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + BLOCK_ENTRY_CODEC.fieldOf("block").forGetter(OreBlockDef::block), + Codec.INT.fieldOf("weight").forGetter(OreBlockDef::weight)).apply(instance, OreBlockDef::new)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/glm/GenericLootModifier.java b/src/main/java/com/ghostipedia/cosmiccore/common/glm/GenericLootModifier.java new file mode 100644 index 000000000..7a55ff20d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/glm/GenericLootModifier.java @@ -0,0 +1,62 @@ +package com.ghostipedia.cosmiccore.common.glm; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.neoforged.neoforge.common.loot.IGlobalLootModifier; +import net.neoforged.neoforge.common.loot.LootModifier; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class GenericLootModifier extends LootModifier { + + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(inst -> inst.group( + IGlobalLootModifier.LOOT_CONDITIONS_CODEC.fieldOf("conditions") + .forGetter((GenericLootModifier lm) -> lm.conditions), + ResourceLocation.CODEC.fieldOf("loot_table_id") + .forGetter((GenericLootModifier lm) -> lm.lootTableId), + LootPool.CODEC.listOf().fieldOf("injected_loot") + .forGetter((GenericLootModifier lm) -> lm.injectedLoot)) + .apply(inst, GenericLootModifier::new)); + + @Getter + private final ResourceLocation lootTableId; + @Getter + private final List injectedLoot; + + /** + * Constructs a LootModifier. + * + * @param conditionsIn the ILootConditions that need to be matched before the loot is modified. + */ + protected GenericLootModifier(LootItemCondition[] conditionsIn, ResourceLocation lootTableId, + List injectedLoot) { + super(conditionsIn); + this.lootTableId = lootTableId; + this.injectedLoot = injectedLoot; + } + + @Override + protected @NotNull ObjectArrayList doApply(ObjectArrayList original, LootContext context) { + if (this.injectedLoot.isEmpty() || !context.getQueriedLootTableId().equals(this.lootTableId)) { + return original; + } + for (LootPool pool : this.injectedLoot) { + pool.addRandomItems(original::add, context); + } + return original; + } + + @Override + public MapCodec codec() { + return CODEC; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/glm/NoSilkTouchOreLootModifier.java b/src/main/java/com/ghostipedia/cosmiccore/common/glm/NoSilkTouchOreLootModifier.java new file mode 100644 index 000000000..0f7d29560 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/glm/NoSilkTouchOreLootModifier.java @@ -0,0 +1,121 @@ +package com.ghostipedia.cosmiccore.common.glm; + +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; + +import net.minecraft.core.Holder; +import net.minecraft.core.HolderGetter; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.enchantment.Enchantment; +import net.minecraft.world.item.enchantment.EnchantmentHelper; +import net.minecraft.world.item.enchantment.Enchantments; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootContext; +import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.common.loot.IGlobalLootModifier; +import net.neoforged.neoforge.common.loot.LootModifier; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import org.jetbrains.annotations.NotNull; + +public class NoSilkTouchOreLootModifier extends LootModifier { + + public static final MapCodec CODEC = RecordCodecBuilder + .mapCodec(inst -> inst + .group(IGlobalLootModifier.LOOT_CONDITIONS_CODEC.fieldOf("conditions") + .forGetter(lm -> lm.conditions)) + .apply(inst, NoSilkTouchOreLootModifier::new)); + + /** + * Re-entry guard. We re-run the block's loot table with a "fake" tool to get the + * non-silk-touch drops, but that re-fires every global loot modifier — including this one. + * For tools whose silk-touch comes from a non-Forge source (e.g. Tinkers' modifier system), + * stripping the standard enchantment NBT doesn't make {@code getEnchantmentLevel(SILK_TOUCH)} + * return 0, so the bailout at the top doesn't trigger and we'd recurse forever (StackOverflow, + * server crash). The flag short-circuits the inner call cleanly without depending on how the + * tool reports enchantments. + */ + private static final ThreadLocal REENTRY = ThreadLocal.withInitial(() -> false); + + protected NoSilkTouchOreLootModifier(LootItemCondition[] conditionsIn) { + super(conditionsIn); + } + + @Override + protected @NotNull ObjectArrayList doApply(ObjectArrayList generatedLoot, + LootContext context) { + if (REENTRY.get()) return generatedLoot; + + HolderGetter enchantments = context.getResolver().lookupOrThrow(Registries.ENCHANTMENT); + Holder silkTouch = enchantments.getOrThrow(Enchantments.SILK_TOUCH); + + ItemStack tool = context.getParamOrNull(LootContextParams.TOOL); + if (tool == null || EnchantmentHelper.getItemEnchantmentLevel(silkTouch, tool) <= 0) { + return generatedLoot; + } + + BlockState state = context.getParamOrNull(LootContextParams.BLOCK_STATE); + if (state == null || !state.is(Tags.Blocks.ORES)) { + return generatedLoot; + } + + ItemStack blockItem = new ItemStack(state.getBlock()); + var materialStack = ChemicalHelper.getMaterialStack(blockItem); + if (materialStack == null || materialStack.material() == null) { + return generatedLoot; + } + + if (!materialStack.material().hasProperty(PropertyKey.ORE)) { + return generatedLoot; + } + + // Use a vanilla netherite pickaxe as the fake tool. Copying the original tool and stripping + // its enchantment NBT doesn't actually remove silk-touch behavior for tools whose silk + // touch lives outside Forge's enchantment system (Tinkers' Silky modifier, Apotheosis + // affixes, any other modded tool). A clean vanilla pickaxe has none of those layers, mines + // any tier, and gets the recipient ore's natural non-silk-touch drops. Fortune is the only + // enchantment that affects ore drop counts, so we forward that and drop everything else. + ItemStack fakeTool = new ItemStack(Items.NETHERITE_PICKAXE); + Holder fortuneHolder = enchantments.getOrThrow(Enchantments.FORTUNE); + int fortune = EnchantmentHelper.getItemEnchantmentLevel(fortuneHolder, tool); + if (fortune > 0) { + fakeTool.enchant(fortuneHolder, fortune); + } + + LootParams.Builder builder = new LootParams.Builder(context.getLevel()) + .withParameter(LootContextParams.BLOCK_STATE, state) + .withParameter(LootContextParams.ORIGIN, context.getParam(LootContextParams.ORIGIN)) + .withParameter(LootContextParams.TOOL, fakeTool); + + var entity = context.getParamOrNull(LootContextParams.THIS_ENTITY); + if (entity != null) { + builder.withOptionalParameter(LootContextParams.THIS_ENTITY, entity); + } + + var explosionRadius = context.getParamOrNull(LootContextParams.EXPLOSION_RADIUS); + if (explosionRadius != null) { + builder.withOptionalParameter(LootContextParams.EXPLOSION_RADIUS, explosionRadius); + } + + REENTRY.set(true); + try { + generatedLoot.clear(); + generatedLoot.addAll(state.getDrops(builder)); + } finally { + REENTRY.set(false); + } + return generatedLoot; + } + + @Override + public MapCodec codec() { + return CODEC; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/AirBladderItem.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/AirBladderItem.java new file mode 100644 index 000000000..f864ff1f8 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/AirBladderItem.java @@ -0,0 +1,106 @@ +package com.ghostipedia.cosmiccore.common.item; + +import java.util.Optional; +import com.ghostipedia.cosmiccore.common.data.CosmicAttachmentTypes; + +import com.ghostipedia.cosmiccore.common.airControl.OxygenConfig; +import com.ghostipedia.cosmiccore.common.airControl.OxygenRules; +import com.ghostipedia.cosmiccore.utils.ItemData; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class AirBladderItem extends Item { + + private static final String TAG_CHARGES = "Charges"; + + public AirBladderItem(Properties props) { + super(props); + } + + public static int getCharges(ItemStack stack) { + CompoundTag tag = ItemData.readTag(stack); + if (!tag.contains(TAG_CHARGES)) { + return OxygenConfig.AIR_BLADDER_MAX_CHARGES; + } + return tag.getInt(TAG_CHARGES); + } + + private static void setCharges(ItemStack stack, int charges) { + ItemData.mutateTag(stack, tag -> tag.putInt(TAG_CHARGES, charges)); + } + + private static boolean isInSafeAir(ServerPlayer player) { + ServerLevel serverLevel = player.serverLevel(); + int y = player.blockPosition().getY(); + OxygenRules.ResolvedAirRange resolved = OxygenRules.resolve(serverLevel.dimension(), y); + if (resolved.airQuality != OxygenRules.AirQuality.SAFE) return false; + + BlockPos eyePos = BlockPos.containing(player.getX(), player.getEyeY(), player.getZ()); + boolean eyesInFluid = !serverLevel.getFluidState(eyePos).isEmpty(); + return !eyesInFluid; + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (!level.isClientSide() && player instanceof ServerPlayer serverPlayer) { + int charges = getCharges(stack); + + if (charges < OxygenConfig.AIR_BLADDER_MAX_CHARGES && isInSafeAir(serverPlayer)) { + setCharges(stack, OxygenConfig.AIR_BLADDER_MAX_CHARGES); + level.playSound(null, player.blockPosition(), + SoundEvents.BOTTLE_FILL, SoundSource.PLAYERS, 0.8f, 1.0f); + player.getCooldowns().addCooldown(this, OxygenConfig.AIR_BLADDER_COOLDOWN); + return InteractionResultHolder.sidedSuccess(stack, false); + } + + if (charges > 0) { + ServerLevel serverLevel = serverPlayer.serverLevel(); + Optional.of(serverPlayer.getData(CosmicAttachmentTypes.OXYGEN_BUDGET)).ifPresent(cap -> { + long current = cap.getOxygenTicks(serverLevel.dimension()); + long max = OxygenConfig.getMaxOxygenTicks(serverPlayer); + + if (current < max) { + long restored = Math.min(OxygenConfig.AIR_BLADDER_RESTORE_TICKS, max - current); + cap.setOxygenTicks(serverLevel.dimension(), current + restored); + setCharges(stack, getCharges(stack) - 1); + + level.playSound(null, player.blockPosition(), + SoundEvents.BOTTLE_EMPTY, SoundSource.PLAYERS, 1.0f, 0.8f); + } + }); + player.getCooldowns().addCooldown(this, OxygenConfig.AIR_BLADDER_COOLDOWN); + return InteractionResultHolder.sidedSuccess(stack, false); + } + } + + return InteractionResultHolder.pass(stack); + } + + @Override + public boolean isBarVisible(ItemStack stack) { + return true; + } + + @Override + public int getBarWidth(ItemStack stack) { + return Math.round(13.0f * getCharges(stack) / OxygenConfig.AIR_BLADDER_MAX_CHARGES); + } + + @Override + public int getBarColor(ItemStack stack) { + return 0x55D8FF; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/AsteroidItem.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/AsteroidItem.java new file mode 100644 index 000000000..d4a63ed71 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/AsteroidItem.java @@ -0,0 +1,42 @@ +package com.ghostipedia.cosmiccore.common.item; + +import com.gregtechceu.gtceu.api.item.ComponentItem; + +import com.ghostipedia.cosmiccore.utils.ItemData; + +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; + +import java.util.List; + +public class AsteroidItem extends ComponentItem { + + public AsteroidItem(Properties properties) { + super(properties); + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltipComponents, + TooltipFlag isAdvanced) { + CompoundTag tag = ItemData.readTag(stack); + + if (tag.isEmpty()) { + tooltipComponents.add(Component.translatable("tooltip.cosmiccore.asteroid.tiny") + .withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC)); + return; + } + + int size = tag.getInt("Size"); + + if (size > 0) { + tooltipComponents.add(Component.translatable("tooltip.cosmiccore.asteroid.tier", size) + .withStyle(ChatFormatting.AQUA)); + } + + super.appendHoverText(stack, context, tooltipComponents, isAdvanced); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/AsteroidTargetingChipItem.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/AsteroidTargetingChipItem.java new file mode 100644 index 000000000..860c26d1b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/AsteroidTargetingChipItem.java @@ -0,0 +1,65 @@ +package com.ghostipedia.cosmiccore.common.item; + +import com.ghostipedia.cosmiccore.utils.ItemData; + +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; + +import java.util.List; +import java.util.Locale; + +public class AsteroidTargetingChipItem extends Item { + + public AsteroidTargetingChipItem(Properties props) { + super(props); + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltipComponents, + TooltipFlag isAdvanced) { + CompoundTag tag = ItemData.readTag(stack); + + if (tag.isEmpty()) { + tooltipComponents.add(Component.translatable("tooltip.cosmiccore.asteroid_chip.unprogrammed") + .withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC)); + return; + } + + String rawType = tag.getString("AsteroidType"); + String asteroidType = prettyType(rawType); + int tier = tag.getInt("Tier"); + + tooltipComponents.add(Component.translatable("tooltip.cosmiccore.asteroid_chip.type", asteroidType) + .withStyle(ChatFormatting.YELLOW)); + + if (tier > 0) { + tooltipComponents.add(Component.translatable("tooltip.cosmiccore.asteroid_chip.tier", tier) + .withStyle(ChatFormatting.AQUA)); + } + } + + private static String prettyType(String key) { + if (key == null || key.isBlank()) return "Unknown"; + String k = key.toLowerCase(Locale.ROOT); + + return switch (k) { + case "carbon", "carbonic", "carbon_asteroid", "carbon_asteroid_base" -> "Carbonic Asteroid"; + case "ferric", "ferric_asteroid" -> "Ferric Asteroid"; + case "rare", "rare_metal", "rare_metals", "rare_metal_asteroid", "exotic", "exotic_metals" -> "Rare Metals Asteroid"; + case "auric", "auric_asteroid" -> "Auric Asteroid"; + case "brimstone", "brimstone_asteroid", "sulfuric" -> "Brimstone Asteroid"; + case "lith", "lith_asteroid" -> "Lith Asteroid"; + case "mafic", "mafic_asteroid" -> "Mafic Asteroid"; + case "mossy", "mossy_asteroid" -> "Mossy Asteroid"; + case "occult", "occult_asteroid" -> "Occult Asteroid"; + case "oxide", "oxide_asteroid" -> "Oxide Asteroid"; + case "sanguine", "sanguine_asteroid" -> "Sanguine Asteroid"; + case "wasteland", "wasteland_asteroid" -> "Wasteland Asteroid"; + default -> k.isEmpty() ? "Unknown" : Character.toUpperCase(k.charAt(0)) + k.substring(1); + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/OxygenTankItem.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/OxygenTankItem.java new file mode 100644 index 000000000..d32f86ca1 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/OxygenTankItem.java @@ -0,0 +1,104 @@ +package com.ghostipedia.cosmiccore.common.item; + +import com.ghostipedia.cosmiccore.utils.ItemData; + +import com.gregtechceu.gtceu.api.item.ComponentItem; + +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.fluids.capability.IFluidHandlerItem; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class OxygenTankItem extends ComponentItem { + + public OxygenTankItem(Properties props) { + super(props); + } + + @Override + public boolean isBarVisible(@NotNull ItemStack stack) { + return true; + } + + @Override + public int getBarWidth(@NotNull ItemStack stack) { + IFluidHandlerItem h = stack.getCapability(Capabilities.FluidHandler.ITEM); + if (h == null) return 0; + int amount = h.getFluidInTank(0).getAmount(); + int cap = Math.max(1, h.getTankCapacity(0)); + return Math.round(13.0f * amount / cap); + } + + @Override + public int getBarColor(@NotNull ItemStack stack) { + return 0x55D8FF; + } + + @Override + public void appendHoverText(@NotNull ItemStack stack, Item.TooltipContext context, + @NotNull List tooltip, @NotNull TooltipFlag flag) { + IFluidHandlerItem h = stack.getCapability(Capabilities.FluidHandler.ITEM); + if (h == null) return; + + int amt = h.getFluidInTank(0).getAmount(); + int cap = h.getTankCapacity(0); + tooltip.add(line("Oxygen", amt + " / " + cap + " mB", ChatFormatting.AQUA)); + + CompoundTag tag = ItemData.readElement(stack, "CosmicCoreO2"); + int ticksPerMb = tag.getInt("TicksPerMb"); + int transferPerTick = tag.getInt("TransferPerTick"); + + if (ticksPerMb <= 0 || transferPerTick < 0) { + stack.getCapability(Capabilities.FluidHandler.ITEM); + tag = ItemData.readElement(stack, "CosmicCoreO2"); + ticksPerMb = Math.max(1, tag.getInt("TicksPerMb")); + transferPerTick = Math.max(0, tag.getInt("TransferPerTick")); + } + + int ticksPerSec = transferPerTick * 20; + + double mbPerTickAtMax = Math.min(1.0, transferPerTick / (double) ticksPerMb); + double mbPerSecAtMax = mbPerTickAtMax * 20.0; + + tooltip.add(line("Max Output", transferPerTick + " O\u2082/t (" + ticksPerSec + "/s)", ChatFormatting.GRAY)); + tooltip.add(line("Conversion", ticksPerMb + " O\u2082-ticks per mB", ChatFormatting.GRAY)); + tooltip.add(line("Use @ Max", fmt(mbPerTickAtMax) + " mB/t (" + fmt(mbPerSecAtMax) + " mB/s)", + ChatFormatting.DARK_GRAY)); + + if (cap > 0 && transferPerTick > 0) { + long totalOTicks = (long) amt * (long) ticksPerMb; + long runGTicks = (long) Math.floor(totalOTicks / (double) transferPerTick); + tooltip.add(line("Est. Runtime @ Max", formatDurationSeconds(runGTicks / 20.0), ChatFormatting.DARK_GREEN)); + } + + tooltip.add(Component.empty()); + tooltip.add(Component.literal("Requires Pressurized Rebreather").withStyle(ChatFormatting.RED)); + } + + private static Component line(String label, String value, ChatFormatting color) { + return Component.literal(label + ": ").withStyle(ChatFormatting.WHITE) + .append(Component.literal(value).withStyle(color)); + } + + private static String fmt(double d) { + if (d >= 10) return String.format("%.0f", d); + if (d >= 1) return String.format("%.2f", d); + return String.format("%.3f", d); + } + + private static String formatDurationSeconds(double seconds) { + if (seconds < 60) return String.format("%.1fs", seconds); + int s = (int) Math.floor(seconds); + int m = s / 60; + int r = s % 60; + return String.format("%dm %02ds", m, r); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/RenderBlockItem.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/RenderBlockItem.java new file mode 100644 index 000000000..128246c72 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/RenderBlockItem.java @@ -0,0 +1,30 @@ +package com.ghostipedia.cosmiccore.common.item; + +import com.lowdragmc.lowdraglib.client.renderer.IBlockRendererProvider; +import com.lowdragmc.lowdraglib.client.renderer.IItemRendererProvider; +import com.lowdragmc.lowdraglib.client.renderer.IRenderer; + +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import org.jetbrains.annotations.Nullable; + +public class RenderBlockItem extends BlockItem implements IItemRendererProvider { + + public RenderBlockItem(Block block, Properties properties) { + super(block, properties); + } + + @Nullable + @Override + @OnlyIn(Dist.CLIENT) + public IRenderer getRenderer(ItemStack stack) { + if (getBlock() instanceof IBlockRendererProvider provider) { + return provider.getRenderer(getBlock().defaultBlockState()); + } + return null; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/SoulNetworkReaderItem.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/SoulNetworkReaderItem.java new file mode 100644 index 000000000..34b317c96 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/SoulNetworkReaderItem.java @@ -0,0 +1,48 @@ +package com.ghostipedia.cosmiccore.common.item; + +import com.ghostipedia.cosmiccore.api.data.souls.SoulNetwork; +import com.ghostipedia.cosmiccore.api.data.souls.SoulNetworkSavedData; +import com.ghostipedia.cosmiccore.api.recipe.ingredient.SoulStack; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +import java.util.List; + +public class SoulNetworkReaderItem extends Item { + + public SoulNetworkReaderItem(Properties properties) { + super(properties); + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + if (!level.isClientSide() && player instanceof ServerPlayer serverPlayer) { + SoulNetwork soulNetwork = SoulNetworkSavedData.getSoulNetwork((ServerLevel) level, player.getUUID()); + player.sendSystemMessage(displaySoulNetworkInfo(soulNetwork)); + } + return InteractionResultHolder.success(player.getItemInHand(hand)); + } + + public static Component displaySoulNetworkInfo(SoulNetwork network) { + var message = Component.empty(); + List contents = network.getContents(); + if (contents.isEmpty()) { + message.append(Component.translatable("gui.cosmiccore.soul.empty_network").withStyle(ChatFormatting.GRAY)); + } else { + message.append( + Component.translatable("gui.cosmiccore.soul.network_contents").withStyle(ChatFormatting.GOLD)) + .append("\n"); + for (SoulStack stack : contents) message.append("\n").append(stack.type().toComponent(stack.amount())); + } + return message; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/ChestSanguineWarptechSuite.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/ChestSanguineWarptechSuite.java new file mode 100644 index 000000000..7ccb5b5d5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/ChestSanguineWarptechSuite.java @@ -0,0 +1,296 @@ +package com.ghostipedia.cosmiccore.common.item.armor; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.capability.souls.SoulType; +import com.ghostipedia.cosmiccore.api.data.souls.SoulNetwork; +import com.ghostipedia.cosmiccore.api.data.souls.SoulNetworkSavedData; +import com.ghostipedia.cosmiccore.api.recipe.ingredient.SoulStack; +import com.ghostipedia.cosmiccore.utils.ItemData; + +import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; +import com.gregtechceu.gtceu.common.item.armor.IJetpack; +import com.gregtechceu.gtceu.common.item.armor.QuarkTechSuite; +import com.gregtechceu.gtceu.api.capability.IElectricItem; +import com.gregtechceu.gtceu.api.item.armor.ArmorUtils; +import com.gregtechceu.gtceu.core.IFireImmuneEntity; +import com.gregtechceu.gtceu.utils.GTUtil; +import com.gregtechceu.gtceu.utils.input.SyncedKeyMappings; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.player.Input; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.core.NonNullList; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Abilities; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import com.mojang.datafixers.util.Pair; +import it.unimi.dsi.fastutil.ints.IntList; + +import java.util.List; + +public class ChestSanguineWarptechSuite extends QuarkTechSuite implements IJetpack { + + public static final String SANGUINE_SHIELD_NBT_KEY = CosmicCore.MOD_ID + ":sanguine_shield"; + public static final int SANGUINE_SHIELD_DRAIN_PER_SECOND = 10; + public static final int SECONDS_PER_UPDATE = 1; + // A replacement for checking the current world time, to get around the gamerule that stops it + private long timer = 0L; + private List, IntList>> inventoryIndexMap; + + public ChestSanguineWarptechSuite(int energyPerUse, long capacity, int tier) { + super(ArmorItem.Type.CHESTPLATE, energyPerUse, capacity, tier); + } + + @OnlyIn(Dist.CLIENT) + @Override + public void drawHUD(ItemStack item, GuiGraphics guiGraphics) { + addCapacityHUD(item, this.HUD); + addSanguineHUD(item, this.HUD); + this.HUD.draw(guiGraphics); + this.HUD.reset(); + } + + @OnlyIn(Dist.CLIENT) + public boolean isNotMoving() { + LocalPlayer player = Minecraft.getInstance().player; + Input input = player.input; + return input.forwardImpulse == 0 && input.leftImpulse == 0 && !input.jumping && !input.shiftKeyDown; + } + + @OnlyIn(Dist.CLIENT) + protected void addSanguineHUD(ItemStack stack, ArmorUtils.ModularHUD hud) { + if (stack == null) return; + CompoundTag tag = ItemData.readTag(stack); + if (tag.contains("currentLP")) { + long currentLP = tag.getLong("currentLP"); + hud.newString(Component.translatable("cosmiccore.armor.sanguinewarptech.hud.LP", currentLP)); + } + if (tag.contains("isSanguineShieldOn")) { + boolean isSanguineShieldOn = tag.getBoolean("isSanguineShieldOn"); + hud.newString(Component.translatable("cosmiccore.armor.sanguinewarptech.hud.shieldstate", + (isSanguineShieldOn ? "§aON" : "§cOFF"))); + } + if (tag.contains("enabled")) { + Component status = (tag.getBoolean("enabled") ? + Component.translatable("metaarmor.hud.status.enabled") : + Component.translatable("metaarmor.hud.status.disabled")); + Component result = Component.translatable("metaarmor.hud.engine_enabled", status); + this.HUD.newString(result); + } + } + + // Mostly copied from AdvancedQuarkTechSpaceSuite.java + @Override + public void onArmorTick(Level world, Player player, ItemStack item) { + IElectricItem cont = GTCapabilityHelper.getElectricItem(item); + if (cont == null) { + return; + } + + CompoundTag data = ItemData.readTag(item); + if (!data.contains("toggleTimer")) { + data.putByte("toggleTimer", (byte) 0); + data.putBoolean("canShare", false); + data.putBoolean("isSanguineShieldOn", false); + data.putBoolean("enabled", true); + data.putBoolean("inertia", true); + data.putByte("toggleTimer", (byte) 0); + data.putLong("currentLP", 0); + } + + byte toggleTimer = data.getByte("toggleTimer"); + boolean canShare = data.getBoolean("canShare"); + boolean jetpackEnabled = data.getBoolean("enabled"); + boolean inertiaDampen = data.getBoolean("inertia"); + + // Handle toggle keypresses + String messageKey = null; + if (toggleTimer == 0) { + if (SyncedKeyMappings.ARMOR_CHARGING.isKeyDown(player)) { + canShare = !canShare; + if (canShare && cont.getCharge() == 0) { // Only allow for charging to be enabled if charge is nonzero + messageKey = "metaarmor.qts.share.error"; + canShare = false; + } else { + messageKey = "metaarmor.qts.share." + (canShare ? "enable" : "disable"); + } + data.putBoolean("canShare", canShare); + } else if (SyncedKeyMappings.JETPACK_ENABLE.isKeyDown(player)) { + jetpackEnabled = !jetpackEnabled; + messageKey = "metaarmor.jetpack.flight." + (jetpackEnabled ? "enable" : "disable"); + data.putBoolean("enabled", jetpackEnabled); + } + + if (messageKey != null) { + toggleTimer = 5; + if (!world.isClientSide) player.displayClientMessage(Component.translatable(messageKey), true); + } + } + + if (toggleTimer > 0) toggleTimer--; + data.putByte("toggleTimer", toggleTimer); + + if (type == ArmorItem.Type.CHESTPLATE && !player.fireImmune()) { + ((IFireImmuneEntity) player).gtceu$setFireImmune(true); + if (player.isOnFire()) player.extinguishFire(); + } + + // Smart Flight + Abilities abilities = player.getAbilities(); + float walkSpeed = abilities.getWalkingSpeed(); + + // Boosting Behavior (CTRL Go Nyoom) + if (GTUtil.isCtrlDown()) { + player.getAbilities().setFlyingSpeed(walkSpeed + 0.2f); + } else { + player.getAbilities().setFlyingSpeed(walkSpeed); + } + + // Inertia Dampening Test + Vec3 playerDelta = player.getDeltaMovement(); + if (world.isClientSide() && isNotMoving() && player.getAbilities().flying) { + player.getAbilities().setFlyingSpeed(0); + player.setDeltaMovement(playerDelta.multiply(0.4f, 0.4f, 0.4f)); + } else { + player.getAbilities().setFlyingSpeed(walkSpeed); + } + + if (!abilities.mayfly) { + abilities.mayfly = true; + if (!world.isClientSide && player instanceof ServerPlayer serverPlayer) { + serverPlayer.connection.send(new ClientboundPlayerAbilitiesPacket(abilities)); + } + } + // Handle the Transition between jetplate mode and creative flight mode, only allow jetplate when non-create + // flight is called. + if (!player.getAbilities().flying) { + performFlying(player, jetpackEnabled, false, item); + } + + // Sanguine shield, update every second + if (!world.isClientSide && timer % (20 * SECONDS_PER_UPDATE) == 0) { + SoulNetwork network = SoulNetworkSavedData.getSoulNetwork( + (ServerLevel) world, player.getUUID()); + int drainAmount = SANGUINE_SHIELD_DRAIN_PER_SECOND * SECONDS_PER_UPDATE; + SoulStack available = network.syphon(new SoulStack(SoulType.Raw, drainAmount), true); + boolean isSanguineShieldOn; + if (available.amount() < drainAmount) { + isSanguineShieldOn = false; + } else { + network.syphon(new SoulStack(SoulType.Raw, drainAmount), false); + isSanguineShieldOn = true; + } + + int currentSoul = network.getContents().stream() + .filter(s -> s.type() == SoulType.Raw) + .mapToInt(SoulStack::amount) + .findFirst().orElse(0); + data.putBoolean("isSanguineShieldOn", isSanguineShieldOn); + data.putLong("currentLP", currentSoul); + player.getPersistentData().putBoolean(SANGUINE_SHIELD_NBT_KEY, isSanguineShieldOn); + } + + // Charging mechanics + if (canShare && !world.isClientSide) { + // Check for new things to charge every 5 seconds + if (timer % 100 == 0) + inventoryIndexMap = ArmorUtils.getChargeableItem(player, cont.getTier()); + + if (inventoryIndexMap != null && !inventoryIndexMap.isEmpty()) { + // Charge all inventory slots + for (int i = 0; i < inventoryIndexMap.size(); i++) { + Pair, IntList> inventoryMap = inventoryIndexMap.get(i); + var inventoryIterator = inventoryMap.getSecond().iterator(); + while (inventoryIterator.hasNext()) { + int slot = inventoryIterator.nextInt(); + IElectricItem chargable = GTCapabilityHelper.getElectricItem(inventoryMap.getFirst().get(slot)); + + // Safety check the null, it should not actually happen. Also don't try and charge itself + if (chargable == null || chargable == cont) { + inventoryIterator.remove(); + continue; + } + + long attemptedChargeAmount = chargable.getTransferLimit() * 10; + + // Accounts for tick differences when charging items + if (chargable.getCharge() < chargable.getMaxCharge() && cont.canUse(attemptedChargeAmount) && + timer % 10 == 0) { + long delta = chargable.charge(attemptedChargeAmount, cont.getTier(), true, false); + if (delta > 0) { + cont.discharge(delta, cont.getTier(), true, false, false); + } + if (chargable.getCharge() == chargable.getMaxCharge()) { + inventoryIterator.remove(); + } + player.inventoryMenu.sendAllDataToRemote(); + } + } + + if (inventoryMap.getSecond().isEmpty()) + inventoryIndexMap.remove(inventoryMap); + } + } + } + + timer++; + if (timer == Long.MAX_VALUE) + timer = 0; + + ItemData.writeTag(item, data); + } + + @Override + public int damageArmor(LivingEntity entity, ItemStack itemStack, int damage, + EquipmentSlot equipmentSlot) { + IElectricItem item = GTCapabilityHelper.getElectricItem(itemStack); + if (item != null) { + item.discharge(energyPerUse / 100L * damage, item.getTier(), true, false, false); + } + return 1; + } + + @Override + public ResourceLocation getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, + ArmorMaterial.Layer layer) { + return CosmicCore.id("textures/armor/sanguine_suit_1.png"); + } + + @Override + public boolean canUseEnergy(ItemStack stack, int amount) { + IElectricItem container = GTCapabilityHelper.getElectricItem(stack); + if (container == null) return false; + return container.canUse(amount); + } + + @Override + public void drainEnergy(ItemStack stack, int amount) { + IElectricItem container = GTCapabilityHelper.getElectricItem(stack); + if (container == null) return; + container.discharge(amount, tier, true, false, false); + } + + @Override + public boolean hasEnergy(ItemStack stack) { + IElectricItem container = GTCapabilityHelper.getElectricItem(stack); + if (container == null) return false; + return container.getCharge() > 0; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/HelmetSanguineWarptechSuite.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/HelmetSanguineWarptechSuite.java new file mode 100644 index 000000000..1332bfd91 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/HelmetSanguineWarptechSuite.java @@ -0,0 +1,39 @@ +package com.ghostipedia.cosmiccore.common.item.armor; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import com.gregtechceu.gtceu.common.item.armor.QuarkTechSuite; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +public class HelmetSanguineWarptechSuite extends QuarkTechSuite { + + public HelmetSanguineWarptechSuite(ArmorItem.Type slot, int energyPerUse, long capacity, int tier) { + super(slot, energyPerUse, capacity, tier); + } + + @Override + public void onArmorTick(Level world, Player player, ItemStack itemStack) { + super.onArmorTick(world, player, itemStack); + if (world.isClientSide) return; + int foodLevel = player.getFoodData().getFoodLevel(); + if (foodLevel < 20) { + player.addEffect(new MobEffectInstance(MobEffects.SATURATION, 1, 1, false, false)); + } + } + + @Override + public ResourceLocation getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, + ArmorMaterial.Layer layer) { + return CosmicCore.id("textures/armor/sanguine_suit_1.png"); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/SanguineWarptechSuite.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/SanguineWarptechSuite.java new file mode 100644 index 000000000..73a192d7a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/SanguineWarptechSuite.java @@ -0,0 +1,27 @@ +package com.ghostipedia.cosmiccore.common.item.armor; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import com.gregtechceu.gtceu.common.item.armor.QuarkTechSuite; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.ItemStack; + +public class SanguineWarptechSuite extends QuarkTechSuite { + + public SanguineWarptechSuite(ArmorItem.Type slot, int energyPerUse, long capacity, int tier) { + super(slot, energyPerUse, capacity, tier); + } + + @Override + public ResourceLocation getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, + ArmorMaterial.Layer layer) { + return slot != EquipmentSlot.LEGS ? + CosmicCore.id("textures/armor/sanguine_suit_1.png") : + CosmicCore.id("textures/armor/sanguine_suit_2.png"); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/boots/CosmicBootsArmorLogic.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/boots/CosmicBootsArmorLogic.java new file mode 100644 index 000000000..3ee959b99 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/boots/CosmicBootsArmorLogic.java @@ -0,0 +1,314 @@ +package com.ghostipedia.cosmiccore.common.item.armor.boots; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; +import com.gregtechceu.gtceu.api.capability.IElectricItem; +import com.gregtechceu.gtceu.api.item.armor.ArmorLogicSuite; + +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ArmorItem; +import net.minecraft.world.item.ArmorMaterial; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.neoforged.neoforge.common.NeoForgeMod; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class CosmicBootsArmorLogic extends ArmorLogicSuite implements ICosmicBoots { + + protected static final ResourceLocation STEP_HEIGHT_ID = CosmicCore.id("cosmic_boots_step_height"); + protected static final ResourceLocation SWIM_SPEED_ID = CosmicCore.id("cosmic_boots_swim_speed"); + + protected final double maxSpeed; + protected final double groundAcceleration; + protected final double groundDeceleration; + protected final double airControl; + protected final double jumpPower; + protected final boolean fallNegation; + protected final String texturePath; + + private static final double SPRINT_BOOST = 2.5; + + public CosmicBootsArmorLogic(int energyPerUse, long maxCapacity, int tier, + double maxSpeed, double groundAcceleration, + double groundDeceleration, double airControl, + double jumpPower, boolean fallNegation, + String texturePath) { + super(energyPerUse, maxCapacity, tier, ArmorItem.Type.BOOTS); + this.maxSpeed = maxSpeed; + this.groundAcceleration = groundAcceleration; + this.groundDeceleration = groundDeceleration; + this.airControl = airControl; + this.jumpPower = jumpPower; + this.fallNegation = fallNegation; + this.texturePath = texturePath; + } + + @Override + public double getMaxSpeed() { + return maxSpeed; + } + + @Override + public double getGroundAcceleration() { + return groundAcceleration; + } + + @Override + public double getGroundDeceleration() { + return groundDeceleration; + } + + @Override + public double getAirControl() { + return airControl; + } + + @Override + public double getJumpPower() { + return jumpPower; + } + + @Override + public boolean negatesFallDamage() { + return fallNegation; + } + + @Override + public boolean hasStepAssist() { + return true; + } + + @Override + public void onArmorTick(Level level, Player player, @NotNull ItemStack boots) { + IElectricItem electric = GTCapabilityHelper.getElectricItem(boots); + if (electric == null) return; + + boolean hasEnergy = electric.getCharge() > 0; + + if (hasEnergy) { + boolean canApplyMovement = !player.getAbilities().flying && !player.isFallFlying(); + + if (player.isInWater() || player.isInLava()) { + applySwimSpeed(player, boots); + } else { + removeSwimSpeed(player); + if (canApplyMovement) { + applyMovementBonus(player, boots); + } + } + + if (ICosmicBoots.isStepAssistEnabled(boots)) { + applyStepHeight(player); + } else { + removeStepHeight(player); + } + + if (!level.isClientSide()) { + Vec3 motion = player.getDeltaMovement(); + double horizontalSpeed = Math.sqrt(motion.x * motion.x + motion.z * motion.z); + if (horizontalSpeed > 0.4) { + spawnCloudTrail(level, player, horizontalSpeed); + } + if (horizontalSpeed > 0.2) { + electric.discharge(energyPerUse / 100L, tier, true, false, false); + } + } + } else { + removeStepHeight(player); + removeSwimSpeed(player); + } + } + + protected void applyStepHeight(Player player) { + AttributeInstance attribute = player.getAttribute(Attributes.STEP_HEIGHT); + if (attribute != null && attribute.getModifier(STEP_HEIGHT_ID) == null) { + attribute.addPermanentModifier(new AttributeModifier( + STEP_HEIGHT_ID, + 1.0, + AttributeModifier.Operation.ADD_VALUE)); + } + } + + protected void removeStepHeight(Player player) { + AttributeInstance attribute = player.getAttribute(Attributes.STEP_HEIGHT); + if (attribute != null) { + attribute.removeModifier(STEP_HEIGHT_ID); + } + } + + protected void applySwimSpeed(Player player, ItemStack boots) { + double speedMod = ICosmicBoots.getSpeedModifier(boots); + if (speedMod <= 0) { + removeSwimSpeed(player); + return; + } + + double swimBoost = groundAcceleration * speedMod * 0.5; + + AttributeInstance attribute = player.getAttribute(NeoForgeMod.SWIM_SPEED); + if (attribute != null) { + attribute.removeModifier(SWIM_SPEED_ID); + attribute.addTransientModifier(new AttributeModifier( + SWIM_SPEED_ID, + swimBoost, + AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); + } + } + + protected void removeSwimSpeed(Player player) { + AttributeInstance attribute = player.getAttribute(NeoForgeMod.SWIM_SPEED); + if (attribute != null) { + attribute.removeModifier(SWIM_SPEED_ID); + } + } + + protected void applyMovementBonus(Player player, ItemStack boots) { + double speedMod = ICosmicBoots.getSpeedModifier(boots); + if (speedMod <= 0) { + return; + } + + Vec3 motion = player.getDeltaMovement(); + + float forward = player.zza; + float strafe = player.xxa; + boolean hasInput = forward != 0 || strafe != 0; + boolean isSprinting = player.isSprinting(); + + double effectiveMaxSpeed = getEffectiveMaxSpeed(boots); + double effectiveAccel = groundAcceleration * speedMod; + + if (isSprinting) { + effectiveAccel *= SPRINT_BOOST; + effectiveMaxSpeed *= SPRINT_BOOST; + } + + double newX = motion.x; + double newZ = motion.z; + + if (hasInput) { + float yaw = player.getYRot() * ((float) Math.PI / 180F); + double sinYaw = Mth.sin(yaw); + double cosYaw = Mth.cos(yaw); + + double wishX = (strafe * cosYaw - forward * sinYaw); + double wishZ = (forward * cosYaw + strafe * sinYaw); + + double wishLen = Math.sqrt(wishX * wishX + wishZ * wishZ); + if (wishLen > 0.01) { + wishX /= wishLen; + wishZ /= wishLen; + } + + double boostAmount; + if (player.onGround()) { + boostAmount = effectiveAccel * 0.08; + } else { + boostAmount = airControl * effectiveAccel * 0.07; + } + + newX += wishX * boostAmount; + newZ += wishZ * boostAmount; + + } else if (ICosmicBoots.isInertiaCancelEnabled(boots) && player.onGround()) { + double decelAmount = groundDeceleration; + + if (Math.abs(newX) > 0.001) { + newX *= (1.0 - decelAmount); + } else { + newX = 0; + } + if (Math.abs(newZ) > 0.001) { + newZ *= (1.0 - decelAmount); + } else { + newZ = 0; + } + } + + double newSpeed = Math.sqrt(newX * newX + newZ * newZ); + if (newSpeed > effectiveMaxSpeed) { + double scale = effectiveMaxSpeed / newSpeed; + newX *= scale; + newZ *= scale; + } + + player.setDeltaMovement(newX, motion.y, newZ); + } + + protected void spawnCloudTrail(Level level, Player player, double speed) { + if (!(level instanceof ServerLevel serverLevel)) return; + + Vec3 pos = player.position(); + Vec3 motion = player.getDeltaMovement(); + + int particleCount = (int) Math.min(4, speed * 3); + + double offsetX = -motion.x * 1.5; + double offsetZ = -motion.z * 1.5; + + serverLevel.sendParticles( + ParticleTypes.CLOUD, + pos.x + offsetX + (level.random.nextDouble() - 0.5) * 0.5, + pos.y + 0.15, + pos.z + offsetZ + (level.random.nextDouble() - 0.5) * 0.5, + particleCount, + 0.12, 0.06, 0.12, + 0.02); + } + + @Override + public int damageArmor(LivingEntity entity, ItemStack boots, int damage, + EquipmentSlot slot) { + IElectricItem electric = GTCapabilityHelper.getElectricItem(boots); + if (electric != null) { + electric.discharge((long) energyPerUse * damage, tier, true, false, false); + } + return 0; + } + + @Override + public ResourceLocation getArmorTexture(ItemStack stack, Entity entity, EquipmentSlot slot, + ArmorMaterial.Layer layer) { + return CosmicCore.id(texturePath); + } + + @Override + public void addInfo(ItemStack stack, List lines) { + super.addInfo(stack, lines); + + double speedMod = ICosmicBoots.getSpeedModifier(stack); + double jumpMod = ICosmicBoots.getJumpModifier(stack); + boolean stepEnabled = ICosmicBoots.isStepAssistEnabled(stack); + boolean inertiaEnabled = ICosmicBoots.isInertiaCancelEnabled(stack); + + lines.add(Component.translatable("cosmiccore.boots.speed_modifier", + String.format("%.0f%%", speedMod * 100))); + lines.add(Component.translatable("cosmiccore.boots.jump_modifier", + String.format("%.0f%%", jumpMod * 100))); + + lines.add(Component.translatable("cosmiccore.boots.step_assist", + stepEnabled ? "\u00a7aON" : "\u00a7cOFF")); + + lines.add(Component.translatable("cosmiccore.boots.inertia_cancel", + inertiaEnabled ? "\u00a7aON" : "\u00a7cOFF")); + + lines.add(Component.translatable("cosmiccore.boots.max_speed", + String.format("%.1f", getEffectiveMaxSpeed(stack) * 20) + " b/s")); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/boots/ICosmicBoots.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/boots/ICosmicBoots.java new file mode 100644 index 000000000..2aba9a5a6 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/armor/boots/ICosmicBoots.java @@ -0,0 +1,100 @@ +package com.ghostipedia.cosmiccore.common.item.armor.boots; + +import com.ghostipedia.cosmiccore.utils.ItemData; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; + +public interface ICosmicBoots { + + String TAG_SPEED_MODIFIER = "cosmicboots:speed_mod"; + String TAG_JUMP_MODIFIER = "cosmicboots:jump_mod"; + String TAG_STEP_ASSIST = "cosmicboots:step_assist"; + String TAG_INERTIA_CANCEL = "cosmicboots:inertia_cancel"; + + double MODIFIER_INCREMENT = 0.25; + + double getMaxSpeed(); + + double getGroundAcceleration(); + + double getGroundDeceleration(); + + double getAirControl(); + + double getJumpPower(); + + default boolean negatesFallDamage() { + return true; + } + + default boolean hasStepAssist() { + return true; + } + + static double getSpeedModifier(ItemStack stack) { + if (stack.isEmpty()) return 1.0; + CompoundTag tag = ItemData.readTag(stack); + if (tag == null || !tag.contains(TAG_SPEED_MODIFIER)) return 1.0; + return tag.getDouble(TAG_SPEED_MODIFIER); + } + + static double getJumpModifier(ItemStack stack) { + if (stack.isEmpty()) return 1.0; + CompoundTag tag = ItemData.readTag(stack); + if (tag == null || !tag.contains(TAG_JUMP_MODIFIER)) return 1.0; + return tag.getDouble(TAG_JUMP_MODIFIER); + } + + static boolean isStepAssistEnabled(ItemStack stack) { + if (stack.isEmpty()) return true; + CompoundTag tag = ItemData.readTag(stack); + if (tag == null || !tag.contains(TAG_STEP_ASSIST)) return true; + return tag.getBoolean(TAG_STEP_ASSIST); + } + + static boolean isInertiaCancelEnabled(ItemStack stack) { + if (stack.isEmpty()) return true; + CompoundTag tag = ItemData.readTag(stack); + if (tag == null || !tag.contains(TAG_INERTIA_CANCEL)) return true; + return tag.getBoolean(TAG_INERTIA_CANCEL); + } + + static double changeSpeedModifier(ItemStack stack, double delta) { + double current = getSpeedModifier(stack); + double newValue = Math.max(0.0, Math.min(1.0, current + delta)); + newValue = Math.round(newValue / MODIFIER_INCREMENT) * MODIFIER_INCREMENT; + double finalValue = newValue; + ItemData.mutateTag(stack, tag -> tag.putDouble(TAG_SPEED_MODIFIER, finalValue)); + return newValue; + } + + static double changeJumpModifier(ItemStack stack, double delta) { + double current = getJumpModifier(stack); + double newValue = Math.max(0.0, Math.min(1.0, current + delta)); + newValue = Math.round(newValue / MODIFIER_INCREMENT) * MODIFIER_INCREMENT; + double finalValue = newValue; + ItemData.mutateTag(stack, tag -> tag.putDouble(TAG_JUMP_MODIFIER, finalValue)); + return newValue; + } + + static boolean toggleStepAssist(ItemStack stack) { + boolean current = isStepAssistEnabled(stack); + ItemData.mutateTag(stack, tag -> tag.putBoolean(TAG_STEP_ASSIST, !current)); + return !current; + } + + static boolean toggleInertiaCancel(ItemStack stack) { + boolean current = isInertiaCancelEnabled(stack); + ItemData.mutateTag(stack, tag -> tag.putBoolean(TAG_INERTIA_CANCEL, !current)); + return !current; + } + + default double getEffectiveMaxSpeed(ItemStack stack) { + return getMaxSpeed() * getSpeedModifier(stack); + } + + default double getEffectiveJumpPower(ItemStack stack) { + return getJumpPower() * getJumpModifier(stack); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/EffectApplicationBehavior.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/EffectApplicationBehavior.java new file mode 100644 index 000000000..5c8790e76 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/EffectApplicationBehavior.java @@ -0,0 +1,43 @@ +package com.ghostipedia.cosmiccore.common.item.behavior; + +import com.gregtechceu.gtceu.api.item.component.IItemComponent; + +import net.minecraft.world.effect.MobEffectInstance; + +import com.mojang.datafixers.util.Pair; +import lombok.NoArgsConstructor; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +@NoArgsConstructor +public class EffectApplicationBehavior implements IItemComponent/* , IItemLifeCycle */ { + + private final List, Float>> effects = new ArrayList<>(); + + public EffectApplicationBehavior addEffect(Supplier effect, float chance) { + effects.add(Pair.of(effect, chance)); + return this; + } + + public List> getEffects() { + return this.effects.stream() + .map((pair) -> Pair.of(pair.getFirst() != null ? pair.getFirst().get() : null, pair.getSecond())) + .collect(Collectors.toList()); + } + + /* + * @Override + * public void inventoryTick(ItemStack stack, Level level, Entity entity, int slotId, boolean isSelected) { + * if (entity instanceof LivingEntity living) { + * for (var effect : getEffects()) { + * if (level.getRandom().nextFloat() < effect.getSecond()) { + * living.addEffect(new MobEffectInstance(effect.getFirst())); + * } + * } + * } + * } + */ +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/ExtendedDyeColor.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/ExtendedDyeColor.java new file mode 100644 index 000000000..a8b55c1ff --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/ExtendedDyeColor.java @@ -0,0 +1,77 @@ +package com.ghostipedia.cosmiccore.common.item.behavior; + +import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; + +import net.minecraft.world.item.DyeColor; + +import lombok.Getter; + +/** + * + * This enum exists to add solvent to colors + */ +public enum ExtendedDyeColor { + + WHITE(DyeColor.WHITE, "white_dye_spray_can.png"), + ORANGE(DyeColor.ORANGE, "orange_dye_spray_can.png"), + MAGENTA(DyeColor.MAGENTA, "magenta_dye_spray_can.png"), + LIGHT_BLUE(DyeColor.LIGHT_BLUE, "light_blue_dye_spray_can.png"), + YELLOW(DyeColor.YELLOW, "yellow_dye_spray_can.png"), + LIME(DyeColor.LIME, "lime_dye_spray_can.png"), + PINK(DyeColor.PINK, "pink_dye_spray_can.png"), + GRAY(DyeColor.GRAY, "gray_dye_spray_can.png"), + LIGHT_GRAY(DyeColor.LIGHT_GRAY, "light_gray_dye_spray_can.png"), + CYAN(DyeColor.CYAN, "cyan_dye_spray_can.png"), + PURPLE(DyeColor.PURPLE, "purple_dye_spray_can.png"), + BLUE(DyeColor.BLUE, "blue_dye_spray_can.png"), + BROWN(DyeColor.BROWN, "brown_dye_spray_can.png"), + GREEN(DyeColor.GREEN, "green_dye_spray_can.png"), + RED(DyeColor.RED, "red_dye_spray_can.png"), + BLACK(DyeColor.BLACK, "black_dye_spray_can.png"), + SOLVENT(null, "white_dye_spray_can.png"); + + private final DyeColor dyeColor; + @Getter + public final ResourceTexture texture; + + ExtendedDyeColor(DyeColor dyeColor, String resloc) { + this.dyeColor = dyeColor; + this.texture = new ResourceTexture("cosmiccore:textures/item/" + resloc); + } + + public static ExtendedDyeColor getColorFromDyeId(int dyeID) { + return fromDyeColor(DyeColor.byId(dyeID)); + } + + public DyeColor getColor() { + return dyeColor; + } + + public boolean isSolvent() { + return this == SOLVENT; + } + + public int getTextColor() { + return dyeColor != null ? dyeColor.getTextColor() : -1; + } + + public String getSerializedName() { + return this.name(); + } + + public static ExtendedDyeColor fromDyeColor(DyeColor dyeColor) { + if (dyeColor == null) return SOLVENT; + + for (ExtendedDyeColor colors : values()) { + if (colors.dyeColor == dyeColor) { + return colors; + } + } + return SOLVENT; + } + + // Return the DyeColor ID or -1 if there's no dye color + public int getColorId() { + return dyeColor != null ? dyeColor.getId() : -1; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/GravityCoreBehavior.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/GravityCoreBehavior.java new file mode 100644 index 000000000..00ddf7caf --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/GravityCoreBehavior.java @@ -0,0 +1,42 @@ +package com.ghostipedia.cosmiccore.common.item.behavior; + +import com.ghostipedia.cosmiccore.common.data.CosmicItems; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.wrapper.EmptyItemHandler; + +import top.theillusivec4.curios.api.CuriosApi; +import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; + +public class GravityCoreBehavior { + + public static float clampGravity(Entity entity, float gravity) { + if (entity instanceof Player player) { + // Check the Inventory and Curio Slots for the GravCore + var playerInventory = player.getInventory(); + IItemHandler curiosInventory = CuriosApi.getCuriosInventory(player) + .map(ICuriosItemHandler::getEquippedCurios) + .orElse(EmptyItemHandler.INSTANCE); + for (int i = 0; i < playerInventory.getContainerSize(); i++) { + var item = playerInventory.getItem(i); + if (item.is(CosmicItems.PORTABLE_GRAVITY_CORE.asItem())) { + if (gravity != 1.0F) { + return 1.0F; + } + } + } + for (int i = 0; i < curiosInventory.getSlots(); i++) { + var curio = curiosInventory.getStackInSlot(i); + if (curio.is(CosmicItems.PORTABLE_GRAVITY_CORE.asItem())) { + if (gravity != 1.0F) { + return 1.0F; + } + } + } + } + + return gravity; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/InfiniteSprayCanBehavior.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/InfiniteSprayCanBehavior.java new file mode 100644 index 000000000..f7d53ea7e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/InfiniteSprayCanBehavior.java @@ -0,0 +1,543 @@ +package com.ghostipedia.cosmiccore.common.item.behavior; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.IPaintable; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; +import com.gregtechceu.gtceu.api.item.component.IAddInformation; +import com.gregtechceu.gtceu.api.item.component.IInteractionItem; +import com.gregtechceu.gtceu.common.data.GTSoundEntries; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.BreadthFirstBlockSearch; + +import com.ghostipedia.cosmiccore.utils.ItemData; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.network.chat.TextColor; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.StainedGlassBlock; +import net.minecraft.world.level.block.StainedGlassPaneBlock; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.ShulkerBoxBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.common.util.TriPredicate; + +import appeng.api.util.AECableType; +import appeng.api.util.AEColor; +import appeng.blockentity.networking.CableBusBlockEntity; +import com.google.common.collect.ImmutableMap; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.BiPredicate; + +public class InfiniteSprayCanBehavior implements IInteractionItem, IAddInformation { + + public ExtendedDyeColor color; + + private Boolean isLocked = false; + + public boolean isSwinging = false; + + public static final String ColorTag = "color"; + + public InfiniteSprayCanBehavior(int color) { + ExtendedDyeColor[] colors = ExtendedDyeColor.values(); + this.color = color >= colors.length || color < 0 ? null : colors[color]; + } + + public ExtendedDyeColor getColor() { + return color; + } + + public void setColor(ExtendedDyeColor color) { + this.color = color; + } + + public Boolean getIsLocked() { + return isLocked; + } + + public void setIsLocked(Boolean isLocked) { + this.isLocked = isLocked; + } + + public void sendColorToTag(Player Player, ExtendedDyeColor color) { + var stack = Player.getMainHandItem(); + ItemData.mutateTag(stack, tag -> tag.putInt(ColorTag, color.getColorId())); + PrintColorToActionBar(Player, color); + } + + @Override + public InteractionResultHolder use(ItemStack item, Level level, Player player, InteractionHand usedHand) { + if (level.isClientSide && player.isShiftKeyDown()) { + SprayCanClientHandler.openScreen(player, this); + return InteractionResultHolder.success(player.getItemInHand(usedHand)); + } + return InteractionResultHolder.pass(player.getItemInHand(usedHand)); + } + + @Override + public InteractionResult onItemUseFirst(ItemStack itemStack, @NotNull UseOnContext context) { + var player = context.getPlayer(); + var level = context.getLevel(); + var pos = context.getClickedPos(); + int maxBlocksToRecolor = Math.max(1, + player.isCrouching() ? ConfigHolder.INSTANCE.tools.sprayCanChainLength : 1); + var first = level.getBlockEntity(pos); + + if (first == null || !handleSpecialBlockEntities(first, maxBlocksToRecolor, context)) { + handleBlocks(pos, maxBlocksToRecolor, context); + } + GTSoundEntries.SPRAY_CAN_TOOL.play(level, null, player.position(), 1.0f, 1.0f); + return InteractionResult.SUCCESS; + } + + @Override + public boolean onEntitySwing(ItemStack stack, LivingEntity entity, InteractionHand hand) { + if (!(entity instanceof Player player) || isSwinging) { + return true; + } + if (!this.isLocked) { + int totalColors = ExtendedDyeColor.values().length; + int nextColor = player.isCrouching() ? (color.ordinal() - 1 + totalColors) % totalColors : + (color.ordinal() + 1) % totalColors; + + this.color = ExtendedDyeColor.values()[nextColor]; + sendColorToTag(player, this.color); + if (player.level().isClientSide) { + SprayCanClientHandler.playShakeSound(); + } + } else { + player.displayClientMessage(Component.translatable("cosmiccore.item.spraycan.locked") + .withStyle(style -> style + .withColor(ChatFormatting.RED) + .withBold(true)), + true); + } + isSwinging = true; + return true; + } + + public void PrintColorToActionBar(Player player, ExtendedDyeColor color) { + String colorName = color.name().replace('_', ' '); + MutableComponent colorComponent = Component.literal(colorName) + .setStyle( + color == ExtendedDyeColor.SOLVENT ? Style.EMPTY.withColor(TextColor.fromRgb(0xFFFFFF)) : + Style.EMPTY.withColor(TextColor.fromRgb(color.getTextColor()))); + + player.displayClientMessage( + Component.translatable("cosmiccore.item.spraycan.actionbar.color", colorComponent), true); + } + + // vanilla + private static final ImmutableMap GLASS_MAP; + private static final ImmutableMap GLASS_PANE_MAP; + private static final Map TERRACOTTA_MAP; + private static final Map WOOL_MAP; + private static final Map CARPET_MAP; + private static final Map CONCRETE_MAP; + private static final Map CONCRETE_POWDER_MAP; + private static final Map SHULKER_BOX_MAP; + private static final Map CANDLE_MAP; + + private static ResourceLocation getId(String modid, DyeColor color, String postfix) { + return ResourceLocation.fromNamespaceAndPath(modid, "%s_%s".formatted(color.getSerializedName(), postfix)); + } + + static { + ImmutableMap.Builder glassBuilder = ImmutableMap.builder(); + ImmutableMap.Builder glassPaneBuilder = ImmutableMap.builder(); + ImmutableMap.Builder terracottaBuilder = ImmutableMap.builder(); + ImmutableMap.Builder woolBuilder = ImmutableMap.builder(); + ImmutableMap.Builder carpetBuilder = ImmutableMap.builder(); + ImmutableMap.Builder concreteBuilder = ImmutableMap.builder(); + ImmutableMap.Builder concretePowderBuilder = ImmutableMap.builder(); + ImmutableMap.Builder shulkerBoxBuilder = ImmutableMap.builder(); + ImmutableMap.Builder candleBuilder = ImmutableMap.builder(); + + for (DyeColor color : DyeColor.values()) { + // if there are > 16 colors (vanilla end) & tinted is loaded, use tinted blocks + if (color.ordinal() > 15 && GTCEu.isModLoaded(GTValues.MODID_TINTED)) { + glassBuilder.put(color, + BuiltInRegistries.BLOCK.get(getId(GTValues.MODID_TINTED, color, "stained_glass"))); + glassPaneBuilder.put(color, + BuiltInRegistries.BLOCK.get(getId(GTValues.MODID_TINTED, color, "stained_glass_pane"))); + terracottaBuilder.put(color, + BuiltInRegistries.BLOCK.get(getId(GTValues.MODID_TINTED, color, "terracotta"))); + woolBuilder.put(color, BuiltInRegistries.BLOCK.get(getId(GTValues.MODID_TINTED, color, "wool"))); + carpetBuilder.put(color, BuiltInRegistries.BLOCK.get(getId(GTValues.MODID_TINTED, color, "carpet"))); + concreteBuilder.put(color, + BuiltInRegistries.BLOCK.get(getId(GTValues.MODID_TINTED, color, "concrete"))); + concretePowderBuilder.put(color, + BuiltInRegistries.BLOCK.get(getId(GTValues.MODID_TINTED, color, "concrete_powder"))); + shulkerBoxBuilder.put(color, + BuiltInRegistries.BLOCK.get(getId(GTValues.MODID_TINTED, color, "shulker_box"))); + candleBuilder.put(color, BuiltInRegistries.BLOCK.get(getId(GTValues.MODID_TINTED, color, "candle"))); + } else { + glassBuilder.put(color, BuiltInRegistries.BLOCK.get(getId("minecraft", color, "stained_glass"))); + glassPaneBuilder.put(color, + BuiltInRegistries.BLOCK.get(getId("minecraft", color, "stained_glass_pane"))); + terracottaBuilder.put(color, BuiltInRegistries.BLOCK.get(getId("minecraft", color, "terracotta"))); + woolBuilder.put(color, BuiltInRegistries.BLOCK.get(getId("minecraft", color, "wool"))); + carpetBuilder.put(color, BuiltInRegistries.BLOCK.get(getId("minecraft", color, "carpet"))); + concreteBuilder.put(color, BuiltInRegistries.BLOCK.get(getId("minecraft", color, "concrete"))); + concretePowderBuilder.put(color, + BuiltInRegistries.BLOCK.get(getId("minecraft", color, "concrete_powder"))); + shulkerBoxBuilder.put(color, BuiltInRegistries.BLOCK.get(getId("minecraft", color, "shulker_box"))); + candleBuilder.put(color, BuiltInRegistries.BLOCK.get(getId("minecraft", color, "candle"))); + } + } + GLASS_MAP = glassBuilder.build(); + GLASS_PANE_MAP = glassPaneBuilder.build(); + TERRACOTTA_MAP = terracottaBuilder.build(); + WOOL_MAP = woolBuilder.build(); + CARPET_MAP = carpetBuilder.build(); + CONCRETE_MAP = concreteBuilder.build(); + CONCRETE_POWDER_MAP = concretePowderBuilder.build(); + SHULKER_BOX_MAP = shulkerBoxBuilder.build(); + CANDLE_MAP = candleBuilder.build(); + + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext world, List tooltip, TooltipFlag flag) { + tooltip.add(Component.translatable("cosmiccore.item.spraycan.tooltip.lclick")); + tooltip.add(Component.translatable("cosmiccore.item.spraycan.tooltip.lclick_sneak")); + tooltip.add(Component.translatable("cosmiccore.item.spraycan.tooltip.rclick")); + tooltip.add(Component.translatable("cosmiccore.item.spraycan.tooltip.rclick_sneak")); + tooltip.add(Component.translatable("cosmiccore.item.spraycan.tooltip.rclick_offhand")); + + if (this.isLocked) { + tooltip.add(Component.translatable("cosmiccore.item.spraycan.tooltip.locked") + .withStyle(ChatFormatting.RED, ChatFormatting.BOLD)); + } + + if (this.color != null) { + tooltip.add(Component + .translatable("cosmiccore.item.spraycan.tooltip.current_color", this.color.getSerializedName()) + .setStyle( + color == ExtendedDyeColor.SOLVENT ? Style.EMPTY.withColor(TextColor.fromRgb(0xFFFFFF)) // white + : Style.EMPTY.withColor(TextColor.fromRgb(color.getTextColor())))); + } else { + tooltip.add(Component.translatable("cosmiccore.item.spraycan.tooltip.solvent_mode") + .withStyle(ChatFormatting.DARK_AQUA)); + } + } + + private static boolean paintPaintable(IPaintable paintable, ExtendedDyeColor color) { + if (color.isSolvent()) { + if (paintable.getPaintingColor() == -1) { + return false; + } + paintable.setPaintingColor(-1); + } else if (paintable.getPaintingColor() != color.getTextColor()) { + paintable.setPaintingColor(color.getTextColor()); + } else { + return false; + } + return true; + } + + @SuppressWarnings("rawtypes") + public boolean handleSpecialBlockEntities(BlockEntity first, int limit, UseOnContext context) { + var player = context.getPlayer(); + if (player == null) { + return false; + } + if (GTCEu.Mods.isAE2Loaded() && AE2CallWrapper.isAE2Cable(first)) { + var collected = AE2CallWrapper.collect(first, limit); + var ae2Color = color == null ? AEColor.TRANSPARENT : AEColor.values()[color.ordinal()]; + for (var c : collected) { + if (c.getColor() == ae2Color) { + continue; + } + c.recolourBlock(null, ae2Color, player); + } + } else if (first instanceof PipeBlockEntity pipe) { + var collected = BreadthFirstBlockSearch.conditionalBlockEntitySearch(PipeBlockEntity.class, pipe, + gtPipePredicate, limit, limit * 6); + for (var c : collected) { + if (!paintPaintable(c, color)) { + continue; + } + } + } else if (first instanceof MetaMachine mmbe) { + var collected = BreadthFirstBlockSearch.conditionalBlockEntitySearch(MetaMachine.class, mmbe, + gtMetaMachinePredicate, limit, limit * 6); + for (var c : collected) { + if (!paintPaintable(c, color)) { + continue; + } + } + + } else if (first instanceof IPaintable) { + var collected = BreadthFirstBlockSearch.conditionalBlockEntitySearch(BlockEntity.class, first, + paintablePredicateWrapper, limit, limit * 6); + for (var c : collected) { + if (!paintPaintable((IPaintable) c, color)) { + continue; + } + } + } else if (first instanceof ShulkerBoxBlockEntity shulkerBoxBE) { + var level = first.getLevel(); + var pos = first.getBlockPos(); + var tag = shulkerBoxBE.saveWithFullMetadata(level.registryAccess()); + recolorBlockNoState(SHULKER_BOX_MAP, color.getColor(), level, pos, Blocks.SHULKER_BOX); + if (level.getBlockEntity(pos) instanceof ShulkerBoxBlockEntity newShulker) { + newShulker.loadWithComponents(tag, level.registryAccess()); + } + } else { + return false; + } + return true; + } + + public void handleBlocks(BlockPos start, int limit, UseOnContext context) { + final var level = context.getLevel(); + var player = context.getPlayer(); + if (player == null) { + return; + } + var stack = context.getItemInHand(); + var collected = BreadthFirstBlockSearch + .conditionalBlockPosSearch(start, + (parent, child) -> parent == null || + level.getBlockState(child).is(level.getBlockState(parent).getBlock()), + limit, limit * 6); + for (var pos : collected) { + if (!tryPaintBlock(level, pos)) { + break; + } + } + } + + private boolean tryPaintBlock(Level world, BlockPos pos) { + var blockState = world.getBlockState(pos); + var block = blockState.getBlock(); + if (color.isSolvent()) { + return tryStripBlockColor(world, pos, block); + } + return recolorBlockState(world, pos, color) || tryPaintSpecialBlock(world, pos, block); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private static boolean recolorBlockState(Level level, BlockPos pos, ExtendedDyeColor color) { + BlockState state = level.getBlockState(pos); + for (Property property : state.getProperties()) { + if (property.getValueClass() == DyeColor.class) { + state.setValue(property, color); + return true; + } + } + return false; + } + + private boolean tryPaintSpecialBlock(Level world, BlockPos pos, @NotNull Block block) { + if (block.defaultBlockState().is(Tags.Blocks.GLASS_BLOCKS)) { + if (recolorBlockNoState(GLASS_MAP, this.color.getColor(), world, pos, Blocks.GLASS)) { + return true; + } + } + if (block.defaultBlockState().is(Tags.Blocks.GLASS_PANES)) { + if (recolorBlockNoState(GLASS_PANE_MAP, this.color.getColor(), world, pos, Blocks.GLASS_PANE)) { + return true; + } + } + if (block.defaultBlockState().is(BlockTags.TERRACOTTA)) { + if (recolorBlockNoState(TERRACOTTA_MAP, this.color.getColor(), world, pos, Blocks.TERRACOTTA)) { + return true; + } + } + if (block.defaultBlockState().is(BlockTags.WOOL)) { + if (recolorBlockNoState(WOOL_MAP, this.color.getColor(), world, pos)) { + return true; + } + } + if (block.defaultBlockState().is(BlockTags.WOOL_CARPETS)) { + if (recolorBlockNoState(CARPET_MAP, this.color.getColor(), world, pos)) { + return true; + } + } + if (CONCRETE_MAP.containsValue(block)) { + if (recolorBlockNoState(CONCRETE_MAP, this.color.getColor(), world, pos)) { + return true; + } + } + if (CONCRETE_POWDER_MAP.containsValue(block)) { + if (recolorBlockNoState(CONCRETE_POWDER_MAP, this.color.getColor(), world, pos)) { + return true; + } + } + if (block.defaultBlockState().is(BlockTags.CANDLES)) { + if (recolorBlockNoState(CANDLE_MAP, this.color.getColor(), world, pos)) { + return true; + } + } + return false; + } + + private static boolean recolorBlockNoState(Map map, DyeColor color, Level world, BlockPos pos) { + return recolorBlockNoState(map, color, world, pos, null); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private static boolean recolorBlockNoState(Map map, DyeColor color, Level world, BlockPos pos, + Block _default) { + Block newBlock = map.getOrDefault(color, _default); + BlockState old = world.getBlockState(pos); + if (newBlock == Blocks.AIR) newBlock = _default; + if (newBlock != null && newBlock != old.getBlock()) { + BlockState state = newBlock.defaultBlockState(); + for (Property property : old.getProperties()) { + state.setValue(property, old.getValue(property)); + } + world.setBlock(pos, state, 3); + world.sendBlockUpdated(pos, old, state, 3); + return true; + } + return false; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private static boolean tryStripBlockColor(Level world, BlockPos pos, Block block) { + // MC special cases + if (block instanceof StainedGlassBlock) { + world.setBlock(pos, Blocks.GLASS.defaultBlockState(), 3); + return true; + } + if (block instanceof StainedGlassPaneBlock) { + world.setBlock(pos, Blocks.GLASS_PANE.defaultBlockState(), 3); + return true; + } + if (block.defaultBlockState().is(BlockTags.TERRACOTTA) && block != Blocks.TERRACOTTA) { + world.setBlock(pos, Blocks.TERRACOTTA.defaultBlockState(), 3); + return true; + } + if (block.defaultBlockState().is(BlockTags.WOOL) && block != Blocks.WHITE_WOOL) { + world.setBlock(pos, Blocks.WHITE_WOOL.defaultBlockState(), 3); + return true; + } + if (block.defaultBlockState().is(BlockTags.WOOL_CARPETS) && block != Blocks.WHITE_CARPET) { + world.setBlock(pos, Blocks.WHITE_CARPET.defaultBlockState(), 3); + return true; + } + if (CONCRETE_MAP.containsValue(block) && block != Blocks.WHITE_CONCRETE) { + world.setBlock(pos, Blocks.WHITE_CONCRETE.defaultBlockState(), 3); + return true; + } + if (CONCRETE_POWDER_MAP.containsValue(block) && block != Blocks.WHITE_CONCRETE_POWDER) { + world.setBlock(pos, Blocks.WHITE_CONCRETE_POWDER.defaultBlockState(), 3); + return true; + } + if (block.defaultBlockState().is(BlockTags.CANDLES) && block != Blocks.WHITE_CANDLE) { + recolorBlockNoState(CANDLE_MAP, DyeColor.WHITE, world, pos); + return true; + } + + // General case + BlockState state = world.getBlockState(pos); + for (Property prop : state.getProperties()) { + if (prop.getValueClass() == ExtendedDyeColor.class) { + BlockState defaultState = block.defaultBlockState(); + ExtendedDyeColor defaultColor = ExtendedDyeColor.WHITE; + try { + // try to read the default color value from the default state instead of just + // blindly setting it to default state, and potentially resetting other values + defaultColor = (ExtendedDyeColor) defaultState.getValue(prop); + } catch (IllegalArgumentException ignored) { + // no default color, we may have to fallback to WHITE here + // other mods that have custom behavior can be done as + // special cases above on a case-by-case basis + } + recolorBlockState(world, pos, defaultColor); + return true; + } + } + + return false; + } + + private static final BiPredicate paintablePredicate = (parent, child) -> { + if (!parent.getClass().equals(child.getClass())) { + return false; + } + return parent.getPaintingColor() == child.getPaintingColor(); + }; + + private static final TriPredicate paintablePredicateWrapper = (parent, child, + direction) -> { + if (parent == null && child instanceof IPaintable) return true; + return parent instanceof IPaintable pp && child instanceof IPaintable pc && paintablePredicate.test(pp, pc); + }; + + @SuppressWarnings("rawtypes") + private static final TriPredicate gtPipePredicate = (parent, child, + direction) -> { + if (parent == null) return true; + if (!paintablePredicate.test(parent, child)) { + return false; + } + return parent.isConnected(direction) && child.isConnected(direction.getOpposite()); + }; + + private static final TriPredicate gtMetaMachinePredicate = (parent, + child, + direction) -> { + if (parent == null) return true; + return paintablePredicate.test(parent, child) && + parent.getDefinition().equals(child.getDefinition()); + }; + + private static class AE2CallWrapper { + + static Set collect(BlockEntity first, int limit) { + return BreadthFirstBlockSearch.conditionalBlockEntitySearch(CableBusBlockEntity.class, + (CableBusBlockEntity) first, + AE2CallWrapper::ae2CablePredicate, + limit, limit * 6); + } + + static boolean isAE2Cable(BlockEntity be) { + return be instanceof CableBusBlockEntity; + } + + static boolean ae2CablePredicate(CableBusBlockEntity parent, CableBusBlockEntity child, Direction direction) { + if (parent == null) return true; + var childDirection = direction.getOpposite(); + if (parent.getPart(direction) != null || parent.getCableConnectionType(direction) == AECableType.NONE || + child.getPart(childDirection) != null || + child.getCableConnectionType(childDirection) == AECableType.NONE || + parent.getColor() != child.getColor()) { + return false; + } + return true; + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/OxygenSupplyTankBehavior.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/OxygenSupplyTankBehavior.java new file mode 100644 index 000000000..0e51ebc32 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/OxygenSupplyTankBehavior.java @@ -0,0 +1,110 @@ +package com.ghostipedia.cosmiccore.common.item.behavior; + +import com.ghostipedia.cosmiccore.common.airControl.IOxygenSupplyItem; +import com.ghostipedia.cosmiccore.common.airControl.OxygenItemCap; +import com.ghostipedia.cosmiccore.utils.ItemData; + +import com.gregtechceu.gtceu.api.item.component.IComponentCapability; +import com.gregtechceu.gtceu.api.item.component.IItemComponent; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.item.GTDataComponents; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.capabilities.Capabilities; +import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent; +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.capability.IFluidHandlerItem; +import net.neoforged.neoforge.fluids.capability.templates.FluidHandlerItemStack; + +import lombok.Getter; + +public class OxygenSupplyTankBehavior implements IItemComponent, IComponentCapability { + + private static final String TAG_ROOT = "CosmicCoreO2"; + private static final String TAG_BUF = "TickBuffer"; + private static final String TAG_CAP = "CapacityMb"; + private static final String TAG_TPT = "TransferPerTick"; + private static final String TAG_TPM = "TicksPerMb"; + + @Getter + private final int capacityMb; + @Getter + private final int transferPerTick; + @Getter + private final int ticksPerMb; + + public OxygenSupplyTankBehavior(int capacityMb, int transferPerTick, int ticksPerMb) { + this.capacityMb = capacityMb; + this.transferPerTick = Math.max(0, transferPerTick); + this.ticksPerMb = Math.max(1, ticksPerMb); + } + + /** + * Drains oxygen ticks from the tank's internal buffer, refilling from fluid as needed. + */ + public int drainTicks(ItemStack stack, int requestTicks) { + if (requestTicks <= 0) return 0; + + int outLimit = Math.min(requestTicks, transferPerTick); + + IFluidHandlerItem fluidHandler = getFluidHandler(stack); + if (fluidHandler == null) return 0; + + int buffer = getTickBuffer(stack); + + if (buffer < outLimit) { + FluidStack drained = fluidHandler.drain( + new FluidStack(GTMaterials.Oxygen.getFluid(), 1), + IFluidHandlerItem.FluidAction.EXECUTE); + if (!drained.isEmpty()) { + buffer += drained.getAmount() * ticksPerMb; + } + } + + int provided = Math.min(outLimit, buffer); + if (provided > 0) { + setTickBuffer(stack, buffer - provided); + } + return provided; + } + + private IFluidHandlerItem getFluidHandler(ItemStack stack) { + return stack.getCapability(Capabilities.FluidHandler.ITEM); + } + + private int getTickBuffer(ItemStack stack) { + return ItemData.readElement(stack, TAG_ROOT).getInt(TAG_BUF); + } + + private void setTickBuffer(ItemStack stack, int value) { + ItemData.mutateElement(stack, TAG_ROOT, tag -> tag.putInt(TAG_BUF, Math.max(0, value))); + } + + private void ensureConfigWritten(ItemStack stack) { + ItemData.mutateElement(stack, TAG_ROOT, tag -> { + tag.putInt(TAG_CAP, capacityMb); + tag.putInt(TAG_TPT, transferPerTick); + tag.putInt(TAG_TPM, ticksPerMb); + }); + } + + @Override + public void attachCapabilities(RegisterCapabilitiesEvent event, Item item) { + event.registerItem(Capabilities.FluidHandler.ITEM, (stack, ctx) -> { + ensureConfigWritten(stack); + return new FluidHandlerItemStack(GTDataComponents.FLUID_CONTENT, stack, capacityMb) { + + @Override + public boolean isFluidValid(int tank, FluidStack fluidStack) { + return fluidStack.getFluid() == GTMaterials.Oxygen.getFluid(); + } + }; + }, item); + + event.registerItem(OxygenItemCap.OXYGEN_SUPPLY, (stack, ctx) -> { + ensureConfigWritten(stack); + return (IOxygenSupplyItem) this::drainTicks; + }, item); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/SprayCanClientHandler.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/SprayCanClientHandler.java new file mode 100644 index 000000000..b1bb82e75 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/SprayCanClientHandler.java @@ -0,0 +1,207 @@ +package com.ghostipedia.cosmiccore.common.item.behavior; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.client.gui.SprayCanScreen; +import com.ghostipedia.cosmiccore.common.data.CosmicSounds; + +import com.gregtechceu.gtceu.api.blockentity.IPaintable; +import com.gregtechceu.gtceu.api.machine.MetaMachine; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.DyeColor; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.entity.ShulkerBoxBlockEntity; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.MapColor; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.HitResult; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.client.event.InputEvent; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; + +import appeng.blockentity.networking.CableBusBlockEntity; +import org.lwjgl.glfw.GLFW; + +import java.util.Objects; + +import static com.ghostipedia.cosmiccore.common.item.behavior.SprayCanEventListener.getSprayCanBehavior; +import static com.ghostipedia.cosmiccore.common.item.behavior.SprayCanEventListener.hasSprayCan; + +@SuppressWarnings("unused") +@EventBusSubscriber(modid = CosmicCore.MOD_ID, bus = EventBusSubscriber.Bus.GAME, value = Dist.CLIENT) +public class SprayCanClientHandler { + + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public static void onClickEvent(InputEvent.InteractionKeyMappingTriggered event) { + // isPickBlock() returns button == 2 which is the middle mouse click + if (!event.isPickBlock()) { + return; + } + + // grabs thine game + Minecraft mc = Minecraft.getInstance(); + Level level = mc.level; + Player player = mc.player; + + // null checks the player level and if there is a blokc + if (player == null || level == null || mc.hitResult == null) return; + + // gets the spraycan and makes sure it is a spraycan + ItemStack spraycan = player.getMainHandItem(); + if (hasSprayCan(spraycan)) return; + + // sets an id for the dye to properly assign the color + int dyeID = 0; + ExtendedDyeColor color = null; + // check if it gets a block + if (mc.hitResult.getType() == HitResult.Type.BLOCK) { + + BlockHitResult blockHit = (BlockHitResult) mc.hitResult; + BlockPos pos = blockHit.getBlockPos(); + + /** + * im not even gonna try to explain what this does but it grabs the block + * and checks what state it is and gets the map color + * and then converts it to a dye color + * and then send that dye to the spray can but since mc is stupid it has to be like this + */ + + BlockEntity entity = level.getBlockEntity(pos); + if (entity != null) { + if (entity instanceof ShulkerBoxBlockEntity shulker) { + color = ExtendedDyeColor.fromDyeColor(shulker.getColor()); + + } else if (entity instanceof CableBusBlockEntity cable) { + var ae2dye = cable.getColor().dye; + if (ae2dye == null) { + color = ExtendedDyeColor.SOLVENT; + } else { + dyeID = ae2dye.getId(); + color = ExtendedDyeColor.getColorFromDyeId(dyeID); + } + } else if (entity instanceof IPaintable) { + for (DyeColor dye : DyeColor.values()) { + if (((IPaintable) entity).getPaintingColor() == -1) { + + color = ExtendedDyeColor.SOLVENT; + + } + if (((IPaintable) entity).getPaintingColor() == dye.getTextColor()) { + color = ExtendedDyeColor.getColorFromDyeId(dye.getId()); + } + } + } else if (entity instanceof MetaMachine meta) { + var machineColor = meta.getPaintingColor(); + for (DyeColor dye : DyeColor.values()) { + if (machineColor == -1) { + color = ExtendedDyeColor.SOLVENT; + break; + } else if (machineColor == dye.getTextColor()) { + color = ExtendedDyeColor.fromDyeColor(dye); + } + } + } + } + // normal blocks + BlockState state = level.getBlockState(pos); + MapColor mapColor = state.getMapColor(level, pos); + + // get the id of the map color + int id = mapColor.id; + + // map id to dye + if (id >= 15 && id <= 29) { + dyeID = id - 14; + color = ExtendedDyeColor.getColorFromDyeId(dyeID); + } + // terracotta is special + else if (id >= 37 && id <= 51) { + dyeID = id - 36; + color = ExtendedDyeColor.getColorFromDyeId(dyeID); + } + // white maps to snow???????????????????????????? + else if (id == 8 || id == 36) { + + dyeID = 0; + color = ExtendedDyeColor.getColorFromDyeId(dyeID); + + } + + } + + // send to spraycan when finished + InfiniteSprayCanBehavior behavior = getSprayCanBehavior(spraycan); + if (behavior != null) { + + // checks if it is locked first before anything + if (!behavior.getIsLocked()) { + color = Objects.requireNonNullElse(color, ExtendedDyeColor.SOLVENT); + behavior.setColor(color); + behavior.sendColorToTag(player, behavior.color); + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(CosmicSounds.SHAKE_CAN.getMainEvent(), 1.0f, 1.0f)); + } else { + player.displayClientMessage(Component.translatable("cosmiccore.item.spraycan.locked"), true); + } + + event.setCanceled(true); + } + } + + // this event is used here because the other one needs a b lock to be clicked on this one works in the air + @OnlyIn(Dist.CLIENT) + @SubscribeEvent + public static void onMouseInput(InputEvent.MouseButton.Pre event) { + int button = event.getButton(); + if ((button != 0 && button != 2) || event.getAction() != GLFW.GLFW_PRESS) return; + + Minecraft mc = Minecraft.getInstance(); + Player player = mc.player; + Level level = mc.level; + + // null check same as above + if (player == null || level == null || mc.hitResult == null) return; + ItemStack spraycan = player.getMainHandItem(); + if (hasSprayCan(spraycan)) return; + + InfiniteSprayCanBehavior behavior = getSprayCanBehavior(spraycan); + if (behavior == null) return; + + // resets the isSwinging flag + if (button == 0) { + behavior.isSwinging = false; + return; + } + + // returns if the player isn't crouching + if (!player.isCrouching()) return; + + // if its locked invert it + boolean nowLocked = !behavior.getIsLocked(); + behavior.setIsLocked(nowLocked); + event.setCanceled(true); + + String langKey = nowLocked ? "cosmiccore.item.spraycan.now_locked" : "cosmiccore.item.spraycan.now_unlocked"; + player.displayClientMessage(Component.translatable(langKey), true); + } + + @OnlyIn(Dist.CLIENT) + public static void openScreen(Player player, InfiniteSprayCanBehavior behavior) { + Minecraft.getInstance().setScreen(new SprayCanScreen(player, behavior)); + } + + @OnlyIn(Dist.CLIENT) + public static void playShakeSound() { + Minecraft.getInstance().getSoundManager().play( + SimpleSoundInstance.forUI(CosmicSounds.SHAKE_CAN.getMainEvent(), 1.0f, 1.0f)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/SprayCanEventListener.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/SprayCanEventListener.java new file mode 100644 index 000000000..6ce7350ab --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/SprayCanEventListener.java @@ -0,0 +1,66 @@ +package com.ghostipedia.cosmiccore.common.item.behavior; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import com.gregtechceu.gtceu.api.item.ComponentItem; +import com.gregtechceu.gtceu.common.data.GTSoundEntries; +import com.gregtechceu.gtceu.config.ConfigHolder; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.event.level.BlockEvent; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; + +import static com.ghostipedia.cosmiccore.common.data.CosmicItems.INFINITE_SPRAY_CAN; + +@SuppressWarnings("unused") +@EventBusSubscriber(modid = CosmicCore.MOD_ID, bus = EventBusSubscriber.Bus.GAME) +public class SprayCanEventListener { + + @SubscribeEvent + public static void onBlockPlaced(BlockEvent.EntityPlaceEvent event) { + Level level = (Level) event.getLevel(); + BlockPos pos = event.getPos(); + if (level.isClientSide) return; + if (!(event.getEntity() instanceof Player player)) return; + ItemStack can = player.getOffhandItem(); + var behavior = getSprayCanBehavior(can); + if (behavior == null) return; + if (hasSprayCan(can)) return; + + UseOnContext fakeContext = new UseOnContext(player, InteractionHand.OFF_HAND, + new BlockHitResult(Vec3.atCenterOf(pos), Direction.UP, pos, false)); + + if (!behavior.handleSpecialBlockEntities(level.getBlockEntity(pos), + ConfigHolder.INSTANCE.tools.sprayCanChainLength, fakeContext)) { + behavior.handleBlocks(pos, ConfigHolder.INSTANCE.tools.sprayCanChainLength, fakeContext); + } + + GTSoundEntries.SPRAY_CAN_TOOL.play(level, null, player.position(), 1.0f, 1.0f); + } + + // just pulls out some repeated code for cleanliness into this method to check if it is a spraycan + static boolean hasSprayCan(ItemStack stack) { + return stack.getItem() != INFINITE_SPRAY_CAN.get().asItem(); + } + + // gets the bahavior to reduce repeated code + static InfiniteSprayCanBehavior getSprayCanBehavior(ItemStack stack) { + if (!(stack.getItem() instanceof ComponentItem compItem)) return null; + + for (var component : compItem.getComponents()) { + if (component instanceof InfiniteSprayCanBehavior behavior) { + return behavior; + } + } + return null; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/StructureWriteBehavior.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/StructureWriteBehavior.java new file mode 100644 index 000000000..4cda15b4e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/StructureWriteBehavior.java @@ -0,0 +1,253 @@ +package com.ghostipedia.cosmiccore.common.item.behavior; + +import com.ghostipedia.cosmiccore.api.data.DebugBlockPattern; +import com.ghostipedia.cosmiccore.utils.ItemData; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.item.ComponentItem; +import com.gregtechceu.gtceu.api.item.component.IItemUIFactory; + +import com.lowdragmc.lowdraglib.gui.factory.HeldItemUIFactory; +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; +import com.lowdragmc.lowdraglib.gui.texture.TextTexture; +import com.lowdragmc.lowdraglib.gui.widget.ButtonWidget; +import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.utils.LocalizationUtils; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.level.Level; + +import com.google.common.base.Joiner; + +public class StructureWriteBehavior implements IItemUIFactory { + + public static final StructureWriteBehavior INSTANCE = new StructureWriteBehavior(); + + protected StructureWriteBehavior() { + /**/ + } + + @Override + public ModularUI createUI(HeldItemUIFactory.HeldItemHolder playerInventoryHolder, Player entityPlayer) { + var container = new WidgetGroup(8, 8, 160, 54); + container + .addWidget(new ImageWidget(4, 4, 152, 46, GuiTextures.DISPLAY)) + .addWidget(new LabelWidget(7, 7, () -> { + int x = 0; + int y = 0; + int z = 0; + if (getPos(playerInventoryHolder.getHeld()) != null) { + BlockPos[] blockPos = getPos(playerInventoryHolder.getHeld()); + if (blockPos != null) { + x = 1 + blockPos[1].getX() - blockPos[0].getX(); + y = 1 + blockPos[1].getY() - blockPos[0].getY(); + z = 1 + blockPos[1].getZ() - blockPos[0].getZ(); + } + } + return LocalizationUtils.format( + "item.cosmiccore.debug.structure_writer.structural_scale", x, y, z); + }).setTextColor(0xFAF9F6)) + .addWidget(new LabelWidget(7, 20, () -> { + var direction = getDir(playerInventoryHolder.getHeld()); + var dirs = DebugBlockPattern.getDir(direction); + return LocalizationUtils.format( + "item.cosmiccore.debug.structure_writer.export_order", + dirs[0].name(), + dirs[1].name(), + dirs[2].name()); + }).setTextColor(0xFAF9F6)); + container.setBackground(GuiTextures.BACKGROUND_INVERSE); + return new ModularUI(176, 120, playerInventoryHolder, entityPlayer) + .background(GuiTextures.BACKGROUND) + .widget(container) + .widget(new ButtonWidget( + 9, + 68, + 158, + 20, + new GuiTextureGroup( + GuiTextures.BUTTON, + new TextTexture("item.cosmiccore.debug.structure_writer.export_to_log")), + clickData -> exportLog(playerInventoryHolder))) + .widget(new ButtonWidget( + 9, + 91, + 77, + 20, + new GuiTextureGroup( + GuiTextures.BUTTON, + new TextTexture("item.cosmiccore.debug.structure_writer.rotate_along_x_axis")), + clickData -> changeDirX(playerInventoryHolder))) + .widget(new ButtonWidget( + 90, + 91, + 77, + 20, + new GuiTextureGroup( + GuiTextures.BUTTON, + new TextTexture("item.cosmiccore.debug.structure_writer.rotate_along_y_axis")), + clickData -> changeDirY(playerInventoryHolder))); + } + + private void exportLog(HeldItemUIFactory.HeldItemHolder playerInventoryHolder) { + if (getPos(playerInventoryHolder.getHeld()) != null && + playerInventoryHolder.getPlayer() instanceof ServerPlayer player) { + BlockPos[] blockPos = getPos(playerInventoryHolder.getHeld()); + Direction direction = getDir(playerInventoryHolder.getHeld()); + StringBuilder builder = new StringBuilder(); + DebugBlockPattern blockPattern = new DebugBlockPattern( + playerInventoryHolder.getPlayer().level(), + blockPos[0].getX(), + blockPos[0].getY(), + blockPos[0].getZ(), + blockPos[1].getX(), + blockPos[1].getY(), + blockPos[1].getZ()); + var dirs = DebugBlockPattern.getDir(direction); + blockPattern.changeDir(dirs[0], dirs[1], dirs[2]); + player.displayClientMessage( + Component.translatable("item.cosmiccore.debug.structure_writer.output_successful"), false); + for (int i = 0; i < blockPattern.pattern.length; i++) { + String[] strings = blockPattern.pattern[i]; + builder.append(".aisle(\"%s\")\n".formatted(Joiner.on("\", \"").join(strings))); + } + + builder.append("\n// Block Legend:\n"); + blockPattern.charToBlockMap.forEach((character, resourceLocation) -> { + if (character == ' ') { + builder.append("// ' ' (space) - %s\n".formatted(resourceLocation)); + } else { + builder.append("// %c - %s\n".formatted(character, resourceLocation)); + } + }); + + GTCEu.LOGGER.info("\n" + builder.toString()); + } + } + + private void changeDirX(HeldItemUIFactory.HeldItemHolder playerInventoryHolder) { + if (getPos(playerInventoryHolder.getHeld()) != null && + playerInventoryHolder.getPlayer() instanceof ServerPlayer) { + ItemStack itemStack = playerInventoryHolder.getHeld(); + Direction direction = getDir(itemStack); + direction = direction.getClockWise(Direction.Axis.X); + setDir(itemStack, direction); + } + } + + private void changeDirY(HeldItemUIFactory.HeldItemHolder playerInventoryHolder) { + if (getPos(playerInventoryHolder.getHeld()) != null && + playerInventoryHolder.getPlayer() instanceof ServerPlayer) { + ItemStack itemStack = playerInventoryHolder.getHeld(); + Direction direction = getDir(itemStack); + direction = direction.getClockWise(Direction.Axis.Y); + setDir(itemStack, direction); + } + } + + public static boolean isItemStructureWriter(ItemStack stack) { + if (stack.isEmpty()) return false; + + if (stack.getItem() instanceof ComponentItem item) { + return item.getComponents().contains(INSTANCE); + } + return false; + } + + public static Direction getDir(ItemStack stack) { + CompoundTag tag = ItemData.readElement(stack, "structure_writer"); + if (!tag.contains("dir")) return Direction.WEST; + return Direction.byName(tag.getString("dir")); + } + + public static void setDir(ItemStack stack, Direction dir) { + ItemData.mutateElement(stack, "structure_writer", tag -> tag.putString("dir", dir.getName())); + } + + public static BlockPos[] getPos(ItemStack stack) { + CompoundTag tag = ItemData.readElement(stack, "structure_writer"); + if (!tag.contains("minX")) return null; + return new BlockPos[] { + new BlockPos(tag.getInt("minX"), tag.getInt("minY"), tag.getInt("minZ")), + new BlockPos(tag.getInt("maxX"), tag.getInt("maxY"), tag.getInt("maxZ")) + }; + } + + public static void addPos(ItemStack stack, BlockPos pos) { + ItemData.mutateElement(stack, "structure_writer", tag -> { + if (!tag.contains("minX") || tag.getInt("minX") > pos.getX()) { + tag.putInt("minX", pos.getX()); + } + if (!tag.contains("maxX") || tag.getInt("maxX") < pos.getX()) { + tag.putInt("maxX", pos.getX()); + } + + if (!tag.contains("minY") || tag.getInt("minY") > pos.getY()) { + tag.putInt("minY", pos.getY()); + } + if (!tag.contains("maxY") || tag.getInt("maxY") < pos.getY()) { + tag.putInt("maxY", pos.getY()); + } + + if (!tag.contains("minZ") || tag.getInt("minZ") > pos.getZ()) { + tag.putInt("minZ", pos.getZ()); + } + if (!tag.contains("maxZ") || tag.getInt("maxZ") < pos.getZ()) { + tag.putInt("maxZ", pos.getZ()); + } + }); + } + + public static void removePos(ItemStack stack) { + ItemData.mutateElement(stack, "structure_writer", tag -> { + tag.remove("minX"); + tag.remove("maxX"); + tag.remove("minY"); + tag.remove("maxY"); + tag.remove("minZ"); + tag.remove("maxZ"); + }); + } + + @Override + public InteractionResult onItemUseFirst(ItemStack itemStack, UseOnContext context) { + var player = context.getPlayer(); + if (player == null) return InteractionResult.SUCCESS; + ItemStack stack = player.getItemInHand(context.getHand()); + if (!player.isShiftKeyDown()) { + addPos(stack, context.getClickedPos()); + } else { + removePos(stack); + } + return InteractionResult.SUCCESS; + } + + @Override + public InteractionResultHolder use( + ItemStack item, Level level, Player player, InteractionHand usedHand) { + ItemStack stack = player.getItemInHand(usedHand); + if (player.isShiftKeyDown()) { + removePos(stack); + } else { + if (player instanceof ServerPlayer serverPlayer) { + HeldItemUIFactory.INSTANCE.openUI(serverPlayer, usedHand); + } + } + return new InteractionResultHolder<>(InteractionResult.SUCCESS, stack); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/VeinSurveyBehavior.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/VeinSurveyBehavior.java new file mode 100644 index 000000000..a132538fd --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/VeinSurveyBehavior.java @@ -0,0 +1,338 @@ +package com.ghostipedia.cosmiccore.common.item.behavior; + +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.network.packet.SyncPredictedVeinsPacket; +import com.ghostipedia.cosmiccore.common.worldgen.survey.VeinSurveyUtil; +import com.ghostipedia.cosmiccore.common.worldgen.survey.VeinSurveyUtil.VeinInfo; +import com.ghostipedia.cosmiccore.utils.ItemData; + +import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; +import com.gregtechceu.gtceu.api.capability.IElectricItem; +import com.gregtechceu.gtceu.api.data.worldgen.IWorldGenLayer; +import com.gregtechceu.gtceu.api.data.worldgen.WorldGeneratorUtils; +import com.gregtechceu.gtceu.api.item.component.IAddInformation; +import com.gregtechceu.gtceu.api.item.component.IInteractionItem; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.ClickEvent; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class VeinSurveyBehavior implements IInteractionItem, IAddInformation { + + public enum ScanMode { + + RADIAL("cosmiccore.survey.mode.radial", 360), + DIRECTIONAL("cosmiccore.survey.mode.directional", 90), + NEAREST("cosmiccore.survey.mode.nearest", 360); + + public final String translationKey; + public final int coneAngle; + + ScanMode(String translationKey, int coneAngle) { + this.translationKey = translationKey; + this.coneAngle = coneAngle; + } + } + + public enum DetailLevel { + + BASIC(1), + COMPASS(2), + PRECISE(3); + + public final int level; + + DetailLevel(int level) { + this.level = level; + } + } + + private final int radius; + private final long energyCost; + private final DetailLevel detailLevel; + + public VeinSurveyBehavior(int radius, long energyCost, DetailLevel detailLevel) { + this.radius = radius; + this.energyCost = energyCost; + this.detailLevel = detailLevel; + } + + public ScanMode getMode(ItemStack stack) { + if (stack.isEmpty()) return ScanMode.RADIAL; + int modeIdx = ItemData.readTag(stack).getInt("ScanMode") % ScanMode.values().length; + return ScanMode.values()[modeIdx]; + } + + public void setNextMode(ItemStack stack) { + int nextMode = (ItemData.readTag(stack).getInt("ScanMode") + 1) % ScanMode.values().length; + ItemData.mutateTag(stack, tag -> tag.putInt("ScanMode", nextMode)); + } + + @Nullable + public String getVeinFilter(ItemStack stack) { + if (stack.isEmpty()) return null; + String filter = ItemData.readTag(stack).getString("VeinFilter"); + return filter.isEmpty() ? null : filter; + } + + public void setVeinFilter(ItemStack stack, @Nullable String filter) { + ItemData.mutateTag(stack, tag -> { + if (filter == null || filter.isEmpty()) { + tag.remove("VeinFilter"); + } else { + tag.putString("VeinFilter", filter); + } + }); + } + + public boolean drainEnergy(ItemStack stack, boolean simulate) { + IElectricItem electricItem = GTCapabilityHelper.getElectricItem(stack); + if (electricItem == null) return false; + return electricItem.discharge(energyCost, Integer.MAX_VALUE, true, false, simulate) >= energyCost; + } + + @Override + public InteractionResultHolder use(ItemStack item, Level level, Player player, InteractionHand usedHand) { + ItemStack stack = player.getItemInHand(usedHand); + + if (player.isShiftKeyDown()) { + if (!level.isClientSide) { + setNextMode(stack); + ScanMode mode = getMode(stack); + player.sendSystemMessage(Component.translatable(mode.translationKey) + .withStyle(ChatFormatting.YELLOW)); + level.playSound(null, player.blockPosition(), SoundEvents.UI_BUTTON_CLICK.value(), + SoundSource.PLAYERS, 0.5f, 1.2f); + } + return InteractionResultHolder.success(stack); + } + + if (!player.isCreative() && !drainEnergy(stack, true)) { + if (!level.isClientSide) { + player.sendSystemMessage(Component.translatable("cosmiccore.survey.no_energy") + .withStyle(ChatFormatting.RED)); + } + return InteractionResultHolder.fail(stack); + } + + if (!level.isClientSide && level instanceof ServerLevel serverLevel && + player instanceof ServerPlayer serverPlayer) { + if (!player.isCreative()) drainEnergy(stack, false); + + ScanMode mode = getMode(stack); + performScan(serverLevel, serverPlayer, stack, mode); + + level.playSound(null, player.blockPosition(), SoundEvents.EXPERIENCE_ORB_PICKUP, + SoundSource.PLAYERS, 0.5f, 0.8f); + } + + return InteractionResultHolder.success(stack); + } + + private void performScan(ServerLevel level, ServerPlayer player, ItemStack stack, ScanMode mode) { + BlockPos center = player.blockPosition(); + + IWorldGenLayer layer = WorldGeneratorUtils.WORLD_GEN_LAYERS.values().stream() + .filter(l -> l.isApplicableForLevel(level.dimension())) + .findFirst() + .orElse(null); + + List allVeins = VeinSurveyUtil.surveyVeins(level, center, radius, layer); + + if (mode == ScanMode.DIRECTIONAL) { + Vec3 lookVec = player.getLookAngle(); + double playerYaw = Math.atan2(lookVec.x, lookVec.z); + + allVeins = allVeins.stream() + .filter(vein -> isInCone(center, vein.center(), playerYaw, mode.coneAngle)) + .toList(); + } + + String filter = getVeinFilter(stack); + if (filter != null) { + String filterLower = filter.toLowerCase(); + allVeins = allVeins.stream() + .filter(v -> v.getVeinName().toLowerCase().contains(filterLower)) + .toList(); + } + + if (mode == ScanMode.NEAREST) { + displayNearestResult(player, allVeins, center, filter); + } else { + displayScanResults(player, allVeins, center, mode, filter); + } + + CCoreNetwork.sendToPlayer(player, new SyncPredictedVeinsPacket(allVeins, true)); + } + + private boolean isInCone(BlockPos from, BlockPos to, double facingYaw, int coneAngle) { + double dx = to.getX() - from.getX(); + double dz = to.getZ() - from.getZ(); + if (dx == 0 && dz == 0) return true; + + double toYaw = Math.atan2(dx, dz); + double angleDiff = Math.abs(normalizeAngle(toYaw - facingYaw)); + return angleDiff <= Math.toRadians(coneAngle / 2.0); + } + + private double normalizeAngle(double angle) { + while (angle > Math.PI) angle -= 2 * Math.PI; + while (angle < -Math.PI) angle += 2 * Math.PI; + return angle; + } + + private void displayScanResults(ServerPlayer player, List veins, BlockPos center, + ScanMode mode, @Nullable String filter) { + if (veins.isEmpty()) { + MutableComponent msg = filter != null ? + Component.translatable("cosmiccore.survey.no_veins.filtered", filter) : + mode == ScanMode.DIRECTIONAL ? Component.translatable("cosmiccore.survey.no_veins.directional") : + Component.translatable("cosmiccore.survey.no_veins"); + player.sendSystemMessage(msg.withStyle(ChatFormatting.RED)); + return; + } + + MutableComponent header = Component.literal("") + .append(Component.translatable("cosmiccore.survey.header").withStyle(ChatFormatting.GOLD)) + .append("\n") + .append(Component.translatable("cosmiccore.survey.found", veins.size(), radius) + .withStyle(ChatFormatting.GRAY)); + + if (mode == ScanMode.DIRECTIONAL) { + header.append(Component.translatable("cosmiccore.survey.found.directional") + .withStyle(ChatFormatting.DARK_GRAY)); + } + player.sendSystemMessage(header); + + Map veinCounts = veins.stream() + .collect(Collectors.groupingBy(VeinInfo::getVeinName, Collectors.counting())); + + MutableComponent typeSummary = Component.translatable("cosmiccore.survey.types") + .withStyle(ChatFormatting.GRAY); + boolean first = true; + for (var entry : veinCounts.entrySet()) { + if (!first) typeSummary.append(Component.literal(", ").withStyle(ChatFormatting.DARK_GRAY)); + first = false; + typeSummary.append(Component.literal(entry.getKey()).withStyle(ChatFormatting.WHITE)) + .append(Component.literal("×" + entry.getValue()).withStyle(ChatFormatting.AQUA)); + } + player.sendSystemMessage(typeSummary); + + player.sendSystemMessage(Component.translatable("cosmiccore.survey.nearest") + .withStyle(ChatFormatting.YELLOW)); + + int displayCount = Math.min(10, veins.size()); + for (int i = 0; i < displayCount; i++) { + sendVeinEntry(player, veins.get(i), center, i + 1); + } + + if (veins.size() > 10) { + player.sendSystemMessage(Component.translatable("cosmiccore.survey.more", veins.size() - 10) + .withStyle(ChatFormatting.DARK_GRAY)); + } + } + + private void displayNearestResult(ServerPlayer player, List veins, BlockPos center, + @Nullable String filter) { + if (veins.isEmpty()) { + MutableComponent msg = filter != null ? + Component.translatable("cosmiccore.survey.no_veins.filtered", filter) : + Component.translatable("cosmiccore.survey.no_veins"); + player.sendSystemMessage(msg.withStyle(ChatFormatting.RED)); + return; + } + + VeinInfo nearest = veins.get(0); + MutableComponent header = filter != null ? + Component.translatable("cosmiccore.survey.nearest_vein.filtered", filter) : + Component.translatable("cosmiccore.survey.nearest_vein"); + player.sendSystemMessage(header.withStyle(ChatFormatting.GOLD)); + sendVeinEntry(player, nearest, center, 1); + } + + private void sendVeinEntry(ServerPlayer player, VeinInfo vein, BlockPos from, int index) { + BlockPos pos = vein.center(); + int distance = vein.horizontalDistanceFrom(from); + String direction = vein.directionFrom(from); + + ChatFormatting nameColor = vein.isConfirmed() ? ChatFormatting.AQUA : ChatFormatting.GRAY; + String confidenceIndicator = vein.isConfirmed() ? "" : "? "; + + MutableComponent entry = Component.literal(" " + index + ". ") + .withStyle(ChatFormatting.GRAY) + .append(Component.literal(confidenceIndicator + vein.getVeinName()).withStyle(nameColor)) + .append(Component.literal(" - ").withStyle(ChatFormatting.DARK_GRAY)) + .append(Component.literal(distance + "m").withStyle(ChatFormatting.WHITE)); + + if (detailLevel.level >= DetailLevel.COMPASS.level) { + entry.append(Component.literal(" " + direction).withStyle(ChatFormatting.WHITE)); + } + + if (detailLevel.level >= DetailLevel.PRECISE.level) { + entry.append(Component.literal(" [").withStyle(ChatFormatting.DARK_GRAY)); + if (player.isCreative()) { + String tpCommand = "/tp @s " + pos.getX() + " ~ " + pos.getZ(); + entry.append(Component.literal("X:" + pos.getX() + " Z:" + pos.getZ()) + .withStyle(Style.EMPTY + .withColor(ChatFormatting.GREEN) + .withUnderlined(true) + .withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, tpCommand)) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, + Component.translatable("cosmiccore.survey.click_tp"))))); + } else { + entry.append(Component.literal("X:" + pos.getX() + " Z:" + pos.getZ()) + .withStyle(ChatFormatting.GREEN)); + } + entry.append(Component.literal("]").withStyle(ChatFormatting.DARK_GRAY)); + } + + player.sendSystemMessage(entry); + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltipComponents, + TooltipFlag isAdvanced) { + ScanMode mode = getMode(stack); + String filter = getVeinFilter(stack); + + tooltipComponents.add(Component.translatable("cosmiccore.survey.tooltip.radius", radius) + .withStyle(ChatFormatting.GRAY)); + tooltipComponents.add(Component.translatable("cosmiccore.survey.tooltip.mode") + .withStyle(ChatFormatting.GRAY) + .append(Component.translatable(mode.translationKey).withStyle(ChatFormatting.YELLOW))); + + if (filter != null) { + tooltipComponents.add(Component.translatable("cosmiccore.survey.tooltip.filter") + .withStyle(ChatFormatting.GRAY) + .append(Component.literal(filter).withStyle(ChatFormatting.AQUA))); + } + + tooltipComponents.add(Component.empty()); + tooltipComponents.add(Component.translatable("cosmiccore.survey.tooltip.use") + .withStyle(ChatFormatting.DARK_GRAY)); + tooltipComponents.add(Component.translatable("cosmiccore.survey.tooltip.shift") + .withStyle(ChatFormatting.DARK_GRAY)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/WarpStaffBehavior.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/WarpStaffBehavior.java new file mode 100644 index 000000000..5693dacf3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/WarpStaffBehavior.java @@ -0,0 +1,10 @@ +package com.ghostipedia.cosmiccore.common.item.behavior; + +import net.minecraft.world.item.Item; + +public class WarpStaffBehavior extends Item { + + public WarpStaffBehavior(Properties properties) { + super(properties); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/WirelessPDABehavior.java b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/WirelessPDABehavior.java new file mode 100644 index 000000000..d0c2450da --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/item/behavior/WirelessPDABehavior.java @@ -0,0 +1,121 @@ +package com.ghostipedia.cosmiccore.common.item.behavior; + +import com.ghostipedia.cosmiccore.api.data.wireless.WirelessEnergySavedData; + +import com.gregtechceu.gtceu.api.item.IComponentItem; +import com.gregtechceu.gtceu.api.item.component.IItemHUDProvider; +import com.gregtechceu.gtceu.api.item.component.IItemLifeCycle; +import com.gregtechceu.gtceu.common.machine.owner.FTBOwner; +import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.neoforged.neoforge.common.NeoForge; + +import org.jetbrains.annotations.NotNull; +import top.theillusivec4.curios.api.CuriosApi; + +import java.math.BigInteger; +import java.util.UUID; + +public class WirelessPDABehavior implements IItemHUDProvider, IItemLifeCycle { + + private static Level serverLevel; + private static UUID playerUUID; + private static UUID wirelessUUID; + + public void ItemMagnetBehavior() { + NeoForge.EVENT_BUS.register(this); + } + + public static void setLevel(Level level) { + serverLevel = level; + } + + public static void setOwner(Player player) { + playerUUID = player.getUUID(); + var team = MachineOwner.getOwner(playerUUID) instanceof FTBOwner ftbOwner ? ftbOwner.getTeam() : null; + wirelessUUID = team != null ? team.getTeamId() : playerUUID; + } + + @Override + public void drawHUD(ItemStack stack, GuiGraphics guiGraphics) { + Minecraft mc = Minecraft.getInstance(); + if (serverLevel == null || playerUUID == null) return; + var wirelessData = WirelessEnergySavedData.getOrCreate((ServerLevel) serverLevel); + var percentStorage = (wirelessData.getEnergyStored(wirelessUUID).multiply(BigInteger.valueOf(10000)) + .divide(wirelessData.getEnergyCapacity(wirelessUUID)).intValue() / 100.0F); + + guiGraphics.drawString(mc.font, + Component.translatable("cosmic.gui.wireless.energy.stored", + Component.literal(FormattingUtil.formatNumbers(percentStorage)).withStyle(ChatFormatting.GREEN), + Component + .literal(FormattingUtil + .formatNumberReadable(wirelessData.getEnergyStored(playerUUID).longValue())) + .withStyle(ChatFormatting.AQUA), + Component + .literal(FormattingUtil + .formatNumberReadable(wirelessData.getEnergyCapacity(playerUUID).longValue())) + .withStyle(ChatFormatting.AQUA)), + 1, 44, 0xFFFFFF, true); + guiGraphics.drawString(mc.font, + Component.translatable("cosmic.command.wireless.energy.input", + Component.literal(FormattingUtil.formatNumberReadable(wirelessData.getEnergyInput(playerUUID)))) + .withStyle(ChatFormatting.GREEN), + -5, 54, 0xFFFFFF, true); + guiGraphics.drawString(mc.font, + Component.translatable("cosmic.command.wireless.energy.output", + Component + .literal(FormattingUtil.formatNumberReadable(wirelessData.getEnergyOutput(playerUUID)))) + .withStyle(ChatFormatting.RED), + -5, 64, 0xFFFFFF, true); + } + + public static class CosmicCuriosUtils { + + public static boolean hasPDACurio(Player player) { + return CuriosApi.getCuriosInventory(player) + .map(curios -> curios.findFirstCurio(WirelessPDABehavior::isPDA).isPresent()) + .orElse(false); + } + + public static ItemStack getPDACurio(Player player) { + var curioInventory = CuriosApi.getCuriosInventory(player); + if (!curioInventory.isPresent()) return ItemStack.EMPTY; + var slotResult = curioInventory.map(curio -> curio.findFirstCurio(WirelessPDABehavior::isPDA)); + if (slotResult.isEmpty()) return ItemStack.EMPTY; + if (slotResult.get().isEmpty()) return ItemStack.EMPTY; + return slotResult.get().get().stack(); + } + } + + @Override + public void inventoryTick(ItemStack stack, Level level, Entity entity, int slotId, boolean isSelected) { + if (serverLevel != null && playerUUID != null) return; + if (level.isClientSide()) return; + if (!(entity instanceof Player player)) return; + if (CosmicCuriosUtils.hasPDACurio(player)) { + setLevel(level); + setOwner(player); + } + } + + private static boolean isPDA(@NotNull ItemStack stack) { + if (stack.getItem() instanceof IComponentItem metaItem) { + for (var behavior : metaItem.getComponents()) { + if (behavior instanceof WirelessPDABehavior) { + return true; + } + } + } + return false; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/WirelessChargerMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/WirelessChargerMachine.java new file mode 100644 index 000000000..0c320b4c4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/WirelessChargerMachine.java @@ -0,0 +1,190 @@ +package com.ghostipedia.cosmiccore.common.machine; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.common.machine.owner.ArgonautsOwner; +import com.gregtechceu.gtceu.common.machine.owner.FTBOwner; +import com.gregtechceu.gtceu.common.machine.owner.PlayerOwner; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Vec3i; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.AABB; +import net.neoforged.neoforge.items.IItemHandler; +import net.neoforged.neoforge.items.wrapper.EmptyItemHandler; +import net.neoforged.neoforge.server.ServerLifecycleHooks; + +import dev.ftb.mods.ftbteams.data.PlayerTeam; +import top.theillusivec4.curios.api.CuriosApi; +import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class WirelessChargerMachine extends TieredEnergyMachine { + + private int tier; + private ChargeMode mode; + private long longRange; + private long shortRange; + private long chargeAmount; + + private TickableSubscription charge; + + List oldPlayerList = new ArrayList<>(); + + public WirelessChargerMachine(BlockEntityCreationInfo holder, int tier) { + super(holder, tier, m -> { + long chargeAmount = GTValues.V[tier]; + return new NotifiableEnergyContainer(m, chargeAmount * 64L, chargeAmount, 4, 0L, 0L) { + + @Override + public long getInputAmperage() { + if (((WirelessChargerMachine) m).mode == ChargeMode.SUPER_CHARGED) { + return 4; + } + return 1; + } + }; + }); + this.tier = tier; + mode = ChargeMode.SUPER_CHARGED; + longRange = 1024L * (tier - GTValues.MV); + shortRange = 512L * (tier - GTValues.MV); + chargeAmount = GTValues.V[tier]; + } + + @Override + public void onLoad() { + super.onLoad(); + if (isRemote()) return; + + charge = subscribeServerTick(this::chargeLoop); + } + + @Override + public void onUnload() { + super.onUnload(); + + if (charge != null) { + charge.unsubscribe(); + charge = null; + } + } + + public void chargeLoop() { + var maxChargeValue = chargeAmount * energyContainer.getInputAmperage(); + if (energyContainer.getEnergyStored() < maxChargeValue) return; + int tickRate = mode == ChargeMode.SUPER_CHARGED ? 4 : 20; + if (getOffsetTimer() % tickRate == 0) { + var owner = getOwner(); + List players = new ArrayList<>(); + if (owner instanceof PlayerOwner) { + UUID pUUID = owner.getUUID(); + Player player = ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayer(pUUID); + if (player != null && isPlayerInRange(player)) players.add(player); + } else if (owner instanceof FTBOwner ftbOwner) { + var team = ftbOwner.getTeam(); + if (team == null) return; + if (team.isPlayerTeam()) { + for (var pUUID : ((PlayerTeam) team).getEffectiveTeam().getMembers()) { + Player player = ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayer(pUUID); + if (player != null && isPlayerInRange(player)) players.add(player); + } + } else if (team.isServerTeam() || team.isPartyTeam()) { + for (var pUUID : team.getMembers()) { + Player player = ServerLifecycleHooks.getCurrentServer().getPlayerList().getPlayer(pUUID); + if (player != null && isPlayerInRange(player)) players.add(player); + } + } + + } else if (owner instanceof ArgonautsOwner) { + // DN + } + + if (!players.isEmpty()) { + + for (var player : players) { + if (GTCEu.Mods.isCuriosLoaded()) { + IItemHandler curios = CuriosApi.getCuriosInventory(player) + .map(ICuriosItemHandler::getEquippedCurios) + .orElse(EmptyItemHandler.INSTANCE); + for (int i = 0; i < curios.getSlots(); i++) { + var itemInSlot = curios.getStackInSlot(i); + var slotElectricItem = GTCapabilityHelper.getElectricItem(itemInSlot); + if (slotElectricItem != null && energyContainer.getEnergyStored() > maxChargeValue && + slotElectricItem.chargeable()) { + long chargedAmount = slotElectricItem.charge(maxChargeValue, tier, true, false); + energyContainer.changeEnergy(-chargedAmount); + } + } + } + + var playerInv = player.getInventory(); + for (int i = 0; i < playerInv.getContainerSize(); i++) { + var itemInSlot = playerInv.getItem(i); + var slotElectricItem = GTCapabilityHelper.getElectricItem(itemInSlot); + if (slotElectricItem != null && energyContainer.getEnergyStored() > maxChargeValue && + slotElectricItem.chargeable()) { + long chargedAmount = slotElectricItem.charge(maxChargeValue, tier, true, false); + energyContainer.changeEnergy(-chargedAmount); + } + } + } + } + + List enteringPlayers = players.stream().filter(player -> !oldPlayerList.contains(player)).toList(); + List leavingPlayers = oldPlayerList.stream().filter(player -> !players.contains(player)).toList(); + int radius = mode == ChargeMode.SUPER_CHARGED ? (int) shortRange : (int) longRange; + for (var player : enteringPlayers) { + player.displayClientMessage(Component.translatable("cosmiccore.wireless_charger.enter_range", + FormattingUtil.formatNumbers(radius)), false); + } + for (var player : leavingPlayers) { + player.displayClientMessage(Component.translatable("cosmiccore.wireless_charger.left_range", + FormattingUtil.formatNumbers(radius)), false); + } + + if (oldPlayerList != players) oldPlayerList = players; + } + } + + private boolean isPlayerInRange(Player player) { + int radius = mode == ChargeMode.SUPER_CHARGED ? (int) shortRange : (int) longRange; + BlockPos a = new BlockPos(getBlockPos().offset(new Vec3i(-radius, -radius, -radius))); + BlockPos b = new BlockPos(getBlockPos().offset(new Vec3i(radius, radius, radius))); + var entityList = getLevel().getEntities(null, AABB.encapsulatingFullBlocks(a, b)); + return entityList.contains(player); + } + + @Override + protected InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { + if (!getLevel().isClientSide) { + mode = ChargeMode.values()[((mode.ordinal() + 1) % ChargeMode.values().length)]; + if (mode == ChargeMode.SUPER_CHARGED) { + context.getPlayer().displayClientMessage(Component.translatable("cosmiccore.wireless_charger.mode.0", + FormattingUtil.formatNumbers(shortRange)), false); + } else if (mode == ChargeMode.MIXED) { + context.getPlayer().displayClientMessage(Component.translatable("cosmiccore.wireless_charger.mode.1", + FormattingUtil.formatNumbers(longRange)), false); + } + } + + return super.onScrewdriverClick(context); + } + + enum ChargeMode { + SUPER_CHARGED, + MIXED; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/LinkedMultiblockHelper.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/LinkedMultiblockHelper.java new file mode 100644 index 000000000..a848a8f3d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/LinkedMultiblockHelper.java @@ -0,0 +1,359 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock; +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock.LinkRole; +import com.ghostipedia.cosmiccore.api.data.savedData.LinkedMultiblockSavedData; + +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.GlobalPos; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.ChunkPos; + +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public class LinkedMultiblockHelper { + + public static final int MAX_FORCED_CHUNKS_PER_MACHINE = 4; + private static final Map> activeTickets = new HashMap<>(); + + public record RolePair(LinkRole aRole, LinkRole bRole) {} + + @Nullable + public static RolePair negotiateRoles(LinkRole aDeclared, LinkRole bDeclared) { + if (aDeclared == LinkRole.PEER && bDeclared == LinkRole.PEER) { + return new RolePair(LinkRole.PEER, LinkRole.PEER); + } + if (aDeclared == LinkRole.PEER && bDeclared == LinkRole.CONTROLLER) { + return new RolePair(LinkRole.REMOTE, LinkRole.CONTROLLER); + } + if (aDeclared == LinkRole.PEER && bDeclared == LinkRole.REMOTE) { + return new RolePair(LinkRole.CONTROLLER, LinkRole.REMOTE); + } + if (aDeclared == LinkRole.CONTROLLER && bDeclared == LinkRole.PEER) { + return new RolePair(LinkRole.CONTROLLER, LinkRole.REMOTE); + } + if (aDeclared == LinkRole.REMOTE && bDeclared == LinkRole.PEER) { + return new RolePair(LinkRole.REMOTE, LinkRole.CONTROLLER); + } + if (aDeclared == LinkRole.CONTROLLER && bDeclared == LinkRole.REMOTE) { + return new RolePair(LinkRole.CONTROLLER, LinkRole.REMOTE); + } + if (aDeclared == LinkRole.REMOTE && bDeclared == LinkRole.CONTROLLER) { + return new RolePair(LinkRole.REMOTE, LinkRole.CONTROLLER); + } + return null; + } + + @Nullable + public static MetaMachine getMachine(MinecraftServer server, GlobalPos pos) { + ServerLevel level = server.getLevel(pos.dimension()); + if (level == null) return null; + + if (!level.isLoaded(pos.pos())) { + return null; + } + + return MetaMachine.getMachine(level, pos.pos()); + } + + @Nullable + public static ILinkedMultiblock getLinkedMachine(MinecraftServer server, GlobalPos pos) { + MetaMachine machine = getMachine(server, pos); + return machine instanceof ILinkedMultiblock linked ? linked : null; + } + + public static boolean isPartnerOnline(MinecraftServer server, GlobalPos pos) { + return getMachine(server, pos) != null; + } + + public static boolean forceLoadPartnerChunk(MinecraftServer server, GlobalPos requester, GlobalPos target) { + Map existing = activeTickets.getOrDefault(requester, Collections.emptyMap()); + if (existing.containsKey(target)) { + return true; + } + if (existing.size() >= MAX_FORCED_CHUNKS_PER_MACHINE) { + CosmicCore.LOGGER.warn("Machine at {} has reached force-load limit of {}", + requester, MAX_FORCED_CHUNKS_PER_MACHINE); + return false; + } + + ServerLevel level = server.getLevel(target.dimension()); + if (level == null) { + CosmicCore.LOGGER.warn("Cannot force-load chunk: dimension {} does not exist", + target.dimension().location()); + return false; + } + + ChunkPos chunkPos = new ChunkPos(target.pos()); + BlockPos ownerPos = requester.pos(); + boolean success = level.setChunkForced(chunkPos.x, chunkPos.z, true); + + activeTickets.computeIfAbsent(requester, k -> new HashMap<>()) + .put(target, ownerPos); + CosmicCore.LOGGER.debug("Force-loaded chunk {} in {} for machine at {} (owner: {}, changed: {})", + chunkPos, target.dimension().location(), requester, ownerPos, success); + + return true; + } + + public static void releasePartnerChunk(MinecraftServer server, GlobalPos requester, GlobalPos target) { + Map tickets = activeTickets.get(requester); + if (tickets == null) return; + + BlockPos ownerPos = tickets.remove(target); + if (ownerPos == null) return; + + ServerLevel level = server.getLevel(target.dimension()); + if (level == null) return; + + ChunkPos chunkPos = new ChunkPos(target.pos()); + level.setChunkForced(chunkPos.x, chunkPos.z, false); + + CosmicCore.LOGGER.debug("Released chunk {} in {} for machine at {} (owner: {})", + chunkPos, target.dimension().location(), requester, ownerPos); + + if (tickets.isEmpty()) { + activeTickets.remove(requester); + } + } + + public static void releaseAllTickets(MinecraftServer server, GlobalPos requester) { + Map tickets = activeTickets.remove(requester); + if (tickets == null) return; + + int released = 0; + for (Map.Entry entry : tickets.entrySet()) { + GlobalPos target = entry.getKey(); + + ServerLevel level = server.getLevel(target.dimension()); + if (level != null) { + ChunkPos chunkPos = new ChunkPos(target.pos()); + level.setChunkForced(chunkPos.x, chunkPos.z, false); + released++; + } + } + + CosmicCore.LOGGER.debug("Released {} force-load tickets for machine at {}", + released, requester); + } + + public static int getActiveTicketCount(GlobalPos requester) { + return activeTickets.getOrDefault(requester, Collections.emptyMap()).size(); + } + + public static boolean validateLink(MinecraftServer server, UUID owner, GlobalPos a, GlobalPos b) { + LinkedMultiblockSavedData savedData = LinkedMultiblockSavedData.getOrCreate(server); + if (!savedData.isLinked(owner, a, b)) { + return false; + } + + MetaMachine machineA = getMachine(server, a); + MetaMachine machineB = getMachine(server, b); + + ServerLevel levelA = server.getLevel(a.dimension()); + if (levelA != null && levelA.isLoaded(a.pos()) && machineA == null) { + return false; + } + + ServerLevel levelB = server.getLevel(b.dimension()); + if (levelB != null && levelB.isLoaded(b.pos()) && machineB == null) { + return false; + } + + return true; + } + + public static boolean canQuery(MinecraftServer server, UUID owner, GlobalPos requester, GlobalPos target) { + return LinkedMultiblockSavedData.getOrCreate(server).canQuery(owner, requester, target); + } + + @FunctionalInterface + public interface PartnerQuery { + + T query(WorkableElectricMultiblockMachine partner); + } + + @Nullable + public static T queryPartner( + MinecraftServer server, + UUID owner, + GlobalPos requester, + GlobalPos target, + PartnerQuery query) { + if (!canQuery(server, owner, requester, target)) { + CosmicCore.LOGGER.debug("Query denied: {} cannot query {}", requester, target); + return null; + } + + boolean needsUnload = false; + if (!isPartnerOnline(server, target)) { + if (!forceLoadPartnerChunk(server, requester, target)) { + return null; + } + needsUnload = true; + } + + try { + MetaMachine machine = getMachine(server, target); + if (machine instanceof WorkableElectricMultiblockMachine workable) { + return query.query(workable); + } + return null; + } finally { + if (needsUnload) { + releasePartnerChunk(server, requester, target); + } + } + } + + public static List> getPartnerItemHandlers( + MinecraftServer server, + UUID owner, + GlobalPos requester, + GlobalPos target, + IO io) { + List> result = queryPartner(server, owner, requester, target, + partner -> partner.getCapabilitiesFlat(io, ItemRecipeCapability.CAP)); + return result != null ? result : Collections.emptyList(); + } + + public static List> getPartnerFluidHandlers( + MinecraftServer server, + UUID owner, + GlobalPos requester, + GlobalPos target, + IO io) { + List> result = queryPartner(server, owner, requester, target, + partner -> partner.getCapabilitiesFlat(io, FluidRecipeCapability.CAP)); + return result != null ? result : Collections.emptyList(); + } + + public static List> getPartnerEnergyHandlers( + MinecraftServer server, + UUID owner, + GlobalPos requester, + GlobalPos target, + IO io) { + List> result = queryPartner(server, owner, requester, target, + partner -> partner.getCapabilitiesFlat(io, EURecipeCapability.CAP)); + return result != null ? result : Collections.emptyList(); + } + + public static boolean partnerHasItem( + MinecraftServer server, + UUID owner, + GlobalPos requester, + GlobalPos target, + java.util.function.Predicate itemPredicate) { + Boolean result = queryPartner(server, owner, requester, target, partner -> { + var handlers = partner.getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP); + if (handlers == null) return false; + + for (Object handler : handlers) { + if (handler instanceof net.neoforged.neoforge.items.IItemHandler itemHandler) { + for (int i = 0; i < itemHandler.getSlots(); i++) { + if (itemPredicate.test(itemHandler.getStackInSlot(i))) { + return true; + } + } + } + } + return false; + }); + return result != null && result; + } + + public static boolean partnerHasFluid( + MinecraftServer server, + UUID owner, + GlobalPos requester, + GlobalPos target, + java.util.function.Predicate fluidPredicate) { + Boolean result = queryPartner(server, owner, requester, target, partner -> { + var handlers = partner.getCapabilitiesFlat(IO.IN, FluidRecipeCapability.CAP); + if (handlers == null) return false; + + for (Object handler : handlers) { + if (handler instanceof net.neoforged.neoforge.fluids.capability.IFluidHandler fluidHandler) { + for (int i = 0; i < fluidHandler.getTanks(); i++) { + if (fluidPredicate.test(fluidHandler.getFluidInTank(i))) { + return true; + } + } + } + } + return false; + }); + return result != null && result; + } + + public static long getPartnerEnergyStored( + MinecraftServer server, + UUID owner, + GlobalPos requester, + GlobalPos target) { + Long result = queryPartner(server, owner, requester, target, partner -> { + var handlers = partner.getCapabilitiesFlat(IO.IN, EURecipeCapability.CAP); + if (handlers == null) return 0L; + + long total = 0; + for (Object handler : handlers) { + if (handler instanceof com.gregtechceu.gtceu.api.capability.IEnergyContainer energyContainer) { + total += energyContainer.getEnergyStored(); + } + } + return total; + }); + return result != null ? result : 0L; + } + + public static boolean isPartnerFormed( + MinecraftServer server, + UUID owner, + GlobalPos requester, + GlobalPos target) { + Boolean result = queryPartner(server, owner, requester, target, + WorkableElectricMultiblockMachine::isFormed); + return result != null && result; + } + + public static boolean isPartnerWorking( + MinecraftServer server, + UUID owner, + GlobalPos requester, + GlobalPos target) { + Boolean result = queryPartner(server, owner, requester, target, partner -> { + RecipeLogic logic = partner.getRecipeLogic(); + return logic != null && logic.isWorking(); + }); + return result != null && result; + } + + private static final Map DIMENSION_NAMES = Map.of( + "minecraft:overworld", "Overworld", + "minecraft:the_nether", "The Nether", + "minecraft:the_end", "The End", + "ad_astra:earth_orbit", "Earth Orbit", + "ad_astra:moon", "Moon", + "ad_astra:mars", "Mars", + "ad_astra:venus", "Venus", + "ad_astra:mercury", "Mercury", + "ad_astra:glacio", "Glacio"); + + public static String getDimensionName(net.minecraft.resources.ResourceLocation dim) { + return DIMENSION_NAMES.getOrDefault(dim.toString(), dim.getPath().replace("_", " ")); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/behavior/AtmoPumpBehavior.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/behavior/AtmoPumpBehavior.java new file mode 100644 index 000000000..86468162e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/behavior/AtmoPumpBehavior.java @@ -0,0 +1,64 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.behavior; + +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.AABB; + +import org.jetbrains.annotations.NotNull; + +public class AtmoPumpBehavior extends WorkableElectricMultiblockMachine { + + @NotNull + private AABB killzone = new AABB(BlockPos.ZERO); + private TickableSubscription hurtSub; + private int Damage = 1; + + public AtmoPumpBehavior(BlockEntityCreationInfo holder) { + super(holder); + } + + private void updateBounds(int multiplier) { + var flt = RelativeDirection.offsetPos(getBlockPos(), getFrontFacing(), getUpwardsFacing(), isFlipped(), 3, 14, -14); + var brb = RelativeDirection.offsetPos(getBlockPos(), getFrontFacing(), getUpwardsFacing(), isFlipped(), -14, -14, + 14); + killzone = AABB.encapsulatingFullBlocks(flt, brb); + } + + @Override + public void onPartUnload() { + super.onPartUnload(); + unsubscribe(hurtSub); + hurtSub = null; + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + unsubscribe(hurtSub); + hurtSub = null; + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + hurtSub = subscribeServerTick(this::suffocatePlayer); + updateBounds(1); + } + + private void suffocatePlayer() { + if (getOffsetTimer() % 35 != 0) return; + if (!this.isActive()) return; + if (isRemote() || getLevel() == null) return; + for (Entity entity : getLevel().getEntities(null, killzone)) { + if (entity instanceof Player player) { + player.hurt(player.level().damageSources().inWall(), this.Damage); + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/HeatSensitiveMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/HeatSensitiveMachine.java new file mode 100644 index 000000000..7800ffe48 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/HeatSensitiveMachine.java @@ -0,0 +1,67 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.electric; + +import com.ghostipedia.cosmiccore.api.capability.recipe.HeatRecipeCapability; +import com.ghostipedia.cosmiccore.api.capability.recipe.IHeatContainer; +import com.ghostipedia.cosmiccore.api.machine.multiblock.HeatWorkableElectricMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.MagnetWorkableElectricMultiblockMachine; + +import com.gregtechceu.gtceu.api.capability.IEnergyContainer; +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.misc.EnergyContainerList; + +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.annotation.Nullable; + +public class HeatSensitiveMachine extends HeatWorkableElectricMultiblockMachine implements ITieredMachine { + + @Getter + private long overHeatLimit; + @Getter + private long freezeLimit; + @Nullable + protected EnergyContainerList inputEnergyContainers; + @Nullable + protected TickableSubscription preHeatSubs; + + public HeatSensitiveMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + List energyContainers = new ArrayList<>(); + List heatContainers = new ArrayList<>(); + Map ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", Long2ObjectMaps::emptyMap); + for (IMultiPart part : getParts()) { + IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.IN); + if (io == IO.NONE || io == IO.OUT) continue; + for (var handler : part.getRecipeHandlers()) { + IO handlerIO = handler.getHandlerIO(); + if (handler.hasCapability(HeatRecipeCapability.CAP) && + handler instanceof IHeatContainer container) { + heatContainers.add(container); + } + if (handler.hasCapability(EURecipeCapability.CAP) && + handler instanceof IEnergyContainer container) { + energyContainers.add(container); + } + + } + } + this.inputEnergyContainers = new EnergyContainerList(energyContainers); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/MagneticFieldMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/MagneticFieldMachine.java index 295725f1b..331fc4256 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/MagneticFieldMachine.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/electric/MagneticFieldMachine.java @@ -1,31 +1,35 @@ package com.ghostipedia.cosmiccore.common.machine.multiblock.electric; import com.ghostipedia.cosmiccore.api.machine.multiblock.MagnetWorkableElectricMultiblockMachine; + import com.gregtechceu.gtceu.api.capability.IEnergyContainer; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.utils.FormattingUtil; + import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; -import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; -import lombok.Getter; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; -import javax.annotation.Nullable; +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + import java.util.ArrayList; import java.util.List; import java.util.Map; +import javax.annotation.Nullable; + public class MagneticFieldMachine extends MagnetWorkableElectricMultiblockMachine implements ITieredMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(MagneticFieldMachine.class, MagnetWorkableElectricMultiblockMachine.MANAGED_FIELD_HOLDER); + @Getter private int fieldChargeRate; @Getter @@ -36,33 +40,35 @@ public class MagneticFieldMachine extends MagnetWorkableElectricMultiblockMachin @Nullable protected TickableSubscription preMagnetSubs; - public MagneticFieldMachine(IMachineBlockEntity holder) { + public MagneticFieldMachine(BlockEntityCreationInfo holder) { super(holder); } - @Override - public ManagedFieldHolder getFieldHolder() { - return MANAGED_FIELD_HOLDER; - } + + @Override public void onStructureFormed() { super.onStructureFormed(); - List energyContainers = new ArrayList<>(); + List inputEnergyContainers = new ArrayList<>(); Map ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", Long2ObjectMaps::emptyMap); for (IMultiPart part : getParts()) { - IO io = ioMap.getOrDefault(part.self().getPos().asLong(), IO.IN); + IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.IN); if (io == IO.NONE || io == IO.OUT) continue; - for (var handler : part.getRecipeHandlers()) { + var handlers = part.getRecipeHandlers(); + for (var handler : handlers) { IO handlerIO = handler.getHandlerIO(); - if (handlerIO == IO.IN){ - if (handler.getCapability() == EURecipeCapability.CAP && handler instanceof IEnergyContainer container) { - energyContainers.add(container); - traitSubscriptions.add(handler.addChangedListener(this::updateMagnetFieldSubscription)); - } + if (handlerIO == IO.IN) { + var containers = handler.getCapability(EURecipeCapability.CAP).stream() + .filter(IEnergyContainer.class::isInstance) + .map(IEnergyContainer.class::cast) + .toList(); + inputEnergyContainers.addAll(containers); + traitSubscriptions.add(handler.subscribe(this::updateMagnetFieldSubscription)); + } } } - this.inputEnergyContainers = new EnergyContainerList(energyContainers); + this.inputEnergyContainers = new EnergyContainerList(inputEnergyContainers); updateMagnetFieldSubscription(); } @@ -73,10 +79,8 @@ protected void updateMagnetFieldSubscription() { preMagnetSubs.unsubscribe(); preMagnetSubs = null; } - } - @Override public void onLoad() { super.onLoad(); @@ -98,10 +102,10 @@ public void updateFieldStrength() { return; } if (inputEnergyContainers.getEnergyStored() > getEnergyCost() && getMagnetStrength() > fieldStrength) { - if(fieldStrength < 0){ + if (fieldStrength < 0) { fieldStrength = 0; } - if(fieldStrength > getMagnetStrength()){ + if (fieldStrength > getMagnetStrength()) { fieldStrength = getMagnetStrength(); } inputEnergyContainers.removeEnergy(getEnergyCost()); @@ -113,26 +117,27 @@ public void updateFieldStrength() { @Override public boolean beforeWorking(@org.jetbrains.annotations.Nullable GTRecipe recipe) { - if(recipe.data.getInt("min_field") <= fieldStrength){ - if(recipe.data.contains("decay_rate") && recipe.data.getInt("decay_rate") > 0){ - if (!recipe.data.getBoolean("per_tick")){ - fieldStrength = fieldStrength - recipe.data.getInt("decay_rate"); - } return true; - } - } + if (recipe.data.getInt("min_field") <= fieldStrength) { + if (recipe.data.contains("decay_rate") && recipe.data.getInt("decay_rate") > 0) { + if (!recipe.data.getBoolean("per_tick")) { + fieldStrength = fieldStrength - recipe.data.getInt("decay_rate"); + } + return true; + } + } return false; } @Override public boolean onWorking() { GTRecipe recipe = recipeLogic.getLastRecipe(); - if(!recipe.data.getBoolean("per_tick")){ + if (!recipe.data.getBoolean("per_tick")) { return super.onWorking(); } - if(!recipe.data.contains("decay_rate") || recipe.data.getInt("decay_rate") <= 0){ + if (!recipe.data.contains("decay_rate") || recipe.data.getInt("decay_rate") <= 0) { return false; } - if(fieldStrength < recipe.data.getInt("min_field")){ + if (fieldStrength < recipe.data.getInt("min_field")) { return false; } fieldStrength = fieldStrength - recipe.data.getInt("decay_rate"); @@ -140,7 +145,7 @@ public boolean onWorking() { } @Override - public boolean dampingWhenWaiting() { + public boolean regressWhenWaiting() { return false; } @@ -150,12 +155,11 @@ public void addDisplayText(List textList) { if (isFormed) { textList.add(Component.translatable("cosmiccore.multiblock.current_field_strength", fieldStrength)); textList.add(Component.translatable("cosmiccore.multiblock.magnetic_field_strength", - Component.translatable(FormattingUtil.formatNumbers(this.getMagnetType().getMagnetFieldCapacity())).setStyle(Style.EMPTY.withColor(ChatFormatting.GOLD)))); + Component.translatable(FormattingUtil.formatNumbers(this.getMagnetType().getMagnetFieldCapacity())) + .setStyle(Style.EMPTY.withColor(ChatFormatting.GOLD)))); textList.add(Component.translatable("cosmiccore.multiblock.magnetic_regen", - Component.translatable(FormattingUtil.formatNumbers(this.getMagnetType().getMagnetRegenRate())).setStyle(Style.EMPTY.withColor(ChatFormatting.GOLD)))); + Component.translatable(FormattingUtil.formatNumbers(this.getMagnetType().getMagnetRegenRate())) + .setStyle(Style.EMPTY.withColor(ChatFormatting.GOLD)))); } - } - - } diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ArcaneCrucible.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ArcaneCrucible.java new file mode 100644 index 000000000..2deec7259 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ArcaneCrucible.java @@ -0,0 +1,55 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.IMPORT_EMBER; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.SOUL_STAINED_STEEL_ALU_CASING; +import static com.gregtechceu.gtceu.api.machine.multiblock.PartAbility.EXPORT_FLUIDS; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.BATCH_MODE; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; + +public class ArcaneCrucible { + + public final static MultiblockMachineDefinition ARCANE_CRUCIBLE = REGISTRATE + .multiblock("arcane_crucible", WorkableElectricMultiblockMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.ARCANE_CRUCIBLE) + .appearanceBlock(SOUL_STAINED_STEEL_ALU_CASING) + .partAppearance((controller, part, side) -> SOUL_STAINED_STEEL_ALU_CASING.getDefaultState()) + .recipeModifiers(ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK), BATCH_MODE) + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAA ", " ABA ", " BBB ", " BBB ", " ABA ", " AAA ") + .aisle("AAAAA", "A A", "B B", "B B", "A A", "AAAAA") + .aisle("AAAAA", "B B", "B B", "B B", "B B", "AAAAA") + .aisle("AAAAA", "A A", "B B", "B B", "A A", "AAAAA") + .aisle(" AQA ", " ABA ", " BBB ", " BBB ", " ABA ", " AAA ") + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('A', blocks(SOUL_STAINED_STEEL_ALU_CASING.get()) + .or(abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.EXPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(EXPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(IMPORT_EMBER).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setExactLimit(1))) + .where('B', blocks(CosmicBlocks.STEEL_ROSE_LIGHT.block().get())) + // + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/soul_stained_steel_aluminium_plated_casing"), + CosmicCore.id("block/multiblock/dawnforge")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ArcaneDistillery.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ArcaneDistillery.java new file mode 100644 index 000000000..7b6d9edb1 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ArcaneDistillery.java @@ -0,0 +1,67 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.util.RelativeDirection.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; + +public class ArcaneDistillery { + + public static final MultiblockMachineDefinition ARCANE_DISTILLERY = REGISTRATE + .multiblock("arcane_distillery", WorkableElectricMultiblockMachine::new) + .langValue("§6Arcane Distillery") + .recipeTypes(CosmicRecipeTypes.ARCANE_DISTILLERY, CosmicRecipeTypes.ARCANE_FOLDING) + .rotationState(RotationState.NON_Y_AXIS) + .partAppearance((controller, part, side) -> OSCILLATING_GILDED_PTHANTERUM_CASING.getDefaultState()) + .recipeModifiers(GTRecipeModifiers.BATCH_MODE, + ELECTRIC_OVERCLOCK.apply(OverclockingLogic.PERFECT_OVERCLOCK_SUBTICK)) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" A AAA A ", " AAA ", " AAA ", " ", " ", " ", " ", " ", " ", " ", " AAA ", " AAA ", " A AAA A ") + .aisle(" AAAAAAAAAAA ", " ABB C BBA ", " B B ", " B B ", " ", " ", " ", " ", " ", " B B ", " B B ", " BB C BBA ", " AAAAAAAAAAA ") + .aisle("AAAAAAAAAAAAA", " AB C BA ", " B B ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " B B ", " B C BA ", "AAAAAAAAAAAAA") + .aisle(" AAAAAAAAAAA ", " B EE C EE B ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " B EE C EE B ", " AAAAAAAAAAA ") + .aisle(" AAAAAAAAAAA ", " B EE C EE B ", " B E E B ", " B EE EE B ", " ", " ", " ", " ", " ", " B EE EE B ", " B E E B ", " B EE C EE B ", " AAAAAAAAAAA ") + .aisle("AAAAAAAAAAAAA", "A C A", "A A", " EE EE ", " E E ", " E ", " ", " E ", " E E ", " EE EE ", "A A", "A C A", "AAAAAAAAAAAAA") + .aisle("AAAAAAAAAAAAA", "ACCCCCCCCCCCA", "A C A", " C ", " C ", " ", " ", " ", " C ", " C ", "A C A", "ACCCCCCCCCCCA", "AAAAAAAAAAAAA") + .aisle("AAAAAAAAAAAAA", "A C A", "A A", " EE EE ", " E E ", " E ", " ", " E ", " E E ", " EE EE ", "A A", "A C A", "AAAAAAAAAAAAA") + .aisle(" AAAAAAAAAAA ", " B EE C EE B ", " B E E B ", " B EE EE B ", " ", " ", " ", " ", " ", " B EE EE B ", " B E E B ", " B EE C EE B ", " AAAAAAAAAAA ") + .aisle(" AAAAAAAAAAA ", " B EE C EE B ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " B EE C EE B ", " AAAAAAAAAAA ") + .aisle("AAAAAAAAAAAAA", " AB C BA ", " B B ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " B B ", " AB C BA ", "AAAAAAAAAAAAA") + .aisle(" AAAAAAAAAAA ", " ABB C BBA ", " B B ", " B B ", " ", " ", " ", " ", " ", " B B ", " B B ", " ABB C BBA ", " AAAAAAAAAAA ") + .aisle(" A AAA A ", " AQA ", " AAA ", " ", " ", " ", " ", " ", " ", " ", " AAA ", " AAA ", " A AAA A ") + .where('Q', Predicates.controller(Predicates.blocks(definition.get()))) + .where(' ', Predicates.any()) + .where('A', blocks(OSCILLATING_GILDED_PTHANTERUM_CASING.get()) + .or(autoAbilities(CosmicRecipeTypes.ARCANE_DISTILLERY)) + .or(autoAbilities(true,false,false)) + .or(abilities(PartAbility.INPUT_ENERGY, PartAbility.INPUT_LASER).setMaxGlobalLimited(2, 2) + .setPreviewCount(1))) + .where('B', blocks(GILDED_PTHANTERUM_CASING.get())) + .where('C', blocks(VIBRANT_RUBIDIUM_CASING.get())) + .where('D', frames(CosmicMaterials.Neutronite)) + .where('E', blocks(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.get())) + .build()) + // spotless:on + .workableCasingModel(CosmicCore.id("block/casings/solid/oscillating_gilded_pthanterum_casings"), + CosmicCore.id("block/multiblock/vomahine_chemplant")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/AtmoPump.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/AtmoPump.java new file mode 100644 index 000000000..04fb8b776 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/AtmoPump.java @@ -0,0 +1,99 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.machine.multiblock.behavior.AtmoPumpBehavior; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.common.machine.multiblock.part.RotorHolderPartMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; +import com.gregtechceu.gtceu.api.pattern.predicates.SimplePredicate; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import com.lowdragmc.lowdraglib.utils.BlockInfo; + +import net.minecraft.network.chat.Component; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.COMPUTER_CASING; +// NOTE DO NOT ADD BERS/RENDERS TO THIS YET + +public class AtmoPump { + + public final static MultiblockMachineDefinition ATMO_PUMP = REGISTRATE + .multiblock("atmo_pump", AtmoPumpBehavior::new) + .langValue("§6Atmospheric Siphon") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.ATMOSPHERE_SIPHON) + .appearanceBlock(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING) + .partAppearance((controller, part, side) -> TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.getDefaultState()) + .recipeModifiers( + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AA AA ", " ", " ", " ", " AA AA ", " ", " AA AA ", " ", " ", " ", " AA AA ") + .aisle(" ABCBA ", " BDB ", " BDB ", " BDB ", " ABCBA ", " B B ", " ABCBA ", " BDB ", " BDB ", " BDB ", " ABCBA ") + .aisle(" CCC ", " D D ", " D D ", " D D ", " CCC ", " ", " CCC ", " D D ", " D D ", " D D ", " CCC ") + .aisle(" ABCBA ", " BDB ", " BDB ", " BDB ", " ABCBA ", " B B ", " ABCBA ", " BDB ", " BDB ", " BDB ", " ABCBA ") + .aisle(" AA AA ", " ", " BEB ", " ", " AA AA ", " ", " AA AA ", " ", " BEB ", " ", " AA AA ") + .aisle(" ", " ", " BEB ", " ", " ", " ", " ", " ", " BEB ", " ", " ") + .aisle(" ", " ", " BEB ", " ", " ", " ", " ", " ", " BEB ", " ", " ") + .aisle(" BBBBB ", " B ", " BBB ", " B ", " ", " ", " ", " B ", " BBB ", " B ", " BBBBB ") + .aisle(" BBBBBBB ", " BDEDB ", " BDEDB ", " BDEDB ", " BEEEB ", " BEZEB ", " BEEEB ", " BDEDB ", " BDEDB ", " BDEDB ", " BBGGGBB ") + .aisle("AA AA BBBBBBBBB AA AA", " B B ", " B B ", " B B ", "AA AA B B AA AA", " B B ", "AA AA B B AA AA", " B B ", " B B ", " B B ", "AA AA BBGGBGGBB AA AA") + .aisle("ABCBA BBBBBBBBB ABCBA", " BDB D B B D BDB ", " BDBBBBBD B B DBBBBBDB ", " BDB D B B D BDB ", "ABCBA E B B E ABCBA", " B B E B B E B B ", "ABCBA E B B E ABCBA", " BDB D B B D BDB ", " BDBBBBBD B B DBBBBBDB ", " BDB D B B D BDB ", "ABCBA BGGBBBGGB ABCBA") + .aisle(" CCC BBBBBBBBB CCC ", " D D BE EB D D ", " D DEEEBE EBEEED D ", " D D BE EB D D ", " CCC E E CCC ", " Z Z ", " CCC E E CCC ", " D D BE EB D D ", " D DEEEBE EBEEED D ", " D D BE EB D D ", " CCC BGBBQBBGB CCC ") + .aisle("ABCBA BBBBBBBBB ABCBA", " BDB D B B D BDB ", " BDBBBBBD B B DBBBBBDB ", " BDB D B B D BDB ", "ABCBA E B B E ABCBA", " B B E B B E B B ", "ABCBA E B B E ABCBA", " BDB D B B D BDB ", " BDBBBBBD B B DBBBBBDB ", " BDB D B B D BDB ", "ABCBA BGGBBBGGB ABCBA") + .aisle("AA AA BBBBBBBBB AA AA", " B B ", " B B ", " B B ", "AA AA B B AA AA", " B B ", "AA AA B B AA AA", " B B ", " B B ", " B B ", "AA AA BBGGBGGBB AA AA") + .aisle(" BBBBBBB ", " BDEDB ", " BDEDB ", " BDEDB ", " BEEEB ", " BEZEB ", " BEEEB ", " BDEDB ", " BDEDB ", " BDEDB ", " BBGGGBB ") + .aisle(" BBBBB ", " B ", " BBB ", " B ", " ", " ", " ", " B ", " BBB ", " B ", " BBBBB ") + .aisle(" ", " ", " BEB ", " ", " ", " ", " ", " ", " BEB ", " ", " ") + .aisle(" ", " ", " BEB ", " ", " ", " ", " ", " ", " BEB ", " ", " ") + .aisle(" AA AA ", " ", " BEB ", " ", " AA AA ", " ", " AA AA ", " ", " BEB ", " ", " AA AA ") + .aisle(" ABCBA ", " BDB ", " BDB ", " BDB ", " ABCBA ", " B B ", " ABCBA ", " BDB ", " BDB ", " BDB ", " ABCBA ") + .aisle(" CCC ", " D D ", " D D ", " D D ", " CCC ", " ", " CCC ", " D D ", " D D ", " D D ", " CCC ") + .aisle(" ABCBA ", " BDB ", " BDB ", " BDB ", " ABCBA ", " B B ", " ABCBA ", " BDB ", " BDB ", " BDB ", " ABCBA ") + .aisle(" AA AA ", " ", " ", " ", " AA AA ", " ", " AA AA ", " ", " ", " ", " AA AA ") +.where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('C', blocks(HIGH_TOLERANCE_RHENIUM_CASING.get())) + .where('B', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get())) //.setMinGlobalLimited(28) + .where('D', blocks(CASING_HEAT_VENT.get())) + .where('E', blocks(RESONANTLY_TUNED_VIRTUE_MELD_CASING.get())) + .where('A', blocks(COMPUTER_CASING.get())) + .where('G', blocks(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.get()) + .or(autoAbilities(CosmicRecipeTypes.ATMOSPHERE_SIPHON)) + .or(abilities(PartAbility.IMPORT_FLUIDS,PartAbility.IMPORT_FLUIDS_4X,PartAbility.IMPORT_FLUIDS_9X)) + .or(abilities(PartAbility.EXPORT_ITEMS)) + .or(abilities(PartAbility.INPUT_ENERGY).setExactLimit(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('Z', + new TraceabilityPredicate( + new SimplePredicate( + state -> MetaMachine.getMachine(state.getWorld(), + state.getPos()) instanceof RotorHolderPartMachine rotorHolder && + state.getWorld() + .getBlockState(state.getPos() + .relative(rotorHolder.self().getFrontFacing())) + .isAir(), + () -> PartAbility.ROTOR_HOLDER.getAllBlocks().stream() + .map(BlockInfo::fromBlock).toArray(BlockInfo[]::new))) + .addTooltips(Component.translatable("gtceu.multiblock.pattern.clear_amount_3")) + .setExactLimit(4)) + .build()) + // spotless:on + .workableCasingModel( + CosmicCore.id("block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing"), + CosmicCore.id("block/multiblock/mantle_bore")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/AtomicReconstructor.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/AtomicReconstructor.java new file mode 100644 index 000000000..1bf8e897d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/AtomicReconstructor.java @@ -0,0 +1,68 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.client.renderer.machine.CosmicDynamicRenderHelpers; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.ETHERSTEEL_PLATED_ASH_TILES; +import static com.ghostipedia.cosmiccore.common.data.datagen.CosmicMachineModels.createSeparateControllerCasingMachineModel; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; + +public class AtomicReconstructor { + + public final static MultiblockMachineDefinition ATOMIC_RECONSTRUCTOR = REGISTRATE + .multiblock("atomic_reconstructor", + WorkableElectricMultiblockMachine::new) + .langValue("§6Radbolt Atomic Reconstructor") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.RADBOLT_RECONSTRUCTOR) + .appearanceBlock(ETHERSTEEL_PLATED_ASH_TILES) + .partAppearance((controller, part, side) -> ETHERSTEEL_PLATED_ASH_TILES.getDefaultState()) + .recipeModifiers( + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAAAAAA ", " DAAAAAD ", " DA AD ", " DA AD ", " D D ", " D D ", " D D ", " D D ", " D D ", " DA AD ", " DA AD ", " DAAAAAD ", " AAAAAAA ", " ") + .aisle("AAAAA ADAAADA DDD ", "A A ADDDDDA GGG ", "A A A A DDD ", "A A A A GGG ", "A A DDD ", "A A A ", "A A A ", "A A A ", "A A ", "A A A A ", "AAAAA A A ", " ADDDDDA ", " ADAAADA ", " AAAAA ") + .aisle("AAAAA AAAAAAA DDDDD", " BBB ADDDDDA GFFFG", " BBB C DFFFD", " BBB C GFFFG", " BBB C DD DD", " BBBCCCCC A DAD ", " BBBCCCCC DAAAAAD ", " BBBCCCCC A ", " BBB C ", " BBB C ", "AAAAA C ", " ADDDDDA ", " AAAAAAA ", " AAAAA ") + .aisle("AAAAA AAAAAAA DDDDD", " B B ADDDDDA GF FG", " B B C DF FD", " B B C GF FG", " B B C D D", " B BCCCCC DDDD D ", " B BCCCCC FFFFF D ", " B BCCCCC DDDDDDD ", " B B C ", " B B C ", "AAAAA C ", " ADDDDDA ", " AAAAAAA ", " AAAAA ") + .aisle("AAAAA AAAAAAA DDDDD", " BBB ADDDDDA GFFFG", " BBB C DFFFD", " BBB C GFFFG", " BBB C DD DD", " BBBCCCCC A DAD ", " BBBCCCCC DAAAAAD ", " BBBCCCCC A ", " BBB C ", " BBB C ", "AAAAA C ", " ADDDDDA ", " AAAAAAA ", " AAAAA ") + .aisle("AAAAA ADAAADA DDD ", "A A ADDDDDA GGG ", "A A A A DDD ", "A A A A GGG ", "A A DDD ", "A A A ", "A A A ", "A A A ", "A A ", "A A A A ", "AAAAA A A ", " ADDDDDA ", " ADAAADA ", " AAAAA ") + .aisle(" AAAAAAA ", " DAAQAAD ", " DA AD ", " DA AD ", " D D ", " D D ", " D D ", " D D ", " D D ", " DA AD ", " DA AD ", " DAAAAAD ", " AAAAAAA ", " ") + + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(CosmicBlocks.SOUL_STAINED_STEEL_ALU_CASING.get())) + .where('B', blocks(ETHERSTEEL_PLATED_ASH_TILES.get()) + .or(autoAbilities(CosmicRecipeTypes.VOID_SALT_FISSION)) + .or(abilities(PartAbility.INPUT_ENERGY).setMaxGlobalLimited(2,2)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('C', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get())) + .where('D', blocks(ETHERSTEEL_PLATED_ASH_TILES.get())) + .where('F', blocks(GTBlocks.COIL_CUPRONICKEL.get())) + .where('G', blocks(GTBlocks.CASING_LAMINATED_GLASS.get())) + .build()) + // spotless:on + .model(createSeparateControllerCasingMachineModel( + CosmicCore.id("block/casings/solid/soul_stained_steel_aluminium_plated_casing"), + CosmicCore.id("block/casings/solid/ethersteel_plated_ash_tiles"), + GTCEu.id("block/multiblock/network_switch")) + .andThen(model -> model + .addDynamicRenderer(CosmicDynamicRenderHelpers::createHellfireFoundryPartRender))) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/BioVat.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/BioVat.java new file mode 100644 index 000000000..1296fae2e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/BioVat.java @@ -0,0 +1,55 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility; +import com.ghostipedia.cosmiccore.client.renderer.machine.CosmicDynamicRenderHelpers; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.createWorkableCasingMachineModel; + +public class BioVat { + + public final static MultiblockMachineDefinition BIOVAT = REGISTRATE + .multiblock("biovat", WorkableElectricMultiblockMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.BIOVAT) + .appearanceBlock(REINFORCED_NAQUADRIA_CASING) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("AAAAA", "CCCCC", "CCCCC", "AAAAA") + .aisle("AAAAA", "C C", "C C", "ADDDA") + .aisle("AAAAA", "C C", "C C", "ADDDA") + .aisle("AAAAA", "C C", "C C", "ADDDA") + .aisle("AAQAA", "CCCCC", "CCCCC", "AAAAA") + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('C', blocks(ZBLAN_REINFORCED_GLASS.get())) + .where('D', blocks(RADIOACTIVE_FILTER_CASING.get())) + .where('A', blocks(REINFORCED_NAQUADRIA_CASING.get()) + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS, PartAbility.IMPORT_ITEMS)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setExactLimit(1)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setMaxGlobalLimited(1, 1)) + .or(Predicates.abilities(PartAbility.EXPORT_FLUIDS).setMaxGlobalLimited(1, 1)) + .or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1)) + .or(Predicates.abilities(CosmicPartAbility.STERILIZE_HATCH).setExactLimit(1))) + .build()) + .model( + createWorkableCasingMachineModel( + CosmicCore.id("block/casings/solid/reinforced_naquadria_casing"), + GTCEu.id("block/multiblock/generator/large_gas_turbine")) + .andThen(d -> d.addDynamicRenderer(CosmicDynamicRenderHelpers::getBioVatRenderer))) + .hasBER(true) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/CHITIN.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/CHITIN.java new file mode 100644 index 000000000..781efaa2f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/CHITIN.java @@ -0,0 +1,58 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.CASING_HSSE_STURDY; + +public class CHITIN { + + public final static MultiblockMachineDefinition CHITIN = REGISTRATE + .multiblock("contained_habitat_for_insectoid_tectonic_integration_and_neutralization", + WorkableElectricMultiblockMachine::new) + .langValue("§bKryosyn Cracking Chamber") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.LARGE_ROASTER) + .appearanceBlock(CASING_HSSE_STURDY) + .partAppearance((controller, part, side) -> CASING_HSSE_STURDY.getDefaultState()) + .recipeModifiers( + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAAAA ", " ABBBA ", " AAAAA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ") + .aisle("ACCCCCA", "ACCCCCA", "ACCCCCA", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ") + .aisle("ACCCCCA", "BCCCCCB", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", " CCCCC ") + .aisle("ACCCCCA", "BCCCCCB", "ACCCCCA", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ") + .aisle("ACCCCCA", "BCCCCCB", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", " CCCCC ") + .aisle("ACCCCCA", "ACCCCCA", "ACCCCCA", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ") + .aisle(" AAAAA ", " ABQBA ", " AAAAA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(CosmicBlocks.SOUL_STAINED_STEEL_ALU_CASING.get())) + .where('B', blocks(CASING_HSSE_STURDY.get()) + .or(autoAbilities(CosmicRecipeTypes.MANA_DIGITIZER,CosmicRecipeTypes.MANA_FLUIDIZER)) + .or(abilities(PartAbility.INPUT_ENERGY).setExactLimit(1)) + .or(abilities(PartAbility.PARALLEL_HATCH).setExactLimit(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('A', blocks(GTBlocks.CASING_ALUMINIUM_FROSTPROOF.get())) + .build()) + // spotless:on + .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_sturdy_hsse"), + GTCEu.id("block/overlay/machine/calx_reactor")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/CelestialBore.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/CelestialBore.java new file mode 100644 index 000000000..e40729b3c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/CelestialBore.java @@ -0,0 +1,106 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.multiblock.UniqueWorkableElectricMultiblockMachine; +import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTMaterials; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.util.RelativeDirection.*; + +public class CelestialBore { + + public final static MultiblockMachineDefinition CELESTIAL_BORE = REGISTRATE.multiblock( + "vomahine_celestial_laser_bore", UniqueWorkableElectricMultiblockMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.CELESTIAL_BORE) + .appearanceBlock(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING) + // spotless:off + //If Spotless CORRECTS THIS DO NOT COMMIT IT! ! ! ! ! ! + .pattern(definition -> FactoryBlockPattern.start(RIGHT, BACK, UP) + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " ", " ", " E E ", " ", " ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " LLL ", " LLLLL ", " ELLLLLE ", " LLLLL ", " LLL ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " ", " ", " E E ", " ", " ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " ", " ", " E E ", " ", " ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " ", " ", " E E ", " ", " ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " LLL ", " LLLLL ", " ELLLLLE ", " LLLLL ", " LLL ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " ", " ", " E E ", " ", " ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " ", " ", " E E ", " ", " ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " ", " ", " E E ", " ", " ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " LLL ", " LLLLL ", " ELLLLLE ", " LLLLL ", " LLL ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " ", " ", " E E ", " ", " ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " ", " ", " E E ", " ", " ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " ", " ", " E E ", " ", " ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " LLL ", " LLLLL ", " ELLLLLE ", " LLLLL ", " LLL ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " ", " ", " E E ", " ", " ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " E ", " ", " ", " EE EE ", " ", " ", " E ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " ", " ", " ", " E E ", " ", " ", " ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " ", " LLL ", " LLLLL ", " E LLLLL E ", " LLLLL ", " LLL ", " ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " ", " ", " ", " E E ", " ", " ", " ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " ", " ", " ", " E E ", " ", " ", " ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " ", " ", " ", " E E ", " ", " ", " ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " JKKKJ ", " KLLLK ", " JKLLLLLKJ ", " KLLLLLLLK ", " EKLLLLLLLKE ", " KLLLLLLLK ", " JKLLLLLKJ ", " KLLLK ", " JKKKJ ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " J J ", " ", " J J ", " ", " E E ", " ", " J J ", " ", " J J ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " J J ", " ", " J J ", " ", " E E ", " ", " J J ", " ", " J J ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " J J ", " ", " J J ", " ", " E E ", " ", " J J ", " ", " J J ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " JKKKJ ", " KLLLK ", " JKLLLLLKJ ", " KLLLLLLLK ", " EKLLLLLLLKE ", " KLLLLLLLK ", " JKLLLLLKJ ", " KLLLK ", " JKKKJ ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " J J ", " ", " J J ", " ", " E E ", " ", " J J ", " ", " J J ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " J J ", " ", " J J ", " ", " E E ", " ", " J J ", " ", " J J ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " J J ", " ", " J J ", " ", " E E ", " ", " J J ", " ", " J J ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " JKKKJ ", " KLLLK ", " JKLLLLLKJ ", " KLLLLLLLK ", " KLLLLLLLK ", " KLLLLLLLK ", " JKLLLLLKJ ", " KLLLK ", " JKKKJ ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " J J ", " ", " J J ", " ", " E E ", " ", " J J ", " ", " J J ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " J J ", " ", " J K K J ", " ", " E E ", " ", " J K K J ", " ", " J J ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " J J ", " ", " J K K J ", " ", " E E ", " ", " J K K J ", " ", " J J ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " J J ", " K K ", " J K K J ", " K K ", " E N E ", " K K ", " J K K J ", " K K ", " J J ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" A A ", " A A ", " AAAAAAAAA ", " A D A ", " ADDDA ", " A D A ", " AAAAAAAAA ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " A A J J A A ", " A A K K A A ", "AAAAAAAAA J KM MK J AAAAAAAAA", " A D A KM MK A D A ", " ADDDA E N E ADDDA ", " A D A KM MK A D A ", "AAAAAAAAA J KM MK J AAAAAAAAA", " A A K K A A ", " A A J J A A ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " A A ", " A A ", " AAAAAAAAA ", " A D A ", " ADDDA ", " A D A ", " AAAAAAAAA ", " A A ", " A A ") + .aisle(" ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " ABBBA JGGGJ ABBBA ", " BB BB GGKMKGG BB BB ", "AB BA JGKM MKGJ AB BA", "B B GKM MKG B B", "B B EGM N MGE B B", "B B GKM MKG B B", "AB BA JGKM MKGJ AB BA", " BB BB GGKMKGG BB BB ", " ABBBA JGGGJ ABBBA ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ") + .aisle(" ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E ", " ABBBA GGG ABBBA ", " BB BB GGKMKGG BB BB ", "AB BA GKM MKG AB BA", "B B GKM MKG B B", "B B EGM N MGE B B", "B B GKM MKG B B", "AB BA GKM MKG AB BA", " BB BB GGKMKGG BB BB ", " ABBBA GGG ABBBA ", " E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ") + .aisle(" ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ABBBA GGG ABBBA ", " BB BB GGKMKGG BB BB ", "AB BA GKM MKG AB BA", "B BCCCCCCCC GKM MKG CCCCCCCCB B", "B B GM N MG B B", "B BCCCCCCCC GKM MKG CCCCCCCCB B", "AB BA GKM MKG AB BA", " BB BB GGKMKGG BB BB ", " ABBBA GGG ABBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ") + .aisle(" ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ", " E ", " E ", " E ", " E ", " E ", " E ", " E ", " CEC ", " E ", " GGGGG ", " GG GG ", " G G ", " G FFFFF G ", " GFGGGGGGGGGFG ", " GGGGGGGGGGGGG ", " GGG GGG ", " GGG GGG ", " GFGG GGFG ", " ABBBA G GG GGG GG G ABBBA ", " BB BB G GG GGKMKGG GG G BB BB ", "AB BA GG GFG GKM MKG GFG GG AB BA", "B B C G GFG GKM N MKG GFG G C B B", "B BEEEEEEEEEG GFG GM NNN MG GFG GEEEEEEEEEB B", "B B C G GFG GKM N MKG GFG G C B B", "AB BA GG GFG GKM MKG GFG GG AB BA", " BB BB G GG GGKMKGG GG G BB BB ", " ABBBA G GG GGG GG G ABBBA ", " GFGG GGFG ", " GGG GGG ", " GGG GGG ", " GGGGGGGGGGGGG ", " GFGGGGGGGGGFG ", " G FFFFF G ", " G G ", " GG GG ", " GGGGG ", " E ", " CEC ", " E ", " E ", " E ", " E ", " E ", " E ", " E ", " ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ") + .aisle(" ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ", " F ", " F ", " F ", " F ", " F ", " F ", " F ", " C C ", " ", " GGGGG ", " GG GG ", " G GGGGG G ", " GGG GGG ", " G G ", " GG GG ", " G G ", " G G ", " G G ", " ABBBA GG GGG GG ABBBA ", " BB BB G G GGKMKGG G G BB BB ", "AB BA GGG GKM MKG GGG AB BA", "B B C G G GKM N MKG G G C B B", "B BFFFFFFF G G GM NNN MG G G FFFFFFFB B", "B B C G G GKM N MKG G G C B B", "AB BA GGG GKM MKG GGG AB BA", " BB BB G G GGKMKGG G G BB BB ", " ABBBA GG GGG GG ABBBA ", " G G ", " G G ", " G G ", " GG GG ", " G G ", " GGG GGG ", " G GGGGG G ", " GG GG ", " GGGGG ", " ", " C C ", " F ", " F ", " F ", " F ", " F ", " F ", " F ", " ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ") + .aisle(" ACCCA ", " CC CC ", " AC CA ", " C C ", " C C ", " C C ", " AC CA ", " CC CC ", " ACCCA ", " CFDFC ", " CFDFC ", " CFDFC ", " CFDFC ", " CFDFC ", " CFDFC ", " CFDFC ", " GGGGGGG ", " GGGHHHHHHHGGG ", " GGHHHHHHHHHHHHHGG ", " GGHHHHGGGGGGGHHHHGG ", " GHHHHGGG GGGHHHHG ", " GHHHGG GGHHHG ", " GHHHGG GGHHHG ", " GGHHG GHHGG ", " GHHGG GGHHG ", " GHHHG GHHHG ", " GHHG GHHG ", " ACCCA GHHG GGG GHHG ACCCA ", " CC CC GHHGG GGKMKGG GGHHG CC CC ", "AC CACCCCCCCGHHG GKM MKG GHHGCCCCCCCAC CA", "C CFFFFFFFGHHG GKM N MKG GHHGFFFFFFFC C", "C CDDDDDDDGHHG GM NNN MG GHHGDDDDDDDC C", "C CFFFFFFFGHHG GKM N MKG GHHGFFFFFFFC C", "AC CACCCCCCCGHHG GKM MKG GHHGCCCCCCCAC CA", " CC CC GHHGG GGKMKGG GGHHG CC CC ", " ACCCA GHHG GGG GHHG ACCCA ", " GHHG GHHG ", " GHHHG GHHHG ", " GHHGG GGHHG ", " GGHHG GHHGG ", " GHHHGG GGHHHG ", " GHHHGG GGHHHG ", " GHHHHGGG GGGHHHHG ", " GGHHHHGGGGGGGHHHHGG ", " GGHHHHHHHHHHHHHGG ", " GGGHHHHHHHGGG ", " GGGGGGG ", " CFDFC ", " CFDFC ", " CFDFC ", " CFDFC ", " CFDFC ", " CFDFC ", " CFDFC ", " ACCCA ", " CC CC ", " AC CA ", " C C ", " C C ", " C C ", " AC CA ", " CC CC ", " ACCCA ") + .aisle(" ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ", " F ", " F ", " F ", " F ", " F ", " F ", " F ", " GGCGCGG ", " GGG C GGG ", " GG C GG ", " GG C GG ", " G C G ", " G C G ", " G C G ", " GG C GG ", " G C G ", " G C G ", " G C G ", " ABBBA G GGG G ABBBA ", " BB BB G GGKMKGG G BB BB ", "AB BA G GKM MKG G AB BA", "B B C GKM N MKG C B B", "B BFFFFFFFGCCCCCCCCCCGM NNN MGCCCCCCCCCC FFFFFFFB B", "B B C GKM N MKG C B B", "AB BA G GKM MKG G AB BA", " BB BB G GGKMKGG G BB BB ", " ABBBA G GGG G ABBBA ", " G C G ", " G C G ", " G C G ", " GG C GG ", " G C G ", " G C G ", " G C G ", " GG C GG ", " GG C GG ", " GGG C GGG ", " GGCGCGG ", " F ", " F ", " F ", " F ", " F ", " F ", " F ", " ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ") + .aisle(" ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ", " E ", " E ", " E ", " E ", " E ", " GGGEGGG ", " GGGGGGEGGGGGG ", " GGGGG CEC GGGGG ", " GGGG EIE GGGG ", " GGG EIE GGG ", " GGG EIE GGG ", " GGG EIE GGG ", " GGG EIE GGG ", " GG EIE GG ", " GG EIE GG ", " GG EIE GG ", " GG EIE GG ", " GG EIE GG ", " ABBBA GG AGA GG ABBBA ", " BB BB GG GGKMKGG GG BB BB ", "AB BA GG GKM MKG GG AB BA", "B B GGCEEEEEEEEEEAKM N MKAEEEEEEEEEECGG B B", "B BEEEEEEEEIIIIIIIIIIGM NNN MGIIIIIIIIIIEEEEEEEEB B", "B B GGCEEEEEEEEEEAKM N MKAEEEEEEEEEECGG B B", "AB BA GG GKM MKG GG AB BA", " BB BB GG GGKMKGG GG BB BB ", " ABBBA GG AGA GG ABBBA ", " GG EIE GG ", " GG EIE GG ", " GG EIE GG ", " GG EIE GG ", " GG EIE GG ", " GGG EIE GGG ", " GGG EIE GGG ", " GGG EIE GGG ", " GGG EIE GGG ", " GGGG EIE GGGG ", " GGGGG CEC GGGGG ", " GGGGGGEGGGGGG ", " GGGEGGG ", " E ", " E ", " E ", " E ", " E ", " ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ") + .aisle(" ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " ABBBA GGG ABBBA ", " BB BB GGKMKGG BB BB ", "AB BA GKM MKG AB BA", "B BCCCCCCCC GKM N MKG CCCCCCCCB B", "B B CCCCCCCCCCGM NNN MGCCCCCCCCCC B B", "B BCCCCCCCC GKM N MKG CCCCCCCCB B", "AB BA GKM MKG AB BA", " BB BB GGKMKGG BB BB ", " ABBBA GGG ABBBA ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ") + .aisle(" ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ABBBA GGG ABBBA ", " BB BB GGKMKGG BB BB ", "AB BA GKM MKG AB BA", "B B GKM N MKG B B", "B B GM NNN MG B B", "B B GKM N MKG B B", "AB BA GKM MKG AB BA", " BB BB GGKMKGG BB BB ", " ABBBA GGG ABBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ") + .aisle(" ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ABBBA GGG ABBBA ", " BB BB GGKMKGG BB BB ", "AB BA GKM MKG AB BA", "B B GKM N MKG B B", "B B GM NNN MG B B", "B B GKM N MKG B B", "AB BA GKM MKG AB BA", " BB BB GGKMKGG BB BB ", " ABBBA GGG ABBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ") + .aisle(" ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ABBBA ABBBA ", " BB BB NNNNN BB BB ", "AB BA NNNNNNN AB BA", "B B NNNNNNN B B", "B B NNNQNNN B B", "B B NNNNNNN B B", "AB BA NNNNNNN AB BA", " BB BB NNNNN BB BB ", " ABBBA ABBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ABBBA ", " BB BB ", " AB BA ", " B B ", " B B ", " B B ", " AB BA ", " BB BB ", " ABBBA ") + .aisle(" A A ", " A A ", " AAAAAAAAA ", " A D A ", " ADDDA ", " A D A ", " AAAAAAAAA ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " A A A A ", " A A A A ", "AAAAAAAAA AAAAAAAAA", " A D A A D A ", " ADDDA ADDDA ", " A D A A D A ", "AAAAAAAAA AAAAAAAAA", " A A A A ", " A A A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " A A ", " A A ", " AAAAAAAAA ", " A D A ", " ADDDA ", " A D A ", " AAAAAAAAA ", " A A ", " A A ") + // spotless:on + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('A', blocks(SELF_HEALING_PTHANTERUM.get())) + .where('B', blocks(HIGH_TOLERANCE_RHENIUM_CASING.get())) + .where('C', blocks(NAQUADAH_PRESSURE_RESISTANT_CASING.get())) + .where('D', blocks(RESONANTLY_TUNED_VIRTUE_MELD_CASING.get())) + .where('E', frames(CosmicMaterials.Trinavine)) + .where('F', blocks(ULTRA_POWERED_CASING.get())) + .where('G', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get())) + .where('H', blocks(HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.get())) + .where('I', blocks(GTBlocks.BATTERY_LAPOTRONIC_ZPM.get())) + .where('J', frames(GTMaterials.Neutronium)) + .where('K', blocks(MAGNET_STELLAR_GRADE.get())) + .where('L', blocks(GTBlocks.FUSION_GLASS.get())) + .where('M', blocks(MAGNET_STELLAR_GRADE.get())) + .where('N', blocks(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.get()) + .or(autoAbilities(CosmicRecipeTypes.CELESTIAL_BORE)) + .or(abilities(PartAbility.IMPORT_FLUIDS)) + .or(abilities(PartAbility.EXPORT_ITEMS, PartAbility.IMPORT_ITEMS)) + .or(abilities(PartAbility.INPUT_ENERGY).setExactLimit(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing"), + CosmicCore.id("block/multiblock/mantle_bore")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ChromaticDistillery.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ChromaticDistillery.java new file mode 100644 index 000000000..b942e1712 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ChromaticDistillery.java @@ -0,0 +1,54 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.util.RelativeDirection.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.CASING_STAINLESS_CLEAN; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; + +public class ChromaticDistillery { + + public final static MultiblockMachineDefinition CHROMATIC_DISTILLATION_PLANT = REGISTRATE + .multiblock("chromatic_distillation_plant", WorkableElectricMultiblockMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.CHROMATIC_DISTILLATION_PLANT) + .recipeModifiers(ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK), + GTRecipeModifiers.PARALLEL_HATCH, GTRecipeModifiers.BATCH_MODE) + .appearanceBlock(GTBlocks.CASING_STAINLESS_CLEAN) + .pattern(definition -> FactoryBlockPattern.start(RIGHT, BACK, UP) + .aisle(" BCB ", "BBBBB", "BBBBB", "BBBBB", " BBB ") + .aisle(" A A ", "AGPGA", "APGPA", "AGPGA", " A A ").setRepeatable(1, 15) + .aisle(" AAA ", "AAAAA", "AAAAA", "AAAAA", " AAA ") + .where(' ', any()) + .where("C", controller(blocks(definition.getBlock()))) + .where('G', blocks(CASING_TEMPERED_GLASS.get())) + .where('P', blocks(CASING_TITANIUM_PIPE.get())) + .where('B', blocks(CASING_STAINLESS_CLEAN.get()) + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) + .setMaxGlobalLimited(2)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setExactLimit(1))) + .where('A', blocks(CASING_STAINLESS_CLEAN.get()) + .or(Predicates.abilities(PartAbility.EXPORT_FLUIDS_1X).setMinLayerLimited(1) + .setMaxLayerLimited(1))) + .build()) + .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_clean_stainless_steel"), + GTCEu.id("block/multiblock/generator/large_gas_turbine")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ChromaticFlotationPlant.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ChromaticFlotationPlant.java new file mode 100644 index 000000000..a2f6a0107 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ChromaticFlotationPlant.java @@ -0,0 +1,67 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GCYMBlocks; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import net.minecraft.world.level.block.Blocks; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.util.RelativeDirection.*; +import static com.gregtechceu.gtceu.common.data.GCYMBlocks.CASING_CORROSION_PROOF; +import static com.gregtechceu.gtceu.common.data.GCYMBlocks.CASING_WATERTIGHT; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; + +public class ChromaticFlotationPlant { + + public final static MultiblockMachineDefinition CHROMATIC_FLOTATION_PLANT = REGISTRATE + .multiblock("chromatic_flotation_plant", WorkableElectricMultiblockMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.CHROMATIC_FLOTATION_PLANT) + .recipeModifiers(ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK), + GTRecipeModifiers.PARALLEL_HATCH, GTRecipeModifiers.BATCH_MODE) + .appearanceBlock(GCYMBlocks.CASING_WATERTIGHT) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("AAAAAAA", "AAAAAAA", "AAAAAAA", "AAAAAAA", "AAAAAAA") + .aisle("AAAAAAA", "ABCBCBA", "ABBBBBA", "ABBBBBA", "ABBBBBA") + .aisle("AAAAAAA", "ABCBCBA", "ABBBBBA", "ABBBBBA", "ABBBBBA") + .aisle("AAAAAAA", "ABCBCBA", "ABBBBBA", "ABBBBBA", "ABBBBBA") + .aisle("AAAAAAA", "ABCBCBA", "ABBBBBA", "ABBBBBA", "ABBBBBA") + .aisle("AAAAAAA", "AACACAA", "AAAAAAA", "AAAAAAA", "AAAAAAA") + .aisle(" ", " C C ", " ", " ", " ") + .aisle(" DDDDD ", " DCDCD ", " DDDDD ", " ", " ") + .aisle(" DDDDD ", " DEEED ", " DDDDD ", " ", " ") + .aisle(" DDDDD ", " DEEED ", " DDDDD ", " ", " ") + .aisle(" DDDDD ", " DDFDD ", " DDDDD ", " ", " ") + .aisle(" ", " ", " ", " ", " ") + .where(' ', any()) + .where("F", controller(blocks(definition.getBlock()))) + .where('C', blocks(CASING_TUNGSTENSTEEL_PIPE.get())) + .where('A', blocks(CASING_CORROSION_PROOF.get())) + .where('E', blocks(CASING_STEEL_SOLID.get())) + .where('B', blocks(Blocks.WATER)) + .where('D', blocks(CASING_WATERTIGHT.get()) + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.EXPORT_FLUIDS).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) + .setMaxGlobalLimited(2)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setExactLimit(1)) + .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setExactLimit(1))) + .build()) + .workableCasingModel(GTCEu.id("block/casings/gcym/watertight_casing"), + GTCEu.id("block/multiblock/generator/large_gas_turbine")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/CinderHearth.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/CinderHearth.java new file mode 100644 index 000000000..29f55b267 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/CinderHearth.java @@ -0,0 +1,56 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.RegressionPersistentWorkableElectricMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; + + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.EXPORT_EMBER; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; + +public class CinderHearth { + + public final static MultiblockMachineDefinition CINDER_HEARTH = REGISTRATE + .multiblock("cinder_hearth", RegressionPersistentWorkableElectricMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.CINDER_HEARTH) + .appearanceBlock(CosmicBlocks.LIGHT_DAWNSTONE_CASING) + .partAppearance((controller, part, side) -> CosmicBlocks.LIGHT_DAWNSTONE_CASING.get().defaultBlockState()) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("AAAAAAAAAA", "A A A", "A A A", "A A A", "AAAAAAAAAA", " ", + " ") + .aisle("ADDDAAAAAA", " D DCCCCC ", " D DCCCCC ", " D DCCCCC ", "AD DA A", " D D ", + " DDD ") + .aisle("ADDDAAAAAA", " F CCCCC ", " F CCCC ", " F CCCCC ", "A F A A", " F ", + " DDD ") + .aisle("ADDDAAAAAA", " D DCBBBB ", " D DCCCCC ", " D DCBBBB ", "AD DA A", " D D ", + " DDD ") + .aisle("AAQAA A", "A A A", "A A A", "A A A", "AAAAA A", " ", + " ") + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('A', blocks(CosmicBlocks.REINFORCED_DAWNSTONE_CASING.get()) + .or(abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setExactLimit(1))) + .where('B', + abilities(EXPORT_EMBER).setPreviewCount(8).or(blocks(CosmicBlocks.LIGHT_DAWNSTONE_CASING.get()))) + .where('C', blocks(CosmicBlocks.LIGHT_DAWNSTONE_CASING.get())) + .where('D', blocks(CosmicBlocks.REINFORCED_DAWNSTONE_CASING.get())) + .where('F', blocks(CosmicBlocks.LIGHT_DAWNSTONE_CASING.get())) + // + .build()) + .workableCasingModel(CosmicCore.id("block/embers/archaic_large_bricks"), + CosmicCore.id("block/multiblock/dawnforge")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ComponentAssemblyLine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ComponentAssemblyLine.java new file mode 100644 index 000000000..52a3322b7 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ComponentAssemblyLine.java @@ -0,0 +1,118 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; + +public class ComponentAssemblyLine { + + public final static MultiblockMachineDefinition COMPONENT_ASSEMBLY_LINE = REGISTRATE + .multiblock("component_assembly_line", + WorkableElectricMultiblockMachine::new) + .langValue("§aComponent Assembly Line") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.COMPONENT_ASSEMBLY_LINE) + .appearanceBlock(BICHROMAL_NEVRAMITE_CASING) + .partAppearance((controller, part, side) -> BICHROMAL_NEVRAMITE_CASING.getDefaultState()) + .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start(RelativeDirection.LEFT,RelativeDirection.UP,RelativeDirection.FRONT) + .aisle(" AAAAA IIIIIII AAAAA ", " AAAAA IIIIIII AAAAA ", " AAAAA IIIIIII AAAAA ", " AAAAA IIIIIII AAAAA ", " AAAAA IIIIIII AAAAA ", " A A IIIII A A ", " A A A A ", " A A A A ", " A A A A ", " A AA AA A ", " A AA AA A ", " AAAAAAAA AAAAAAAA ", " AAAAAAAAAAA AAAAAAAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAA AAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAA CKKKKKC AAAAA ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " ACCCA ACCCA ", " D D D D ", " E E E E ", " D D D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAAFFFFFCKKKKKCFFFFFAAAAA ", " F F ", " F F ", " F F ", " F F ", " F F ", " F H F ", " ACCCA HH ACCCA ", " D D H D D ", " E E H E E ", " D D H D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAA CKKKKKC AAAAA ", " B B ", " B B ", " B B ", " B I I B ", " B III B ", " B I B ", " ACCCA ACCCA ", " D D D D ", " E E E E ", " D D D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAAFFFFFCKKKKKCFFFFFAAAAA ", " F F ", " F F ", " F F ", " F F ", " F F ", " F H F ", " ACCCA HH ACCCA ", " D D H D D ", " E E H E E ", " D D H D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAA CKKKKKC AAAAA ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " ACCCA ACCCA ", " D D D D ", " E E E E ", " D D D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" AAAAA AAAAA ", " AAAAA AAAAA ", " AAAAADDDDDDDDDDDDDDDDDAAAAA ", " AAAAA CCCCC AAAAA ", " AAAAA CKKKKKC AAAAA ", " A A A A ", " A A A A ", " A A A A ", " A A A A ", " A A A A ", " A A A A ", " AAAAA AAAAA ", " AAAAA AAAAA ", " AAAAADDDDDDDDDDDDDDDDDAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAA AAAAA ", " ", " ", " ") + .aisle(" ", " FF FF ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " F CCCCC F ", " CKKKKKC ", " ", " ", " ", " ", " ", " ", " ", " F F ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " FFFFFFFFFFFFFFFFFFFFFFF ", " ", " ", " ", " ") + .aisle(" ", " FF FF ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " F CCCCC F ", " CKKKKKC ", " ", " ", " ", " ", " ", " ", " ", " F F ", " FBDDD DDDBF ", " FFFFGGGGGGGGGGGGGGGFFFF ", " ", " ", " ", " ") + .aisle(" ", " FF FF ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " F CCCCC F ", " CKKKKKC ", " ", " ", " ", " ", " ", " ", " ", " F F ", " FBDD DDBF ", " FFFGGGGGGGGGGGGGGGGGFFF ", " ", " ", " ", " ") + .aisle("AAA AAA", "A A FF FF A A", "A AFBDDDDDDDDDDDDDDDDDDDDDBFA A", "A AF CCCCC FA A", "A A CKKKKKC A A", "A A A A", "A A A A", "A A A A", "A A A A", "A A A A", "A A A A", "A A A A", "A AF FA A", "A AFBDD DDBFA A", "A A FFFGGGGGGGGGGGGGGGGGFFF A A", "A A AAA AAA A A", "A AAA A A AAA A", "A A A A", "AAAAAAA AAAAAAA") + .aisle("AAA AAA", " B FF FF B ", " B FBDDDDDDDDDDDDDDDDDDDDDBF B ", " B F CCCCC F B ", " B CKKKKKC B ", " B B ", " B B ", " B B ", " B B ", " B B ", " B B ", " B B ", " B F F B ", " B FBDD DDBF B ", " B FFFGGGGGGGGGGGGGGGGGFFF B ", " B AAA AAA B ", " B B B B ", " BBBBB BBBBB ", "AAA A A AAA") + .aisle("AAA AAA", "A A FF FF A A", "A AFBDDDDDDDDDDDDDDDDDDDDDBFA A", "A AF CCCCC FA A", "A A CKKKKKC A A", "A A A A", "A A A A", "A A A A", "A A A A", "A A A A", "A A A A", "A A A A", "A AF FA A", "A AFBDD DDBFA A", "A A FFFGGGGGGGGGGGGGGGGGFFF A A", "A A AAA AAA A A", "A AAA A A AAA A", "A A A A", "AAAAAAA AAAAAAA") + .aisle(" ", " FF FF ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " F CCCCC F ", " CKKKKKC ", " ", " ", " ", " ", " ", " ", " ", " F F ", " FBDD DDBF ", " FFFGGGGGGGGGGGGGGGGGFFF ", " ", " ", " ", " ") + .aisle(" ", " FF FF ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " F CCCCC F ", " CKKKKKC ", " ", " ", " ", " ", " ", " ", " ", " F F ", " FBDDD DDDBF ", " FFFFGGGGGGGGGGGGGGGFFFF ", " ", " ", " ", " ") + .aisle(" ", " FF FF ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " F CCCCC F ", " CKKKKKC ", " ", " ", " ", " ", " ", " ", " ", " F F ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " FFFFFFFFFFFFFFFFFFFFFFF ", " ", " ", " ", " ") + .aisle(" AAAAA AAAAA ", " AAAAA AAAAA ", " AAAAADDDDDDDDDDDDDDDDDAAAAA ", " AAAAA CCCCC AAAAA ", " AAAAA CKKKKKC AAAAA ", " A A A A ", " A A A A ", " A A A A ", " A A A A ", " A A A A ", " A A A A ", " AAAAA AAAAA ", " AAAAA AAAAA ", " AAAAADDDDDDDDDDDDDDDDDAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAA AAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAA CKKKKKC AAAAA ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " ACCCA ACCCA ", " D D D D ", " E E E E ", " D D D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAAFFFFFCKKKKKCFFFFFAAAAA ", " F F ", " F F ", " F H F ", " F H F ", " F H F ", " F H F ", " ACCCA H ACCCA ", " D D H D D ", " E E H E E ", " D D H D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAA CKKKKKC AAAAA ", " B B ", " B II B ", " B II B ", " B II B ", " B B ", " B B ", " ACCCA ACCCA ", " D D D D ", " E E E E ", " D D D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAAFFFFFCKKKKKCFFFFFAAAAA ", " F F ", " F F ", " F H F ", " F H F ", " F H F ", " F H F ", " ACCCA H ACCCA ", " D D H D D ", " E E H E E ", " D D H D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAA CKKKKKC AAAAA ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " ACCCA ACCCA ", " D D D D ", " E E E E ", " D D D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" AAAAA AAAAA ", " AAAAA AAAAA ", " AAAAADDDDDDDDDDDDDDDDDAAAAA ", " AAAAA CCCCC AAAAA ", " AAAAA CKKKKKC AAAAA ", " A A A A ", " A A A A ", " A A A A ", " A A A A ", " A A A A ", " A A A A ", " AAAAA AAAAA ", " AAAAA AAAAA ", " AAAAADDDDDDDDDDDDDDDDDAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAA AAAAA ", " ", " ", " ") + .aisle(" ", " FF FF ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " F CCCCC F ", " CKKKKKC ", " ", " ", " ", " ", " ", " ", " ", " F F ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " FFFFFFFFFFFFFFFFFFFFFFF ", " ", " ", " ", " ") + .aisle(" ", " FF FF ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " F CCCCC F ", " CKKKKKC ", " ", " ", " ", " ", " ", " ", " ", " F F ", " FBDDD DDDBF ", " FFFFGGGGGGGGGGGGGGGFFFF ", " ", " ", " ", " ") + .aisle(" ", " FF FF ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " F CCCCC F ", " CKKKKKC ", " ", " ", " ", " ", " ", " ", " ", " F F ", " FBDD DDBF ", " FFFGGGGGGGGGGGGGGGGGFFF ", " ", " ", " ", " ") + .aisle("AAA AAA", "A A FF FF A A", "A AFBDDDDDDDDDDDDDDDDDDDDDBFA A", "A AF CCCCC FA A", "A A CKKKKKC A A", "A A A A", "A A A A", "A A A A", "A A A A", "A A A A", "A A A A", "A A A A", "A AF FA A", "A AFBDD DDBFA A", "A A FFFGGGGGGGGGGGGGGGGGFFF A A", "A A AAA AAA A A", "A AAA A A AAA A", "A A A A", "AAAAAAA AAAAAAA") + .aisle("AAA AAA", " B FF FF B ", " B FBDDDDDDDDDDDDDDDDDDDDDBF B ", " B F CCCCC F B ", " B CKKKKKC B ", " B B ", " B B ", " B B ", " B B ", " B B ", " B B ", " B B ", " B F F B ", " B FBDD DDBF B ", " B FFFGGGGGGGGGGGGGGGGGFFF B ", " B AAA AAA B ", " B B B B ", " BBBBB BBBBB ", "AAA A A AAA") + .aisle("AAA AAA", "A A FF FF A A", "A AFBDDDDDDDDDDDDDDDDDDDDDBFA A", "A AF CCCCC FA A", "A A CKKKKKC A A", "A A A A", "A A A A", "A A A A", "A A A A", "A A A A", "A A A A", "A A A A", "A AF FA A", "A AFBDD DDBFA A", "A A FFFGGGGGGGGGGGGGGGGGFFF A A", "A A AAA AAA A A", "A AAA A A AAA A", "A A A A", "AAAAAAA AAAAAAA") + .aisle(" ", " FF FF ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " F CCCCC F ", " CKKKKKC ", " ", " ", " ", " ", " ", " ", " ", " F F ", " FBDD DDBF ", " FFFGGGGGGGGGGGGGGGGGFFF ", " ", " ", " ", " ") + .aisle(" ", " FF FF ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " F CCCCC F ", " CKKKKKC ", " ", " ", " ", " ", " ", " ", " ", " F F ", " FBDDD DDDBF ", " FFFFGGGGGGGGGGGGGGGFFFF ", " ", " ", " ", " ") + .aisle(" ", " FF FF ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " F CCCCC F ", " CKKKKKC ", " ", " ", " ", " ", " ", " ", " ", " F F ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " FFFFFFFFFFFFFFFFFFFFFFF ", " ", " ", " ", " ") + .aisle(" AAAAA AAAAA ", " AAAAA AAAAA ", " AAAAADDDDDDDDDDDDDDDDDAAAAA ", " AAAAA CCCCC AAAAA ", " AAAAA CKKKKKC AAAAA ", " A A A A ", " A A A A ", " A A A A ", " A A A A ", " A A A A ", " A A A A ", " AAAAA AAAAA ", " AAAAA AAAAA ", " AAAAADDDDDDDDDDDDDDDDDAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAA AAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAA CKKKKKC AAAAA ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " ACCCA ACCCA ", " D D D D ", " E E E E ", " D D D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAAFFFFFCKKKKKCFFFFFAAAAA ", " F F ", " F F ", " F F ", " F H F ", " F HIH F ", " F H F ", " ACCCA HH ACCCA ", " D D H D D ", " E E H E E ", " D D H D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAA CKKKKKC AAAAA ", " B B ", " B B ", " B L B ", " B I B ", " B I B ", " B B ", " ACCCA ACCCA ", " D D D D ", " E E E E ", " D D D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAAFFFFFCKKKKKCFFFFFAAAAA ", " F F ", " F F ", " F F ", " F H F ", " F HIH F ", " F H F ", " ACCCA HH ACCCA ", " D D H D D ", " E E H E E ", " D D H D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAA CKKKKKC AAAAA ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " ACCCA ACCCA ", " D D D D ", " E E E E ", " D D D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" AAAAA AAAAA ", " AAAAA AAAAA ", " AAAAADDDDDDDDDDDDDDDDDAAAAA ", " AAAAA CCCCC AAAAA ", " AAAAA CKKKKKC AAAAA ", " A A A A ", " A A A A ", " A A A A ", " A A A A ", " A A A A ", " A A A A ", " AAAAA AAAAA ", " AAAAA AAAAA ", " AAAAADDDDDDDDDDDDDDDDDAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAA AAAAA ", " ", " ", " ") + .aisle(" ", " FF FF ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " F CCCCC F ", " CKKKKKC ", " ", " ", " ", " ", " ", " ", " ", " F F ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " FFFFFFFFFFFFFFFFFFFFFFF ", " ", " ", " ", " ") + .aisle(" ", " FF FF ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " F CCCCC F ", " CKKKKKC ", " ", " ", " ", " ", " ", " ", " ", " F F ", " FBDDD DDDBF ", " FFFFGGGGGGGGGGGGGGGFFFF ", " ", " ", " ", " ") + .aisle(" ", " FF FF ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " F CCCCC F ", " CKKKKKC ", " ", " ", " ", " ", " ", " ", " ", " F F ", " FBDD DDBF ", " FFFGGGGGGGGGGGGGGGGGFFF ", " ", " ", " ", " ") + .aisle("AAA AAA", "A A FF FF A A", "A AFBDDDDDDDDDDDDDDDDDDDDDBFA A", "A AF CCCCC FA A", "A A CKKKKKC A A", "A A A A", "A A A A", "A A A A", "A A A A", "A A A A", "A A A A", "A A A A", "A AF FA A", "A AFBDD DDBFA A", "A A FFFGGGGGGGGGGGGGGGGGFFF A A", "A A AAA AAA A A", "A AAA A A AAA A", "A A A A", "AAAAAAA AAAAAAA") + .aisle("AAA AAA", " B FF FF B ", " B FBDDDDDDDDDDDDDDDDDDDDDBF B ", " B F CCCCC F B ", " B CKKKKKC B ", " B B ", " B B ", " B B ", " B B ", " B B ", " B B ", " B B ", " B F F B ", " B FBDD DDBF B ", " B FFFGGGGGGGGGGGGGGGGGFFF B ", " B AAA AAA B ", " B B B B ", " BBBBB BBBBB ", "AAA A A AAA") + .aisle("AAA AAA", "A A FF FF A A", "A AFBDDDDDDDDDDDDDDDDDDDDDBFA A", "A AF CCCCC FA A", "A A CKKKKKC A A", "A A A A", "A A A A", "A A A A", "A A A A", "A A A A", "A A A A", "A A A A", "A AF FA A", "A AFBDD DDBFA A", "A A FFFGGGGGGGGGGGGGGGGGFFF A A", "A A AAA AAA A A", "A AAA A A AAA A", "A A A A", "AAAAAAA AAAAAAA") + .aisle(" ", " FF FF ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " F CCCCC F ", " CKKKKKC ", " ", " ", " ", " ", " ", " ", " ", " F F ", " FBDD DDBF ", " FFFGGGGGGGGGGGGGGGGGFFF ", " ", " ", " ", " ") + .aisle(" ", " FF FF ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " F CCCCC F ", " CKKKKKC ", " ", " ", " ", " ", " ", " ", " ", " F F ", " FBDDD DDDBF ", " FFFFGGGGGGGGGGGGGGGFFFF ", " ", " ", " ", " ") + .aisle(" ", " FF FF ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " F CCCCC F ", " CKKKKKC ", " ", " ", " ", " ", " ", " ", " ", " F F ", " FBDDDDDDDDDDDDDDDDDDDDDBF ", " FFFFFFFFFFFFFFFFFFFFFFF ", " ", " ", " ", " ") + .aisle(" AAAAA AAAAA ", " AAAAA AAAAA ", " AAAAADDDDDDDDDDDDDDDDDAAAAA ", " AAAAA CCCCC AAAAA ", " AAAAA CKKKKKC AAAAA ", " A A A A ", " A A A A ", " A A A A ", " A A A A ", " A A A A ", " A A A A ", " AAAAA AAAAA ", " AAAAA AAAAA ", " AAAAADDDDDDDDDDDDDDDDDAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAA AAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAA CKKKKKC AAAAA ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " ACCCA ACCCA ", " D D D D ", " E E E E ", " D D D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAAFFFFFCKKKKKCFFFFFAAAAA ", " F F ", " F F ", " F F ", " F I F ", " F H F ", " F H F ", " ACCCA H ACCCA ", " D D H D D ", " E E H E E ", " D D H D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAA CKKKKKC AAAAA ", " B B ", " B B ", " B L B ", " B LIL B ", " B L B ", " B B ", " ACCCA ACCCA ", " D D D D ", " E E E E ", " D D D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAAFFFFFCKKKKKCFFFFFAAAAA ", " F F ", " F F ", " F F ", " F I F ", " F H F ", " F H F ", " ACCCA H ACCCA ", " D D H D D ", " E E H E E ", " D D H D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" ACCCA ACCCA ", " D DAAAAAAAAAAAAAAAAAAAD D ", " E E E E ", " D D CCCCC D D ", " AAAAA CKKKKKC AAAAA ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " ACCCA ACCCA ", " D D D D ", " E E E E ", " D D D D ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ") + .aisle(" AAAAA IIIIIII AAAAA ", " AAAAA IIIIIII AAAAA ", " AAAAA IIIIIII AAAAA ", " AAAAA IIIIIII AAAAA ", " AAAAA IIIIIII AAAAA ", " A A IIIII A A ", " A A A A ", " A A A A ", " A A A A ", " A AA AA A ", " A AA AA A ", " AAAAAAAA AAAAAAAA ", " AAAAAAAAAAA AAAAAAAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " AAAAA AAAAA ", " ", " ", " ") + .aisle(" JJJJJ ", " JJJJJ ", " JJQJJ ", " JJJJJ ", " JJJ ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(BICHROMAL_NEVRAMITE_CASING.get())) + .where('B', blocks(ULTRA_POWERED_CASING.get())) + .where('C', blocks(HIGHLY_CONDUCTIVE_FISSION_CASING.get())) + .where('D', blocks(GTBlocks.COMPUTER_CASING.get())) + .where('E', blocks(GTBlocks.HIGH_POWER_CASING.get())) + .where('F', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get())) + .where('G', blocks(ZBLAN_REINFORCED_GLASS.get())) + .where('H', frames(GTMaterials.Neutronium)) + .where('I', blocks(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.get())) + .where('J', blocks(BICHROMAL_NEVRAMITE_CASING.get()) + .or(autoAbilities(CosmicRecipeTypes.MANA_DIGITIZER,CosmicRecipeTypes.MANA_FLUIDIZER)) + .or(abilities(PartAbility.INPUT_ENERGY).setExactLimit(1)) + .or(abilities(PartAbility.PARALLEL_HATCH).setExactLimit(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('K', blocks(HIGHLY_CONDUCTIVE_FISSION_CASING.get())) + .where('L', blocks(GEARBOX_PTHANTERUM.get())) + .build()) + // spotless:on + .workableCasingModel(CosmicCore.id("block/casings/solid/bichromal_nevramite_casing"), + GTCEu.id("block/multiblock/power_substation")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/CryogenicsChamber.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/CryogenicsChamber.java new file mode 100644 index 000000000..adb4dff05 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/CryogenicsChamber.java @@ -0,0 +1,79 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.ghostipedia.cosmiccore.common.data.datagen.CosmicMachineModels.createSeparateControllerCasingMachineModel; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.blocks; + +public class CryogenicsChamber { + + public final static MultiblockMachineDefinition CRYOGENICS_CHAMBER = REGISTRATE + .multiblock("cryogenics_chamber", + WorkableElectricMultiblockMachine::new) + .langValue("§bCryogenics Chamber") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.CRYOGENICS_CHAMBER) + .hasBER(true) + .partAppearance((controller, part, side) -> CRYOGENIC_CASING.getDefaultState()) + .appearanceBlock(HEAVY_FROST_PROOF_CASING) + .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + + .aisle(" AAAAAAA ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAAAAAAA ", " A A A ", " A A A ", " A A A ", " A A A ", " ", " ", " ") + .aisle(" AABBBBBBBAA ", " ABBBBBBBA ", " ABBBBBBBA ", " ABBBBBBBA ", " A A A A A ", " ", " ", " ") + .aisle("AABBBBBBBBBAA", " BBBBBBBBB ", " BBBBBBBBB ", " A A A ", " ", " ", " ", " ") + .aisle("AABBBBBBBBBAA", " ABBBBBBBBBA ", " ABBBBBBBBBA ", " AB A A A BA ", " B B ", " B B ", " B B ", " ") + .aisle("AABBBBBBBBBAA", " BBBBBBBBB ", " BBBBBBBBB ", " BAAAAAAAB ", " B AAA B ", " B DDD B ", " B DDD B ", " B DDD B ") + .aisle("AABBBBBBBBBAA", " ABBBBBBBBBA ", " ABBBBBBBBBA ", " ABAAAAAAABA ", " AB AAA BA ", " AB DDD BA ", " BCCD DCCB ", " B DDD B ") + .aisle("AABBBBBBBBBAA", " BBBBBBBBB ", " BBBBBBBBB ", " BAAAAAAAB ", " B AAA B ", " B DDD B ", " B DQD B ", " B DDD B ") + .aisle("AABBBBBBBBBAA", " ABBBBBBBBBA ", " ABBBBBBBBBA ", " AB A A A BA ", " B B ", " B B ", " B B ", " ") + .aisle("AABBBBBBBBBAA", " BBBBBBBBB ", " BBBBBBBBB ", " A A A ", " ", " ", " ", " ") + .aisle(" AABBBBBBBAA ", " ABBBBBBBA ", " ABBBBBBBA ", " ABBBBBBBA ", " A A A A A ", " ", " ", " ") + .aisle(" AAAAAAAAA ", " A A A ", " A A A ", " A A A ", " A A A ", " ", " ", " ") + .aisle(" AAAAAAA ", " ", " ", " ", " ", " ", " ", " ") + + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(CRYOGENIC_CASING.get()).setMinGlobalLimited(160) + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMinGlobalLimited(1) + .setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.EXPORT_FLUIDS).setPreviewCount(1) + .setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) + .setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1) + .setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMinGlobalLimited(1) + .setPreviewCount(1)) + ) + .where('B', blocks(HEAVY_FROST_PROOF_CASING.get())) + .where('C', blocks(CRYOGENIC_CASING.get())) + .where('D', blocks(HEAVY_FROST_PROOF_CASING.get())) + .build()) + // spotless:on + .model(createSeparateControllerCasingMachineModel( + CosmicCore.id("block/casings/solid/heavy_frost_proof_casing"), + CosmicCore.id("block/casings/solid/cryogenic_casing"), + GTCEu.id("block/multiblock/hpca"))) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DawnForge.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DawnForge.java new file mode 100644 index 000000000..cf6cac72a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DawnForge.java @@ -0,0 +1,56 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.machine.multiblock.steam.WeakSteamParallelMultiBlockMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.IMPORT_EMBER; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.LIGHT_DAWNSTONE_CASING; +import static com.gregtechceu.gtceu.api.machine.multiblock.PartAbility.EXPORT_FLUIDS; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; + +public class DawnForge { + + public final static MultiblockMachineDefinition DAWN_FORGE = REGISTRATE + .multiblock("dawn_forge", WeakSteamParallelMultiBlockMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.DAWN_FORGE) + .appearanceBlock(LIGHT_DAWNSTONE_CASING) + .partAppearance((controller, part, side) -> LIGHT_DAWNSTONE_CASING.getDefaultState()) + .recipeModifier(WeakSteamParallelMultiBlockMachine.recipeModifierCanRunAtMost(GTValues.MV)) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("ABBBA", "A A", "AA AA", " BBB ", " ") + .aisle("BAAAB", " ", "A A", "BABAB", " B ") + .aisle("BAAAB", " D ", " ", "BBABB", " BBB ") + .aisle("BAAAB", " ", "A A", "BABAB", " B ") + .aisle("ABQBA", "A A", "AA AA", " BBB ", " ") + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('A', blocks(CosmicBlocks.REINFORCED_DAWNSTONE_CASING.get())) + .where('B', blocks(CosmicBlocks.LIGHT_DAWNSTONE_CASING.get()) + .or(abilities(PartAbility.IMPORT_ITEMS)) + .or(abilities(PartAbility.STEAM_IMPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.EXPORT_ITEMS)) + .or(abilities(PartAbility.STEAM_EXPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(EXPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(IMPORT_EMBER).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.STEAM).setExactLimit(1))) + .where('D', blocks(net.minecraft.world.level.block.Blocks.ANVIL)) + // + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/light_dawnstone_casing"), + CosmicCore.id("block/multiblock/dawnforge")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DivingBell.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DivingBell.java new file mode 100644 index 000000000..00a6988e3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DivingBell.java @@ -0,0 +1,46 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.DivingBellMachine; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; + +public class DivingBell { + + public final static MultiblockMachineDefinition DIVING_BELL = REGISTRATE + .multiblock("diving_bell", DivingBellMachine::new) + .langValue("Diving Bell") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(GTRecipeTypes.DUMMY_RECIPES) + .appearanceBlock(REINFORCED_NAQUADRIA_CASING) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + // Front row (all vertical layers bottom to top) + .aisle("CCC", "GGG", "GGG", "CCC", "CCC") + // Middle row (all vertical layers bottom to top) + .aisle("CQC", "G G", "G G", "C C", "C C") + // Back row (all vertical layers bottom to top) + .aisle("CCC", "GGG", "GGG", "CCC", "CCC") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('G', blocks(ZBLAN_REINFORCED_GLASS.get())) + .where('C', blocks(REINFORCED_NAQUADRIA_CASING.get()) + .or(abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1).setMaxGlobalLimited(2)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .build()) + // spotless:on + .workableCasingModel(CosmicCore.id("block/casings/solid/highly_flexible_reinforced_trinavine_casing"), + GTCEu.id("block/multiblock/generator/large_gas_turbine")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DreamersBasin.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DreamersBasin.java new file mode 100644 index 000000000..7a265552a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DreamersBasin.java @@ -0,0 +1,108 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.multiblock.DreamersBasinMachine; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; + +import net.minecraft.network.chat.Component; + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.EXPORT_SOUL; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.SUPERHEAVY_STEEL_CASING; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; + +/** + * The Dreamer's Basin - A multithreaded processing machine. + *

+ * This machine can run multiple unique recipes simultaneously using color-coded input buses. + * Each thread requires a uniquely colored input bus/hatch pair. + * Maximum threads is determined by energy hatch amperage (4A = 4 threads, 16A = 16 threads). + * All threads share output buses/hatches. + *

+ * Energy is split evenly among threads - each thread gets 1A worth of the input voltage. + * Recipes can overclock within each thread's energy budget. + */ +public class DreamersBasin { + + public static final MultiblockMachineDefinition DREAMERS_BASIN = REGISTRATE + .multiblock("dreamers_basin", DreamersBasinMachine::new) + .langValue("Dreamer's Basin") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.MULTITHREADED_PROCESSOR) + // CRITICAL: Disable default overclock modifier - we handle overclocking per-thread, under no circumstance + // should anyone change this ~G + .noRecipeModifier() + .appearanceBlock(SUPERHEAVY_STEEL_CASING) + .partAppearance((controller, part, side) -> SUPERHEAVY_STEEL_CASING.getDefaultState()) + .tooltips( + Component.translatable("cosmiccore.machine.dreamers_basin.tooltip.0"), + Component.translatable("cosmiccore.machine.dreamers_basin.tooltip.1"), + Component.translatable("cosmiccore.machine.dreamers_basin.tooltip.2"), + Component.translatable("cosmiccore.machine.dreamers_basin.tooltip.3")) + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAA AAA ", " A A ", " A A ", " B ", " B ", + " BBB ", " BBBBBBB ", " BBBBB ", " BBB ", " ", + " ") + .aisle(" ACCA ACCA ", " ", " A B A ", " AB BA ", " B B ", + " BBBBBBB ", " BCCBBBCCB ", " CC CC ", " CC CC ", " C C ", + " ") + .aisle("ACCA ACCA", " C B C ", " C B B C ", " A B A ", " A B A ", + " B A C A B ", " BCBBCCCBBCB ", " CC CC ", " C C ", " C C ", + " C C ") + .aisle("ACA B ACA", " B B ", " B ", " C C ", " C CCC C ", + " B CCC CCC B ", "BCBC CBCB", " CC CC ", " C C ", " C C ", + " ") + .aisle("AA B AA", "A B B A", "AA B AA", " AA AA ", " A A ", + " BAC CAB ", "BCB BCB", "BC CB", " C C ", " ", + " ") + .aisle(" BBB ", " BBBBBBB ", " B C B ", " B B ", " B C C B ", + "BB C C BB", "BBC CBB", "B B", "B B", " ", + " ") + .aisle(" BBBBBBB ", " B BBB B ", " B BBCCCBB B ", "B B B B", "B BC CB B", + "BBC CBB", "BBC CBB", "B B", "B B", " ", + " ") + .aisle(" BBB ", " BBBBBBB ", " B C B ", " B B ", " B C C B ", + "BB C C BB", "BBC CBB", "B B", "B B", " ", + " ") + .aisle("AA B AA", "A B B A", "AA B AA", " AA AA ", " A A ", + " BAC CAB ", "BCB BCB", "BC CB", " C C ", " ", + " ") + .aisle("ACA B ACA", " B B ", " B ", " C C ", " C CCC C ", + " B CCC CCC B ", "BCBC CBCB", " CC CC ", " C C ", " C C ", + " ") + .aisle("ACCA ACCA", " C B C ", " C B B C ", " A B A ", " A B A ", + " B A C A B ", " BCBBCCCBBCB ", " CC CC ", " C C ", " C C ", + " C C ") + .aisle(" ACCA ACCA ", " ", " A B A ", " AB BA ", " B B ", + " BBBBBBB ", " BCCBBBCCB ", " CC CC ", " CC CC ", " C C ", + " ") + .aisle(" AAA AAA ", " A A ", " A A ", " B ", " B ", + " BBB ", " BBBBBBB ", " BBDBB ", " BBB ", " ", + " ") + + .where('D', controller(blocks(definition.getBlock()))) + .where(' ', any()) + .where('A', blocks(CosmicBlocks.SOUL_MUTED_CASING.get())) + .where('B', blocks(SUPERHEAVY_STEEL_CASING.get()).setMinGlobalLimited(200) + .or(autoAbilities(CosmicRecipeTypes.MULTITHREADED_PROCESSOR)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) + .setMaxGlobalLimited(2)) + .or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1)) + .or(abilities(EXPORT_SOUL).setExactLimit(1))) + .where('C', blocks(CosmicBlocks.SOMARUST_CASING.get())) + .build()) + .workableCasingModel( + CosmicCore.id("block/casings/solid/superheavy_steel_casing"), + GTCEu.id("block/multiblock/implosion_compressor")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DroneStation.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DroneStation.java new file mode 100644 index 000000000..50470db4a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DroneStation.java @@ -0,0 +1,67 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.DroneStationMachine; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import net.minecraft.world.level.block.Blocks; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; + +public class DroneStation { + + public final static MultiblockMachineDefinition DRONE_STATION = REGISTRATE + .multiblock("drone_station", + DroneStationMachine::new) + .langValue("Drone Station") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(GTRecipeTypes.DUMMY_RECIPES) + .appearanceBlock(CASING_STAINLESS_CLEAN) + .partAppearance((controller, part, side) -> CASING_STAINLESS_CLEAN.getDefaultState()) + .recipeModifiers(GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.PERFECT_OVERCLOCK_SUBTICK)) + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAAAA ", " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ") + .aisle("AAAAAAA ", "B B ", "B B ", "B C B ", "B CCC B ", "BCCCCCB ", + "BCCDCCB ", "BCCCCCB ", "B CCC B F ", "B B F ", " ") + .aisle("AAAAAAAAAA ", " FFF ", " CCC FFF ", " CEC FFF ", " CEEEC FFF ", " CEEEC FFF ", + " CEEEC ", " CEEEC FF", " CEEEC F ", " CCC F ", " F ") + .aisle("AAAAAAAAAA ", " F F ", " CCC F F ", " CEEEC F F ", " CEEEC F F ", " CEEEC FFF ", + " DEEED B ", " CEEEC BFF", " CEEEC H ", " CCC F H ", " F ") + .aisle("AAAAAAAAAA ", " FFF ", " CCC FQF ", " CEC FFF ", " CEEEC FFF ", " CEEEC FFF ", + " CEEEC ", " CEEEC FF", " CEEEC F ", " CCC F ", " F ") + .aisle("AAAAAAA ", "B B ", "B B ", "B C B ", "B CCC B ", "BCCCCCB ", + "BCCDCCB ", "BCCCCCB ", "B CCC B F ", "B B F ", " ") + .aisle(" AAAAA ", " ", " ", " ", " ", " ", + " ", " ", " ", " ", " ") + + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(CASING_STEEL_SOLID.get())) + .where('B', frames(GTMaterials.StainlessSteel)) + .where('C', blocks(CASING_TITANIUM_STABLE.get())) + .where('D', blocks(CASING_GRATE.get())) + .where('E', blocks(Blocks.HONEYCOMB_BLOCK)) + .where('F', blocks(CASING_STAINLESS_CLEAN.get()) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) + .setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMinGlobalLimited(1) + .setPreviewCount(1))) + .where('H', blocks(CASING_TITANIUM_PIPE.get())) + .build()) + .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_clean_stainless_steel"), + GTCEu.id("block/multiblock/power_substation")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DrygmyGrove.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DrygmyGrove.java new file mode 100644 index 000000000..e28fbac26 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/DrygmyGrove.java @@ -0,0 +1,69 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.common.data.recipe.CosmicRecipeModifiers; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import net.minecraft.world.level.block.Blocks; + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.IMPORT_SOUL; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.abilities; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; + +public class DrygmyGrove { + + public final static MultiblockMachineDefinition DRYGMY_GROVE = REGISTRATE + .multiblock("drygmy_grove", WorkableElectricMultiblockMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.GROVE_RECIPES) + .recipeModifiers(CosmicRecipeModifiers::groveMulti, + ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK), GTRecipeModifiers.BATCH_MODE) + .appearanceBlock(GTBlocks.CASING_STAINLESS_CLEAN) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("##QQQ##", "##QQQ##", "#######", "#######", "#######", "##QQQ##", "##QQQ##") + .aisle("#QQQQQ#", "#QMMMQ#", "#FLBBF#", "#F#B#F#", "#F###F#", "#QGGGQ#", "#QQQQQ#") + .aisle("QQQQQQQ", "QMMMMMQ", "#B#####", "#B#####", "#######", "QGP#PGQ", "QQQQQQQ") + .aisle("QQQQQQQ", "QMMMMMQ", "#B###B#", "#######", "#######", "QG###GQ", "QQQQQQQ") + .aisle("QQQQQQQ", "QMMMMMQ", "####LB#", "#####B#", "#######", "QGP#PGQ", "QQQQQQQ") + .aisle("#QQQQQ#", "#QMMMQ#", "#F#BBF#", "#F##BF#", "#F###F#", "#QGGGQ#", "#QQQQQ#") + .aisle("##QQQ##", "##QCQ##", "#######", "#######", "#######", "##QQQ##", "##QQQ##") + .where('#', any()) + .where("C", controller(blocks(definition.getBlock()))) + .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel))) + .where('M', blocks(Blocks.MOSS_BLOCK)) + .where('B', blocks(Blocks.AZALEA_LEAVES) + .or(blocks(Blocks.FLOWERING_AZALEA_LEAVES))) + .where('L', blocks(Blocks.FLOWERING_AZALEA) + .or(blocks(Blocks.AZALEA))) + .where('P', blocks(GTBlocks.CASING_STEEL_PIPE.get())) + .where('G', blocks(Blocks.SEA_LANTERN)) // WHAT THE HELL IS A LAMP BRO - HALP + .where('Q', blocks(GTBlocks.CASING_STAINLESS_CLEAN.get()) + .or(abilities(PartAbility.IMPORT_FLUIDS)) + .or(abilities(PartAbility.EXPORT_FLUIDS)) + .or(abilities(PartAbility.IMPORT_ITEMS)) + .or(abilities(PartAbility.EXPORT_ITEMS)) + .or(abilities(PartAbility.INPUT_ENERGY)) + .or(abilities(PartAbility.MAINTENANCE)) + .or(abilities(IMPORT_SOUL))) + .build()) + .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_clean_stainless_steel"), + GTCEu.id("block/multiblock/data_bank")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/EclipsedDawnForge.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/EclipsedDawnForge.java new file mode 100644 index 000000000..5111da943 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/EclipsedDawnForge.java @@ -0,0 +1,69 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.recipe.CosmicRecipeModifiers; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; + + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.IMPORT_EMBER; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.ETHERSTEEL_PLATED_ASH_TILES; +import static com.gregtechceu.gtceu.api.machine.multiblock.PartAbility.EXPORT_FLUIDS; +import static com.gregtechceu.gtceu.api.machine.multiblock.PartAbility.IMPORT_FLUIDS; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.BATCH_MODE; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; + +public class EclipsedDawnForge { + + public final static MultiblockMachineDefinition ECLIPSED_DAWNFORGE = REGISTRATE + .multiblock("dawnforge_eclipsed", WorkableElectricMultiblockMachine::new) + .langValue("Dawnforge [Eclipsed]") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.DAWNFORGE_ECLIPSED) + .appearanceBlock(ETHERSTEEL_PLATED_ASH_TILES) + .partAppearance((controller, part, side) -> ETHERSTEEL_PLATED_ASH_TILES.getDefaultState()) + .recipeModifiers(CosmicRecipeModifiers::innateParallel4x, + ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK), BATCH_MODE) + .pattern(definition -> FactoryBlockPattern.start() + // spotless:off + .aisle(" AAAAA ", " AAA ", " ", " ", " ", " ", " AAA ", " ") + .aisle(" AAAAAAA ", " AACCCAA ", " AA AA ", " A A ", " ", " ", " AAAAAAA ", " AAA ") + .aisle("AAAAAAAAA", " ACCCCCA ", " AD DA ", " D D ", " D D ", " D D ", " ADA ADA ", " AAAAA ") + .aisle("AAAAAAAAA", "ACCCCCCCA", " CCC ", " ", " ", " ", "AAA AAA", " AAAEAAA ") + .aisle("AAAAAAAAA", "ACCCCCCCA", " CCC ", " F ", " ", " ", "AA AA", " AAEEEAA ") + .aisle("AAAAAAAAA", "ACCCCCCCA", " CCC ", " ", " ", " ", "AAA AAA", " AAAEAAA ") + .aisle("AAAAAAAAA", " ACCCCCA ", " AD DA ", " D D ", " D D ", " D D ", " ADA ADA ", " AAAAA ") + .aisle(" AAAAAAA ", " AACCCAA ", " AA AA ", " A A ", " ", " ", " AAAAAAA ", " AAA ") + .aisle(" AAAAA ", " AQA ", " ", " ", " ", " ", " AAA ", " ") + // spotless:on + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('A', blocks(ETHERSTEEL_PLATED_ASH_TILES.get()) + .or(abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.EXPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(EXPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(IMPORT_EMBER).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setExactLimit(1))) + .where('C', blocks(ETHERSTEEL_PLATED_ASH_TILES.get())) + .where('D', blocks(GTBlocks.CASING_PTFE_INERT.get())) + .where('E', blocks(GTBlocks.CASING_LAMINATED_GLASS.get())) + .where('F', blocks(net.minecraft.world.level.block.Blocks.ANVIL)) + + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/ethersteel_plated_ash_tiles"), + CosmicCore.id("block/multiblock/dawnforge")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/FluidVoidRig.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/FluidVoidRig.java new file mode 100644 index 000000000..46d601c4a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/FluidVoidRig.java @@ -0,0 +1,75 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.VoidFluidDrillMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import net.minecraft.network.chat.Component; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +// NOTE DO NOT ADD BERS/RENDERS TO THIS YET + +public class FluidVoidRig { + + public final static MultiblockMachineDefinition VOID_MINER = REGISTRATE + .multiblock("void_fluid_rig", + VoidFluidDrillMachine::new) + .langValue("§cVoid Fluid Rig") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.VOID_MINER) + .appearanceBlock(GILDED_PTHANTERUM_CASING) + .partAppearance((controller, part, side) -> GILDED_PTHANTERUM_CASING.getDefaultState()) + .recipeModifiers( + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK)) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" A B B A ", " AAB B A ", " AAB BAA ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle("A A", "AACCAAACC A", " AB BA ", " AB BA ", " AB BA ", " B B ", " B B ", " ", " ", " ", " ", " ", " ") + .aisle(" B A A B ", " BCA ACB ", " B AAAAA B ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " A A ", " ACCCA ", " ACDCA ", " ACDCA ", " CDC ", " CDC ", " CDC ", " A A ", " ", " ", " ", " ") + .aisle(" ", " A A ", " ACCCA ", " DBD ", " DBD ", " DBD ", " DBD ", " DBD ", " B ", " B ", " B ", " B ", " B ") + .aisle(" ", " A A ", " ACCCA ", " ACDCA ", " ACDCA ", " CDC ", " CDC ", " CDC ", " A A ", " ", " ", " ", " ") + .aisle(" B A A B ", " BCA ACB ", " B AAAAA B ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle("A A", "AACCAQACCAA", " AB BA ", " AB BA ", " AB BA ", " B B ", " B B ", " ", " ", " ", " ", " ", " ") + .aisle(" A B B A ", " AAB BAA ", " AAB BAA ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(GILDED_PTHANTERUM_CASING.get()).setMinGlobalLimited(105) + .or(autoAbilities(CosmicRecipeTypes.VOID_MINER)) + .or(abilities(PartAbility.IMPORT_FLUIDS,PartAbility.IMPORT_FLUIDS_4X,PartAbility.IMPORT_FLUIDS_9X)) + .or(abilities(PartAbility.EXPORT_ITEMS)) + .or(abilities(PartAbility.EXPORT_FLUIDS)) + .or(abilities(PartAbility.INPUT_ENERGY).setExactLimit(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1)) + ) + .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, CosmicMaterials.Trinavine))) //.setMinGlobalLimited(28) + .where('C', blocks(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.get())) + .where('D', blocks(RESONANTLY_TUNED_VIRTUE_MELD_CASING.get())) + .build()) + // spotless:on + .tooltips( + Component.translatable("cosmiccore.machine.fluid_drilling_rig.description.0"), + Component.translatable("cosmiccore.machine.fluid_drilling_rig.description.1"), + Component.translatable("cosmiccore.universal.tooltip.energy_usage"), + Component.translatable("cosmiccore.machine.fluid_drilling_rig.production")) + .workableCasingModel(CosmicCore.id("block/casings/solid/gilded_pthanterum_casing"), + GTCEu.id("block/multiblock/generator/large_gas_turbine")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/HeavyAssembler.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/HeavyAssembler.java new file mode 100644 index 000000000..6383af540 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/HeavyAssembler.java @@ -0,0 +1,81 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GCYMBlocks; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; + +public class HeavyAssembler { + + public final static MultiblockMachineDefinition HEAVY_ASSEMBLER = REGISTRATE + .multiblock("heavy_assembler", + WorkableElectricMultiblockMachine::new) + .langValue("§9Heavy Assembler") + .rotationState(RotationState.NON_Y_AXIS) + .recipeTypes(CosmicRecipeTypes.HEAVY_ASSEMBLER, GTRecipeTypes.ASSEMBLER_RECIPES) + .appearanceBlock(MULTIPURPOSE_INTERSTELLAR_GRADE_CASING) + .partAppearance((controller, part, side) -> MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.getDefaultState()) + .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" BB BBBBBBA", "BBBBBBBBBBBA", "B BBBA", "B BBBA", "B BBB ", "B BB ", "BBBBBBBBBB ") + .aisle(" BB BBBBBBA", "BBBBBBBBBBBA", "B BBBA", "B G BBBA", "BFFFFFFFBBB ", "B BB ", "BBBBBBBBBB ") + .aisle(" BBBBA", " BDDDDDBB A", "E A", "E A", "E BDD ", "E EDD ", "EEEEEEEEE ") + .aisle(" BBBBA", " BDDDDDBB A", "E A", "E A", "E BDD ", "E EDD ", "EEEEEEEEE ") + .aisle(" BBBBA", " BDDDDDBB A", "E A", "E A", "E BDD ", "E EDD ", "EEEEEEEEE ") + .aisle(" BB BBBBBBA", "BBDDDDDBBBBA", "B BBBA", "B G BBBA", "BFFFFFFFBBB ", "B BB ", "BBBBBBBBBB ") + .aisle(" BBBBA", " BDDDDDBB A", "E A", "E A", "E BDD ", "E EDD ", "EEEEEEEEE ") + .aisle(" BBBBA", " BDDDDDBB A", "E A", "E A", "E BDD ", "E EDD ", "EEEEEEEEE ") + .aisle(" BBBBA", " BDDDDDBB A", "E A", "E A", "E BDD ", "E EDD ", "EEEEEEEEE ") + .aisle(" BB BBBBBBA", "BBDDDDDBBBBA", "B BBBA", "B G BBBA", "BFFFFFFFBBB ", "B BB ", "BBBBBBBBBB ") + .aisle(" BBBBA", " BDDDDDBB A", "E A", "E A", "E BDD ", "E EDD ", "EEEEEEEEE ") + .aisle(" BBBBA", " BDDDDDBB A", "E A", "E A", "E BDD ", "E EDD ", "EEEEEEEEE ") + .aisle(" BBBBA", " BDDDDDBB A", "E A", "E A", "E BDD ", "E EDD ", "EEEEEEEEE ") + .aisle(" BB BBBBBBA", "BBDDDDDBBBBA", "B BBBA", "B G BBBA", "BFFFFFFFBBB ", "B BB ", "BBBBBBBBBB ") + .aisle(" BBBBA", " BDDDDDBB A", "E A", "E A", "E BDD ", "E EDD ", "EEEEEEEEE ") + .aisle(" BBBBA", " BDDDDDBB A", "E A", "E A", "E BDD ", "E EDD ", "EEEEEEEEE ") + .aisle(" BBBBA", " BDDDDDBB A", "E A", "E A", "E BDD ", "E EDD ", "EEEEEEEEE ") + .aisle(" BBBBBBBBBBA", "BBBBBBBBBBBA", "B BBBA", "B BBBA", "B BBBA", "B BBBA", "BBBBBBBBB ") + .aisle(" BBBBBBBBBBA", "BBBBBBBBBBBA", "B BBBA", "B BBBA", "B BBBA", "B BBBA", "BBBBBBBBB ") + .aisle(" BBA", " BBA", " BBA", " BBA", " BBA", " BBA", " ") + .aisle(" AAA", " AAA", " AQA", " AAA", " AAA", " AAA", " ") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get()) + .or(autoAbilities()) + .or(autoAbilities(CosmicRecipeTypes.HEAVY_ASSEMBLER)) + .or(abilities(PartAbility.IMPORT_FLUIDS,PartAbility.IMPORT_FLUIDS_4X,PartAbility.IMPORT_FLUIDS_9X)) + .or(abilities(PartAbility.INPUT_ENERGY).setExactLimit(1)) + .or(abilities(PartAbility.PARALLEL_HATCH).setExactLimit(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) //Part IO go here + .where('B', blocks(MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get())) + .where('D', blocks(GCYMBlocks.CASING_LARGE_SCALE_ASSEMBLING.get())) + .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.TungstenCarbide))) + .where('E', blocks(CASING_LAMINATED_GLASS.get())) + .where('G', blocks(GEARBOX_PTHANTERUM.get())) + .build()) + // spotless:on + .workableCasingModel(CosmicCore.id("block/casings/solid/vomahine_certified_interstellar_grade_casing"), + CosmicCore.id("block/multiblock/vomahine_chemplant")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/HellFireFoundry.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/HellFireFoundry.java new file mode 100644 index 000000000..dfc6dc42c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/HellFireFoundry.java @@ -0,0 +1,66 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.client.renderer.machine.CosmicDynamicRenderHelpers; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.IMPORT_SOUL; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.BLANK_RUNE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.HIGHLY_CONDUCTIVE_FISSION_CASING; +import static com.ghostipedia.cosmiccore.common.data.datagen.CosmicMachineModels.createSeparateControllerCasingMachineModel; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.BATCH_MODE; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; +import static com.klikli_dev.occultism.registry.OccultismBlocks.IESNIUM_BLOCK; + +public class HellFireFoundry { + + public static final MultiblockMachineDefinition HELLFIRE_FOUNDRY = REGISTRATE + .multiblock("hellfire_foundry", WorkableElectricMultiblockMachine::new) + .langValue("§cHellfire Foundry") + .recipeType(CosmicRecipeTypes.HELLFIRE_FOUNDRY) + .rotationState(RotationState.NON_Y_AXIS) + .partAppearance((controller, part, side) -> HIGHLY_CONDUCTIVE_FISSION_CASING.getDefaultState()) + .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, + ELECTRIC_OVERCLOCK.apply(OverclockingLogic.PERFECT_OVERCLOCK), BATCH_MODE) + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" ", " ", " AAAAAAA ", " AAAAA ", " ", " ", " ") + .aisle(" AA AA ", " ", "ABBBBBBBA", " BBBBBBB ", " BB BB ", " B B ", " C C ") + .aisle(" A A ", " A A ", "ABBBBBBBA", "ABB BBA", " B B ", " ", " ") + .aisle(" ", " ", "ABBBBBBBA", "AB CCC BA", " ", " ", " ") + .aisle(" ", " ", "ABBBBBBBA", "AB CXC BA", " ", " ", " ") + .aisle(" ", " ", "ABBBBBBBA", "AB CCC BA", " ", " ", " ") + .aisle(" A A ", " A A ", "ABBBBBBBA", "ABB BBA", " B B ", " ", " ") + .aisle(" AA AA ", " ", "ABBBBBBBA", " BBBBBBB ", " BB BB ", " B B ", " C C ") + .aisle(" ", " ", " AAAAAAA ", " AAQAA ", " ", " ", " ") + .where('Q', Predicates.controller(Predicates.blocks(definition.get()))) + .where(' ', Predicates.any()) + .where('A', blocks(BLANK_RUNE.get())) + .where('B', blocks(HIGHLY_CONDUCTIVE_FISSION_CASING.get()).setMinGlobalLimited(70) + .or(autoAbilities(CosmicRecipeTypes.HELLFIRE_FOUNDRY)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1)) + .or(abilities(PartAbility.INPUT_ENERGY).setExactLimit(1))) + .where('X', abilities(IMPORT_SOUL).setMinGlobalLimited(1, 1).setMaxGlobalLimited(1)) + .where('C', blocks(IESNIUM_BLOCK.get())) + .build()) + .model(createSeparateControllerCasingMachineModel( + CosmicCore.id("block/casings/solid/soul_muted_casing"), + CosmicCore.id("block/casings/solid/highly_conductive_fission_casing"), + GTCEu.id("block/multiblock/network_switch")) + .andThen(model -> model + .addDynamicRenderer(CosmicDynamicRenderHelpers::createHellfireFoundryPartRender))) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/HemophagicTransfuser.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/HemophagicTransfuser.java new file mode 100644 index 000000000..9dbc2d077 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/HemophagicTransfuser.java @@ -0,0 +1,79 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.client.renderer.machine.CosmicDynamicRenderHelpers; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.IMPORT_SOUL; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.ghostipedia.cosmiccore.common.data.datagen.CosmicMachineModels.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GCYMBlocks.*; + +public class HemophagicTransfuser { + + public final static MultiblockMachineDefinition HEMOPHAGIC_TRANSFUSER = REGISTRATE + .multiblock("hemophagic_transfuser", + WorkableElectricMultiblockMachine::new) + .langValue("§aHemophagic Transfuser") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.HEMOPHAGIC_TRANSFUSER) + .partAppearance((controller, part, side) -> CYCLOZINE_CHEMICALLY_REPELLING_CASING.getDefaultState()) + .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.PERFECT_OVERCLOCK_SUBTICK)) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle("AAAA AAAA", "A AAAAA A", "A A", "AA AA", " A A ", " A A ", " A A ", "AA AA", "A A", "A AAAAA A", "AAAA AAAA") + .aisle("A AAAAA A", " BCCCB ", " B B ", "A A", "AC CA", "AC CA", "AC CA", "A A", " B B ", " BCCCB ", "A AAAAA A") + .aisle("A A", " B B ", " B B ", " ", "D D", "D D", "D D", " ", " B B ", " B B ", "A A") + .aisle("AA AA", "AB BA", " ", " EEEEE ", "D E E D", "D E E D", "D E E D", " EEEEE ", " ", "AB BA", "AA AA") + .aisle(" A A ", "AC CA", "F F", "F E E F", "D D", "D D", "D D", "F E E F", "F F", "AC CA", " A A ") + .aisle(" A A ", "AC CA", " ", " E E ", "D D", "D D", "D D", " E E ", " ", "AC CA", " A A ") + .aisle(" A A ", "AC CA", "F F", "F E E F", "D D", "D D", "D D", "F E E F", "F F", "AC CA", " A A ") + .aisle("AA AA", "AB BA", " ", " EEEEE ", "D E E D", "D E E D", "D E E D", " EEEEE ", " ", "AB BA", "AA AA") + .aisle("A A", " B B ", " B B ", " ", "D D", "D D", "D D", " ", " B B ", " B B ", "A A") + .aisle("A AAAAA A", " BCCCB ", " B B ", "A A", "AC CA", "AC CA", "AC CA", "A A", " B B ", " BCCCB ", "A AAAAA A") + .aisle("AAAA AAAA", "A AAQAA A", "A A", "AA AA", " A A ", " A A ", " A A ", "AA AA", "A A", "A AAAAA A", "AAAA AAAA") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(BLANK_RUNE.get())) + .where('B', blocks(RITUAL_STONE.get())) + .where('C', blocks(LIGHT_RITUAL_STONE.get())) + .where('F', blocks(CASING_STRESS_PROOF.get())) + .where('E', blocks(CASING_STRESS_PROOF.get())) + .where('D', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get()).setMinGlobalLimited(28) + // TODO see how to limit to 1 laser OR 1 energy, not 1 of each.. + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMinGlobalLimited(1) + .setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.EXPORT_FLUIDS).setPreviewCount(1) + .setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) + .setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1) + .setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMinGlobalLimited(1) + .setPreviewCount(1)) + .or(abilities(IMPORT_SOUL))) + .build()) + // spotless:on + .model(createSeparateControllerCasingMachineModel(CosmicCore.id("block/casings/solid/soul_muted_casing"), + CosmicCore.id("block/casings/solid/vomahine_certified_chemically_resistant_casing"), + GTCEu.id("block/multiblock/network_switch")) + .andThen(model -> model + .addDynamicRenderer(CosmicDynamicRenderHelpers::getHemophagicTransfuserRender))) + .hasBER(true) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/IPBF.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/IPBF.java new file mode 100644 index 000000000..e3dcd3203 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/IPBF.java @@ -0,0 +1,62 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IPBFMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderHelper; +import com.gregtechceu.gtceu.common.block.BoilerFireboxType; +import com.gregtechceu.gtceu.utils.GTUtil; + +import net.minecraft.network.chat.Component; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.STEEL_PLATED_BRONZE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.blocks; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.createWorkableCasingMachineModel; + +public class IPBF { + + public static final MultiblockMachineDefinition INDUSTRIAL_PRIMITIVE_BLAST_FURNACE = REGISTRATE + .multiblock("industrial_primitive_blast_furnace", IPBFMachine::new) + .rotationState(RotationState.ALL) + .recipeType(CosmicRecipeTypes.INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES) + .recipeModifier(IPBFMachine::recipeModifier, true) + .appearanceBlock(CASING_PRIMITIVE_BRICKS) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("QQQ", "XXX", "XXX", "XXX", "XXX") + .aisle("QQQ", "X#X", "X#X", "X#X", "X#X") + .aisle("QQQ", "XYX", "XXX", "XXX", "XXX") + .where('X', blocks(CASING_PRIMITIVE_BRICKS.get())) + .where('#', Predicates.air() + .or(Predicates.custom(bws -> GTUtil.isBlockSnow(bws.getBlockState()), null))) + .where('Y', Predicates.controller(blocks(definition.getBlock()))) + .where('Q', blocks(FIREBOX_STEEL.get()).setMinGlobalLimited(6) + .or(Predicates.abilities(PartAbility.STEAM_IMPORT_ITEMS).setPreviewCount(1) + .setExactLimit(1)) + .or(Predicates.abilities(PartAbility.STEAM_EXPORT_ITEMS).setPreviewCount(1) + .setExactLimit(1)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1).setExactLimit(1))) + .build()) + .model(createWorkableCasingMachineModel(GTCEu.id("block/casings/solid/machine_primitive_bricks"), + GTCEu.id("block/multiblock/primitive_blast_furnace")) + .andThen(b -> b.addDynamicRenderer( + () -> DynamicRenderHelper.makeBoilerPartRender( + BoilerFireboxType.STEEL_FIREBOX, STEEL_PLATED_BRONZE))) + .andThen(b -> b.addDynamicRenderer(DynamicRenderHelper::createPBFLavaRender))) + .hasBER(true) + .tooltips( + Component.translatable("cosmiccore.multiblock.ipbf.tooltip.0"), + Component.translatable("cosmiccore.multiblock.ipbf.tooltip.1"), + Component.translatable("cosmiccore.multiblock.ipbf.tooltip.2"), + Component.translatable("cosmiccore.multiblock.ipbf.tooltip.3")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/IndustChemVat.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/IndustChemVat.java new file mode 100644 index 000000000..bc1ebd738 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/IndustChemVat.java @@ -0,0 +1,82 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.data.recipe.CosmicRecipeModifiers; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import net.minecraft.network.chat.Component; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.CYCLOZINE_CHEMICALLY_REPELLING_CASING; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.*; + +public class IndustChemVat { + + public final static MultiblockMachineDefinition INDUSTRIAL_CHEMPLANT = REGISTRATE + .multiblock("industrial_chemical_vat", WorkableElectricMultiblockMachine::new) + .rotationState(RotationState.ALL) + .recipeTypes(CosmicRecipeTypes.INDUSTRIAL_CHEMVAT, GTRecipeTypes.CRACKING_RECIPES) + .recipeModifiers(CosmicRecipeModifiers::chemicalVatLogic, GTRecipeModifiers.PARALLEL_HATCH, + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + .appearanceBlock(CYCLOZINE_CHEMICALLY_REPELLING_CASING) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle("##QQQ##", "##QQQ##", "###Q###", "#######", "#######", "#######", "#######", "#######", "###Q###", "##QQQ##", "##QQQ##") + .aisle("#QQQQQ#", "#QQSQQ#", "#FQQQF#", "#FQ#QF#", "#F###F#", "#F###F#", "#F###F#", "#FQ#QF#", "#FQQQF#", "#QQSQQ#", "#QQQQQ#") + .aisle("QQQQQQQ", "QQSSSQQ", "#QSSSQ#", "##HGH##", "##HGH##", "##HGH##", "##HGH##", "#QHGHQ#", "#QSSSQ#", "QQSSSQQ", "QQQQQQQ") + .aisle("QQQQQQQ", "QSSSSSQ", "QQSSSQQ", "##GSG##", "##GSG##", "##GSG##", "##GSG##", "##GSG##", "QQSSSQQ", "QSSSSSQ", "QQQQQQQ") + .aisle("QQQQQQQ", "QQSSSQQ", "#QSSSQ#", "##HGH##", "##HGH##", "##HGH##", "##HGH##", "#QHGHQ#", "#QSSSQ#", "QQSSSQQ", "QQQQQQQ") + .aisle("#QQQQQ#", "#QQSQQ#", "#FQQQF#", "#FQ#QF#", "#F###F#", "#F###F#", "#F###F#", "#FQ#QF#", "#FQQQF#", "#QQSQQ#", "#QQQQQ#") + .aisle("##QQQ##", "##QCQ##", "###Q###", "#######", "#######", "#######", "#######", "#######", "###Q###", "##QQQ##", "##QQQ##") + .where('#', any()) + .where("C", controller(blocks(definition.getBlock()))) + .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.NaquadahAlloy))) + .where('S', blocks(CosmicBlocks.COIL_RESONANT_VIRTUE_MELD.get())) + .where('H', blocks(CosmicBlocks.CYCLOZINE_CHEMICALLY_REPELLING_PIPE.get())) + .where('G', blocks(GTBlocks.CASING_LAMINATED_GLASS.get())) + .where('Q', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get()) + .or(abilities(PartAbility.IMPORT_FLUIDS)) + .or(abilities(PartAbility.EXPORT_FLUIDS)) + .or(abilities(PartAbility.IMPORT_ITEMS)) + .or(abilities(PartAbility.EXPORT_ITEMS)) + .or(abilities(PartAbility.INPUT_ENERGY)) + .or(abilities(PartAbility.MAINTENANCE)) + .or(abilities(PartAbility.DATA_ACCESS)) + .or(abilities(PartAbility.COMPUTATION_DATA_RECEPTION)) + .or(abilities(PartAbility.OPTICAL_DATA_RECEPTION)) + .or(abilities(PartAbility.PARALLEL_HATCH)) + .or(abilities(CosmicPartAbility.COSMIC_PARALLEL_HATCH)) + .or(abilities(PartAbility.INPUT_LASER)) + .or(abilities(PartAbility.INPUT_ENERGY)) + .or(Predicates.abilities(CosmicPartAbility.STERILIZE_HATCH))) + .build()) + // spotless:on + .tooltips(Component.translatable("cosmiccore.multiblock.chemvat.tooltip.0"), + Component.translatable("cosmiccore.multiblock.chemvat.tooltip.1"), + Component.translatable("cosmiccore.multiblock.chemvat.tooltip.2"), + Component.translatable("cosmiccore.multiblock.chemvat.tooltip.3"), + Component.translatable("cosmiccore.multiblock.chemvat.tooltip.4")) + .workableCasingModel(CosmicCore.id("block/casings/solid/vomahine_certified_chemically_resistant_casing"), + CosmicCore.id("block/multiblock/vomahine_chemplant")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/IndustrialSteamTurbine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/IndustrialSteamTurbine.java new file mode 100644 index 000000000..c0b6b7988 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/IndustrialSteamTurbine.java @@ -0,0 +1,56 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.data.recipe.CosmicRecipeModifiers; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.IMPORT_EMBER; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.SOUL_STAINED_STEEL_ALU_CASING; +import static com.gregtechceu.gtceu.api.machine.multiblock.PartAbility.EXPORT_FLUIDS; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; + +public class IndustrialSteamTurbine { + + public final static MultiblockMachineDefinition LARGE_EMBER_COMPRESSOR = REGISTRATE + .multiblock("large_ember_boiler", WorkableElectricMultiblockMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.ARCANE_CRUCIBLE) + .appearanceBlock(SOUL_STAINED_STEEL_ALU_CASING) + .partAppearance((controller, part, side) -> SOUL_STAINED_STEEL_ALU_CASING.getDefaultState()) + .recipeModifiers(CosmicRecipeModifiers::innateParallel4x, + ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK)) + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAA ", " ABA ", " BBB ", " BBB ", " ABA ", " AAA ") + .aisle("AAAAA", "A A", "B B", "B B", "A A", "AAAAA") + .aisle("AAAAA", "B B", "B B", "B B", "B B", "AAAAA") + .aisle("AAAAA", "A A", "B B", "B B", "A A", "AAAAA") + .aisle(" AQA ", " ABA ", " BBB ", " BBB ", " ABA ", " AAA ") + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('A', blocks(SOUL_STAINED_STEEL_ALU_CASING.get()) + .or(abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.EXPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(EXPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(IMPORT_EMBER).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setExactLimit(1))) + .where('B', blocks(CosmicBlocks.STEEL_ROSE_LIGHT.block().get())) + // + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/soul_stained_steel_aluminium_plated_casing"), + CosmicCore.id("block/multiblock/dawnforge")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/KryosynCrackingChamber.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/KryosynCrackingChamber.java new file mode 100644 index 000000000..b1584d1c4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/KryosynCrackingChamber.java @@ -0,0 +1,58 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.CASING_HSSE_STURDY; + +public class KryosynCrackingChamber { + + public final static MultiblockMachineDefinition KRYOSYN_CRACKING_CHAMBER = REGISTRATE + .multiblock("kryosyn_cracking_chamber", + WorkableElectricMultiblockMachine::new) + .langValue("§bKryosyn Cracking Chamber") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.LARGE_ROASTER) + .appearanceBlock(CASING_HSSE_STURDY) + .partAppearance((controller, part, side) -> CASING_HSSE_STURDY.getDefaultState()) + .recipeModifiers( + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAAAA ", " ABBBA ", " AAAAA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ") + .aisle("ACCCCCA", "ACCCCCA", "ACCCCCA", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ") + .aisle("ACCCCCA", "BCCCCCB", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", " CCCCC ") + .aisle("ACCCCCA", "BCCCCCB", "ACCCCCA", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ") + .aisle("ACCCCCA", "BCCCCCB", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", "ACCCCCA", " CCCCC ") + .aisle("ACCCCCA", "ACCCCCA", "ACCCCCA", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " CCCCC ") + .aisle(" AAAAA ", " ABQBA ", " AAAAA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(CosmicBlocks.SOUL_STAINED_STEEL_ALU_CASING.get())) + .where('B', blocks(CASING_HSSE_STURDY.get()) + .or(autoAbilities(CosmicRecipeTypes.MANA_DIGITIZER,CosmicRecipeTypes.MANA_FLUIDIZER)) + .or(abilities(PartAbility.INPUT_ENERGY).setExactLimit(1)) + .or(abilities(PartAbility.PARALLEL_HATCH).setExactLimit(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('A', blocks(GTBlocks.CASING_ALUMINIUM_FROSTPROOF.get())) + .build()) + // spotless:on + .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_sturdy_hsse"), + GTCEu.id("block/overlay/machine/calx_reactor")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LARVA.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LARVA.java new file mode 100644 index 000000000..2522f0589 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LARVA.java @@ -0,0 +1,302 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.LarvaMachine; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.common.data.*; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTMachines.ITEM_IMPORT_BUS; + +public class LARVA { + + public final static MultiblockMachineDefinition LARVA = REGISTRATE + .multiblock("larva", LarvaMachine::new) + .langValue("Logistic Asteroid Reclamation and Valuing Assembly [LARVA]") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(GTRecipeTypes.DUMMY_RECIPES) + .recipeModifier(RecipeModifier.NO_MODIFIER) + .appearanceBlock(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING) + .partAppearance((controller, part, side) -> TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.getDefaultState()) + .pattern(definition -> FactoryBlockPattern.start() + // spotless: off + .aisle(" ", + " ", + " AAAAA AAAAA AAAAA ", + " BBBBB BBBBB BBBBB ", + " AAAAA AAAAA AAAAA ", + " ", + " ") + .aisle(" ", + " ", + " CA AC CA AC CA AC ", + " BB D BB BB D BB BB D BB ", + " CA AC CA AC CA AC ", + " ", + " ") + .aisle(" ", + " ", + " CC CC CC CC CC CC ", + " BB D BB BB D BB BB D BB ", + " CC CC CC CC CC CC ", + " ", + " ") + .aisle(" ", + " AAA AAA AAA ", + " AA BBB AA AA BBB AA AA BBB AA ", + " BB CCC BB BB CCC BB BB CCC BB ", + " AA BBB AA AA BBB AA AA BBB AA ", + " AAA AAA AAA ", + " ") + .aisle(" ", + " AAAAA AAAAA AAAAA ", + " A B B A A B B A A B B A ", + " B C C B B C C B B C C B ", + " A B B A A B B A A B B A ", + " AAEAA AAEAA AAEAA ", + " ") + .aisle(" ", + " AAAAA AAAAA AAAAA ", + " A B B A A B B A A B B A ", + " BDDC CDDB BDDC CDDB BDDC CDDB ", + " A B B A A B B A A B B A ", + " AEFEA AEFEA AEFEA ", + " ") + .aisle(" ", + " AAAAA AAAAA AAAAA ", + " A B B A A B B A A B B A ", + " B C C B B C C B B C C B ", + " A B B A A B B A A B B A ", + " AAEAA AAEAA AAEAA ", + " ") + .aisle(" ", + " AAA AAA AAA ", + " AA BBB AA AA BBB AA AA BBB AA ", + " AAAA BB CCC BB BB CCC BB BB CCC BB AAAA ", + " AA BBB AA AA BBB AA AA BBB AA ", + " AAA AAA AAA ", + " ") + .aisle(" ", + " ", + " CCC CC CC CC CC CC CC CCC ", + " AAAAAAAA BB D BB BB D BB BB D BB AAAAAAAA ", + " CCCC CC CC CC CC CC CC CCCC ", + " ", + " ") + .aisle(" ", + " ", + " CC CCCC CA AC CA AC CA AC CCCC CC ", + " AAA AAAAAA BB D BB BB D BB BB D BB AAAAAA AAA ", + " CC CCCC CA AC CA AC CA AC CCCC CC ", + " ", + " ") + .aisle(" ", + " ", + " C CCC AAAAA AAAAA AAAAA CCC C ", + " AA AAAA BBBBB BBBBB BBBBB AAAA AA ", + " C CCC AAAAA AAAAA AAAAA CCC C ", + " ", + " ") + .aisle(" ", + " ", + " C CC ABA CCCCCCABACCCCCC ABA CC C ", + "AA AAA BAB CCCCCCBABCCCCCC BAB AAA AA", + " C CC ABA CCCCCCABACCCCCC ABA CC C ", + " ", + " ") + .aisle(" ", + " ", + " C CC BDB CCCCCCCBDBCCCCCCC BDB CC C ", + "AA AAA D D CCCCCCCD DCCCCCCC D D AAA AA", + " C CC BDB CCCCCCCBDBCCCCCCC BDB CC C ", + " ", + " ") + .aisle(" ", + " ", + "C CC BDB CCCCCCCCBDBCCCCCCCC BDB CC C", + "A AA D D CCCCCCCCD DCCCCCCCC D D AA A", + " CC BDB CCCFFFCCBDBCCFFFCCC BDB CC ", + " ", + " ") + .aisle(" ", + " ", + " C BDB CCCCCCCCCBDBCCCCCCCCC BDB C ", + " A D D CCCCCCCCCD DCCCCCCCCC D D A ", + " C BDB CCFFFCCCCBDBCCCCFFFCC BDB C ", + " FFFFF ", + " ") + .aisle(" CCCCC CCCCC CCCCC ", + " CDAAADC CDAAADC CDAAADC ", + " CDAA AADCCCCCCCDAA AADCCCCCCCDAA AADC ", + " CAA AACCCCCCCAA AACCCCCCCAA AAC ", + " CDAA AADCCCCCCCDAA AADCCCCCCCDAA AADC ", + " CDAAADC CDAAADC CDAAADC ", + " CCCCC CFFFC CCCCC ") + .aisle(" ADADA ADADA ADADA ", + " A A A A A A ", + " A AAAAAAAA AAAAAAAA A ", + " DA AAAAAAAA AAAAAAAA AD ", + " A AAAAAAAA AAAAAAAA A ", + " A A A A A A ", + " ADFDA ADFDA ADFDA ") + .aisle(" ADADA ADADA ADADA ", + " A A A A A A ", + " A AAAAAAAA AAAAAAAA A ", + " DA AAAAAAAA AAAAAAAA AD ", + " A AFFFFFAA AAFFFFFA A ", + " A A A A A A ", + " ADFDA ADQDA ADFDA ") + .aisle(" ADADA ADADA ADADA ", + " A A A A A A ", + " A AAAAAAAA AAAAAAAA A ", + " DA AAAAAAAA AAAAAAAA AD ", + " A AAAAAAAA AAAAAAAA A ", + " A A A A A A ", + " ADFDA ADFDA ADFDA ") + .aisle(" CCCCC CCCCC CCCCC ", + " CDAAADC CDAAADC CDAAADC ", + " CDABABADCCCCCCCDABABADCCCCCCCDABABADC ", + " CAAAAAAACCCCCCCAAAAAAACCCCCCCAAAAAAAC ", + " CDABABADCCCCCCCDABABADCCCCCCCDABABADC ", + " CDAAADC CDAAADC CDAAADC ", + " CCCCC CFFFC CCCCC ") + .aisle(" ", + " ", + " C BDB CCCCCCCCCBDBCCCCCCCCC BDB C ", + " AAADCD CCCCCCCCCDCDCCCCCCCCC DCDAAA ", + " C BDB CCFFFCCCCBDBCCCCFFFCC BDB C ", + " FFFFF ", + " ") + .aisle(" ", + " ", + "C CC BDB CCCCCCCCBDBCCCCCCCC BDB CC C", + "A AAA DCD CCCCCCCCDCDCCCCCCCC DCD AAA A", + " CC BDB CCCFFFCCBDBCCFFFCCC BDB CC ", + " ", + " ") + .aisle(" ", + " ", + " C CC BDB CCCCCCCBDBCCCCCCC BDB CC C ", + "AA AAA DCD CCCCCCCDCDCCCCCCC DCD AAA AA", + " C CC BDB CCCCCCCBDBCCCCCCC BDB CC C ", + " ", + " ") + .aisle(" ", + " ", + " C CC ABA CCCCCCABACCCCCC ABA CC C ", + "AA AAA BCB CCCCCCBCBCCCCCC BCB AAA AA", + " C CC ABA CCCCCCABACCCCCC ABA CC C ", + " ", + " ") + .aisle(" ", + " ", + " C CCC AAAAA AAAAA AAAAA CCC C ", + " AA AAAA BBCBB BBCBB BBCBB AAAA AA ", + " C CCC AAAAA AAAAA AAAAA CCC C ", + " ", + " ") + .aisle(" ", + " ", + " CC CCCC CA AC CA AC CA AC CCCC CC ", + " AAA AAAAAA BB D BB BB D BB BB D BB AAAAAA AAA ", + " CC CCCC CA AC CA AC CA AC CCCC CC ", + " ", + " ") + .aisle(" ", + " ", + " CCC CC CC CC CC CC CC CCC ", + " AAAAAAAA BB D BB BB D BB BB D BB AAAAAAAA ", + " CCCC CC CC CC CC CC CC CCCC ", + " ", + " ") + .aisle(" ", + " AAA AAA AAA ", + " AA BBB AA AA BBB AA AA BBB AA ", + " AAAA BB CCC BB BB CCC BB BB CCC BB AAAA ", + " AA BBB AA AA BBB AA AA BBB AA ", + " AAA AAA AAA ", + " ") + .aisle(" ", + " AAAAA AAAAA AAAAA ", + " A B B A A B B A A B B A ", + " B C C B B C C B B C C B ", + " A B B A A B B A A B B A ", + " AAEAA AAEAA AAEAA ", + " ") + .aisle(" ", + " AAAAA AAAAA AAAAA ", + " A B B A A B B A A B B A ", + " BDDC CDDB BDDC CDDB BDDC CDDB ", + " A B B A A B B A A B B A ", + " AEFEA AEFEA AEFEA ", + " ") + .aisle(" ", + " AAAAA AAAAA AAAAA ", + " A B B A A B B A A B B A ", + " B C C B B C C B B C C B ", + " A B B A A B B A A B B A ", + " AAEAA AAEAA AAEAA ", + " ") + .aisle(" ", + " AAA AAA AAA ", + " AA BBB AA AA BBB AA AA BBB AA ", + " BB CCC BB BB CCC BB BB CCC BB ", + " AA BBB AA AA BBB AA AA BBB AA ", + " AAA AAA AAA ", + " ") + .aisle(" ", + " ", + " CC CC CC CC CC CC ", + " BB D BB BB D BB BB D BB ", + " CC CC CC CC CC CC ", + " ", + " ") + .aisle(" ", + " ", + " CA AC CA AC CA AC ", + " BB D BB BB D BB BB D BB ", + " CA AC CA AC CA AC ", + " ", + " ") + .aisle(" ", + " ", + " AAAAA AAAAA AAAAA ", + " BBBBB BBBBB BBBBB ", + " AAAAA AAAAA AAAAA ", + " ", + " ") + // spotless: on + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('C', blocks(CosmicBlocks.HIGH_TOLERANCE_RHENIUM_CASING.get())) + .where('A', blocks(CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.get())) + .where('F', blocks(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.get()) + .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(4)) + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) + .setMaxGlobalLimited(2)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setMinGlobalLimited(1, 1) + .setMaxGlobalLimited(3, 3))) + .where('E', + blocks(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.get()) + .or(blocks(ITEM_IMPORT_BUS[1].getBlock()))) + .where('D', blocks(GCYMBlocks.CASING_HIGH_TEMPERATURE_SMELTING.get())) + .where('B', blocks(CosmicBlocks.NAQUADAH_PRESSURE_RESISTANT_CASING.get())) + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/highly_flexible_reinforced_trinavine_casing"), + CosmicCore.id("block/multiblock/mantle_bore")) + .hasBER(true) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/Laminator.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/Laminator.java new file mode 100644 index 000000000..4008ca539 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/Laminator.java @@ -0,0 +1,65 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import com.sammy.malum.registry.common.block.MalumBlocks; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.CYCLOZINE_CHEMICALLY_REPELLING_CASING; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.ULTRA_POWERED_CASING; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; + +public class Laminator { + + public final static MultiblockMachineDefinition LARGE_LAMINATOR = REGISTRATE + .multiblock("large_laminator", + WorkableElectricMultiblockMachine::new) + .langValue("§1Large Laminator") + .rotationState(RotationState.NON_Y_AXIS) + .recipeTypes(CosmicRecipeTypes.MANA_DIGITIZER, CosmicRecipeTypes.MANA_FLUIDIZER) + .appearanceBlock(CYCLOZINE_CHEMICALLY_REPELLING_CASING) + .partAppearance((controller, part, side) -> CYCLOZINE_CHEMICALLY_REPELLING_CASING.getDefaultState()) + .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start(RelativeDirection.LEFT,RelativeDirection.UP,RelativeDirection.FRONT) + .aisle(" AA AA ", " ", " ", " ", " ", " ", " ", " ", " AA AA ") + .aisle("AAABBBAAA", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", "AAA AAA") + .aisle("AABAAABAA", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", "AABAAABAA") + .aisle(" BABBBAB ", " ", " ", " ", " ", " ", " ", " ", " ABBBA ") + .aisle(" BABBBAB ", " ", " ", " ", " ", " ", " ", " ", " ABBBA ") + .aisle(" BABBBAB ", " ", " ", " ", " ", " ", " ", " ", " ABBBA ") + .aisle("AABAAABAA", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", "AABAAABAA") + .aisle("AAABQBAAA", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", "AAA AAA") + .aisle(" AA AA ", " ", " ", " ", " ", " ", " ", " ", " AA AA ") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(ULTRA_POWERED_CASING.get()) + .or(autoAbilities(CosmicRecipeTypes.MANA_DIGITIZER,CosmicRecipeTypes.MANA_FLUIDIZER)) + .or(abilities(PartAbility.INPUT_ENERGY).setExactLimit(1)) + .or(abilities(PartAbility.PARALLEL_HATCH).setExactLimit(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('B', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get())) + .where('C', frames(GTMaterials.TungstenCarbide)) + .where('D', blocks(MalumBlocks.AQUEOUS_SPIRITED_GLASS.get())) + .build()) + // spotless:on + .workableCasingModel(CosmicCore.id("block/casings/solid/vomahine_certified_chemically_resistant_casing"), + GTCEu.id("block/multiblock/power_substation")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LargeSpoolingMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LargeSpoolingMachine.java new file mode 100644 index 000000000..1ebd6bb9d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LargeSpoolingMachine.java @@ -0,0 +1,65 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.WEAR_RESISTANT_RURIDIT_CASING; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.util.RelativeDirection.*; +import static com.gregtechceu.gtceu.common.data.GCYMBlocks.CASING_STRESS_PROOF; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; + +public class LargeSpoolingMachine { + + public final static MultiblockMachineDefinition LARGE_SPOOLING_MACHINE = REGISTRATE + .multiblock("large_spooling_machine", WorkableElectricMultiblockMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.SPOOLING_MACHINE) + .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, + ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK), GTRecipeModifiers.BATCH_MODE) + .appearanceBlock(WEAR_RESISTANT_RURIDIT_CASING) + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAAA", " F", " DDDF", " F", " F", " F", " F", " AAAA", " ") + .aisle(" AAAA", " C ", " DC ", " C ", " C ", " C ", " C ", " AAAA", " ") + .aisle("AAAAAA", "A A ", "A E A ", "A A ", "A A ", "A A ", "A A ", "AAAAAA", " AAA ") + .aisle("AAAAA ", "B B ", "B B ", "B B ", "B B ", "B B ", "B B ", "A A ", "AAAAA ") + .aisle("AACAA ", "B D B ", "B D B ", "B D B ", "B D B ", "B D B ", "B D B ", "B D B ", "AACAA ") + .aisle("AAAAA ", "B B ", "B B ", "B B ", "B B ", "B B ", "B B ", "A A ", "AAAAA ") + .aisle("AAQAA ", "ABBBA ", "ABBBA ", "ABBBA ", "ABBBA ", "ABBBA ", "ABBBA ", "AABAA ", " AAA ") + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('A', blocks(WEAR_RESISTANT_RURIDIT_CASING.get()).setMinGlobalLimited(85, 90) + .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMinGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setMinGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1)) + .or(Predicates.abilities(PartAbility.PARALLEL_HATCH).setExactLimit(1)) + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMinGlobalLimited(1))) + .where('B', blocks(CASING_LAMINATED_GLASS.get())) + .where('C', blocks(CASING_TUNGSTENSTEEL_GEARBOX.get())) + .where('D', blocks(CASING_STRESS_PROOF.get())) + .where('E', blocks(CASING_STEEL_GEARBOX.get())) + .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Iridium))) + + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/ruridit_casing"), + GTCEu.id("block/multiblock/generator/large_gas_turbine")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LinkTestStation.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LinkTestStation.java new file mode 100644 index 000000000..5b94e1908 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LinkTestStation.java @@ -0,0 +1,54 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.LinkTestStationMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.common.data.GTBlocks; + +import net.minecraft.network.chat.Component; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.createWorkableCasingMachineModel; + +/** + * Simple test multiblock for verifying cross-dimensional linking. + * Minimal 3x3x3 structure using steel casings. + */ +public class LinkTestStation { + + public final static MultiblockMachineDefinition LINK_TEST_STATION = REGISTRATE + .multiblock("link_test_station", LinkTestStationMachine::new) + .langValue("Link Test Station") + .tooltips( + Component.literal("Test multiblock for cross-dimensional linking"), + Component.literal("Use datastick: Shift+click to copy, click to link"), + Component.literal("Some recipes require linked partners")) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.LINK_TEST_RECIPES) + .appearanceBlock(GTBlocks.CASING_STEEL_SOLID) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("CCC", "CCC", "CCC") + .aisle("CCC", "C C", "CCC") + .aisle("CCC", "CQC", "CCC") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('C', blocks(GTBlocks.CASING_STEEL_SOLID.get()) + .or(abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1).setMaxGlobalLimited(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1)) + .or(abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(1)) + .or(abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(1))) + .build()) + .model( + createWorkableCasingMachineModel( + GTCEu.id("block/casings/solid/machine_casing_solid_steel"), + GTCEu.id("block/multiblock/implosion_compressor"))) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LunarHammer.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LunarHammer.java new file mode 100644 index 000000000..3f6080536 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/LunarHammer.java @@ -0,0 +1,82 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.client.renderer.machine.CosmicDynamicRenderHelpers; +import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; +import com.ghostipedia.cosmiccore.common.data.recipe.CosmicRecipeModifiers; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.TitanFusionReactorMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GCYMBlocks.CASING_HIGH_TEMPERATURE_SMELTING; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.createWorkableCasingMachineModel; + +public class LunarHammer { + + public final static MultiblockMachineDefinition LUNAR_HAMMER = REGISTRATE + .multiblock("lunar_sheer_hammer", + TitanFusionReactorMachine::new) + .langValue("§9Lunar Hammer") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.LUNAR_HAMMER) + .appearanceBlock(CASING_HIGH_TEMPERATURE_SMELTING) + .partAppearance((controller, part, side) -> CASING_HIGH_TEMPERATURE_SMELTING.getDefaultState()) + .recipeModifiers(CosmicRecipeModifiers::titanReactorParallel, + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.PERFECT_OVERCLOCK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" A A ", " A B A ", " BBB ", " BBB ", " B ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " B ", " BBB ", " BBB ", " A B A ", " A A ") + .aisle(" AA AA ", " AA C AA ", " AA CDC AA ", " A CCC A ", " C ", " ", " ", " EEEEE ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " EEEEE ", " ", " ", " C ", " A CCC A ", " AA CDC AA ", " AAFFCFFAA ", " AA AA ") + .aisle(" ACCCCCCCCCA ", " AF C FA ", " AFCCCDCCCFA ", " AF CCC FA ", " AFEEECEEEFA ", " AF FA ", " F F ", " FE G G EF ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " FE G G EF ", " F F ", " AF FA ", " AFEEECEEEFA ", " AF CCC FA ", " AFCCCDCCCFA ", " AF C FA ", " ACCCCCCCCCA ") + .aisle(" ACC CCA ", " AF HHHCHHH FA ", " AFCA CDC ACFA ", " F AECCCEA F ", " FEA C AEF ", " F A A F ", " F A A F ", " FEA G G AEF ", " F A A F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F A A F ", " FEA G G AEF ", " F A A F ", " F A A F ", " FEA C AEF ", " F AECCCEA F ", " AFCA CDC ACFA ", " AF HHHCHHH FA ", " ACC CCA ") + .aisle("AAC CAA", "AA HH C HH AA", " ACA CDC ACA ", " A A ECCCE A A ", " EA C AE ", " A A ", " AA AA ", " EAA G G AAE ", " AA AA ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " A A ", " A A ", " A A ", " AA AA ", " EAA G G AAE ", " AA AA ", " A A ", " EA C AE ", " A A ECCCE A A ", " ACA CDC ACA ", "AA HH C HH AA", "AAC CAA") + .aisle(" C C ", " H C H ", " C CCDCC C ", " EEECCCEEE ", " E CCC E ", " CIC ", " CIC ", " E CIC E ", " CIC ", " CIC ", " CIC ", " C ", " ", " ", " ", " ", " ", " C ", " CIC ", " CIC ", " CIC ", " E CIC E ", " CIC ", " CIC ", " E CCC E ", " EEECCCEEE ", " C CCDCC C ", " F H C H F ", " C C ") + .aisle(" C C ", " H CCC H ", "BCCCCCCCCCCCCCB", "BCCCCCCCCCCCCCB", " E CD DC E ", " CD DC ", " CD DC ", " EGGGCD DCGGGE ", " CD DC ", " CD DC ", " CD DC ", " EEE ", " E ", " ", " ", " ", " E ", " EEE ", " CD DC ", " CD DC ", " CD DC ", " EGGGCD DCGGGE ", " CD DC ", " CD DC ", " E CD DC E ", "BCCCCCCCCCCCCCB", "BCCCCCCCCCCCCCB", " F H CCC H F ", " C C ") + .aisle(" C C ", "BCCCCCCCCCCCCCB", "BDDDDDCCCDDDDDB", "BCCCCCCCCCCCCCB", "BCCCCC CCCCCB", " I I ", " I I ", " E I I E ", " I I ", " I I ", " I I ", " CE EC ", " E E ", " ", " ", " ", " E E ", " CE EC ", " I I ", " I I ", " I I ", " E I I E ", " I I ", " I I ", "BCCCCC CCCCCB", "BCCCCCCCCCCCCCB", "BDDDDDCCCDDDDDB", "BCCCCCCCCCCCCCB", " C C ") + .aisle(" C C ", " H CCC H ", "BCCCCCCCCCCCCCB", "BCCCCCCCCCCCCCB", " E CD DC E ", " CD DC ", " CD DC ", " EGGGCD DCGGGE ", " CD DC ", " CD DC ", " CD DC ", " EEE ", " E ", " ", " ", " ", " E ", " EEE ", " CD DC ", " CD DC ", " CD DC ", " EGGGCD DCGGGE ", " CD DC ", " CD DC ", " E CD DC E ", "BCCCCCCCCCCCCCB", "BCCCCCCCCCCCCCB", " F H CCC H F ", " C C ") + .aisle(" C C ", " H C H ", " C CCDCC C ", " EEECCCEEE ", " E CCC E ", " CIC ", " CIC ", " E CIC E ", " CIC ", " CIC ", " CIC ", " C ", " ", " ", " ", " ", " ", " C ", " CIC ", " CIC ", " CIC ", " E CIC E ", " CIC ", " CIC ", " E CCC E ", " EEECCCEEE ", " C CCDCC C ", " F H C H F ", " C C ") + .aisle("AAC CAA", "AA HH C HH AA", " ACA CDC ACA ", " A A ECCCE A A ", " EA C AE ", " A A ", " AA AA ", " EAA G G AAE ", " AA AA ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " A A ", " A A ", " A A ", " AA AA ", " EAA G G AAE ", " AA AA ", " A A ", " EA C AE ", " A A ECCCE A A ", " ACA CDC ACA ", "AA HH C HH AA", "AAC CAA") + .aisle(" ACC CCA ", " AF HHHCHHH FA ", " AFCA CDC ACFA ", " F AECCCEA F ", " FEA C AEF ", " F A A F ", " F A A F ", " FEA G G AEF ", " F A A F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F A A F ", " FEA G G AEF ", " F A A F ", " F A A F ", " FEA C AEF ", " F AECCCEA F ", " AFCA CDC ACFA ", " AF HHHCHHH FA ", " ACC CCA ") + .aisle(" ACCCCCCCCCA ", " AF C FA ", " AFCCCDCCCFA ", " AF CCC FA ", " AFEEECEEEFA ", " AF FA ", " F F ", " FE G G EF ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " FE G G EF ", " F F ", " AF FA ", " AFEEECEEEFA ", " AF CCC FA ", " AFCCCDCCCFA ", " AF C FA ", " ACCCCCCCCCA ") + .aisle(" AA AA ", " AACCCCCAA ", " AA CDC AA ", " A CCC A ", " C ", " ", " ", " EEEEE ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " EEEEE ", " ", " ", " C ", " A CCC A ", " AA CDC AA ", " AAFFCFFAA ", " AA AA ") + .aisle(" A A ", " ABBBBBA ", " BQB ", " BBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " B ", " BBB ", " BBB ", " A B A ", " A A ") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(OSCILLATING_GILDED_PTHANTERUM_CASING.get())) //Part IO go here + .where('B', blocks(CASING_HIGH_TEMPERATURE_SMELTING.get()) + .or(autoAbilities()) + .or(autoAbilities(CosmicRecipeTypes.HEAVY_ASSEMBLER)) + .or(abilities(PartAbility.IMPORT_FLUIDS,PartAbility.IMPORT_FLUIDS_4X,PartAbility.IMPORT_FLUIDS_9X)) + .or(abilities(PartAbility.INPUT_ENERGY,PartAbility.INPUT_LASER).setExactLimit(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('C', blocks(CASING_HIGH_TEMPERATURE_SMELTING.get())) + .where('D', blocks(GTBlocks.FUSION_COIL.get())) + .where('F', frames(GTMaterials.Neutronium)) + .where('E', blocks(HIGH_TOLERANCE_RHENIUM_CASING.get())) + .where('G', frames(CosmicMaterials.Trinavine)) + .where('H', blocks(ULTRA_POWERED_CASING.get())) + .where('I', blocks(GTBlocks.FUSION_CASING_MK3.get())) + .build()) + // spotless:on + .model( + createWorkableCasingMachineModel( + GTCEu.id("block/casings/gcym/high_temperature_smelting_casing"), + GTCEu.id("block/multiblock/fusion_reactor")) + .andThen(model -> model + .addDynamicRenderer(CosmicDynamicRenderHelpers::getRenderTesterHelper))) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ManaDigitizer.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ManaDigitizer.java new file mode 100644 index 000000000..e590c2696 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ManaDigitizer.java @@ -0,0 +1,66 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import com.sammy.malum.registry.common.block.MalumBlocks; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.CYCLOZINE_CHEMICALLY_REPELLING_CASING; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.blocks; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; + +public class ManaDigitizer { + + public final static MultiblockMachineDefinition BOTANICAL_SIMULATION_COMPLEX = REGISTRATE + .multiblock("botanical_simulation_complex", + WorkableElectricMultiblockMachine::new) + .langValue("§aBotanical Simulation Complex") + .rotationState(RotationState.NON_Y_AXIS) + .recipeTypes(CosmicRecipeTypes.MANA_DIGITIZER, CosmicRecipeTypes.MANA_FLUIDIZER) + .appearanceBlock(CYCLOZINE_CHEMICALLY_REPELLING_CASING) + .partAppearance((controller, part, side) -> CYCLOZINE_CHEMICALLY_REPELLING_CASING.getDefaultState()) + .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK)) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start(RelativeDirection.LEFT,RelativeDirection.UP,RelativeDirection.FRONT) + .aisle(" AA AA ", " ", " ", " ", " ", " ", " ", " ", " AA AA ") + .aisle("AAABBBAAA", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", "AAA AAA") + .aisle("AABAAABAA", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", "AABAAABAA") + .aisle(" BABBBAB ", " ", " ", " ", " ", " ", " ", " ", " ABBBA ") + .aisle(" BABBBAB ", " ", " ", " ", " ", " ", " ", " ", " ABBBA ") + .aisle(" BABBBAB ", " ", " ", " ", " ", " ", " ", " ", " ABBBA ") + .aisle("AABAAABAA", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", "AABAAABAA") + .aisle("AAABQBAAA", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", "AAA AAA") + .aisle(" AA AA ", " ", " ", " ", " ", " ", " ", " ", " AA AA ") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(ULTRA_POWERED_CASING.get()) + .or(autoAbilities(CosmicRecipeTypes.MANA_DIGITIZER,CosmicRecipeTypes.MANA_FLUIDIZER)) + .or(abilities(PartAbility.INPUT_ENERGY).setExactLimit(1)) + .or(abilities(PartAbility.PARALLEL_HATCH).setExactLimit(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('B', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get())) + .where('C', frames(GTMaterials.TungstenCarbide)) + .where('D', blocks(MalumBlocks.AQUEOUS_SPIRITED_GLASS.get())) + .build()) + // spotless:on + .workableCasingModel(CosmicCore.id("block/casings/solid/vomahine_certified_chemically_resistant_casing"), + GTCEu.id("block/multiblock/power_substation")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ManaEtchingFactory.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ManaEtchingFactory.java new file mode 100644 index 000000000..b6c547208 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/ManaEtchingFactory.java @@ -0,0 +1,57 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.IMPORT_EMBER; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.LIVING_ROCK_TILES; +import static com.gregtechceu.gtceu.api.machine.multiblock.PartAbility.EXPORT_FLUIDS; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; + +public class ManaEtchingFactory { + + public final static MultiblockMachineDefinition MANA_ETCHING_FACTORY = REGISTRATE + .multiblock("mana_etching_factory", WorkableElectricMultiblockMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.MANA_ETCHING_FACTORY) + .appearanceBlock(LIVING_ROCK_TILES) + .partAppearance((controller, part, side) -> LIVING_ROCK_TILES.getDefaultState()) + .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, + ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK), GTRecipeModifiers.BATCH_MODE) + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAAAA ", " CCCCC ", " CCCCC ", " DDDDD ") + .aisle("AADDDAA", "D D", "D D", "DDDDDDD") + .aisle("AADDDAA", "A A", "A A", "AADADAA") + .aisle("AADDDAA", "D D", "D D", "DDDDDDD") + .aisle(" AAQAA ", " CCCCC ", " CCCCC ", " DDDDD ") + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('A', blocks(LIVING_ROCK_TILES.get()) + .or(abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.EXPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(EXPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(IMPORT_EMBER).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setExactLimit(1))) + .where('C', blocks(GTBlocks.CASING_TEMPERED_GLASS.get())) + .where('D', blocks(CosmicBlocks.SOUL_STAINED_STEEL_ALU_CASING.get())) + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/livingrock_tiles"), + CosmicCore.id("block/multiblock/dawnforge")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MantleBore.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MantleBore.java new file mode 100644 index 000000000..66e8ebdbc --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MantleBore.java @@ -0,0 +1,56 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.client.renderer.machine.CosmicDynamicRenderHelpers; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.LarvaMachine; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.util.RelativeDirection.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.createWorkableCasingMachineModel; + +public class MantleBore { + + public final static MultiblockMachineDefinition MANTLE_BORE = REGISTRATE + .multiblock("mantle_bore", LarvaMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(GTRecipeTypes.ELECTROLYZER_RECIPES) + .recipeModifier(RecipeModifier.NO_MODIFIER) + .appearanceBlock(GTBlocks.STEEL_HULL) + .pattern(definition -> FactoryBlockPattern.start(RIGHT, BACK, UP) + .aisle(" A A ", "A A", " ", " D ", " ", "A A", " A A ") + .aisle(" A A ", "A A", " D ", " DDD ", " D ", "A A", " A A ") + .aisle(" BBB ", " ACCCA ", "BCBBBCB", "BCBEBCB", "BCBBBCB", " ACCCA ", " BBB ") + .where(' ', any()) + .where("E", controller(blocks(definition.getBlock()))) + .where('C', blocks(CosmicBlocks.CASING_HEAT_VENT.get())) + .where('A', blocks(STEEL_HULL.get())) + .where('D', blocks(STEEL_HULL.get())) + .where('B', blocks(CASING_STEEL_SOLID.get()) + .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(4)) + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) + .setMaxGlobalLimited(2)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setExactLimit(1)) + .or(Predicates.abilities(PartAbility.EXPORT_FLUIDS).setExactLimit(1))) + .build()) + .model(createWorkableCasingMachineModel( + CosmicCore.id("block/casings/solid/vomahine_certified_chemically_resistant_casing"), + CosmicCore.id("block/multiblock/mantle_bore")) + .andThen(model -> model.addDynamicRenderer(CosmicDynamicRenderHelpers::getRenderTesterHelper))) + .hasBER(true) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MothCargoDropOff.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MothCargoDropOff.java new file mode 100644 index 000000000..d2240c77d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MothCargoDropOff.java @@ -0,0 +1,55 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.MothCargoDropOffMachine; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import net.minecraft.network.chat.Component; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.CASING_STEEL_SOLID; + +/** + * Moth Cargo Drop Off - Receiver multiblock for the Cargo Moths system. + * Receives items and fluids from linked Moth Cargo Stations. + * Small, compact design for easy placement at outposts. + */ +public class MothCargoDropOff { + + public static final MultiblockMachineDefinition MOTH_CARGO_DROP_OFF = REGISTRATE + .multiblock("moth_cargo_drop_off", MothCargoDropOffMachine::new) + .langValue("Moth Cargo Drop Off") + .tooltips( + Component.literal("Receives shipments from Moth Cargo Stations"), + Component.literal("Link to stations with a datastick"), + Component.literal("Small footprint for easy outpost placement")) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(GTRecipeTypes.DUMMY_RECIPES) + .appearanceBlock(CASING_STEEL_SOLID) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + // Compact 3x3x3 structure + .aisle("CCC", "CCC", "C C") + .aisle("CCC", "C C", " ") + .aisle("CCC", "CQC", "C C") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('C', blocks(CASING_STEEL_SOLID.get()) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1)) + .or(abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(4)) + .or(abilities(PartAbility.EXPORT_FLUIDS).setMaxGlobalLimited(4))) + .build()) + // spotless:on + .workableCasingModel( + GTCEu.id("block/casings/solid/machine_casing_solid_steel"), + GTCEu.id("block/multiblock/implosion_compressor")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MothCargoStation.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MothCargoStation.java new file mode 100644 index 000000000..427a47541 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/MothCargoStation.java @@ -0,0 +1,83 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.api.pattern.CosmicPredicates; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.MothCargoStationMachine; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.CASING_STEEL_SOLID; + +/** + * Moth Cargo Station - Sender multiblock for the Cargo Moths system. + * Ships items and fluids to linked Moth Cargo Drop Off stations. + */ +public class MothCargoStation { + + // Forestry beehive blocks used as moth homes + public static final ResourceLocation BEEHIVE_FOREST = ResourceLocation.fromNamespaceAndPath("forestry", "beehive_forest"); + public static final ResourceLocation BEEHIVE_LUSH = ResourceLocation.fromNamespaceAndPath("forestry", "beehive_lush"); + public static final ResourceLocation BEEHIVE_DESERT = ResourceLocation.fromNamespaceAndPath("forestry", "beehive_desert"); + public static final ResourceLocation BEEHIVE_END = ResourceLocation.fromNamespaceAndPath("forestry", "beehive_end"); + + /** + * Check if a block is a valid moth home (any tier of Forestry beehive). + */ + public static boolean isMothHome(BlockState state) { + Block block = state.getBlock(); + ResourceLocation blockId = BuiltInRegistries.BLOCK.getKey(block); + return blockId.equals(BEEHIVE_FOREST) || + blockId.equals(BEEHIVE_LUSH) || + blockId.equals(BEEHIVE_DESERT) || + blockId.equals(BEEHIVE_END); + } + + public static final MultiblockMachineDefinition MOTH_CARGO_STATION = REGISTRATE + .multiblock("moth_cargo_station", MothCargoStationMachine::new) + .langValue("Moth Cargo Station") + .tooltips( + Component.literal("Ships items and fluids using cargo moths"), + Component.literal("Link to Moth Cargo Drop Offs with a datastick"), + Component.literal("Add Moth Homes to increase capacity and speed"), + Component.literal("Feed moths honey or pale oil for bonuses!")) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(GTRecipeTypes.DUMMY_RECIPES) + .appearanceBlock(CASING_STEEL_SOLID) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + // Tower structure: 3x3 footprint, 6 blocks tall + // Moth homes (beehives) in center column - up to 4 can be placed + // Open walls (air in center) so beehives are visible from all sides + .aisle("CCC", "C C", "C C", "C C", "C C", "CCC") + .aisle("CCC", " M ", " M ", " M ", " M ", "CCC") + .aisle("CQC", "C C", "C C", "C C", "C C", "CCC") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('C', blocks(CASING_STEEL_SOLID.get()) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1)) + .or(abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(4)) + .or(abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(4)) + .or(abilities(PartAbility.IMPORT_FLUIDS).setMaxGlobalLimited(4)) + .or(abilities(PartAbility.EXPORT_FLUIDS).setMaxGlobalLimited(4))) + .where('M', CosmicPredicates.mothHomes()) + .build()) + // spotless:on + .workableCasingModel( + GTCEu.id("block/casings/solid/machine_casing_solid_steel"), + GTCEu.id("block/multiblock/implosion_compressor")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/NPR.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/NPR.java new file mode 100644 index 000000000..bf37e46e4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/NPR.java @@ -0,0 +1,72 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.data.recipe.CosmicRecipeModifiers; +import com.ghostipedia.cosmiccore.common.machine.multiblock.electric.MagneticFieldMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.common.data.GTMaterials; + +import net.minecraft.network.chat.Component; + +import static com.ghostipedia.cosmiccore.api.pattern.CosmicPredicates.magnetCoils; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.FUSION_GLASS; + +public class NPR { + + public final static MultiblockMachineDefinition NAQUAHINE_PRESSURE_REACTOR = REGISTRATE + .multiblock("naquahine_pressure_reactor", MagneticFieldMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.NAQUAHINE_REACTOR) + .recipeModifier(CosmicRecipeModifiers::vomahineReactorOC) + .appearanceBlock(CosmicBlocks.NAQUADAH_PRESSURE_RESISTANT_CASING) + .generator(true) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("##QQQ##", "##QQQ##", "###Q###", "#######", "#######", "#######", "#######", "#######", + "#######", "#######", "###Q###", "##QQQ##", "##QQQ##") + .aisle("#QQQQQ#", "#QQSQQ#", "#FQQQF#", "#FQFQF#", "#F###F#", "#F###F#", "#F###F#", "#F###F#", + "#F###F#", "#FQFQF#", "#FQQQF#", "#QQSQQ#", "#QQQQQ#") + .aisle("QQQQQQQ", "QQSSSQQ", "#QSSSQ#", "#QHGHQ#", "##HGH##", "##HGH##", "##HGH##", "##HGH##", + "##HGH##", "#QHGHQ#", "#QSSSQ#", "QQSSSQQ", "QQQQQQQ") + .aisle("QQQQQQQ", "QSSSSSQ", "QQSSSQQ", "#FGSGF#", "##GSG##", "##GSG##", "##GSG##", "##GSG##", + "##GSG##", "#FGSGF#", "QQSSSQQ", "QSSSSSQ", "QQQQQQQ") + .aisle("QQQQQQQ", "QQSSSQQ", "#QSSSQ#", "#QHGHQ#", "##HGH##", "##HGH##", "##HGH##", "##HGH##", + "##HGH##", "#QHGHQ#", "#QSSSQ#", "QQSSSQQ", "QQQQQQQ") + .aisle("#QQQQQ#", "#QQSQQ#", "#FQQQF#", "#FQFQF#", "#F###F#", "#F###F#", "#F###F#", "#F###F#", + "#F###F#", "#FQFQF#", "#FQQQF#", "#QQSQQ#", "#QQQQQ#") + .aisle("##QQQ##", "##QCQ##", "###Q###", "#######", "#######", "#######", "#######", "#######", + "#######", "#######", "###Q###", "##QQQ##", "##QQQ##") + .where('#', any()) + .where("C", controller(blocks(definition.getBlock()))) + .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.NaquadahAlloy))) + .where('S', magnetCoils()) + .where('H', blocks(CosmicBlocks.RESONANTLY_TUNED_VIRTUE_MELD_CASING.get())) + .where('G', blocks(FUSION_GLASS.get())) + .where('Q', blocks(CosmicBlocks.NAQUADAH_PRESSURE_RESISTANT_CASING.get()).setMinGlobalLimited(160) + .or(abilities(PartAbility.IMPORT_FLUIDS)) + .or(abilities(PartAbility.IMPORT_ITEMS)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1)) + .or(abilities(PartAbility.OUTPUT_LASER).setExactLimit(1)) + .or(abilities(PartAbility.INPUT_LASER).setExactLimit(1))) + .build()) + // Note, Never allow energy hatches, it breaks them pretty badly and i think this is the easier of the two + // sacrifices for now - G + .tooltips(Component.translatable("cosmiccore.multiblock.naqreactor.tooltip.0"), + Component.translatable("cosmiccore.multiblock.naqreactor.tooltip.1"), + Component.translatable("cosmiccore.multiblock.naqreactor.tooltip.2")) + .workableCasingModel(CosmicCore.id("block/casings/solid/naquadah_pressure_resistant_casing"), + GTCEu.id("block/multiblock/hpca")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/OneiricSieve.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/OneiricSieve.java new file mode 100644 index 000000000..f04c07c7c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/OneiricSieve.java @@ -0,0 +1,63 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.EXPORT_SOUL; +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.IMPORT_SOUL; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; + +public class OneiricSieve { + + public static final MultiblockMachineDefinition ONEIRIC_SIEVE = REGISTRATE + .multiblock("oneiric_sieve", WorkableElectricMultiblockMachine::new) + .langValue("Oneiric Sieve") + .recipeType(CosmicRecipeTypes.ONEIRIC_SIEVE) + .rotationState(RotationState.NON_Y_AXIS) + .recipeModifiers(GTRecipeModifiers.BATCH_MODE, + ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK)) + .appearanceBlock(SUPERHEAVY_STEEL_CASING) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AABBBBBAA ", " ", " ", " ", " ", " ") + .aisle(" A BAAAB A ", " ", " ", " BBCCCBB ", " CAC ", " BBBBBBBBB ") + .aisle("CACBAAABCAC", "CCC CCC", " C C ", " CBDDDBC ", "CCCCC CCCCC", "CB BC") + .aisle(" A BAAAB A ", " ", " ", " BDDDB ", " AA AA ", " B B ") + .aisle("CACBAAABCAC", "CCC CCC", " C C ", " CBDDDBC ", "CCCCC CCCCC", "CB BC") + .aisle(" A BAAAB A ", " ", " ", " BBCECBB ", " CAC ", " BBBBBBBBB ") + .aisle(" AABBBBBAA ", " ", " ", " ", " ", " ") + .where('E', Predicates.controller(Predicates.blocks(definition.get()))) + .where(' ', Predicates.any()) + .where('A', blocks(SOUL_MUTED_CASING.get())) + .where('B', blocks(SOMARUST_CASING.get())) + .where('C', blocks(SUPERHEAVY_STEEL_CASING.get()) + .or(autoAbilities(CosmicRecipeTypes.ONEIRIC_SIEVE)) + .or(autoAbilities(true, false, false)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) + .setMaxGlobalLimited(2)) + .or(abilities(IMPORT_SOUL)) + .or(abilities(EXPORT_SOUL)) + ) + .where('D', blocks(GTBlocks.CASING_GRATE.get())) + .build()) + // spotless:on + .workableCasingModel(CosmicCore.id("block/casings/solid/superheavy_steel_casing"), + GTCEu.id("block/multiblock/implosion_compressor")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/OrbitalForge.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/OrbitalForge.java new file mode 100644 index 000000000..4e91038c3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/OrbitalForge.java @@ -0,0 +1,114 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.CoilWorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.CYCLOZINE_CHEMICALLY_REPELLING_CASING; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.util.RelativeDirection.*; +import static com.gregtechceu.gtceu.common.data.GCYMBlocks.HEAT_VENT; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.BATCH_MODE; + +public class OrbitalForge { + + public final static MultiblockMachineDefinition ORBITAL_TEMPERING_FORGE = REGISTRATE.multiblock( + "orbital_tempering_forge", CoilWorkableElectricMultiblockMachine::new) + .rotationState(RotationState.ALL) + .recipeTypes(CosmicRecipeTypes.ORBITAL_FORGE_EBF, CosmicRecipeTypes.ORBITAL_FORGE_ABS) + .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, + GTRecipeModifiers::ebfOverclock, BATCH_MODE) + .appearanceBlock(CosmicBlocks.CYCLOZINE_CHEMICALLY_REPELLING_CASING) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" ", " ", " AAAAA AAAAA ", " BBBBB BBBBB ", " AAAAA AAAAA ", " ", " ") + .aisle(" ", " ", " CA AC C C CA AC ", " BB D BB CDDDC BB D BB ", " CA AC C C CA AC ", " ", " ") + .aisle(" ", " CAAAC ", " CC CC DEEED CC CC ", " BB D BB AEEEA BB D BB ", " CC CC DEEED CC CC ", " CAAAC ", " ") + .aisle(" C C ", " AAA DEEED AAA ", "AA FFF AA A A AA FFF AA", "BB CCC BB A A BB CCC BB", "AA FFF AA A A AA FFF AA", " AAA DEEED AAA ", " C C ") + .aisle(" CDDDC ", " AAAAA AEEEA AAAAA ", "A F F AABBBA ABBBAA F F A", "B C C BBDDD DDDBB C C B", "A F F AABBBA ABBBAA F F A", " AAAAA AEEEA AAAAA ", " CDDDC ") + .aisle(" C C ", " AAAAA AEEEA AAAAA ", "A F F ABDDD DDDBA F F A", "BDDC CDDBA ABDDC CDDB", "A F F ABDDD DDDBA F F A", " AAAAA AEEEA AAAAA ", " C C ") + .aisle(" CDDDC ", " AAAAA AEEEA AAAAA ", "A F F AABBBA ABBBAA F F A", "B C C BBDDD DDDBB C C B", "A F F AABBBA ABBBAA F F A", " AAAAA AEEEA AAAAA ", " CDDDC ") + .aisle(" C C ", " AAA DEEED AAA ", "AA FFF AA A A AA FFF AA", "BB CCC BB A A BB CCC BB", "AA FFF AA A A AA FFF AA", " AAA DEEED AAA ", " C C ") + .aisle(" ", " CAAAC ", " CC CC DEEED CC CC ", " BB D BB AEEEA BB D BB ", " CC CC DEEED CC CC ", " CAAAC ", " ") + .aisle(" ", " ", " CA AC CAAAC CA AC ", " BB D BB CAXAC BB D BB ", " CA AC CAAAC CA AC ", " ", " ") + .aisle(" ", " ", " AAAAA AAAAA ", " BBCBB BBCBB ", " AAAAA AAAAA ", " ", " ") + .aisle(" ", " ", " ABA ABA ", " BCB BCB ", " ABA ABA ", " ", " ") + .aisle(" ", " ", " BDB BDB ", " DCD DCD ", " BDB BDB ", " ", " ") + .aisle(" ", " ", " BDB BDB ", " DCD DCD ", " BDB BDB ", " ", " ") + .aisle(" ", " ", " BDB BDB ", " DCD DCD ", " BDB BDB ", " ", " ") + .aisle(" CCCCC CCCCC ", " CDAAADC CDAAADC ", " CDABABADC CDABABADC ", " CAAAAAAAC CAAAAAAAC ", " CDABABADC CDABABADC ", " CDAAADC CDAAADC ", " CCCCC CCCCC ") + .aisle(" D D D D ", " AEEEEEA AEEEEEA ", " E EA AE E ", " DE EA AE ED ", " E EA AE E ", " AEEEEEA AEEEEEA ", " D D D D ") + .aisle(" D D D D ", " AEEEEEA AEEEEEA ", " E EA AE E ", " DE EA AE ED ", " E EA AE E ", " AEEEEEA AEEEEEA ", " D D D D ") + .aisle(" D D D D ", " AEEEEEA AEEEEEA ", " E EA AE E ", " DE EA AE ED ", " E EA AE E ", " AEEEEEA AEEEEEA ", " D D D D ") + .aisle(" CCCCC CCCCC ", " CDAAADC CDAAADC ", " CDAA AADC CDAA AADC ", " CAA AAC CAA AAC ", " CDAA AADC CDAA AADC ", " CDAAADC CDAAADC ", " CCCCC CCCCC ") + .aisle(" ", " ", " BDB BDB ", " D D D D ", " BDB BDB ", " ", " ") + .aisle(" ", " ", " BDB BDB ", " D D D D ", " BDB BDB ", " ", " ") + .aisle(" ", " ", " BDB BDB ", " D D D D ", " BDB BDB ", " ", " ") + .aisle(" ", " ", " ABA ABA ", " BAB BAB ", " ABA ABA ", " ", " ") + .aisle(" ", " ", " AAAAA AAAAA ", " BBBBB BBBBB ", " AAAAA AAAAA ", " ", " ") + .aisle(" ", " ", " CA AC CAAAC CA AC ", " BB D BB CAAAC BB D BB ", " CA AC CAAAC CA AC ", " ", " ") + .aisle(" ", " CAAAC ", " CC CC DEEED CC CC ", " BB D BB AEEEA BB D BB ", " CC CC DEEED CC CC ", " CAAAC ", " ") + .aisle(" C C ", " AAA DEEED AAA ", "AA FFF AA A A AA FFF AA", "BB CCC BB A A BB CCC BB", "AA FFF AA A A AA FFF AA", " AAA DEEED AAA ", " C C ") + .aisle(" CDDDC ", " AAAAA AEEEA AAAAA ", "A F F AABBBB BBBBAA F F A", "B C C BBDDDA ADDDBB C C B", "A F F AABBBB BBBBAA F F A", " AAAAA AEEEA AAAAA ", " CDDDC ") + .aisle(" C C ", " AAAAA AEEEA AAAAA ", "A F F ABDDDA ADDDBA F F A", "BDDC CDDCCCCCA ACCCCCDDC CDDB", "A F F ABDDDA ADDDBA F F A", " AAAAA AEEEA AAAAA ", " C C ") + .aisle(" CDDDC ", " AAAAA AEEEA AAAAA ", "A F F AABBBB BBBBAA F F A", "B C C BBDDDA ADDDBB C C B", "A F F AABBBB BBBBAA F F A", " AAAAA AEEEA AAAAA ", " CDDDC ") + .aisle(" C C ", " AAA DEEED AAA ", "AA FFF AA A A AA FFF AA", "BB CCC BB A A BB CCC BB", "AA FFF AA A A AA FFF AA", " AAA DEEED AAA ", " C C ") + .aisle(" ", " CAAAC ", " CC CC DEEED CC CC ", " BB D BB AEEEA BB D BB ", " CC CC DEEED CC CC ", " CAAAC ", " ") + .aisle(" ", " ", " CA AC CAAAC CA AC ", " BB D BB CDDDC BB D BB ", " CA AC CAAAC CA AC ", " ", " ") + .aisle(" ", " ", " AAAAA AAAAA ", " BBBBB BBBBB ", " AAAAA AAAAA ", " ", " ") + .where(' ', any()) + .where("X", controller(blocks(definition.getBlock()))) + .where('C', blocks(MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get())) + .where('E', heatingCoils()) + .where('B', blocks(ULTRA_POWERED_CASING.get())) + .where('D', blocks(CYCLOZINE_CHEMICALLY_REPELLING_PIPE.get())) + .where('F', blocks(HEAT_VENT.get())) + .where('A', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get()).setMinGlobalLimited(650, 660) + .or(abilities(PartAbility.IMPORT_FLUIDS)) + .or(abilities(PartAbility.EXPORT_FLUIDS)) + .or(abilities(PartAbility.IMPORT_ITEMS)) + .or(abilities(PartAbility.EXPORT_ITEMS)) + .or(abilities(PartAbility.INPUT_ENERGY)) + .or(abilities(PartAbility.COMPUTATION_DATA_RECEPTION).setMaxGlobalLimited(1, 1)) + .or(abilities(PartAbility.DATA_ACCESS, PartAbility.OPTICAL_DATA_RECEPTION) + .setMaxGlobalLimited(1, 1)) + .or(abilities(PartAbility.PARALLEL_HATCH, CosmicPartAbility.COSMIC_PARALLEL_HATCH) + .setExactLimit(1)) + .or(abilities(PartAbility.INPUT_LASER, PartAbility.INPUT_ENERGY).setExactLimit(1))) + .build()) + // spotless:on + .workableCasingModel(CosmicCore.id("block/casings/solid/vomahine_certified_chemically_resistant_casing"), + CosmicCore.id("block/multiblock/vomahine_chemplant")) + .additionalDisplay((controller, components) -> { + if (controller instanceof CoilWorkableElectricMultiblockMachine coilMachine && controller.isFormed()) { + components.add(Component.translatable("gtceu.multiblock.blast_furnace.max_temperature", + Component + .translatable( + FormattingUtil + .formatNumbers(coilMachine.getCoilType().getCoilTemperature() + + 100L * Math.max(0, coilMachine.getTier() - GTValues.MV)) + + "K") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED)))); + } + }) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/OreExtractionDrill.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/OreExtractionDrill.java new file mode 100644 index 000000000..3178b1e51 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/OreExtractionDrill.java @@ -0,0 +1,117 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.OreExtractionDrillMachine; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; + +import com.tterrag.registrate.util.entry.BlockEntry; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; + +public class OreExtractionDrill { + + // LV: Solid Steel, HV: Stainless Steel, IV: Titanium, ZPM: TungstenSteel + public static final MultiblockMachineDefinition ORE_EXTRACTION_DRILL_LV = registerDrill("ore_extraction_drill_lv", + GTValues.LV, GTBlocks.CASING_STEEL_SOLID, + GTCEu.id("block/casings/solid/machine_casing_solid_steel")); + + public static final MultiblockMachineDefinition ORE_EXTRACTION_DRILL_HV = registerDrill("ore_extraction_drill_hv", + GTValues.HV, GTBlocks.CASING_STAINLESS_CLEAN, + GTCEu.id("block/casings/solid/machine_casing_clean_stainless_steel")); + + public static final MultiblockMachineDefinition ORE_EXTRACTION_DRILL_IV = registerDrill("ore_extraction_drill_iv", + GTValues.IV, GTBlocks.CASING_TITANIUM_STABLE, + GTCEu.id("block/casings/solid/machine_casing_stable_titanium")); + + public static final MultiblockMachineDefinition ORE_EXTRACTION_DRILL_ZPM = registerDrill("ore_extraction_drill_zpm", + GTValues.ZPM, GTBlocks.CASING_TUNGSTENSTEEL_ROBUST, + GTCEu.id("block/casings/solid/machine_casing_robust_tungstensteel")); + + private static MultiblockMachineDefinition registerDrill(String id, int tier, BlockEntry casing, + ResourceLocation casingTexture) { + float removalChance = switch (tier) { + case GTValues.LV -> 0.50f; + case GTValues.HV -> 0.25f; + case GTValues.IV -> 0.125f; + case GTValues.ZPM -> 0.0625f; + default -> 0.50f; + }; + int yieldMultiplier = Math.round(1.0f / removalChance); + + return REGISTRATE + .multiblock(id, holder -> new OreExtractionDrillMachine(holder, tier)) + .langValue(GTValues.VNF[tier] + " Ore Extraction Drill") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(GTRecipeTypes.DUMMY_RECIPES) + .noRecipeModifier() + .appearanceBlock(casing) + .tooltips( + Component.translatable("cosmiccore.machine.ore_extraction_drill.tooltip.0"), + Component.translatable("cosmiccore.machine.ore_extraction_drill.tooltip.1", + String.format("%.1f%%", removalChance * 100)), + Component.translatable("cosmiccore.machine.ore_extraction_drill.tooltip.2", + yieldMultiplier), + Component.translatable("cosmiccore.machine.ore_extraction_drill.tooltip.3")) + .pattern(definition -> { + // Tier-specific materials - deferred to pattern build time + var decorativeCasing = switch (tier) { + case GTValues.HV -> GTBlocks.CASING_STAINLESS_CLEAN.get(); + case GTValues.IV -> GTBlocks.CASING_TITANIUM_STABLE.get(); + case GTValues.ZPM -> GTBlocks.CASING_TUNGSTENSTEEL_ROBUST.get(); + default -> CosmicBlocks.STEEL_PLATED_BRONZE.get(); + }; + var frameMaterial = switch (tier) { + case GTValues.HV -> GTMaterials.StainlessSteel; + case GTValues.IV -> GTMaterials.Titanium; + case GTValues.ZPM -> GTMaterials.TungstenSteel; + default -> GTMaterials.Steel; + }; + var pipeCasing = switch (tier) { + case GTValues.IV -> GTBlocks.CASING_TITANIUM_PIPE.get(); + case GTValues.ZPM -> GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get(); + default -> GTBlocks.CASING_STEEL_PIPE.get(); + }; + + return FactoryBlockPattern.start() + .aisle("AA AA", " A A ", " BCB ", " ", " ", " ", " ", " ", " ", + " ") + .aisle("A A", "A D A", "BCCCB", " CCC ", " B ", " B ", " B ", " ", " ", + " ") + .aisle(" D ", " DDD ", "CCCCC", " CCC ", " BCB ", " BCB ", " BCB ", " B ", " B ", + " B ") + .aisle("A A", "A D A", "BCCCB", " CCC ", " B ", " B ", " B ", " ", " ", + " ") + .aisle("AA AA", " A A ", " BSB ", " ", " ", " ", " ", " ", " ", + " ") + .where('S', controller(blocks(definition.getBlock()))) + .where('A', blocks(decorativeCasing)) + .where('B', Predicates.frames(frameMaterial)) + .where('C', blocks(casing.get()) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setExactLimit(1)) + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMinGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('D', blocks(pipeCasing)) + .where(' ', Predicates.any()) + .build(); + }) + .workableCasingModel(casingTexture, GTCEu.id("block/multiblock/large_miner")) + .register(); + } + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PCBFoundry.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PCBFoundry.java new file mode 100644 index 000000000..fb120c0b0 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PCBFoundry.java @@ -0,0 +1,82 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility; +import com.ghostipedia.cosmiccore.common.data.recipe.CosmicRecipeModifiers; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.PCBFoundryMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.*; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.blocks; + +public class PCBFoundry { + + public final static MultiblockMachineDefinition PCB_FOUNDRY = REGISTRATE + .multiblock("pcb_foundry", + PCBFoundryMachine::new) + .langValue("§ePCB Foundry") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.PCB_FABRICATOR) + .appearanceBlock(BICHROMAL_NEVRAMITE_CASING) + .partAppearance((controller, part, side) -> BICHROMAL_NEVRAMITE_CASING.getDefaultState()) + .recipeModifiers(CosmicRecipeModifiers::innateParallel4x, + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle("AAAAAAAAA", "A A A A A", "A A A A A", "A A A A A", " ", " ", " ") + .aisle("ABBBBBBBA", "ACCCCCCCA", "ACCCCCCCA", "A A A A A", " ", " ", " ") + .aisle("ABBBBBBBA", "ACCCCCCCA", "ACCCCCCCA", "A A A A A", " ", " ", " ") + .aisle("AAAAAAAAA", "AAAAAAAAA", "AAAAAAAAA", "AAAAAAAAA", " ", " ", " ") + .aisle("ADDDDDDDA", "ADEFFFEDA", "ADEFFFEDA", "ADEFFFEDA", "ADEEEEEDA", "ADDDDDDDA", " ") + .aisle("ADDDDDDDA", " E FFF E ", " E E ", " E E ", " E E ", "AD DA", " BBBBB ") + .aisle("ADDDDDDDA", " E FFF E ", " E E ", " E G E ", " E H E ", "ADHHHHHDA", " BEEEB ") + .aisle("ADDDDDDDA", " E FFF E ", " E E ", " E E ", " E E ", "AD DA", " BEEEB ") + .aisle("ADDDDDDDA", " E FFF E ", " E E ", " E E ", " E E ", "AD DA", " BEEEB ") + .aisle("ADDDDDDDA", " E FFF E ", " E E ", " E I E ", " E H E ", "ADHHHHHDA", " BEEEB ") + .aisle("ADDDDDDDA", " E FFF E ", " E E ", " E E ", " E E ", "AD DA", " BEEEB ") + .aisle("ADDDDDDDA", "AE FFF EA", "AE EA", "AE EA", "AE EA", "AD DA", " BEEEB ") + .aisle("ADDDDDDDA", " D D ", " D D ", " D D ", " D D ", "ADDD DDDA", " BBEBB ") + .aisle("ADDDDDDDA", "AEBBBBBEA", "AE EA", "AE EA", "AE EA", "ABDDDDDBA", " BBBBB ") + .aisle("ADDDDDDDA", " EBBBBBE ", " E BBB E ", " E BBB E ", " E BBB E ", "ABDBBBDBA", " BBB ") + .aisle("ADDDDDDDA", " EBBBBBE ", " E BBB E ", " E BBB E ", " E BBB E ", "ABDBBBDBA", " BBB ") + .aisle("ADDDDDDDA", " EBBBBBE ", " E BBB E ", " E BBB E ", " E BBB E ", "ABDBBBDBA", " BBB ") + .aisle("ADDDDDDDA", " EBBBBBE ", " E E ", "AAAAAAAAA", "AE EA", "ABDDDDDBA", " ") + .aisle("ADDDDDDDA", " DEEAEED ", " DEEAEED ", "ADEEAEEDA", " DEEAEED ", "AAAAAAAAA", " ") + .aisle("AAAAAAAAA", "A AAA A", "A AAA A", "AAAAQAAAA", " AAA ", " AAA ", " ") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(BICHROMAL_NEVRAMITE_CASING.get()) + .or(autoAbilities()) + .or(autoAbilities(CosmicRecipeTypes.HEAVY_ASSEMBLER)) + .or(abilities(PartAbility.IMPORT_FLUIDS,PartAbility.IMPORT_FLUIDS_4X,PartAbility.IMPORT_FLUIDS_9X)) + .or(abilities(PartAbility.INPUT_ENERGY).setExactLimit(1)) + .or(abilities(PartAbility.PARALLEL_HATCH, CosmicPartAbility.COSMIC_PARALLEL_HATCH).setExactLimit(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) //Part IO go here + .where('B', blocks(SELF_HEALING_PTHANTERUM.get())) + .where('C', blocks(NAQUADAH_PRESSURE_RESISTANT_CASING.get())) + .where('D', blocks(OSCILLATING_GILDED_PTHANTERUM_CASING.get())) + .where('F', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.TungstenCarbide))) + .where('E', blocks(ZBLAN_REINFORCED_GLASS.get())) + .where('G', blocks(GTBlocks.CASING_TUNGSTENSTEEL_GEARBOX.get())) + .where('H', frames(GTMaterials.HSLASteel)) + .where('I', blocks(GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get())) + .build()) + // spotless:on + .workableCasingModel(CosmicCore.id("block/casings/solid/bichromal_nevramite_casing"), + CosmicCore.id("block/multiblock/vomahine_chemplant")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PlasmiteDistillery.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PlasmiteDistillery.java new file mode 100644 index 000000000..548f25c68 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PlasmiteDistillery.java @@ -0,0 +1,66 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; + +// NOTE DO NOT ADD BERS/RENDERS TO THIS YET + +public class PlasmiteDistillery { + + public final static MultiblockMachineDefinition PLASMITE_DISTILLERY = REGISTRATE + .multiblock("plasmite_distillery", + WorkableElectricMultiblockMachine::new) + .langValue("§9Plasmite Distillery") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.PLASMITE_FORGE) + .appearanceBlock(HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING) + .partAppearance((controller, part, side) -> HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.getDefaultState()) + .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAAEEEEEEEEEEE", " AAAEFFFFFFFFFE", " AAAEFFFFFFFFFE", " AAAEFFFFFFFFFE", " AAAEEEEEEEEEEE", " AAA ", " AAA ", " AAA ", " AAA ", " AAA ", " AAA ", " ") + .aisle("AAAAAEEEEEEEEEA", "AABAA A", "AABAAGGGGGGGGGA", "AABAA A", "AABAAEFFFFFFFFA", "AABAAHHHHHHHHHA", "AABAA ", "AABAA ", "AABAA ", "AABAA ", "AABAA ", " AAA ") + .aisle("AAAAAEEEEEEEEEA", "ABCBAGGGGGGGGGA", "ABCBACCCCCCCCCA", "ABCBAGGGGGGGGGA", "ABCBAEFFFFFFFFA", "ABCBA A", "ABCBA ", "ABCBA ", "ABCBA ", "ABCBA ", "ABCBA ", " AAA ") + .aisle("AAAAAEEEEEEEEEA", "AABAA A", "AABAAGGGGGGGGGA", "AABAA A", "AABAAEFFFFFFFFA", "AABAAHHHHHHHHHA", "AABAA ", "AABAA ", "AABAA ", "AABAA ", "AABAA ", " AAA ") + .aisle(" AAAEEEEEEEEEEE", " AAAEFFFFFFFFFE", " AQAEFFFFFFFFFE", " AAAEFFFFFFFFFE", " AAAEEEEEEEEEEE", " AAA ", " AAA ", " AAA ", " AAA ", " AAA ", " AAA ", " ") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.get()) + .or(autoAbilities(CosmicRecipeTypes.PLASMITE_FORGE)) + .or(abilities(PartAbility.INPUT_ENERGY).setExactLimit(1)) + .or(abilities(PartAbility.PARALLEL_HATCH).setExactLimit(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('B', blocks(CASING_TUNGSTENSTEEL_PIPE.get())) + .where('C', blocks(CASING_GRATE.get())) + .where('F', blocks(ZBLAN_REINFORCED_GLASS.get())) + .where('E', blocks(NAQUADAH_PRESSURE_RESISTANT_CASING.get())) + .where('G', blocks(FUSION_CASING_MK2.get())) + .where('H', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, CosmicMaterials.Trinavine))) + .where('D', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get()).setMinGlobalLimited(28)) + .build()) + // spotless:on + .workableCasingModel(CosmicCore.id("block/casings/solid/highly_flexible_reinforced_trinavine_casing"), + GTCEu.id("block/multiblock/generator/large_gas_turbine")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/Polymerizer.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/Polymerizer.java new file mode 100644 index 000000000..fe5c9e0f2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/Polymerizer.java @@ -0,0 +1,65 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.ghostipedia.cosmiccore.common.data.datagen.CosmicMachineModels.createSeparateControllerCasingMachineModel; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.FUSION_GLASS; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.BATCH_MODE; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; + +public class Polymerizer { + + public static final MultiblockMachineDefinition POLYMERIZER = REGISTRATE + .multiblock("polymerizer", WorkableElectricMultiblockMachine::new) + .langValue("§aPolymerizer") + .recipeType(CosmicRecipeTypes.POLYMERIZER) + .rotationState(RotationState.NON_Y_AXIS) + .partAppearance((controller, part, side) -> CYCLOZINE_CHEMICALLY_REPELLING_CASING.getDefaultState()) + .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, + ELECTRIC_OVERCLOCK.apply(OverclockingLogic.PERFECT_OVERCLOCK), BATCH_MODE) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("X X", "X X", "AABBABBAA", "AABBABBAA", "AABBABBAA", " ", " ") + .aisle(" ", "AABBABBAA", "AD#####DA", "ADD###DDA", "AD#####DA", "AABBABBAA", " ") + .aisle("AABBABBAA", "AD#####DA", "EF#####FE", "EFD###DFE", "EF#####FE", "AD#####DA", "AABBABBAA") + .aisle("AABBABBAA", "ADD###DDA", "EFD###DFE", "EDDFFFDDE", "EFD###DFE", "ADD###DDA", "AABBABBAA") + .aisle("AABBABBAA", "AD#####DA", "EF#####FE", "EFD###DFE", "EF#####FE", "AD#####DA", "AABBABBAA") + .aisle(" ", "AABBABBAA", "AD#####DA", "ADD###DDA", "AD#####DA", "AABBABBAA", " ") + .aisle("X X", "X X", "AABBABBAA", "AABBQBBAA", "AABBABBAA", " ", " ") + .where('Q', Predicates.controller(Predicates.blocks(definition.get()))) + .where(' ', Predicates.any()) + .where('#', Predicates.air()) + .where('A', blocks(HIGH_TOLERANCE_RHENIUM_CASING.get())) + .where('B', blocks(FUSION_GLASS.get())) + .where('D', blocks(RESONANTLY_TUNED_VIRTUE_MELD_CASING.get())) + .where('E', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get()) + .or(autoAbilities(CosmicRecipeTypes.POLYMERIZER)) + .or(abilities(PartAbility.INPUT_ENERGY, PartAbility.INPUT_LASER).setMaxGlobalLimited(2, 2) + .setPreviewCount(1))) + .where('F', blocks(GEARBOX_PTHANTERUM.get())) + .where('X', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.NaquadahAlloy))) + .build()) + .model(createSeparateControllerCasingMachineModel( + CosmicCore.id("block/casings/solid/high_tolerance_rhenium_casing"), + CosmicCore.id("block/casings/solid/vomahine_certified_chemically_resistant_casing"), + GTCEu.id("block/multiblock/assembly_line"))) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PrismaticOreFoundry.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PrismaticOreFoundry.java new file mode 100644 index 000000000..98d69b099 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PrismaticOreFoundry.java @@ -0,0 +1,88 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GCYMBlocks; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; + +// NOTE DO NOT ADD BERS/RENDERS TO THIS YET + +public class PrismaticOreFoundry { + + public final static MultiblockMachineDefinition PRISMATIC_ORE_FOUNDRY = REGISTRATE + .multiblock("prismatic_ore_foundry", + WorkableElectricMultiblockMachine::new) + .langValue("Prismatic Ore Foundry") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.PRISMA_FOUNDRY) + .appearanceBlock(SELF_HEALING_PTHANTERUM) + .partAppearance((controller, part, side) -> SELF_HEALING_PTHANTERUM.getDefaultState()) + .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start(RelativeDirection.RIGHT, RelativeDirection.UP,RelativeDirection.FRONT) + .aisle(" NNNNNNNNNNNNNNNN ", " NHHHHNHHHHHNNNNN ", " NHHHHNHHHHHNNNNN ", " NNNNNNNNNNNNNNNN ", " N N N N ", " N N N N ", " N N N N ", " NNNNN NNNNN ", " ", " ", " ", " ", " ", " ") + .aisle(" NNNNNNNNNNNNNNNN ", " H N ", " HKKKKKKKKKKKKKKN ", " NN NHHHHHHIIIN ", " OOO III ", " OOO III ", " OOO III ", " NHNHN NNNNN ", " ", " ", " ", " ", " ", " ") + .aisle(" NNNNNNNNNNNNNNNN ", " HKKKKKKKKKKKKKKN ", " H N ", " NN NHHHHHHI IN ", " O O I I ", " O O I I ", " O O I I ", " NNINN NNNNN ", " I ", " I ", " I ", " ", " ", " ") + .aisle(" NNNNNNNNNNNNNNNN ", " H N ", " HKKKKKKKKKKKKKKN ", " NN NHHHHHHIIIN ", " OOO III ", " OOO III ", " OOO III ", " NHNHN NNNNN ", " ", " ", " I ", " ", " ", " ") + .aisle(" NNNNNNNNNNNNNNNN ", " NHHHHNHHHHHNNNNN ", " NHHHHNHHHHHNNNNN ", " NNNNNNNNNNNNNNNN ", " N N N N ", " N N N I N ", " N N N N ", " NNNNN NNNNN ", " ", " ", " I ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " M M ", " I ", " M M M M ", " ", " ", " ", " I ", " ", " ", " ") + .aisle(" AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " M M ", " AAAAA I ", " AAAAA M M ", " AAAAA ", " ", " AAAAA ", " AAIAA ", " AAAAA ", " ", " ") + .aisle(" ABBBBBA CCC ", " ABBBBBA CCC ", " ABBBBBA ", " ABBBBBA ", " DDDDD M M ", " ABBBBBA I ", " ABBBBBA M M ", " ABBBBBA ", " DDDDD CCC ", " ABBBBBA CCC ", " ABBBBBA ", " ABBBBBA ", " BBBBB ", " B B ") + .aisle("ABBBBBBBA CEEEC ", "ABF FBA CEEEC ", "ABFGGGFBA CEHEC ", "ABF FBA CEHEC ", " DD DD CEEEC ", "ABF FBA CEIEC ", "ABFGGGFBA CEEEC ", "ABF FBA CEHEC ", " DD DD CEEEC ", "ABF FBA CCCCC ", "ABFGGGFBA ", "ABF FBA ", " B B ", " ") + .aisle("ABBBBBBBA ICEEEEEC", "AB J BA ICE EC", "ABG GBA I EKKKE ", "AB J BA I E E ", " D D I EKKKE ", "AB J BA I E E ", "ABG GBA I EKKKE ", "AB J BA I E E ", " D D ICEKKKEC", "AB J BA ICCCCCCC", "ABG GBA I ", "AB J BA I ", " B IIII ", " B B ") + .aisle("ABBBBBBBA CEEEEEC", "AB JJJ BA CE EC", "ABG J GBALL H H ", "AB JJJ BA HKKKH ", " D D H H ", "AB JJJ BA HKKKH ", "ABG J GBALL H H ", "AB JJJ BA HKKKH ", " D D CE EC", "AB JJJ BA CCCCCCC", "ABG J GBALL ", "AB JJJ BA ", " B B ", " ") + .aisle("ABBBBBBBA ICEEEEEC", "AB J BA ICE EC", "ABG GBA I EKKKE ", "AB J BA I E E ", " D D I EKKKE ", "AB J BA I E E ", "ABG GBA I EKKKE ", "AB J BA I E E ", " D D ICEKKKEC", "AB J BA ICCCCCCC", "ABG GBA I ", "AB J BA I ", " B IIII ", " B B ") + .aisle("ABBBBBBBA CEEEC ", "ABF FBA CEEEC ", "ABFGGGFBA CEHEC ", "ABF FBA CEHEC ", " DD DD CEHEC ", "ABF FBA CEHEC ", "ABFGGGFBA CEHEC ", "ABF FBA CEHEC ", " DD DD CEEEC ", "ABF FBA CCCCC ", "ABFGGGFBA ", "ABF FBA ", " B B ", " ") + .aisle(" ABBBBBA CCC ", " ABBBBBA CQC ", " ABBBBBA ", " ABBBBBA ", " DDDDD ", " ABBBBBA ", " ABBBBBA ", " ABBBBBA ", " DDDDD CCC ", " ABBBBBA CCC ", " ABBBBBA ", " ABBBBBA ", " BBBBB ", " B B ") + .aisle(" AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " ", " AAAAA ", " AAAAA ", " AAAAA ", " ", " AAAAA ", " AAAAA ", " AAAAA ", " ", " ") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(GCYMBlocks.CASING_REACTION_SAFE.get())) + .where('B', blocks(GCYMBlocks.CASING_WATERTIGHT.get())) //.setMinGlobalLimited(28) + .where('C', blocks(SELF_HEALING_PTHANTERUM.get()) + .or(autoAbilities(CosmicRecipeTypes.PRISMA_FOUNDRY)) + .or(abilities(PartAbility.IMPORT_FLUIDS,PartAbility.IMPORT_FLUIDS_4X,PartAbility.IMPORT_FLUIDS_9X)) + .or(abilities(PartAbility.EXPORT_ITEMS,PartAbility.IMPORT_ITEMS)) + .or(abilities(PartAbility.INPUT_ENERGY, PartAbility.INPUT_LASER).setExactLimit(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1)) + .or(abilities(PartAbility.PARALLEL_HATCH).setMaxGlobalLimited(1,1)) + ) + .where('D', blocks(GCYMBlocks.CASING_CORROSION_PROOF.get())) + .where('E', blocks(WEAR_RESISTANT_RURIDIT_CASING.get())) + .where('F', blocks(CASING_POLYTETRAFLUOROETHYLENE_PIPE.get())) + .where('G', blocks(CASING_TITANIUM_PIPE.get())) + .where('H', blocks(ZBLAN_REINFORCED_GLASS.get())) + .where('I', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get())) + .where('J', blocks(CASING_TUNGSTENSTEEL_PIPE.get())) + .where('K', blocks(GEARBOX_PTHANTERUM.get())) + .where('L', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.TungstenCarbide))) + .where('M', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Neutronium))) + .where('N', blocks(CASING_STAINLESS_CLEAN.get())) + .where('O', blocks(COIL_TRANAVINE.get())) + .build()) + // spotless:on + .workableCasingModel(CosmicCore.id("block/casings/solid/self_healing_pthanterum_casing"), + GTCEu.id("block/multiblock/generator/large_gas_turbine")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PyrothermicRefinery.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PyrothermicRefinery.java new file mode 100644 index 000000000..fda9c2d84 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/PyrothermicRefinery.java @@ -0,0 +1,69 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.data.recipe.CosmicRecipeModifiers; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.RegressionPersistentWorkableElectricMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; + + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.IMPORT_EMBER; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.LIGHT_DAWNSTONE_CASING; +import static com.gregtechceu.gtceu.api.machine.multiblock.PartAbility.EXPORT_FLUIDS; +import static com.gregtechceu.gtceu.api.machine.multiblock.PartAbility.IMPORT_FLUIDS; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; + +public class PyrothermicRefinery { + + public final static MultiblockMachineDefinition PYROTHERMIC_REFINDERY = REGISTRATE + .multiblock("pyrothermic_refinery", RegressionPersistentWorkableElectricMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.PYROTHERMIC_REFINERY) + .appearanceBlock(LIGHT_DAWNSTONE_CASING) + .partAppearance((controller, part, side) -> LIGHT_DAWNSTONE_CASING.getDefaultState()) + .recipeModifiers(CosmicRecipeModifiers::innateParallel4x, + ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK)) + .pattern(definition -> FactoryBlockPattern.start() + // spotless:off + .aisle(" AAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBAA ", " DDD ", " DDD ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBA ", " D D ", " D D ", " DDDDD ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle("ABBBBBBBBBBBBBA", " AD DA ", " AD DA ", " A DEEED A ", " AAA E AAA ", " A E A ", " A E A ", " A E A ", " A E A ", " A E A ", " A E A ", " A E A ", " AAAAA ") + .aisle("ABBBBBBBBBBBBBA", " C D D C ", " C D D C ", " C DEEED C ", " C FEF C ", " C FEF C ", " C FEFCCCCC ", " C FEF ", " C FEF ", " C FEF ", " CCCCCFEF ", " FEF ", " A A ") + .aisle("ABBBBBBBBBBBBBA", " AD DA ", " AD DA ", " A DEEED A ", " AAA E AAA ", " A E A ", " A E A ", " A E A ", " A E A ", " A E A ", " A E A ", " A E A ", " AAAAA ") + .aisle(" ABBBBBBBBBBBA ", " D D ", " D D ", " DDDDD ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBAA ", " DQD ", " DDD ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + // spotless:on + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('A', blocks(CosmicBlocks.REINFORCED_DAWNSTONE_CASING.get())) + .where('B', blocks(CosmicBlocks.LIGHT_DAWNSTONE_CASING.get())) + .where('C', blocks(CosmicBlocks.STEEL_PLATED_BRONZE.get())) + .where('D', blocks(CosmicBlocks.LIGHT_DAWNSTONE_CASING.get()) + .or(abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1)) + .or(abilities(PartAbility.EXPORT_ITEMS).setPreviewCount(1)) + .or(abilities(EXPORT_FLUIDS).setPreviewCount(1)) + .or(abilities(IMPORT_EMBER).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setExactLimit(1))) + .where('E', blocks(CosmicBlocks.LIGHT_DAWNSTONE_CASING.get())) + .where('F', abilities(IMPORT_FLUIDS)) + + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/light_dawnstone_casing"), + CosmicCore.id("block/multiblock/dawnforge")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/Roaster.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/Roaster.java new file mode 100644 index 000000000..f15035be8 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/Roaster.java @@ -0,0 +1,53 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.CASING_INVAR_HEATPROOF; + +public class Roaster { + + public final static MultiblockMachineDefinition LARGE_ROASTER = REGISTRATE + .multiblock("large_roaster", + WorkableElectricMultiblockMachine::new) + .langValue("§cLarge Roaster") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.LARGE_ROASTER) + .appearanceBlock(CASING_INVAR_HEATPROOF) + .partAppearance((controller, part, side) -> CASING_INVAR_HEATPROOF.getDefaultState()) + .recipeModifiers( + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle("A A", "ABA", "BBB", "BBB", " B ") + .aisle(" B ", "BBB", "B B", "B B", "B B") + .aisle("A A", "ABA", "BQB", "BBB", " B ") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', frames(GTMaterials.BlackSteel)) + .where('B', blocks(CASING_INVAR_HEATPROOF.get()) + .or(autoAbilities(CosmicRecipeTypes.LARGE_ROASTER)) + .or(abilities(PartAbility.INPUT_ENERGY).setMaxGlobalLimited(2,2)) + .or(abilities(CosmicPartAbility.IMPORT_EMBER).setMaxGlobalLimited(1,1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .build()) + // spotless:on + .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_heatproof"), + GTCEu.id("block/overlay/machine/roaster")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SpiritCrucible.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SpiritCrucible.java new file mode 100644 index 000000000..14ef3ad3c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SpiritCrucible.java @@ -0,0 +1,72 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.client.renderer.machine.CosmicDynamicRenderHelpers; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes.SOUL_FOUNDRY; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GCYMBlocks.CASING_ATOMIC; +import static com.gregtechceu.gtceu.common.data.GTMaterials.TungstenCarbide; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.BATCH_MODE; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.createWorkableCasingMachineModel; + +public class SpiritCrucible { + + public final static MultiblockMachineDefinition SPIRIT_CRUCIBLE = REGISTRATE + .multiblock("spirit_crucible", WorkableElectricMultiblockMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeTypes(CosmicRecipeTypes.SPIRIT_CRUCIBLE, SOUL_FOUNDRY) + .recipeModifiers(ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK), BATCH_MODE) + .appearanceBlock(CASING_ATOMIC) + .partAppearance((controller, part, side) -> CASING_ATOMIC.getDefaultState()) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle("AAB BAA", " B B ", " B B ", " B B ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle("AA AA", " A A ", " AAB BAA ", " B B ", " B B ", " B B ", " ", " ", " ", " B B ", " B B ", " B B ", " B B ", " B B ") + .aisle("B CAAAC B", "B CAAAC B", "BAA CAAAC AAB", "B A CAAAC A B", " AAC CAA ", " D C C D ", " D C C D ", " D C C D ", " D C C D ", " BBC CBB ", " C C ", " ", " ", " ") + .aisle(" EEE ", " EEE ", " B EEE B ", " B EEE B ", " BAAAAAAAAAB ", " B A A B ", " A A ", " ", " ", " BBC CBB ", " B C C B ", " B C C B ", " B B ", " B B ") + .aisle(" C EAAAE C ", " C EAAAE C ", " C EAAAE C ", " C EAAAE C ", " CAA AAC ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " ", " ", " ") + .aisle(" AEAAAAAEA ", " AEA AEA ", " AEA AEA ", " AEA AEA ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AEAAAAAEA ", " AEA AEA ", " AEA AEA ", " AEA AEA ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AEAAAAAEA ", " AEA AEA ", " AEA AEA ", " AEA AEA ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" C EAAAE C ", " C EAAAE C ", " C EAAAE C ", " C EAAAE C ", " CAA AAC ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " ", " ", " ") + .aisle(" EEE ", " EEE ", " B EEE B ", " B EEE B ", " BAAAAAAAAAB ", " B A B ", " A A ", " ", " ", " BBC CBB ", " B C C B ", " B C C B ", " B B ", " B B ") + .aisle("B CAAAC B", "B CAAAC B", "BAA CAQAC AAB", "B A CAAAC A B", " AAC CAA ", " D C C D ", " D C C D ", " D C C D ", " D C C D ", " BBC CBB ", " C C ", " ", " ", " ") + .aisle("AA AA", " A A ", " AAB BAA ", " B B ", " B B ", " B B ", " ", " ", " ", " B B ", " B B ", " B B ", " B B ", " B B ") + .aisle("AAB BAA", " B B ", " B B ", " B B ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('C', blocks(CosmicBlocks.SELF_HEALING_PTHANTERUM.get())) + .where('A', blocks(CASING_ATOMIC.get()) + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(4)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) + .setMaxGlobalLimited(2)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setMinGlobalLimited(1,1)) + .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMinGlobalLimited(1,1)) + ) + .where('D', frames(TungstenCarbide)) + .where('E', blocks(CASING_ATOMIC.get())) + .where('B', blocks(CosmicBlocks.RESONANTLY_TUNED_VIRTUE_MELD_CASING.get())) + .build()) + // spotless:on + .model(createWorkableCasingMachineModel( + GTCEu.id("block/casings/gcym/atomic_casing"), + GTCEu.id("block/multiblock/fusion_reactor")) + .andThen(model -> model.addDynamicRenderer(CosmicDynamicRenderHelpers::getSpiritCrucibleRender))) + .hasBER(true) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StarLadder.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StarLadder.java new file mode 100644 index 000000000..11964b2e3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StarLadder.java @@ -0,0 +1,190 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.client.renderer.machine.CosmicDynamicRenderHelpers; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.StarLadderMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import net.minecraft.network.chat.Component; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.createWorkableCasingMachineModel; + +public class StarLadder { + + public final static MultiblockMachineDefinition STAR_LADDER = REGISTRATE + .multiblock("star_ladder", StarLadderMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.STAR_LADDER_RESEARCH) + .recipeModifier(GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK)) + .appearanceBlock(CosmicBlocks.CYCLOZINE_CHEMICALLY_REPELLING_CASING) + .pattern(definition -> FactoryBlockPattern.start() + // spotless:off + .aisle(" A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABA ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABA ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABAA ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBA ", " BBB ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBA ", " BBB ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBAA ", " BBB ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBA ", " BB BB ", " B ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBAA ", " BB BB ", " B ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBA ", " BB B BB ", " BBB ", " AAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBA ", " BB B BB ", " BBB ", " ABA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBAA ", " B BBB B ", " BBBBB ", " AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBA ", " BB BBB BB ", " BBBBB ", " ABBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBA ", " B BBBBB B ", " BBBBBBB ", " AABBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBA ", " B BBBBB B ", " BBBBBBB ", " ABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBA ", " B BBBBB B ", " BBBBBBB ", " ABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBAA ", " B BBBBB B ", " BBBBBBB ", " ABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBA ", " BBBBBBBBBBB ", " BBBBBBBBB ", " AABBBBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBA ", " B BBBBBBB B ", " BBBBBBBBB ", " ABBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBA ", " B BBBBBBB B ", " BBBBBBBBB ", " ABBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBA ", " B BBBBBBB B ", " BBBBBBBBB ", " ABBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBAA ", " B BBBBBBB B ", " BBBBBBBBB ", " ABBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBA ", " BBBBBBBBBBBBB ", " BBBBBBBBBBB ", " AABBBBBBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBA ", " B BBBBBBBBB B ", " BBBBBBBBBBB ", " ABBBBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBA ", " B BBBBBBBBB B ", " BBBBBBBBBBB ", " ABBBBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBAA ", " B BBBBBBBBB B ", " BBBBBBBBBBB ", " ABBBBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBA ", " BBBBBBBBBBBBBBB ", " BBBBBBBBBBBBB ", " AABBBBBBBBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBAA ", " B BBBBBBBBBBB B ", " BBBBBBBBBBBBB ", " ABBBBBABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBBBA ", " BB BBBBBBBBBBB BB ", " BBBBBBBBBBBBB ", " ABBBBBABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBAA ", " BB BBBBBBBBBBB BB ", " BBBBBBBBBBBBB ", " ABBBBAAABBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBAA ", " BB BBBBBBBBBBBBB BB ", " BBBBBBBBBBBBBBB ", " AABBBBACABBBBAA ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBAAA ", " BBB BBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBB ", " ABBBBBACABBBBBA ", " C ", " C ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " BBBBB BBBBBBBBBBBBB BBBBB ", " BBBBBBBBBBBBBBB ", " ABBBBAACAABBBBA ", " C ", " C ", " C ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBBBBBB BBBBBBBBBBBBBBB BBBBBBB ", " BBBBBBBBBBBBBBBBB ", " AABBBBACCCABBBBAA ", " CCC ", " CCC ", " C ", " C ", " C ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBBBBBBB BBBBBBBBBBBBBBB BBBBBBBB ", " BBBBBBBBBBBBBBBBB ", " ABBBBBACCCABBBBBA ", " CCC ", " CCC ", " CCC ", " CCC ", " CCC ", " C ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " BBBB B BBBBBBBBBBBBBBB B BBBB ", " BBBB BBBBBBBBBBBBBBBBB BBBB ", " AAAA ABBBBAACCCAABBBBA AAAA ", " CCC ", " CCC ", " CCC ", " CCC ", " CCC ", " CCC ", " CCC ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " ABB BBBB BBBBBBBBBBBBBBBBB BBBB BBA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAAAABBBBACCCCCABBBBAAAAAAAA ", " AAA A CCCCC A AAA ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCC A ", " A CCC A ", " A CCC A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " AAA BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB AAA ", " ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA ", " AAAAAAAAABBBBBACCCCCABBBBBAAAAAAAAA ", " ADAA DDD CCCCC DDD AADA ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCC D D ", " D D C D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " DDD DDD ", " A A ", " A A ", " A A ", " A A ", " A A ", " AA AA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " A ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA A ", " AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " AAAAAAABBBBBBBAACCCCCAABBBBBBBAAAAAAA ", " AAAA ADDD CCCCC DDDA AAAA ", " AD A CCCCC A DA ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCC A ", " A CCC A ", " A C A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ADDD DDDA ", " AADDD DDDAA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " AAAAAAABBCCCBBBACCCCCCCABBBCCCBBAAAAAAA ", " AAAA DDD CCCCCCC DDD AAAA ", " AA D D CCCCCCC D D AA ", " AD D D CCCCCCC D D DA ", " D D CCCCCCC D D ", " D D CCCCCCC D D ", " D D CCCCCCC D D ", " D D CCCCCCC D D ", " D D CCCCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCC D D ", " D D CCC D D ", " D D C D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " AADDD DDDAA ", " A ED DE A ", " A ED DE A ", " A ED DE A ", " A ED DE A ", " A ED DE A ", " ED DE ", " ED DE ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAAABBCCCBBBBACCCCCCCABBBBCCCBBAAAAAAA ", " AAAA CCCCCCC AAAA ", " AA CCCCCCC AA ", " AA CCCCCCC AA ", " AD CCCCCCC DA ", " AD CCCCCCC DA ", " D CCCCCCC D ", " D CCCCCCC D ", " D CCCCCCC D ", " CCCCCCC ", " CCCCCCC ", " CCCCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " EEE CCC EEEEE ", " AAAAA CCC AAAAA ", " EEE C EEEEE ", " C ", " ", " ", " ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DD DDE ", " DD DD ", " DD DDE ", " DD DD ", " DD DD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " DD DD ", " DD DD ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAACCCCCCCBBBBAACCCCCCCAABBBBCCCCCCCAAAA ", " AAAAA CCCCCCC AAAAA ", " AA CCCCCCC AA ", " AA CCCCCCC AA ", " A CCCCCCC A ", " A CCCCCCC A ", " A CCCCCCC A ", " A CCCCCCC A ", " D CCCCCCC D ", " D CCCCCCC D ", " D CCCCCCC D ", " CCCCCCC ", " CCCCCCC ", " CCCCCCC ", " CCCCCCC ", " EEE CCCCC EE EEE ", " AAA AA CCC AA AAA ", " EEE CCC EE EEE ", " CCC ", " CCC ", " ", " ", " ", " ", " ", " ", " EE EE ", " AA AA ", " EE EE ", " ", " ", " ", " ", " ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DDD DDD ", " DDD DDD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " D D ", " D D ", " D D ", " D D ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAACCCCCBBBBBAACCCCCCCCCAABBBBBCCCCCAAAAA ", " AAAAADD CCCCCCCC DDAAAAA ", " AAA DD CCCCCCCC DD AAA ", " AA CCCCCCCC AA ", " A CCCCCCCC A ", " A CCCCCCCC A ", " CCCCCCCC ", " CCCCCCCC ", " CCCCCCCC ", " CCCCCCCC ", " D CCCCCCCC D ", " D CCCCCCCC D ", " D CCCCCCC D ", " CCCCCCC ", " CCCCCCC ", " EEE CCCCCCCEE EEE ", " AAA AAACCCCCAAA AAA ", " EEE CCCCCEEE EEE ", " CCC ", " CCC ", " C ", " C ", " C ", " C ", " C ", " C ", " EEE EEE ", " AAA AAA ", " EEE EEE ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAACCCCBBBBAAACCCCCCCCCCCAAABBBBCCCCAAAAA ", " DAA DCCC CCCCCCC CCCD AAD ", " DA DCCC CCCCCCC CCCD AD ", " D CCC CCCCCCC CCC D ", " D CCC CCCCCCC CCC D ", " D CCC CCCCCCC CCC D ", " D CCC CCCCCCC CCC D ", " D CCC CCCCCCC CCC D ", " DD CCC CCCCCCC CCC DD ", " D CCC CCCCCCC CCC D ", " DDCCC CCCCCCC CCCDD ", " DCCC CCCCCCC CCCD ", " DCCC CCCCCCC CCCD ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " ECCCE CCCCCCC ECCCE ", " ACCCA CCCCC ACCCA ", " ECCCE CCCCC ECCCE ", " AA CCCCC AA ", " AA CCC AA ", " AA CCC AA ", " AA CCC AA ", " A CCC A ", " A C A ", " A C A ", " A C A ", " EEE C EEE ", " AAA AAA ", " EEE EEE ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAABCCCCCBAAACCCCCCCCCCCCCCCAAABCCCCCBAAAAA ", " AA CCC CCCCCCC CCC AA ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " ECCCE CCCCCCC ECCCE ", " ACCCA CCCCC ACCCA ", " ECCCE CCCCC ECCCE ", " ACCC CCCCC CCCA ", " ACCC CCCCC CCCA ", " ACCC CCCCC CCCA ", " ACCC CCC CCCA ", " ACCC CCC CCCA ", " ACCC CCC CCCA ", " ACCC CCC CCCA ", " ACCC C CCCA ", " ECCCE C ECCCE ", " ACCCA C ACCCA ", " ECCCE C ECCCE ", " AA AA ", " AA AA ", " AAA AAA ", " AA AA ", " AA AA ", " AA AA ", " AA AA ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAABBCCBCCAACCCCCCAAAAAAACCCCCCAACCBCCBBAAAA ", " AA CC EDCCCDE CC AA ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CCC EDCCCDE CCC ", " CCC EDDCDDE CCC ", " EECCCE E DCD E ECCCEE ", " AACCCA E DCD E ACCCAA ", " EECCCE E DCD E ECCCEE ", " CCC E DCD E CCC ", " CCC E DDD E CCC ", " CCC E D E CCC ", " CCC E D E CCC ", " CCC E D E CCC ", " CCC E D E CCC ", " CCC E E CCC ", " CCC E E CCC ", " ECCCE E E ECCCE ", " ACCCA E E ACCCA ", " ECCCE E E ECCCE ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC CCCA ", " ACCC CCCA ", " CCC CCC ", " CCC CCC ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAABBCCBBBACCCCCCAAAAAAAAAAACCCCCCABBBCCBBAAA ", " A FFFFF A ", " FFQFF ", " FFFFF ", " FFF ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E EEE EEE E ", " A AAA AAA A ", " E EEE EEE E ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CCC CCC ", " CCC CCC ", " EECCCE ECCCEE ", " AACCCA ACCCAA ", " EECCCE ECCCEE ", " CCC CCC ", " CCC CCC ", " ACCC CCCA ", " ACCC CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACC CCA ", " ACC CCA ", " AC CA ", " AC CA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAABCCCBBAACCCCAAAAAAAAAAAAAAACCCCAABBCCCBAAA ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " EE EE ", " AA AA ", " EE EE ", " ", " ", " ", " ", " ", " ", " ", " ", " E EEE EEE E ", " A AAA AAA A ", " E EEE EEE E ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CC CC ", " CC CC ", " C C ", " C C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " BBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AABCCBBBACCCCAAAAAAAAAAAAAAAAACCCCABBBCCBAA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A E E A ", " A A A A ", " A E E A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " EE EE ", " AA AA ", " EE EE ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CC CC ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAABBCBBBAACCCAAAAAAAAAAAAAAAAAAACCCAABBBCBBAAAA ", " DDD DDD ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D DE ED D ", " D DA AD D ", " D DE ED D ", " D D D D ", " D D D D ", " D D D D ", " DDD DDD ", " A A ", " A A ", " A A ", " A A ", " A EE E A ", " AA A A AA ", " AEE E A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " C C ", " C C ", " C C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAA ", " BBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAABBBBBBBBBACCCAAAAAAAAAAAAAAAAAAAAACCCABBBBBBBBBAAAA ", " ADDD DDDA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A E E A ", " A A A A ", " A E E A ", " A A ", " A A ", " A A ", " ADDD DDDA ", " AADDD DDDAA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAAA ", " BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAABBBBBBBBBBBAACCCAAAAAAAAAAAAAAAAAAAAACCCAABBBBBBBBBBBAAAAA ", " DDD E E DDD ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D DEE E E EED D ", " D DAA E E AAD D ", " D DEE E E EED D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " DDD E E DDD ", " DDD E E DDD ", " DDD E E DDD ", " DDD E E DDD ", " DDD E E DDD ", " DDD E E DDD ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " AADDD E E DDDAA ", " A ED E E DE A ", " A ED E E DE A ", " A ED E E DE A ", " A ED E E DE A ", " A ED E E DE A ", " ED E E DE ", " ED E E DE ", " E E E E ", " E E E E ", " E E E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ") + .aisle(" AAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAAA ", " BBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAABBBBBBBBBBBBBBAACCCAAAAAAAAAAAAAAAAAAAAAAACCCAABBBBBBBBBBBBBBAAAAA ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " EE EE ", " AA AA ", " EE CCCCC EE ", " ", " ", " ", " CCCCC ", " DD DD ", " DD DD ", " DD DD ", " DD CCCCC DD ", " DD DD ", " DD DD ", " DD DD ", " DD CCCCC DD ", " DD DD ", " DDD DDD ", " DDD DDD ", " DDD CCCCC DDD ", " DDD DDD ", " EDD DDE ", " EDD DDE ", " EDD CCCCC DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD CCCCC DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " DD CCCCC DD ", " DD DD ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " BBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAABBBBBBBBBBBBBBBAAAACCCCAAAAAAAAAAAAAAAAAAAAAAACCCCAAAABBBBBBBBBBBBBBBAAAAAA ", " C CCA ACC ", " C A A ", " C AAA ", " C A A ", " C CCA ACC ", " C A A ", " C AAA ", " C A A ", " C CCA ACC ", " C A A ", " C AAA ", " A A ", " CCA ACC ", " A A ", " E AAA E ", " A A A A ", " E CCA ACC E ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " DD A A DD ", " DD AAA DD ", " DD A A DD ", " DD CCA ACC DD ", " DD A A DD ", " DD AAA DD ", " DDD A A DDD ", " DDD CCA ACC DDD ", " DD A A DD ", " DD AAA DD ", " DD A A DD ", " DD CCA ACC DD ", " DD A A DD ", " D AAA D ", " D A A D ", " D CCA ACC D ", " D A A D ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " BBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAABBBBBBBBBBBBBBBBBAAAACCCCCCAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCAAAABBBBBBBBBBBBBBBBBAAAAA ", " CCCCCCE CE EC ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE CE EC ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCE CE EC ECCCCC ", " CCCCCE E E ECCCCC ", " CCCCCE E E ECCCCC ", " CCCCE E E ECCCC ", " CCCCE CE EC ECCCC ", " CCCCE E E ECCCC ", " CCCE E E ECCC ", " A E E E E A ", " E E CE EC E E ", " E E E E ", " E E E E ", " E E E E ", " E CE EC E ", " E E E E ", " E E E E ", " E E E E ", " E CE EC E ", " E E E E ", " E E E E ", " E E E E ", " E CE EC E ", " E E E E ", " E E E E ", " E E E E ", " EE CE EC EE ", " E E E E ", " E E E E ", " E E E E ", " E CE EC E ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " BBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAABBBBBBBBBBBBBBBBBBAAAACCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCCAAAABBBBBBBBBBBBBBBBBBAAA ", " CCCCCCCCCDF CC CC FDCCCCCCCCC ", " CCCCCCCCCDF FDCCCCCCCCC ", " CCCCCCCCCDF FDCCCCCCCCC ", " CCCCCCCCCD DCCCCCCCCC ", " CCCCCCCCCD CC CC DCCCCCCCCC ", " CCCCCCCCD DCCCCCCCC ", " CCCCCCCCD DCCCCCCCC ", " CCCCCCCCD DCCCCCCCC ", " CCCCCCD CC CC DCCCCCC ", " CCCCCCD DCCCCCC ", " CCCCCCD DCCCCCC ", " CCCCCD DCCCCC ", " CCCCCD CC CC DCCCCC ", " CCCCCD DCCCCC ", " CCCC CCCC ", " CCC CCC ", " CCC CC CC CCC ", " CC CC ", " C C ", " C C ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAABBBBBBBBBBBBBBBBBAAAACCCCCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCCCCCAAAABBBBBBBBBBBBBBBBBAAA ", " CCCCCCCCCCCCCF ECA ACE FCCCCCCCCCCCCC ", " CCCCCCCCCCCCCF E A A E FCCCCCCCCCCCCC ", " CCCCCCCCCCCCF E A A E FCCCCCCCCCCCC ", " CCCCCCCCCCCCF E A A E FCCCCCCCCCCCC ", " CCCCCCCCCCCC ECA ACE CCCCCCCCCCCC ", " CCCCCCCCCCC E A A E CCCCCCCCCCC ", " CCCCCCCCCCC E A A E CCCCCCCCCCC ", " CCCCCCCCCC E A A E CCCCCCCCCC ", " CCCCCCCCC ECA ACE CCCCCCCCC ", " CCCCCCCC E A A E CCCCCCCC ", " CCCCCCC E A A E CCCCCCC ", " CCCCCCC E A A E CCCCCCC ", " CCCCCCC ECA ACE CCCCCCC ", " CCCCCD E A A E DCCCCC ", " CCCCCD E A A E DCCCCC ", " CCCCCD E A A E DCCCCC ", " CCCCD ECA ACE DCCCC ", " CCCCD E A A E DCCCC ", " CCCCD E A A E DCCCC ", " CC E A A E CC ", " CC ECA ACE CC ", " CC E A A E CC ", " C E A A E C ", " C E A A E C ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ") + .aisle("AAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAA", " AAABBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBAAA ", " AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " AAABBBBBBBBBBBBBBBBBAAACCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCCCCCCCCAAABBBBBBBBBBBBBBBBBAAA ", " CCCCCCCCCCCCCCCCF C C FCCCCCCCCCCCCCCCC ", " CCCCCCCCCCCCCCCF FCCCCCCCCCCCCCCC ", " CCCCCCCCCCCCCCCF A A FCCCCCCCCCCCCCCC ", " CCCCCCCCCCCCCCF FCCCCCCCCCCCCCC ", " CCCCCCCCCCCCC C C CCCCCCCCCCCCC ", " CCCCCCCCCCCCC CCCCCCCCCCCCC ", " CCCCCCCCCCCC A A CCCCCCCCCCCC ", " CCCCCCCCCCC CCCCCCCCCCC ", " CCCCCCCCC C C CCCCCCCCC ", " CCCCCCCCC CCCCCCCCC ", " CCCCCCCC A A CCCCCCCC ", " CCCCCCC CCCCCCC ", " CCCCCCC C C CCCCCCC ", " CCCCCCC CCCCCCC ", " CCCCCC A A CCCCCC ", " CCCCCC CCCCCC ", " CCCCCC C C CCCCCC ", " CCCCCC CCCCCC ", " CCCCD A A DCCCC ", " CCCD DCCC ", " CCCD C C DCCC ", " CCCD DCCC ", " CCCD A A DCCC ", " CCC CCC ", " CCC C C CCC ", " CC CC ", " C A A C ", " C C ", " C C ", " ", " A A ", " ", " C C ", " ", " A A ", " ", " C C ", " ", " A A ", " ", " C C ", " ", " A A ", " ", " C C ", " ", " A A ", " ", " C C ", " ", " A A ", " ", " C C ", " ", " A A ", " ", " C C ", " ", " A A ", " ", " C C ", " ", " A A ", " ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAABBBBBBBBBBBBBBBBBAAAACCCCCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCCCCCAAAABBBBBBBBBBBBBBBBBAAA ", " CCCCCCCCCCCCCF ECA ACE FCCCCCCCCCCCCC ", " CCCCCCCCCCCCCF E A A E FCCCCCCCCCCCCC ", " CCCCCCCCCCCCF E A A E FCCCCCCCCCCCC ", " CCCCCCCCCCCCF E A A E FCCCCCCCCCCCC ", " CCCCCCCCCCCC ECA ACE CCCCCCCCCCCC ", " CCCCCCCCCCC E A A E CCCCCCCCCCC ", " CCCCCCCCCCC E A A E CCCCCCCCCCC ", " CCCCCCCCCC E A A E CCCCCCCCCC ", " CCCCCCCCC ECA ACE CCCCCCCCC ", " CCCCCCCC E A A E CCCCCCCC ", " CCCCCCC E A A E CCCCCCC ", " CCCCCCC E A A E CCCCCCC ", " CCCCCCC ECA ACE CCCCCCC ", " CCCCCD E A A E DCCCCC ", " CCCCCD E A A E DCCCCC ", " CCCCCD E A A E DCCCCC ", " CCCCD ECA ACE DCCCC ", " CCCCD E A A E DCCCC ", " CCCCD E A A E DCCCC ", " CC E A A E CC ", " CC ECA ACE CC ", " CC E A A E CC ", " C E A A E C ", " C E A A E C ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ", " ECA ACE ", " E A A E ", " E A A E ", " E A A E ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " BBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAABBBBBBBBBBBBBBBBBBAAAACCCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCCAAAABBBBBBBBBBBBBBBBBBAAA ", " CCCCCCCCCDF CC CC FDCCCCCCCCC ", " CCCCCCCCCDF FDCCCCCCCCC ", " CCCCCCCCCDF FDCCCCCCCCC ", " CCCCCCCCCD DCCCCCCCCC ", " CCCCCCCCCD CC CC DCCCCCCCCC ", " CCCCCCCCD DCCCCCCCC ", " CCCCCCCCD DCCCCCCCC ", " CCCCCCCCD DCCCCCCCC ", " CCCCCCD CC CC DCCCCCC ", " CCCCCCD DCCCCCC ", " CCCCCCD DCCCCCC ", " CCCCCD DCCCCC ", " CCCCCD CC CC DCCCCC ", " CCCCCD DCCCCC ", " CCCC CCCC ", " CCC CCC ", " CCC CC CC CCC ", " CC CC ", " C C ", " C C ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ", " CC CC ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " BBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAABBBBBBBBBBBBBBBBBAAAACCCCCCAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCAAAABBBBBBBBBBBBBBBBBAAAAA ", " CCCCCCE CE EC ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE CE EC ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCCE E E ECCCCCC ", " CCCCCE CE EC ECCCCC ", " CCCCCE E E ECCCCC ", " CCCCCE E E ECCCCC ", " CCCCE E E ECCCC ", " CCCCE CE EC ECCCC ", " CCCCE E E ECCCC ", " CCCE E E ECCC ", " A E E E E A ", " E CE EC E E ", " E E E E ", " E E E E ", " E E E E ", " E CE EC E ", " E E E E ", " E E E E ", " E E E E ", " E CE EC E ", " E E E E ", " E E E E ", " E E E E ", " E CE EC E ", " E E E E ", " E E E E ", " E E E E ", " EE CE EC EE ", " E E E E ", " E E E E ", " E E E E ", " E CE EC E ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ", " CE EC ", " E E ", " E E ", " E E ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " BBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAABBBBBBBBBBBBBBBAAAACCCCAAAAAAAAAAAAAAAAAAAAAAACCCCAAAABBBBBBBBBBBBBBBAAAAAA ", " CCA ACC C ", " A A C ", " AAA C ", " A A C ", " CCA ACC C ", " A A C ", " AAA C ", " A A C ", " CCA ACC C ", " A A C ", " AAA C ", " A A ", " CCA ACC ", " A A ", " AAA E ", " A A A A ", " CCA ACC E ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " DD A A DD ", " DD AAA DD ", " DD A A DD ", " DD CCA ACC DD ", " DD A A DD ", " DD AAA DD ", " DDD A A DDD ", " DDD CCA ACC DDD ", " DD A A DD ", " DD AAA DD ", " DD A A DD ", " DD CCA ACC DD ", " DD A A DD ", " D AAA D ", " D A A D ", " D CCA ACC D ", " D A A D ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ", " CCA ACC ", " A A ", " AAA ", " A A ") + .aisle(" AAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAAA ", " BBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAABBBBBBBBBBBBBBAACCCAAAAAAAAAAAAAAAAAAAAAAACCCAABBBBBBBBBBBBBBAAAAA ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " EE ", " AA AA ", " CCCCC EE ", " ", " ", " ", " CCCCC ", " DD DD ", " DD DD ", " DD DD ", " DD CCCCC DD ", " DD DD ", " DD DD ", " DD DD ", " DD CCCCC DD ", " DD DD ", " DDD DDD ", " DDD DDD ", " DDD CCCCC DDD ", " DDD DDD ", " EDD DDE ", " EDD DDE ", " EDD CCCCC DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD CCCCC DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " DD CCCCC DD ", " DD DD ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ", " CCCCC ", " ", " ", " ") + .aisle(" AAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAAA ", " BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAABBBBBBBBBBBAACCCAAAAAAAAAAAAAAAAAAAAACCCAABBBBBBBBBBBAAAAA ", " DDD E E DDD ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " D D E E EED D ", " D DAA E E AAD D ", " D D E E EED D ", " D D E E D D ", " D D E E D D ", " D D E E D D ", " DDD E E DDD ", " DDD E E DDD ", " DDD E E DDD ", " DDD E E DDD ", " DDD E E DDD ", " DDD E E DDD ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " ADDD E E DDDA ", " AADDD E E DDDAA ", " A ED E E DE A ", " A ED E E DE A ", " A ED E E DE A ", " A ED E E DE A ", " A ED E E DE A ", " ED E E DE ", " ED E E DE ", " E E E E ", " E E E E ", " E E E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ") + .aisle(" AAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAA ", " BBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAABBBBBBBBBACCCAAAAAAAAAAAAAAAAAAAAACCCABBBBBBBBBAAAA ", " ADDD DDDA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A E A ", " A A A A ", " A E A ", " A A ", " A A ", " A A ", " ADDD DDDA ", " AADDD DDDAA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " BBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAABBCBBBAACCCAAAAAAAAAAAAAAAAAAACCCAABBBCBBAAAA ", " DDD DDD ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D DE ED D ", " D DA AD D ", " D DE ED D ", " D D D D ", " D D D D ", " D D D D ", " DDD DDD ", " A A ", " A A ", " A A ", " A A ", " A E EE A ", " AA A A AA ", " A E EEA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " C C ", " C C ", " C C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " BBBBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AABCCBBBACCCCAAAAAAAAAAAAAAAAACCCCABBBCCBAA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A E E A ", " A A A A ", " A E E A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " EE EE ", " AA AA ", " EE EE ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CC CC ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAABCCCBBAACCCCAAAAAAAAAAAAAAACCCCAABBCCCBAAA ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " EE EE ", " AA AA ", " EE EE ", " ", " ", " ", " ", " ", " ", " ", " ", " E EEE EEE E ", " A AAA AAA A ", " E EEE EEE E ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CCC CCC ", " CC CC ", " CC CC ", " C C ", " C C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAABBCCBBBACCCCCCAAAAAAAAAAACCCCCCABBBCCBBAAA ", " A FFFFF A ", " FFFFF ", " FFFFF ", " FFF ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E EEE EEE E ", " A AAA AAA A ", " E EEE EEE E ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CC CC ", " CCC CCC ", " CCC CCC ", " EECCCE ECCCEE ", " AACCCA ACCCAA ", " EECCCE ECCCEE ", " CCC CCC ", " CCC CCC ", " ACCC CCCA ", " ACCC CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACC CCA ", " ACC CCA ", " AC CA ", " AC CA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAABBCCBCCAACCCCCCAAAAAAACCCCCCAACCBCCBBAAAA ", " AA CC EDCCCDE CC AA ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CC EDCCCDE CC ", " CCC EDCCCDE CCC ", " CCC EDDCDDE CCC ", " EECCCE E DCD E ECCCEE ", " AACCCA E DCD E ACCCAA ", " EECCCE E DCD E ECCCEE ", " CCC E DCD E CCC ", " CCC E DDD E CCC ", " CCC E D E CCC ", " CCC E D E CCC ", " CCC E D E CCC ", " CCC E D E CCC ", " CCC E E CCC ", " CCC E E CCC ", " ECCCE E E ECCCE ", " ACCCA E E ACCCA ", " ECCCE E E ECCCE ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC E E CCCA ", " ACCC CCCA ", " ACCC CCCA ", " CCC CCC ", " CCC CCC ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAABCCCCCBAAACCCCCCCCCCCCCCCAAABCCCCCBAAAAA ", " AA CCC CCCCCCC CCC AA ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " ECCCE CCCCCCC ECCCE ", " ACCCA CCCCC ACCCA ", " ECCCE CCCCC ECCCE ", " ACCC CCCCC CCCA ", " ACCC CCCCC CCCA ", " ACCC CCCCC CCCA ", " ACCC CCC CCCA ", " ACCC CCC CCCA ", " ACCC CCC CCCA ", " ACCC CCC CCCA ", " ACCC C CCCA ", " ECCCE C ECCCE ", " ACCCA C ACCCA ", " ECCCE C ECCCE ", " AA AA ", " AA AA ", " AAA AAA ", " AA AA ", " AA AA ", " AA AA ", " AA AA ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAACCCCBBBBAAACCCCCCCCCCCAAABBBBCCCCAAAAA ", " DAA DCCC CCCCCCC CCCD AAD ", " DA DCCC CCCCCCC CCCD AD ", " D CCC CCCCCCC CCC D ", " D CCC CCCCCCC CCC D ", " D CCC CCCCCCC CCC D ", " D CCC CCCCCCC CCC D ", " D CCC CCCCCCC CCC D ", " DD CCC CCCCCCC CCC DD ", " D CCC CCCCCCC CCC D ", " DDCCC CCCCCCC CCCDD ", " DCCC CCCCCCC CCCD ", " DCCC CCCCCCC CCCD ", " CCC CCCCCCC CCC ", " CCC CCCCCCC CCC ", " ECCCE CCCCCCC ECCCE ", " ACCCA CCCCC ACCCA ", " ECCCE CCCCC ECCCE ", " AA CCCCC AA ", " AA CCC AA ", " AA CCC AA ", " AA CCC AA ", " A CCC A ", " A C A ", " A C A ", " A C A ", " EEE C EEE ", " AAA AAA ", " EEE EEE ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAACCCCCBBBBBAACCCCCCCCCAABBBBBCCCCCAAAAA ", " AAAAADD CCCCCCCC DDAAAAA ", " AAA DD CCCCCCCC DD AAA ", " AA CCCCCCCC AA ", " A CCCCCCCC A ", " A CCCCCCCC A ", " CCCCCCCC ", " CCCCCCCC ", " CCCCCCCC ", " CCCCCCCC ", " D CCCCCCCC D ", " D CCCCCCCC D ", " D CCCCCCC D ", " CCCCCCC ", " CCCCCCC ", " EEE EECCCCCCC EEE ", " AAA AAACCCCCAAA AAA ", " EEE EEECCCCC EEE ", " CCC ", " CCC ", " C ", " C ", " C ", " C ", " C ", " C ", " EEE EEE ", " AAA AAA ", " EEE EEE ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAACCCCCCCBBBBAACCCCCCCAABBBBCCCCCCCAAAA ", " AAAAA CCCCCCC AAAAA ", " AA CCCCCCC AA ", " AA CCCCCCC AA ", " A CCCCCCC A ", " A CCCCCCC A ", " A CCCCCCC A ", " A CCCCCCC A ", " D CCCCCCC D ", " D CCCCCCC D ", " D CCCCCCC D ", " CCCCCCC ", " CCCCCCC ", " CCCCCCC ", " CCCCCCC ", " EEE EE CCCCC EEE ", " AAA AA CCC AA AAA ", " EEE EE CCC EEE ", " CCC ", " CCC ", " ", " ", " ", " ", " ", " ", " EE EE ", " AA AA ", " EE EE ", " ", " ", " ", " ", " ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DDD DDD ", " DDD DDD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " D D ", " D D ", " D D ", " D D ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BB BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAAABBCCCBBBBACCCCCCCABBBBCCCBBAAAAAAA ", " AAAA CCCCCCC AAAA ", " AA CCCCCCC AA ", " AA CCCCCCC AA ", " AD CCCCCCC DA ", " AD CCCCCCC DA ", " D CCCCCCC D ", " D CCCCCCC D ", " D CCCCCCC D ", " CCCCCCC ", " CCCCCCC ", " CCCCCCC ", " CCCCC ", " CCCCC ", " CCCCC ", " EEEEE CCC EEE ", " AAAAA CCC AAAAA ", " EEEEE C EEE ", " C ", " ", " ", " ", " DD DD ", " DD DD ", " DD DD ", " DD DD ", " EDD DD ", " DD DD ", " EDD DD ", " DD DD ", " DD DD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " EDD DDE ", " DD DD ", " DD DD ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " AAAAAAABBCCCBBBACCCCCCCABBBCCCBBAAAAAAA ", " AAAA DDD CCCCCCC DDD AAAA ", " AA D D CCCCCCC D D AA ", " AD D D CCCCCCC D D DA ", " D D CCCCCCC D D ", " D D CCCCCCC D D ", " D D CCCCCCC D D ", " D D CCCCCCC D D ", " D D CCCCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCC D D ", " D D CCC D D ", " D D C D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " AADDD DDDAA ", " A ED DE A ", " A ED DE A ", " A ED DE A ", " A ED DE A ", " A ED DE A ", " ED DE ", " ED DE ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " A ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA A ", " AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " AAAAAAABBBBBBBAACCCCCAABBBBBBBAAAAAAA ", " AAAA ADDD CCCCC DDDA AAAA ", " AD A CCCCC A DA ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCC A ", " A CCC A ", " A C A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ADDD DDDA ", " AADDD DDDAA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " ADDD DDDA ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " DDD DDD ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " AAA BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB AAA ", " ABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA ", " AAAAAAAAABBBBBACCCCCABBBBBAAAAAAAAA ", " ADAA DDD CCCCC DDD AADA ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCCCC D D ", " D D CCC D D ", " D D C D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " D D D D ", " DDD DDD ", " A A ", " A A ", " A A ", " A A ", " A A ", " AA AA ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " ABB BBBB BBBBBBBBBBBBBBBBB BBBB BBA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAAAABBBBACCCCCABBBBAAAAAAAA ", " AAA A CCCCC A AAA ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCCCC A ", " A CCC A ", " A CCC A ", " A CCC A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAA ", " BBBB B BBBBBBBBBBBBBBB B BBBB ", " BBBB BBBBBBBBBBBBBBBBB BBBB ", " AAAA ABBBBAACCCAABBBBA AAAA ", " CCC ", " CCC ", " CCC ", " CCC ", " CCC ", " CCC ", " CCC ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBBBBBBB BBBBBBBBBBBBBBB BBBBBBBB ", " BBBBBBBBBBBBBBBBB ", " ABBBBBACCCABBBBBA ", " CCC ", " CCC ", " CCC ", " CCC ", " CCC ", " C ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAA ", " BBBBBBB BBBBBBBBBBBBBBB BBBBBBB ", " BBBBBBBBBBBBBBBBB ", " AABBBBACCCABBBBAA ", " CCC ", " CCC ", " C ", " C ", " C ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAAABBBBBBBBBBBBBBBBBBBBBBBBBAAAA ", " BBBBB BBBBBBBBBBBBB BBBBB ", " BBBBBBBBBBBBBBB ", " ABBBBAACAABBBBA ", " C ", " C ", " C ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAABBBBBBBBBBBBBBBBBBBBBAAA ", " BBB BBBBBBBBBBBBB BBB ", " BBBBBBBBBBBBBBB ", " ABBBBBACABBBBBA ", " C ", " C ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBBBAA ", " BB BBBBBBBBBBBBB BB ", " BBBBBBBBBBBBBBB ", " AABBBBACABBBBAA ", " C ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBBBAA ", " BB BBBBBBBBBBB BB ", " BBBBBBBBBBBBB ", " ABBBBAAABBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBBBA ", " BB BBBBBBBBBBB BB ", " BBBBBBBBBBBBB ", " ABBBBBABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBBBAA ", " B BBBBBBBBBBB B ", " BBBBBBBBBBBBB ", " ABBBBBABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBBBA ", " BBBBBBBBBBBBBBB ", " BBBBBBBBBBBBB ", " AABBBBBBBBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBBBAA ", " B BBBBBBBBB B ", " BBBBBBBBBBB ", " ABBBBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBA ", " B BBBBBBBBB B ", " BBBBBBBBBBB ", " ABBBBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBA ", " B BBBBBBBBB B ", " BBBBBBBBBBB ", " ABBBBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBBBA ", " BBBBBBBBBBBBB ", " BBBBBBBBBBB ", " AABBBBBBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBBBAA ", " B BBBBBBB B ", " BBBBBBBBB ", " ABBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBA ", " B BBBBBBB B ", " BBBBBBBBB ", " ABBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBA ", " B BBBBBBB B ", " BBBBBBBBB ", " ABBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBA ", " B BBBBBBB B ", " BBBBBBBBB ", " ABBBBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBBBA ", " BBBBBBBBBBB ", " BBBBBBBBB ", " AABBBBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBBBAA ", " B BBBBB B ", " BBBBBBB ", " ABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBA ", " B BBBBB B ", " BBBBBBB ", " ABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBA ", " B BBBBB B ", " BBBBBBB ", " ABBBBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBA ", " B BBBBB B ", " BBBBBBB ", " AABBBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBBBA ", " BB BBB BB ", " BBBBB ", " ABBBA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBBBAA ", " B BBB B ", " BBBBB ", " AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBA ", " BB B BB ", " BBB ", " ABA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBBBA ", " BB B BB ", " BBB ", " AAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBBBAA ", " BB BB ", " B ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBBBA ", " BB BB ", " B ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABBBAA ", " BBB ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBA ", " BBB ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABBBA ", " BBB ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AABAA ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABA ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ABA ", " A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" AAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + // spotless:on + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('F', blocks(RIGID_HIGH_SPEED_STEEL_CASING.get()) + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(16)) + .or(Predicates.abilities(PartAbility.EXPORT_FLUIDS).setMaxGlobalLimited(16)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMaxGlobalLimited(2)) + .or(Predicates.abilities(PartAbility.INPUT_LASER).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.OUTPUT_LASER).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setMaxGlobalLimited(16)) + .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(16))) + .where('C', blocks(RIGID_HIGH_SPEED_STEEL_CASING.get())) + .where('D', blocks(BOLTED_HEAVY_FRAME_CASING.get())) + .where('B', blocks(GTBlocks.DARK_CONCRETE.get())) + .where('E', frames(GTMaterials.TungstenSteel)) + .where('A', blocks(SUPERHEAVY_STEEL_CASING.get())) + .build()) + .model(createWorkableCasingMachineModel( + CosmicCore.id("block/casings/solid/rigid_high_speed_steel_casing"), + GTCEu.id("block/multiblock/generator/large_gas_turbine")) + .andThen(model -> model.addDynamicRenderer(CosmicDynamicRenderHelpers::getStarLadderRender))) + + .hasBER(true) + .tooltips(Component.translatable("cosmiccore.multiblock.star_ladder.tooltip.0"), + Component.translatable("cosmiccore.multiblock.star_ladder.tooltip.1"), + Component.translatable("cosmiccore.multiblock.star_ladder.tooltip.2"), + Component.translatable("cosmiccore.multiblock.star_ladder.tooltip.3")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StarLadderResearchHub.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StarLadderResearchHub.java new file mode 100644 index 000000000..400deec2c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StarLadderResearchHub.java @@ -0,0 +1,1091 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.StarLadderResearchHubMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.BlockPattern; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.MultiblockShapeInfo; +import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; +import com.gregtechceu.gtceu.common.data.GTMachines; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.world.level.block.Blocks; + +import java.util.ArrayList; +import java.util.List; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.createWorkableCasingMachineModel; + +/** + * Star Ladder Research Hub multiblock definition. + * + * LEGEND: + * ' ' (space) = Air/ANY + * '@' = Controller area (hatches/buses allowed) + * '#' = Controller position + * A = cosmiccore:superheavy_steel_casing + * B = cosmiccore:bolted_heavy_frame_casing + * C = cosmiccore:somarust_casing + * D = cosmiccore:soul_muted_casing + * E = cosmiccore:bichromal_nevramite_casing (T1+) + * F = cosmiccore:oscillating_gilded_pthanterum_casings (T2+) + * G = cosmiccore:highly_flexible_reinforced_trinavine_casing (T2+) + * H = cosmiccore:royal_ichorium_casing (T3+) + * I = cosmiccore:multi_purpose_interstellar_grade_casing (T3+) + * J = cosmiccore:ultra_powered_casing (T3+) + */ +public class StarLadderResearchHub { + + public final static MultiblockMachineDefinition STAR_LADDER_RESEARCH_HUB = REGISTRATE + .multiblock("star_ladder_research_hub", StarLadderResearchHubMachine::new) + .langValue("Star Ladder Research Hub") + .tooltips( + Component.literal("Remote research station for the Star Ladder"), + Component.literal("Link to a Star Ladder using a datastick"), + Component.literal("Build larger structures to increase tier (T0-T3)"), + Component.literal("Do NOT use the terminal to automatically build"), + Component.literal( + "Use the Inbuilt multiblock build system (Screwdriver) otherwise you'll experience wrong block placement"), + Component.literal("TODO: ACTUAL LANG KEYS LMAO") + .withStyle(ChatFormatting.RED)) + .rotationState(RotationState.NON_Y_AXIS) + .allowExtendedFacing(false) + .recipeType(CosmicRecipeTypes.STAR_LADDER_RESEARCH) + .appearanceBlock(CosmicBlocks.SUPERHEAVY_STEEL_CASING) + .pattern(definition -> tier0Pattern() + .where(' ', any()) + .where('@', hatchSlot()) + .where('#', controller(blocks(definition.getBlock()))) + .where('A', blocks(CosmicBlocks.SUPERHEAVY_STEEL_CASING.get())) + .where('B', blocks(CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.get())) + .where('C', blocks(CosmicBlocks.SOMARUST_CASING.get())) + .where('D', blocks(CosmicBlocks.SOUL_MUTED_CASING.get())) + .build()) + .shapeInfos(definition -> { + List shapeInfos = new ArrayList<>(); + shapeInfos.add(tier0ShapeInfo(definition) + .where(' ', Blocks.AIR.defaultBlockState()) + .where('@', GTMachines.ENERGY_INPUT_HATCH[3], Direction.NORTH) + .where('#', definition, Direction.NORTH) + .where('A', CosmicBlocks.SUPERHEAVY_STEEL_CASING.getDefaultState()) + .where('B', CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.getDefaultState()) + .where('C', CosmicBlocks.SOMARUST_CASING.getDefaultState()) + .where('D', CosmicBlocks.SOUL_MUTED_CASING.getDefaultState()) + .build()); + + // T1 preview + shapeInfos.add(tier1ShapeInfo(definition) + .where(' ', Blocks.AIR.defaultBlockState()) + .where('@', GTMachines.ENERGY_INPUT_HATCH[4], Direction.NORTH) + .where('#', definition, Direction.NORTH) + .where('A', CosmicBlocks.SUPERHEAVY_STEEL_CASING.getDefaultState()) + .where('B', CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.getDefaultState()) + .where('C', CosmicBlocks.SOMARUST_CASING.getDefaultState()) + .where('D', CosmicBlocks.SOUL_MUTED_CASING.getDefaultState()) + .where('E', CosmicBlocks.BICHROMAL_NEVRAMITE_CASING.getDefaultState()) + .build()); + + // T2 preview + shapeInfos.add(tier2ShapeInfo(definition) + .where(' ', Blocks.AIR.defaultBlockState()) + .where('@', GTMachines.ENERGY_INPUT_HATCH[5], Direction.NORTH) + .where('#', definition, Direction.NORTH) + .where('A', CosmicBlocks.SUPERHEAVY_STEEL_CASING.getDefaultState()) + .where('B', CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.getDefaultState()) + .where('C', CosmicBlocks.SOMARUST_CASING.getDefaultState()) + .where('D', CosmicBlocks.SOUL_MUTED_CASING.getDefaultState()) + .where('E', CosmicBlocks.BICHROMAL_NEVRAMITE_CASING.getDefaultState()) + .where('F', CosmicBlocks.OSCILLATING_GILDED_PTHANTERUM_CASING.getDefaultState()) + .where('G', CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.getDefaultState()) + .build()); + + // T3 preview + shapeInfos.add(tier3ShapeInfo(definition) + .where(' ', Blocks.AIR.defaultBlockState()) + .where('@', GTMachines.ENERGY_INPUT_HATCH[6], Direction.NORTH) + .where('#', definition, Direction.NORTH) + .where('A', CosmicBlocks.SUPERHEAVY_STEEL_CASING.getDefaultState()) + .where('B', CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.getDefaultState()) + .where('C', CosmicBlocks.SOMARUST_CASING.getDefaultState()) + .where('D', CosmicBlocks.SOUL_MUTED_CASING.getDefaultState()) + .where('E', CosmicBlocks.BICHROMAL_NEVRAMITE_CASING.getDefaultState()) + .where('F', CosmicBlocks.OSCILLATING_GILDED_PTHANTERUM_CASING.getDefaultState()) + .where('G', CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.getDefaultState()) + .where('H', CosmicBlocks.ROYAL_ICHORIUM_CASING.getDefaultState()) + .where('I', CosmicBlocks.MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.getDefaultState()) + .where('J', CosmicBlocks.ULTRA_POWERED_CASING.getDefaultState()) + .build()); + + return shapeInfos; + }) + .model( + createWorkableCasingMachineModel( + CosmicCore.id("block/casings/solid/superheavy_steel_casing"), + CosmicCore.id("block/multiblock/mantle_bore"))) + .register(); + + public static void init() {} + + private static TraceabilityPredicate controllerSlot() { + return blocks(STAR_LADDER_RESEARCH_HUB.getBlock()); + } + + private static TraceabilityPredicate hatchSlot() { + return blocks(CosmicBlocks.SUPERHEAVY_STEEL_CASING.get()) + .or(abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1).setMaxGlobalLimited(2)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1)) + .or(abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(4)) + .or(abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(4)) + .or(abilities(PartAbility.IMPORT_FLUIDS).setMaxGlobalLimited(4)) + .or(abilities(PartAbility.EXPORT_FLUIDS).setMaxGlobalLimited(4)); + } + + public static BlockPattern buildT0Pattern() { + return tier0Pattern() + .where(' ', any()) + .where('@', hatchSlot()) + .where('#', controller(controllerSlot())) + .where('A', blocks(CosmicBlocks.SUPERHEAVY_STEEL_CASING.get())) + .where('B', blocks(CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.get())) + .where('C', blocks(CosmicBlocks.SOMARUST_CASING.get())) + .where('D', blocks(CosmicBlocks.SOUL_MUTED_CASING.get())) + .build(); + } + + public static BlockPattern buildT1Pattern() { + return tier1Pattern() + .where(' ', any()) + .where('@', hatchSlot()) + .where('#', controller(controllerSlot())) + .where('A', blocks(CosmicBlocks.SUPERHEAVY_STEEL_CASING.get())) + .where('B', blocks(CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.get())) + .where('C', blocks(CosmicBlocks.SOMARUST_CASING.get())) + .where('D', blocks(CosmicBlocks.SOUL_MUTED_CASING.get())) + .where('E', blocks(CosmicBlocks.BICHROMAL_NEVRAMITE_CASING.get())) + .build(); + } + + public static BlockPattern buildT2Pattern() { + return tier2Pattern() + .where(' ', any()) + .where('@', hatchSlot()) + .where('#', controller(controllerSlot())) + .where('A', blocks(CosmicBlocks.SUPERHEAVY_STEEL_CASING.get())) + .where('B', blocks(CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.get())) + .where('C', blocks(CosmicBlocks.SOMARUST_CASING.get())) + .where('D', blocks(CosmicBlocks.SOUL_MUTED_CASING.get())) + .where('E', blocks(CosmicBlocks.BICHROMAL_NEVRAMITE_CASING.get())) + .where('F', blocks(CosmicBlocks.OSCILLATING_GILDED_PTHANTERUM_CASING.get())) + .where('G', blocks(CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.get())) + .build(); + } + + public static BlockPattern buildT3Pattern() { + return tier3Pattern() + .where(' ', any()) + .where('@', hatchSlot()) + .where('#', controller(controllerSlot())) + .where('A', blocks(CosmicBlocks.SUPERHEAVY_STEEL_CASING.get())) + .where('B', blocks(CosmicBlocks.BOLTED_HEAVY_FRAME_CASING.get())) + .where('C', blocks(CosmicBlocks.SOMARUST_CASING.get())) + .where('D', blocks(CosmicBlocks.SOUL_MUTED_CASING.get())) + .where('E', blocks(CosmicBlocks.BICHROMAL_NEVRAMITE_CASING.get())) + .where('F', blocks(CosmicBlocks.OSCILLATING_GILDED_PTHANTERUM_CASING.get())) + .where('G', blocks(CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.get())) + .where('H', blocks(CosmicBlocks.ROYAL_ICHORIUM_CASING.get())) + .where('I', blocks(CosmicBlocks.MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get())) + .where('J', blocks(CosmicBlocks.ULTRA_POWERED_CASING.get())) + .build(); + } + + // spotless:off + + private static FactoryBlockPattern tier0Pattern() { + return FactoryBlockPattern.start() + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AAA AAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AA AA AAAA AAAA AA AA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AA AAAA ACCCA AAAA AA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AABA ACCCA ABAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AABABA ACCCA ABABAA ", " ", " ", " ", " ", " ") + .aisle(" DD DD ", " D D ", " D BAB D ", " AA ABABAD ACCCA DABABA AA ", " D D ", " D D ", " DD DD ", " ", " ") + .aisle(" DD DD ", " ", " BAB ", " A ABABA ACCCA ABABA A ", " ", " ", " DD DD ", " ", " ") + .aisle(" DD DD ", " AAAAA ", " BAB ", " AA ABABA ACCCA ABABA AA ", " ", " AAAAA ", " DD DD ", " ", " ") + .aisle(" D D ", " D AAAAAAAAA D ", " D BBBBB D ", " AA DABABA BBBBB ABABAD AA ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " A ABABBBBBBBBBBBBBABA A ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " A ABABBBBBBBBBBBABA A ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " AA BBBBBBBBBBBBBBB AA ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " CCCCCCBBBBBBBBBBBBBBBBBCCCCCC ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDD@@@@@DDDDDD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", "AAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAA", " CCCCCCBBBBBBBBBBBBBBBBBCCCCCC ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCCC@@#@@CCCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " CCCCCCBBBBBBBBBBBBBBBBBCCCCCC ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDD@@@@@DDDDDD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " AA BBBBBBBBBBBBBBB AA ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " A ABABBBBBBBBBBBABA A ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " A ABABBBBBBBBBBBBBABA A ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" D D ", " D AAAAAAAAA D ", " D BBBBB D ", " AA DABABA BBBBB ABABAD AA ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" DD DD ", " AAAAA ", " BAB ", " AA ABABA ACCCA ABABA AA ", " ", " AAAAA ", " DD DD ", " ", " ") + .aisle(" DD DD ", " ", " BAB ", " A ABABA ACCCA ABABA A ", " ", " ", " DD DD ", " ", " ") + .aisle(" DD DD ", " D D ", " D BAB D ", " AA ABABAD ACCCA DABABA AA ", " D D ", " D D ", " DD DD ", " ", " ") + .aisle(" ", " ", " BAB ", " AABABA ACCCA ABABAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AABA ACCCA ABAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AA AAAA ACCCA AAAA AA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AA AA AAAA AAAA AA AA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AAA AAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + ; + } + + private static MultiblockShapeInfo.ShapeInfoBuilder tier0ShapeInfo(MultiblockMachineDefinition definition) { + return MultiblockShapeInfo.builder() + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AAA AAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AA AA AAAA AAAA AA AA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AA AAAA ACCCA AAAA AA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AABA ACCCA ABAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AABABA ACCCA ABABAA ", " ", " ", " ", " ", " ") + .aisle(" DD DD ", " D D ", " D BAB D ", " AA ABABAD ACCCA DABABA AA ", " D D ", " D D ", " DD DD ", " ", " ") + .aisle(" DD DD ", " ", " BAB ", " A ABABA ACCCA ABABA A ", " ", " ", " DD DD ", " ", " ") + .aisle(" DD DD ", " AAAAA ", " BAB ", " AA ABABA ACCCA ABABA AA ", " ", " AAAAA ", " DD DD ", " ", " ") + .aisle(" D D ", " D AAAAAAAAA D ", " D BBBBB D ", " AA DABABA BBBBB ABABAD AA ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " A ABABBBBBBBBBBBBBABA A ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " A ABABBBBBBBBBBBABA A ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " AA BBBBBBBBBBBBBBB AA ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " CCCCCCBBBBBBBBBBBBBBBBBCCCCCC ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDD@@@@@DDDDDD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", "AAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAA", " CCCCCCBBBBBBBBBBBBBBBBBCCCCCC ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCCC@@#@@CCCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " CCCCCCBBBBBBBBBBBBBBBBBCCCCCC ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDD@@@@@DDDDDD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " AA BBBBBBBBBBBBBBB AA ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " A ABABBBBBBBBBBBABA A ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " A ABABBBBBBBBBBBBBABA A ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" D D ", " D AAAAAAAAA D ", " D BBBBB D ", " AA DABABA BBBBB ABABAD AA ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" DD DD ", " AAAAA ", " BAB ", " AA ABABA ACCCA ABABA AA ", " ", " AAAAA ", " DD DD ", " ", " ") + .aisle(" DD DD ", " ", " BAB ", " A ABABA ACCCA ABABA A ", " ", " ", " DD DD ", " ", " ") + .aisle(" DD DD ", " D D ", " D BAB D ", " AA ABABAD ACCCA DABABA AA ", " D D ", " D D ", " DD DD ", " ", " ") + .aisle(" ", " ", " BAB ", " AABABA ACCCA ABABAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AABA ACCCA ABAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AA AAAA ACCCA AAAA AA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AA AA AAAA AAAA AA AA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " AAA AAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " BAB ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " A ", " ", " ", " ", " ", " ", " ") + ; + } + private static FactoryBlockPattern tier1Pattern() { + return FactoryBlockPattern.start() + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCCBABCCDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCACBABCACDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " A A ", " A A ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " A A ", " A A ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " AAA EEE AAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " D BAB D ", " AA AA AAAAEEEAAAA AA AA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " D BAB D ", " AA AAAA ACCCA AAAA AA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " BAB ", " AABA ACCCA ABAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " BAB ", " AABABA ACCCA ABABAA ", " ", " ", " A A ", " ", " ") + .aisle(" DD DD ", " D D ", " D BAB D ", " AA ABABAD ACCCA DABABA AA ", " D D ", " D D ", " DD A A DD ", " ", " ") + .aisle(" DD DD ", " ", " BAB ", " A ABABA ACCCA ABABA A ", " ", " ", " DD A A DD ", " ", " ") + .aisle(" DD DD ", " AAAAA ", " BAB ", " AA ABABA ACCCA ABABA AA ", " ", " AAAAA ", " DD A A DD ", " ", " ") + .aisle(" D D ", " D AAAAAAAAA D ", " D BBBBB D ", " AA DABABA BBBBB ABABAD AA ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " A ABABBBBBBBBBBBBBABA A ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " A ABABBBBBBBBBBBABA A ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AA BBBBBBBBBBBBBBB AA ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " EEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEE ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", "DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD", " EEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEE ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCCC@@#@@CCCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " EEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEE ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AA BBBBBBBBBBBBBBB AA ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " A ABABBBBBBBBBBBABA A ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " A ABABBBBBBBBBBBBBABA A ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" D D ", " D AAAAAAAAA D ", " D BBBBB D ", " AA DABABA BBBBB ABABAD AA ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" DD DD ", " AAAAA ", " BAB ", " AA ABABA ACCCA ABABA AA ", " ", " AAAAA ", " DD A A DD ", " ", " ") + .aisle(" DD DD ", " ", " BAB ", " A ABABA ACCCA ABABA A ", " ", " ", " DD A A DD ", " ", " ") + .aisle(" DD DD ", " D D ", " D BAB D ", " AA ABABAD ACCCA DABABA AA ", " D D ", " D D ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " BAB ", " AABABA ACCCA ABABAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " BAB ", " AABA ACCCA ABAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " D BAB D ", " AA AAAA ACCCA AAAA AA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " D BAB D ", " AA AA AAAAEEEAAAA AA AA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " AAA EEE AAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " A A ", " A A ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " A A ", " A A ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCACBABCACDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCCBABCCDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + ; + } + + private static MultiblockShapeInfo.ShapeInfoBuilder tier1ShapeInfo(MultiblockMachineDefinition definition) { + return MultiblockShapeInfo.builder() + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCCBABCCDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCACBABCACDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " A A ", " A A ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " A A ", " A A ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " AAA EEE AAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " D BAB D ", " AA AA AAAAEEEAAAA AA AA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " D BAB D ", " AA AAAA ACCCA AAAA AA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " BAB ", " AABA ACCCA ABAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " BAB ", " AABABA ACCCA ABABAA ", " ", " ", " A A ", " ", " ") + .aisle(" DD DD ", " D D ", " D BAB D ", " AA ABABAD ACCCA DABABA AA ", " D D ", " D D ", " DD A A DD ", " ", " ") + .aisle(" DD DD ", " ", " BAB ", " A ABABA ACCCA ABABA A ", " ", " ", " DD A A DD ", " ", " ") + .aisle(" DD DD ", " AAAAA ", " BAB ", " AA ABABA ACCCA ABABA AA ", " ", " AAAAA ", " DD A A DD ", " ", " ") + .aisle(" D D ", " D AAAAAAAAA D ", " D BBBBB D ", " AA DABABA BBBBB ABABAD AA ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " A ABABBBBBBBBBBBBBABA A ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " A ABABBBBBBBBBBBABA A ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AA BBBBBBBBBBBBBBB AA ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " EEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEE ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", "DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD", " EEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEE ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCCC@@#@@CCCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " EEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEE ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " A BBBBBBBBBBBBBBB A ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AA BBBBBBBBBBBBBBB AA ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " A ABABBBBBBBBBBBABA A ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " A ABABBBBBBBBBBBBBABA A ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" D D ", " D AAAAAAAAA D ", " D BBBBB D ", " AA DABABA BBBBB ABABAD AA ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" DD DD ", " AAAAA ", " BAB ", " AA ABABA ACCCA ABABA AA ", " ", " AAAAA ", " DD A A DD ", " ", " ") + .aisle(" DD DD ", " ", " BAB ", " A ABABA ACCCA ABABA A ", " ", " ", " DD A A DD ", " ", " ") + .aisle(" DD DD ", " D D ", " D BAB D ", " AA ABABAD ACCCA DABABA AA ", " D D ", " D D ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " BAB ", " AABABA ACCCA ABABAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " BAB ", " AABA ACCCA ABAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " D BAB D ", " AA AAAA ACCCA AAAA AA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " D BAB D ", " AA AA AAAAEEEAAAA AA AA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " AAA EEE AAA ", " ", " ", " A A ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " A A ", " A A ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " A A ", " A A ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEEEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCAACBABCAACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCACBABCACDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCACBABCACD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCCBABCCDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " D ", " ", " ", " ", " ", " ", " ") + ; + } + + private static FactoryBlockPattern tier2Pattern() { + return FactoryBlockPattern.start() + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDD ", " ", " ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDADD ", " ", " ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DBABD ", " ", " ", " ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DDBABDD ", " ", " ", " ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DDCBABCDD ", " ", " ", " ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFFFFF ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " FFFFFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF FFFFF ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " FFFFF FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FF ", " DDCCBABCCDD ", " ", " ", " ", " DDCCBABCCDD ", " FF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFF FFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFF FFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFFFEFFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFFEFFFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFFF E FFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFF E FFFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFF E FFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFF E FFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFF E FFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFF E FFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF EEE FFFFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFFFF EEE FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GG GG ", " FFFF EEE FFFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFFF EEE FFFF ", " GG GG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGA AGGG ", " FFF EEE FFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFF EEE FFF ", " GGGA AGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGAA AAGGG ", " FF FFFEEEFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFEEEFFF FF ", " GGGAA AAGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGGGA AGGGGA ", " FF FFFFFFEEEFFFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFFFEEEFFFFFF FF ", " AGGGGA AGGGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGAGGA AGGAGA ", " FF FFFFFFFFEEEFFFFFFFF FF ", " DDCACBABCACDD ", " ", " ", " ", " DDCACBABCACDD ", " FF FFFFFFFFEEEFFFFFFFF FF ", " AGAGGA AGGAGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFF EEEEE FFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFF EEEEE FFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFFF EEEEE FFFF FFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFF FFFF EEEEE FFFF FFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFF EEEEE FFF FFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFF FFF EEEEE FFF FFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFFF FF EEEEE FF FFFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFFF FF EEEEE FF FFFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " A A ", " AGGAGGA A A AGGAGGA ", " F F FF EEEEE FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF EEEEE FF F F ", " AGGAGGA A A AGGAGGA ", " A A ", " ", " ", " ") + .aisle(" ", " ", " A A ", " A A ", " AGGAGGA AGGAGGA ", " F F FF EEEEE FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF EEEEE FF F F ", " AGGAGGA AGGAGGA ", " A A ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " F F FF AAA EEE AAA FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF AAA EEE AAA FF F F ", " AGGAGGA AGGAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " F F FF AA AA AAAAEEEAAAA AA AA FF F F ", " D BAB D ", " ", " ", " ", " D BAB D ", " F F FF AA AA AAAAEEEAAAA AA AA FF F F ", " AGGAGGA AGGAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAG GAGGA ", " FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF ", " D BAB D ", " ", " ", " ", " D BAB D ", " FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF ", " AGGAG GAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGA AGGA ", " F F FFF AABA ACCCA ABAA FFF F F ", " BAB ", " ", " ", " ", " BAB ", " F F FFF AABA ACCCA ABAA FFF F F ", " AGGA AGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " A A ", " F F FFF AABABA ACCCA ABABAA FFF F F ", " BAB ", " ", " ", " ", " BAB ", " F F FFF AABABA ACCCA ABABAA FFF F F ", " A A ", " ", " A A ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " D D ", " D D ", " F F FFF AA ABABAD ACCCA DABABA AA FFF F F ", " D BAB D ", " D D ", " DD DD ", " D D ", " D BAB D ", " F F FFF AA ABABAD ACCCA DABABA AA FFF F F ", " D D ", " D D ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " ", " ", " F F FFF A ABABA ACCCA ABABA A FFF F F ", " BAB ", " ", " DD DD ", " ", " BAB ", " F F FFF A ABABA ACCCA ABABA A FFF F F ", " ", " ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " AAAAA ", " ", " F F FFFF AA ABABA ACCCA ABABA AA FFFF F F ", " BAB ", " AAAAA ", " DD DD ", " AAAAA ", " BAB ", " F F FFFF AA ABABA ACCCA ABABA AA FFFF F F ", " ", " AAAAA ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " D D D D ", " D AAAAAAAAA D ", " D BBBBB D ", " F F FFF AA DABABA BBBBB ABABAD AA FFF F F ", " D BBBBB D ", " D AAAAAAAAA D ", " D GGGGG D ", " D AAAAAAAAA D ", " D BBBBB D ", " F F FFF AA DABABA BBBBB ABABAD AA FFF F F ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " GGGGGGGGG ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBABA A FFFF F F ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " F F FFFF A ABABBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " CDCDC ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " ", " DCDCDCD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" D D ", " D D ", " DDCDCDCDD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " ", " CCCC CCCC ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " ", " AAAAAAAAADDDDDD DDDDDDAAAAAAAAA ", " AA AAAAAAAAAAAAAAAAAAA AA ", " A BBBBBBBBBBBBBBBBB A ", " EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " ", " CCCCC CCCCC ", " AAAAAAAAA AAAAAAAAA ", " BBBBBBBB BBBBBBBB ", " EEEEEEEEEEEEF EEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBB BBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEE FEEEEEEEEEEEE ", "DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", "DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD", " EEEEEEEEEEEEF EEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEE FEEEEEEEEEEEE ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCCC@@#@@CCCCC ", " ", " ") + .aisle(" ", " ", " AAAAAAAAADDDDDD DDDDDDAAAAAAAAA ", " AA AAAAAAAAAAAAAAAAAAA AA ", " A BBBBBBBBBBBBBBBBB A ", " EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " ", " CCCC CCCC ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" D D ", " D D ", " DDCDCDCDD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " ", " DCDCDCD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " ", " CDCDC ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBABA A FFFF F F ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " F F FFFF A ABABBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " GGGGGGGGG ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " D D D D ", " D AAAAAAAAA D ", " D BBBBB D ", " F F FFF AA DABABA BBBBB ABABAD AA FFF F F ", " D BBBBB D ", " D AAAAAAAAA D ", " D GGGGG D ", " D AAAAAAAAA D ", " D BBBBB D ", " F F FFF AA DABABA BBBBB ABABAD AA FFF F F ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " AAAAA ", " ", " F F FFFF AA ABABA ACCCA ABABA AA FFFF F F ", " BAB ", " AAAAA ", " DD DD ", " AAAAA ", " BAB ", " F F FFFF AA ABABA ACCCA ABABA AA FFFF F F ", " ", " AAAAA ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " ", " ", " F F FFF A ABABA ACCCA ABABA A FFF F F ", " BAB ", " ", " DD DD ", " ", " BAB ", " F F FFF A ABABA ACCCA ABABA A FFF F F ", " ", " ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " D D ", " D D ", " F F FFF AA ABABAD ACCCA DABABA AA FFF F F ", " D BAB D ", " D D ", " DD DD ", " D D ", " D BAB D ", " F F FFF AA ABABAD ACCCA DABABA AA FFF F F ", " D D ", " D D ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " A A ", " ", " A A ", " F F FFF AABABA ACCCA ABABAA FFF F F ", " BAB ", " ", " ", " ", " BAB ", " F F FFF AABABA ACCCA ABABAA FFF F F ", " A A ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGA AGGA ", " F F FFF AABA ACCCA ABAA FFF F F ", " BAB ", " ", " ", " ", " BAB ", " F F FFF AABA ACCCA ABAA FFF F F ", " AGGA AGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAG GAGGA ", " FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF ", " D BAB D ", " ", " ", " ", " D BAB D ", " FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF ", " AGGAG GAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " F F FF AA AA AAAAEEEAAAA AA AA FF F F ", " D BAB D ", " ", " ", " ", " D BAB D ", " F F FF AA AA AAAAEEEAAAA AA AA FF F F ", " AGGAGGA AGGAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " F F FF AAA EEE AAA FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF AAA EEE AAA FF F F ", " AGGAGGA AGGAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " A A ", " AGGAGGA AGGAGGA ", " F F FF EEEEE FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF EEEEE FF F F ", " AGGAGGA AGGAGGA ", " A A ", " A A ", " ", " ") + .aisle(" ", " ", " ", " A A ", " AGGAGGA A A AGGAGGA ", " F F FF EEEEE FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF EEEEE FF F F ", " AGGAGGA A A AGGAGGA ", " A A ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFFF FF EEEEE FF FFFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFFF FF EEEEE FF FFFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFF EEEEE FFF FFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFF FFF EEEEE FFF FFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFFF EEEEE FFFF FFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFF FFFF EEEEE FFFF FFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFF EEEEE FFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFF EEEEE FFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGAGGA AGGAGA ", " FF FFFFFFFFEEEFFFFFFFF FF ", " DDCACBABCACDD ", " ", " ", " ", " DDCACBABCACDD ", " FF FFFFFFFFEEEFFFFFFFF FF ", " AGAGGA AGGAGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGGGA AGGGGA ", " FF FFFFFFEEEFFFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFFFEEEFFFFFF FF ", " AGGGGA AGGGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGAA AAGGG ", " FF FFFEEEFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFEEEFFF FF ", " GGGAA AAGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGA AGGG ", " FFF EEE FFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFF EEE FFF ", " GGGA AGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GG GG ", " FFFF EEE FFFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFFF EEE FFFF ", " GG GG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF EEE FFFFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFFFF EEE FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFF E FFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFF E FFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFF E FFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFF E FFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFFF E FFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFF E FFFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFFFEFFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFFEFFFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFF FFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFF FFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FF ", " DDCCBABCCDD ", " ", " ", " ", " DDCCBABCCDD ", " FF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF FFFFF ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " FFFFF FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFFFFF ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " FFFFFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DDCBABCDD ", " ", " ", " ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DDBABDD ", " ", " ", " ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DBABD ", " ", " ", " ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDADD ", " ", " ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDD ", " ", " ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + ; + } + + private static MultiblockShapeInfo.ShapeInfoBuilder tier2ShapeInfo(MultiblockMachineDefinition definition) { + return MultiblockShapeInfo.builder() + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDD ", " ", " ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDADD ", " ", " ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DBABD ", " ", " ", " ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DDBABDD ", " ", " ", " ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DDCBABCDD ", " ", " ", " ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFFFFF ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " FFFFFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF FFFFF ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " FFFFF FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FF ", " DDCCBABCCDD ", " ", " ", " ", " DDCCBABCCDD ", " FF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFF FFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFF FFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFFFEFFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFFEFFFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFFF E FFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFF E FFFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFF E FFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFF E FFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFF E FFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFF E FFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF EEE FFFFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFFFF EEE FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GG GG ", " FFFF EEE FFFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFFF EEE FFFF ", " GG GG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGA AGGG ", " FFF EEE FFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFF EEE FFF ", " GGGA AGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGAA AAGGG ", " FF FFFEEEFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFEEEFFF FF ", " GGGAA AAGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGGGA AGGGGA ", " FF FFFFFFEEEFFFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFFFEEEFFFFFF FF ", " AGGGGA AGGGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGAGGA AGGAGA ", " FF FFFFFFFFEEEFFFFFFFF FF ", " DDCACBABCACDD ", " ", " ", " ", " DDCACBABCACDD ", " FF FFFFFFFFEEEFFFFFFFF FF ", " AGAGGA AGGAGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFF EEEEE FFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFF EEEEE FFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFFF EEEEE FFFF FFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFF FFFF EEEEE FFFF FFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFF EEEEE FFF FFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFF FFF EEEEE FFF FFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFFF FF EEEEE FF FFFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFFF FF EEEEE FF FFFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " A A ", " AGGAGGA A A AGGAGGA ", " F F FF EEEEE FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF EEEEE FF F F ", " AGGAGGA A A AGGAGGA ", " A A ", " ", " ", " ") + .aisle(" ", " ", " A A ", " A A ", " AGGAGGA AGGAGGA ", " F F FF EEEEE FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF EEEEE FF F F ", " AGGAGGA AGGAGGA ", " A A ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " F F FF AAA EEE AAA FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF AAA EEE AAA FF F F ", " AGGAGGA AGGAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " F F FF AA AA AAAAEEEAAAA AA AA FF F F ", " D BAB D ", " ", " ", " ", " D BAB D ", " F F FF AA AA AAAAEEEAAAA AA AA FF F F ", " AGGAGGA AGGAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAG GAGGA ", " FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF ", " D BAB D ", " ", " ", " ", " D BAB D ", " FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF ", " AGGAG GAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGA AGGA ", " F F FFF AABA ACCCA ABAA FFF F F ", " BAB ", " ", " ", " ", " BAB ", " F F FFF AABA ACCCA ABAA FFF F F ", " AGGA AGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " A A ", " F F FFF AABABA ACCCA ABABAA FFF F F ", " BAB ", " ", " ", " ", " BAB ", " F F FFF AABABA ACCCA ABABAA FFF F F ", " A A ", " ", " A A ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " D D ", " D D ", " F F FFF AA ABABAD ACCCA DABABA AA FFF F F ", " D BAB D ", " D D ", " DD DD ", " D D ", " D BAB D ", " F F FFF AA ABABAD ACCCA DABABA AA FFF F F ", " D D ", " D D ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " ", " ", " F F FFF A ABABA ACCCA ABABA A FFF F F ", " BAB ", " ", " DD DD ", " ", " BAB ", " F F FFF A ABABA ACCCA ABABA A FFF F F ", " ", " ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " AAAAA ", " ", " F F FFFF AA ABABA ACCCA ABABA AA FFFF F F ", " BAB ", " AAAAA ", " DD DD ", " AAAAA ", " BAB ", " F F FFFF AA ABABA ACCCA ABABA AA FFFF F F ", " ", " AAAAA ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " D D D D ", " D AAAAAAAAA D ", " D BBBBB D ", " F F FFF AA DABABA BBBBB ABABAD AA FFF F F ", " D BBBBB D ", " D AAAAAAAAA D ", " D GGGGG D ", " D AAAAAAAAA D ", " D BBBBB D ", " F F FFF AA DABABA BBBBB ABABAD AA FFF F F ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " GGGGGGGGG ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBABA A FFFF F F ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " F F FFFF A ABABBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " CDCDC ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " ", " DCDCDCD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" D D ", " D D ", " DDCDCDCDD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " ", " CCCC CCCC ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " ", " AAAAAAAAADDDDDD DDDDDDAAAAAAAAA ", " AA AAAAAAAAAAAAAAAAAAA AA ", " A BBBBBBBBBBBBBBBBB A ", " EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " ", " CCCCC CCCCC ", " AAAAAAAAA AAAAAAAAA ", " BBBBBBBB BBBBBBBB ", " EEEEEEEEEEEEF EEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBB BBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEE FEEEEEEEEEEEE ", "DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", "DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD", " EEEEEEEEEEEEF EEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEE FEEEEEEEEEEEE ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCCC@@#@@CCCCC ", " ", " ") + .aisle(" ", " ", " AAAAAAAAADDDDDD DDDDDDAAAAAAAAA ", " AA AAAAAAAAAAAAAAAAAAA AA ", " A BBBBBBBBBBBBBBBBB A ", " EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " ", " CCCC CCCC ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" D D ", " D D ", " DDCDCDCDD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " ", " DCDCDCD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " F F FFFF A BBBBBBBBBBBBBBB A FFFF F F ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " ", " CDCDC ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBABA A FFFF F F ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD ", " F F FFFF A ABABBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " GGGGGGGGG ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " D D D D ", " D AAAAAAAAA D ", " D BBBBB D ", " F F FFF AA DABABA BBBBB ABABAD AA FFF F F ", " D BBBBB D ", " D AAAAAAAAA D ", " D GGGGG D ", " D AAAAAAAAA D ", " D BBBBB D ", " F F FFF AA DABABA BBBBB ABABAD AA FFF F F ", " D BBBBB D ", " D AAAAAAAAA D ", " D D D D ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " AAAAA ", " ", " F F FFFF AA ABABA ACCCA ABABA AA FFFF F F ", " BAB ", " AAAAA ", " DD DD ", " AAAAA ", " BAB ", " F F FFFF AA ABABA ACCCA ABABA AA FFFF F F ", " ", " AAAAA ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " ", " ", " F F FFF A ABABA ACCCA ABABA A FFF F F ", " BAB ", " ", " DD DD ", " ", " BAB ", " F F FFF A ABABA ACCCA ABABA A FFF F F ", " ", " ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " D D ", " D D ", " F F FFF AA ABABAD ACCCA DABABA AA FFF F F ", " D BAB D ", " D D ", " DD DD ", " D D ", " D BAB D ", " F F FFF AA ABABAD ACCCA DABABA AA FFF F F ", " D D ", " D D ", " DD A A DD ", " ", " ") + .aisle(" ", " ", " A A ", " ", " A A ", " F F FFF AABABA ACCCA ABABAA FFF F F ", " BAB ", " ", " ", " ", " BAB ", " F F FFF AABABA ACCCA ABABAA FFF F F ", " A A ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGA AGGA ", " F F FFF AABA ACCCA ABAA FFF F F ", " BAB ", " ", " ", " ", " BAB ", " F F FFF AABA ACCCA ABAA FFF F F ", " AGGA AGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAG GAGGA ", " FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF ", " D BAB D ", " ", " ", " ", " D BAB D ", " FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF ", " AGGAG GAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " F F FF AA AA AAAAEEEAAAA AA AA FF F F ", " D BAB D ", " ", " ", " ", " D BAB D ", " F F FF AA AA AAAAEEEAAAA AA AA FF F F ", " AGGAGGA AGGAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " F F FF AAA EEE AAA FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF AAA EEE AAA FF F F ", " AGGAGGA AGGAGGA ", " ", " A A ", " ", " ") + .aisle(" ", " ", " A A ", " A A ", " AGGAGGA AGGAGGA ", " F F FF EEEEE FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF EEEEE FF F F ", " AGGAGGA AGGAGGA ", " A A ", " A A ", " ", " ") + .aisle(" ", " ", " ", " A A ", " AGGAGGA A A AGGAGGA ", " F F FF EEEEE FF F F ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " F F FF EEEEE FF F F ", " AGGAGGA A A AGGAGGA ", " A A ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFFF FF EEEEE FF FFFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFFF FF EEEEE FF FFFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFF EEEEE FFF FFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFF FFF EEEEE FFF FFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFFF EEEEE FFFF FFF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FFF FFFF EEEEE FFFF FFF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFF EEEEE FFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFF EEEEE FFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " DCAACBABCAACD ", " ", " ", " ", " DCAACBABCAACD ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGAGGA AGGAGA ", " FF FFFFFFFFEEEFFFFFFFF FF ", " DDCACBABCACDD ", " ", " ", " ", " DDCACBABCACDD ", " FF FFFFFFFFEEEFFFFFFFF FF ", " AGAGGA AGGAGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGGGA AGGGGA ", " FF FFFFFFEEEFFFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFFFEEEFFFFFF FF ", " AGGGGA AGGGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGAA AAGGG ", " FF FFFEEEFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFEEEFFF FF ", " GGGAA AAGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGA AGGG ", " FFF EEE FFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFF EEE FFF ", " GGGA AGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GG GG ", " FFFF EEE FFFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFFF EEE FFFF ", " GG GG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF EEE FFFFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFFFF EEE FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFF E FFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFF E FFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFF E FFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFF E FFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFFF E FFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFF E FFFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FFFFFEFFFFF FF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FF FFFFFEFFFFF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFF FFF ", " DCACBABCACD ", " ", " ", " ", " DCACBABCACD ", " FFF FFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FF FF ", " DDCCBABCCDD ", " ", " ", " ", " DDCCBABCCDD ", " FF FF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF FFFFF ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " FFFFF FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFFFFF ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " FFFFFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCCBABCCD ", " ", " ", " ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DDCBABCDD ", " ", " ", " ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " ", " ", " ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DDBABDD ", " ", " ", " ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " ", " ", " ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DBABD ", " ", " ", " ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDADD ", " ", " ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDD ", " ", " ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " ", " ", " D ", " ", " ", " ", " ", " ", " ") + ; + } + + private static FactoryBlockPattern tier3Pattern() { + return FactoryBlockPattern.start() + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDD ", " ", " H ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDADD ", " ", " H ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DDBABDD ", " I I ", " IHI ", " I I ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DDCBABCDD ", " I I ", " IHI ", " I I ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFFFFF ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " FFFFFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFIIIIIIIIIFFFFF ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " FFFFFIIIIIIIIIFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIIIIIIIIIIIIIIIFF ", " IIIIDDCCBABCCDDIIII ", " IIII I I IIII ", " IIII IHI IIII ", " IIII I I IIII ", " IIIIDDCCBABCCDDIIII ", " FFIIIIIIIIIIIIIIIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFIIIIIIIIIIIIIIIIIIIIIIIFFF ", " IIIIIIDCACBABCACDIIIIII ", " IIIIII I I IIIIII ", " IIIIII IHI IIIIII ", " IIIIII I I IIIIII ", " IIIIIIDCACBABCACDIIIIII ", " FFFIIIIIIIIIIIIIIIIIIIIIIIFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF ", " IIIIIIIIDCACBABCACDIIIIIIII ", " IIIIIIII I I IIIIIIII ", " IIIIIIII IHI IIIIIIII ", " IIIIIIII I I IIIIIIII ", " IIIIIIIIDCACBABCACDIIIIIIII ", " FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIFFFFF E FFFFFIIIIIFF ", " IIIII DCACBABCACD IIIII ", " IIIII I I IIIII ", " IIIII IHI IIIII ", " IIIII I I IIIII ", " IIIII DCACBABCACD IIIII ", " FFIIIIIFFFFF E FFFFFIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIFFFF E FFFFIIIFF ", " III DCACBABCACD III ", " III I I III ", " III IHI III ", " III I I III ", " III DCACBABCACD III ", " FFIIIFFFF E FFFFIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIFFF E FFFIIFF ", " II DCACBABCACD II ", " II I I II ", " II IHI II ", " II I I II ", " II DCACBABCACD II ", " FFIIFFF E FFFIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF EEE FFFFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFFFF EEE FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GG GG ", " FFFF EEE FFFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFFF EEE FFFF ", " GG J GG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGA AGGG ", " FFF EEE FFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFF EEE FFF ", " GGGA J AGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGAA AAGGG ", " FF FFFEEEFFF FF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FF FFFEEEFFF FF ", " GGGAA J AAGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGGGA AGGGGA ", " FF FFFFFFEEEFFFFFF FF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FF FFFFFFEEEFFFFFF FF ", " AGGGGA J AGGGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGAGGA AGGAGA ", " FF FFFFFFFFEEEFFFFFFFF FF ", " DDCACBABCACDD ", " I I ", " IHI ", " I I ", " DDCACBABCACDD ", " FF FFFFFFFFEEEFFFFFFFF FF ", " AGAGGA J AGGAGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " AGGAGGA J AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFF EEEEE FFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFF EEEEE FFFFFF FF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFFF EEEEE FFFF FFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFF FFFF EEEEE FFFF FFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFF EEEEE FFF FFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFF FFF EEEEE FFF FFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFFF FF EEEEE FF FFFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFFF FF EEEEE FF FFFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " A A ", " AGGAGGA A A AGGAGGA ", " FIF FF EEEEE FF FIF ", " I DCAACBABCAACD I ", " I I I I ", " I IHI I ", " I I I I ", " I DCAACBABCAACD I ", " FIF FF EEEEE FF FIF ", " AGGAGGA A A AGGAGGA ", " AJA ", " ", " ", " ") + .aisle(" ", " ", " A A ", " A A ", " AGGAGGA AGGAGGA ", " FIIF FF EEEEE FF FIIF ", " II DCAACBABCAACD II ", " II I I II ", " II IHI II ", " II I I II ", " II DCAACBABCAACD II ", " FIIF FF EEEEE FF FIIF ", " AGGAGGA AGGAGGA ", " A A ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " FIF FF AAA EEE AAA FF FIF ", " I DCAACBABCAACD I ", " I I I I ", " I IHI I ", " I I I I ", " I DCAACBABCAACD I ", " FIF FF AAA EEE AAA FF FIF ", " AGGAGGA AGGAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF ", " II D BAB D II ", " II I I II ", " II IHI II ", " II I I II ", " II D BAB D II ", " FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF ", " AGGAGGA AGGAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAG GAGGA ", " FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF ", " I D BAB D I ", " I I I I ", " I IHI I ", " I I I I ", " I D BAB D I ", " FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF ", " AGGAG GAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGA AGGA ", " FIIF FFF AABA ACCCA ABAA FFF FIIF ", " II BAB II ", " II I I II ", " II IHI II ", " II I I II ", " II BAB II ", " FIIF FFF AABA ACCCA ABAA FFF FIIF ", " AGGA AGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " A A ", " FIIF FFF AABABA ACCCA ABABAA FFF FIIF ", " II BAB II ", " II I I II ", " II IHI II ", " II I I II ", " II BAB II ", " FIIF FFF AABABA ACCCA ABABAA FFF FIIF ", " A A ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " D D ", " D D ", " FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF ", " III D BAB D III ", " III D I I D III ", " III DD IHI DD III ", " III D I I D III ", " III D BAB D III ", " FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF ", " D D ", " D D ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " ", " ", " FIIF FFF A ABABA ACCCA ABABA A FFF FIIF ", " II BAB II ", " II I I II ", " II DD IHI DD II ", " II I I II ", " II BAB II ", " FIIF FFF A ABABA ACCCA ABABA A FFF FIIF ", " ", " ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " AAAAA ", " ", " FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF ", " III BAB III ", " III AAAAA III ", " III DD H DD III ", " III AAAAA III ", " III BAB III ", " FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF ", " ", " AAAAA ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " D D D D ", " D AAAAAAAAA D ", " D BBBBB D ", " FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF ", " III D BBBBB D III ", " III D AAAAAAAAA D III ", " III D GGGGG D III ", " III D AAAAAAAAA D III ", " III D BBBBB D III ", " FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF ", " D BBBBB D ", " D AAAAAAAAA D ", " D DJD D ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF ", " III BBBBBBBBB III ", " III AAAAAAAAAAAAA III ", " III GGGGGGGGG III ", " III AAAAAAAAAAAAA III ", " III BBBBBBBBB III ", " FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF ", " III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III ", " III AAAAAAAAAAAAAAA III ", " III GGGGGGGGGGG III ", " III AAAAAAAAAAAAAAA III ", " III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III ", " FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " CDCDC ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " ", " DCDCDCD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" D D ", " D D ", " DDCDCDCDD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " ", " CCCCCCCCCCC ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " ", " AAAAAAAAADDDDDDCCCCCDDDDDDAAAAAAAAA ", " AA AAAAAAAAAAAAAAAAAAA AA ", " A BBBBBBBBBBBBBBBBB A ", " EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII GGGGGGGGGGGGGGGGG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " ", " CCCCCCCCCCCCCCC ", " AAAAAAAAA AAAAAAAAA ", " BBBBBBBB BBBBBBBB ", " EEEEEEEEEEEEFIIIEEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBB BBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEEIIIFEEEEEEEEEEEE ", " DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD ", " AAAAAAAAAAAAAAAAAAA ", "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH", " AAAAAAAAAAAAAAAAAAA ", " DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD ", " EEEEEEEEEEEEFIIIEEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEEIIIFEEEEEEEEEEEE ", " JJJJJJ BBBBBBBBBBBBBBBBB JJJJJJ ", " JJJJJJ AAAAAAAAAAAAAAAAAAA JJJJJJ ", " JJJJJJJJJJCCCCC@@#@@CCCCCJJJJJJJJJJ ", " ", " ") + .aisle(" ", " ", " AAAAAAAAADDDDDDCCCCCDDDDDDAAAAAAAAA ", " AA AAAAAAAAAAAAAAAAAAA AA ", " A BBBBBBBBBBBBBBBBB A ", " EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII GGGGGGGGGGGGGGGGG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " ", " CCCCCCCCCCC ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" D D ", " D D ", " DDCDCDCDD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " ", " DCDCDCD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " ", " CDCDC ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF ", " III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III ", " III AAAAAAAAAAAAAAA III ", " III GGGGGGGGGGG III ", " III AAAAAAAAAAAAAAA III ", " III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III ", " FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF ", " III BBBBBBBBB III ", " III AAAAAAAAAAAAA III ", " III GGGGGGGGG III ", " III AAAAAAAAAAAAA III ", " III BBBBBBBBB III ", " FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " D D D D ", " D AAAAAAAAA D ", " D BBBBB D ", " FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF ", " III D BBBBB D III ", " III D AAAAAAAAA D III ", " III D GGGGG D III ", " III D AAAAAAAAA D III ", " III D BBBBB D III ", " FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF ", " D BBBBB D ", " D AAAAAAAAA D ", " D DJD D ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " AAAAA ", " ", " FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF ", " III BAB III ", " III AAAAA III ", " III DD H DD III ", " III AAAAA III ", " III BAB III ", " FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF ", " ", " AAAAA ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " ", " ", " FIIF FFF A ABABA ACCCA ABABA A FFF FIIF ", " II BAB II ", " II I I II ", " II DD IHI DD II ", " II I I II ", " II BAB II ", " FIIF FFF A ABABA ACCCA ABABA A FFF FIIF ", " ", " ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " D D ", " D D ", " FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF ", " III D BAB D III ", " III D I I D III ", " III DD IHI DD III ", " III D I I D III ", " III D BAB D III ", " FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF ", " D D ", " D D ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " A A ", " ", " A A ", " FIIF FFF AABABA ACCCA ABABAA FFF FIIF ", " II BAB II ", " II I I II ", " II IHI II ", " II I I II ", " II BAB II ", " FIIF FFF AABABA ACCCA ABABAA FFF FIIF ", " A A ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGA AGGA ", " FIIF FFF AABA ACCCA ABAA FFF FIIF ", " II BAB II ", " II I I II ", " II IHI II ", " II I I II ", " II BAB II ", " FIIF FFF AABA ACCCA ABAA FFF FIIF ", " AGGA AGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAG GAGGA ", " FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF ", " I D BAB D I ", " I I I I ", " I IHI I ", " I I I I ", " I D BAB D I ", " FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF ", " AGGAG GAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF ", " II D BAB D II ", " II I I II ", " II IHI II ", " II I I II ", " II D BAB D II ", " FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF ", " AGGAGGA AGGAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " FIF FF AAA EEE AAA FF FIF ", " I DCAACBABCAACD I ", " I I I I ", " I IHI I ", " I I I I ", " I DCAACBABCAACD I ", " FIF FF AAA EEE AAA FF FIF ", " AGGAGGA AGGAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " A A ", " AGGAGGA AGGAGGA ", " FIIF FF EEEEE FF FIIF ", " II DCAACBABCAACD II ", " II I I II ", " II IHI II ", " II I I II ", " II DCAACBABCAACD II ", " FIIF FF EEEEE FF FIIF ", " AGGAGGA AGGAGGA ", " A A ", " AJA ", " ", " ") + .aisle(" ", " ", " ", " A A ", " AGGAGGA A A AGGAGGA ", " FIF FF EEEEE FF FIF ", " I DCAACBABCAACD I ", " I I I I ", " I IHI I ", " I I I I ", " I DCAACBABCAACD I ", " FIF FF EEEEE FF FIF ", " AGGAGGA A A AGGAGGA ", " AJA ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFFF FF EEEEE FF FFFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFFF FF EEEEE FF FFFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFF EEEEE FFF FFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFF FFF EEEEE FFF FFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFFF EEEEE FFFF FFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFF FFFF EEEEE FFFF FFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFF EEEEE FFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFF EEEEE FFFFFF FF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " AGGAGGA J AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGAGGA AGGAGA ", " FF FFFFFFFFEEEFFFFFFFF FF ", " DDCACBABCACDD ", " I I ", " IHI ", " I I ", " DDCACBABCACDD ", " FF FFFFFFFFEEEFFFFFFFF FF ", " AGAGGA J AGGAGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGGGA AGGGGA ", " FF FFFFFFEEEFFFFFF FF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FF FFFFFFEEEFFFFFF FF ", " AGGGGA J AGGGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGAA AAGGG ", " FF FFFEEEFFF FF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FF FFFEEEFFF FF ", " GGGAA J AAGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGA AGGG ", " FFF EEE FFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFF EEE FFF ", " GGGA J AGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GG GG ", " FFFF EEE FFFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFFF EEE FFFF ", " GG J GG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF EEE FFFFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFFFF EEE FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIFFF E FFFIIFF ", " II DCACBABCACD II ", " II I I II ", " II IHI II ", " II I I II ", " II DCACBABCACD II ", " FFIIFFF E FFFIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIFFFF E FFFFIIIFF ", " III DCACBABCACD III ", " III I I III ", " III IHI III ", " III I I III ", " III DCACBABCACD III ", " FFIIIFFFF E FFFFIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIFFFFF E FFFFFIIIIIFF ", " IIIII DCACBABCACD IIIII ", " IIIII I I IIIII ", " IIIII IHI IIIII ", " IIIII I I IIIII ", " IIIII DCACBABCACD IIIII ", " FFIIIIIFFFFF E FFFFFIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF ", " IIIIIIIIDCACBABCACDIIIIIIII ", " IIIIIIII I I IIIIIIII ", " IIIIIIII IHI IIIIIIII ", " IIIIIIII I I IIIIIIII ", " IIIIIIIIDCACBABCACDIIIIIIII ", " FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFIIIIIIIIIIIIIIIIIIIIIIIFFF ", " IIIIIIDCACBABCACDIIIIII ", " IIIIII I I IIIIII ", " IIIIII IHI IIIIII ", " IIIIII I I IIIIII ", " IIIIIIDCACBABCACDIIIIII ", " FFFIIIIIIIIIIIIIIIIIIIIIIIFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIIIIIIIIIIIIIIIFF ", " IIIIDDCCBABCCDDIIII ", " IIII I I IIII ", " IIII IHI IIII ", " IIII I I IIII ", " IIIIDDCCBABCCDDIIII ", " FFIIIIIIIIIIIIIIIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFIIIIIIIIIFFFFF ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " FFFFFIIIIIIIIIFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFFFFF ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " FFFFFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DDCBABCDD ", " I I ", " IHI ", " I I ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DDBABDD ", " I I ", " IHI ", " I I ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDADD ", " ", " H ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDD ", " ", " H ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + ; + } + + private static MultiblockShapeInfo.ShapeInfoBuilder tier3ShapeInfo(MultiblockMachineDefinition definition) { + return MultiblockShapeInfo.builder() + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDD ", " ", " H ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDADD ", " ", " H ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DDBABDD ", " I I ", " IHI ", " I I ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DDCBABCDD ", " I I ", " IHI ", " I I ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFFFFF ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " FFFFFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFIIIIIIIIIFFFFF ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " FFFFFIIIIIIIIIFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIIIIIIIIIIIIIIIFF ", " IIIIDDCCBABCCDDIIII ", " IIII I I IIII ", " IIII IHI IIII ", " IIII I I IIII ", " IIIIDDCCBABCCDDIIII ", " FFIIIIIIIIIIIIIIIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFIIIIIIIIIIIIIIIIIIIIIIIFFF ", " IIIIIIDCACBABCACDIIIIII ", " IIIIII I I IIIIII ", " IIIIII IHI IIIIII ", " IIIIII I I IIIIII ", " IIIIIIDCACBABCACDIIIIII ", " FFFIIIIIIIIIIIIIIIIIIIIIIIFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF ", " IIIIIIIIDCACBABCACDIIIIIIII ", " IIIIIIII I I IIIIIIII ", " IIIIIIII IHI IIIIIIII ", " IIIIIIII I I IIIIIIII ", " IIIIIIIIDCACBABCACDIIIIIIII ", " FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIFFFFF E FFFFFIIIIIFF ", " IIIII DCACBABCACD IIIII ", " IIIII I I IIIII ", " IIIII IHI IIIII ", " IIIII I I IIIII ", " IIIII DCACBABCACD IIIII ", " FFIIIIIFFFFF E FFFFFIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIFFFF E FFFFIIIFF ", " III DCACBABCACD III ", " III I I III ", " III IHI III ", " III I I III ", " III DCACBABCACD III ", " FFIIIFFFF E FFFFIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIFFF E FFFIIFF ", " II DCACBABCACD II ", " II I I II ", " II IHI II ", " II I I II ", " II DCACBABCACD II ", " FFIIFFF E FFFIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF EEE FFFFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFFFF EEE FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GG GG ", " FFFF EEE FFFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFFF EEE FFFF ", " GG J GG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGA AGGG ", " FFF EEE FFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFF EEE FFF ", " GGGA J AGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGAA AAGGG ", " FF FFFEEEFFF FF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FF FFFEEEFFF FF ", " GGGAA J AAGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGGGA AGGGGA ", " FF FFFFFFEEEFFFFFF FF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FF FFFFFFEEEFFFFFF FF ", " AGGGGA J AGGGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGAGGA AGGAGA ", " FF FFFFFFFFEEEFFFFFFFF FF ", " DDCACBABCACDD ", " I I ", " IHI ", " I I ", " DDCACBABCACDD ", " FF FFFFFFFFEEEFFFFFFFF FF ", " AGAGGA J AGGAGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " AGGAGGA J AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFF EEEEE FFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFF EEEEE FFFFFF FF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFFF EEEEE FFFF FFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFF FFFF EEEEE FFFF FFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFF EEEEE FFF FFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFF FFF EEEEE FFF FFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFFF FF EEEEE FF FFFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFFF FF EEEEE FF FFFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " A A ", " AGGAGGA A A AGGAGGA ", " FIF FF EEEEE FF FIF ", " I DCAACBABCAACD I ", " I I I I ", " I IHI I ", " I I I I ", " I DCAACBABCAACD I ", " FIF FF EEEEE FF FIF ", " AGGAGGA A A AGGAGGA ", " AJA ", " ", " ", " ") + .aisle(" ", " ", " A A ", " A A ", " AGGAGGA AGGAGGA ", " FIIF FF EEEEE FF FIIF ", " II DCAACBABCAACD II ", " II I I II ", " II IHI II ", " II I I II ", " II DCAACBABCAACD II ", " FIIF FF EEEEE FF FIIF ", " AGGAGGA AGGAGGA ", " A A ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " FIF FF AAA EEE AAA FF FIF ", " I DCAACBABCAACD I ", " I I I I ", " I IHI I ", " I I I I ", " I DCAACBABCAACD I ", " FIF FF AAA EEE AAA FF FIF ", " AGGAGGA AGGAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF ", " II D BAB D II ", " II I I II ", " II IHI II ", " II I I II ", " II D BAB D II ", " FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF ", " AGGAGGA AGGAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAG GAGGA ", " FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF ", " I D BAB D I ", " I I I I ", " I IHI I ", " I I I I ", " I D BAB D I ", " FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF ", " AGGAG GAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGA AGGA ", " FIIF FFF AABA ACCCA ABAA FFF FIIF ", " II BAB II ", " II I I II ", " II IHI II ", " II I I II ", " II BAB II ", " FIIF FFF AABA ACCCA ABAA FFF FIIF ", " AGGA AGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " A A ", " FIIF FFF AABABA ACCCA ABABAA FFF FIIF ", " II BAB II ", " II I I II ", " II IHI II ", " II I I II ", " II BAB II ", " FIIF FFF AABABA ACCCA ABABAA FFF FIIF ", " A A ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " D D ", " D D ", " FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF ", " III D BAB D III ", " III D I I D III ", " III DD IHI DD III ", " III D I I D III ", " III D BAB D III ", " FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF ", " D D ", " D D ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " ", " ", " FIIF FFF A ABABA ACCCA ABABA A FFF FIIF ", " II BAB II ", " II I I II ", " II DD IHI DD II ", " II I I II ", " II BAB II ", " FIIF FFF A ABABA ACCCA ABABA A FFF FIIF ", " ", " ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " AAAAA ", " ", " FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF ", " III BAB III ", " III AAAAA III ", " III DD H DD III ", " III AAAAA III ", " III BAB III ", " FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF ", " ", " AAAAA ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " D D D D ", " D AAAAAAAAA D ", " D BBBBB D ", " FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF ", " III D BBBBB D III ", " III D AAAAAAAAA D III ", " III D GGGGG D III ", " III D AAAAAAAAA D III ", " III D BBBBB D III ", " FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF ", " D BBBBB D ", " D AAAAAAAAA D ", " D DJD D ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF ", " III BBBBBBBBB III ", " III AAAAAAAAAAAAA III ", " III GGGGGGGGG III ", " III AAAAAAAAAAAAA III ", " III BBBBBBBBB III ", " FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF ", " III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III ", " III AAAAAAAAAAAAAAA III ", " III GGGGGGGGGGG III ", " III AAAAAAAAAAAAAAA III ", " III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III ", " FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " CDCDC ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " ", " DCDCDCD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" D D ", " D D ", " DDCDCDCDD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " ", " CCCCCCCCCCC ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" ", " ", " AAAAAAAAADDDDDDCCCCCDDDDDDAAAAAAAAA ", " AA AAAAAAAAAAAAAAAAAAA AA ", " A BBBBBBBBBBBBBBBBB A ", " EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII GGGGGGGGGGGGGGGGG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " ", " CCCCCCCCCCCCCCC ", " AAAAAAAAA AAAAAAAAA ", " BBBBBBBB BBBBBBBB ", " EEEEEEEEEEEEFIIIEEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBB BBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEEIIIFEEEEEEEEEEEE ", " DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD ", " AAAAAAAAAAAAAAAAAAA ", "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH", " AAAAAAAAAAAAAAAAAAA ", " DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD ", " EEEEEEEEEEEEFIIIEEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEEIIIFEEEEEEEEEEEE ", " JJJJJJ BBBBBBBBBBBBBBBBB JJJJJJ ", " JJJJJJ AAAAAAAAAAAAAAAAAAA JJJJJJ ", " JJJJJJJJJJCCCCC@@#@@CCCCCJJJJJJJJJJ ", " ", " ") + .aisle(" ", " ", " AAAAAAAAADDDDDDCCCCCDDDDDDAAAAAAAAA ", " AA AAAAAAAAAAAAAAAAAAA AA ", " A BBBBBBBBBBBBBBBBB A ", " EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII GGGGGGGGGGGGGGGGG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII ", " DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD ", " EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE ", " A BBBBBBBBBBBBBBBBB A ", " AA AAAAAAAAAAAAAAAAAAA AA ", " AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA ", " ", " ") + .aisle(" ", " ", " CCCCCCCCCCC ", " AAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBBBB ", " FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD ", " FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF ", " BBBBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAA ", " CCCC@@@CCCC ", " ", " ") + .aisle(" D D ", " D D ", " DDCDCDCDD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DDCDCDCDD ", " D D ", " D D ") + .aisle(" ", " ", " DCDCDCD ", " AAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " AAAAAAAAAAAAAAAAA ", " GGGGGGGGGGGGGGG ", " AAAAAAAAAAAAAAAAA ", " DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD ", " FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAA ", " DCDCDCD ", " ", " ") + .aisle(" ", " ", " CDCDC ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBBBB ", " FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " AAAAAAAAAAAAAAA ", " GGGGGGGGGGGGG ", " AAAAAAAAAAAAAAA ", " DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD ", " FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF ", " BBBBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " CDCDC ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAAAA ", " BBBBBBBBBBB ", " FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF ", " III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III ", " III AAAAAAAAAAAAAAA III ", " III GGGGGGGGGGG III ", " III AAAAAAAAAAAAAAA III ", " III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III ", " FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF ", " BBBBBBBBBBB ", " AAAAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " DCD ", " AAAAAAAAAAAAA ", " BBBBBBBBB ", " FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF ", " III BBBBBBBBB III ", " III AAAAAAAAAAAAA III ", " III GGGGGGGGG III ", " III AAAAAAAAAAAAA III ", " III BBBBBBBBB III ", " FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF ", " BBBBBBBBB ", " AAAAAAAAAAAAA ", " DCD ", " ", " ") + .aisle(" ", " ", " D D D D ", " D AAAAAAAAA D ", " D BBBBB D ", " FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF ", " III D BBBBB D III ", " III D AAAAAAAAA D III ", " III D GGGGG D III ", " III D AAAAAAAAA D III ", " III D BBBBB D III ", " FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF ", " D BBBBB D ", " D AAAAAAAAA D ", " D DJD D ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " AAAAA ", " ", " FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF ", " III BAB III ", " III AAAAA III ", " III DD H DD III ", " III AAAAA III ", " III BAB III ", " FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF ", " ", " AAAAA ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " ", " ", " FIIF FFF A ABABA ACCCA ABABA A FFF FIIF ", " II BAB II ", " II I I II ", " II DD IHI DD II ", " II I I II ", " II BAB II ", " FIIF FFF A ABABA ACCCA ABABA A FFF FIIF ", " ", " ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " DD A A DD ", " D D ", " D D ", " FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF ", " III D BAB D III ", " III D I I D III ", " III DD IHI DD III ", " III D I I D III ", " III D BAB D III ", " FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF ", " D D ", " D D ", " DD AJA DD ", " ", " ") + .aisle(" ", " ", " A A ", " ", " A A ", " FIIF FFF AABABA ACCCA ABABAA FFF FIIF ", " II BAB II ", " II I I II ", " II IHI II ", " II I I II ", " II BAB II ", " FIIF FFF AABABA ACCCA ABABAA FFF FIIF ", " A A ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGA AGGA ", " FIIF FFF AABA ACCCA ABAA FFF FIIF ", " II BAB II ", " II I I II ", " II IHI II ", " II I I II ", " II BAB II ", " FIIF FFF AABA ACCCA ABAA FFF FIIF ", " AGGA AGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAG GAGGA ", " FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF ", " I D BAB D I ", " I I I I ", " I IHI I ", " I I I I ", " I D BAB D I ", " FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF ", " AGGAG GAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF ", " II D BAB D II ", " II I I II ", " II IHI II ", " II I I II ", " II D BAB D II ", " FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF ", " AGGAGGA AGGAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " ", " AGGAGGA AGGAGGA ", " FIF FF AAA EEE AAA FF FIF ", " I DCAACBABCAACD I ", " I I I I ", " I IHI I ", " I I I I ", " I DCAACBABCAACD I ", " FIF FF AAA EEE AAA FF FIF ", " AGGAGGA AGGAGGA ", " ", " AJA ", " ", " ") + .aisle(" ", " ", " A A ", " A A ", " AGGAGGA AGGAGGA ", " FIIF FF EEEEE FF FIIF ", " II DCAACBABCAACD II ", " II I I II ", " II IHI II ", " II I I II ", " II DCAACBABCAACD II ", " FIIF FF EEEEE FF FIIF ", " AGGAGGA AGGAGGA ", " A A ", " AJA ", " ", " ") + .aisle(" ", " ", " ", " A A ", " AGGAGGA A A AGGAGGA ", " FIF FF EEEEE FF FIF ", " I DCAACBABCAACD I ", " I I I I ", " I IHI I ", " I I I I ", " I DCAACBABCAACD I ", " FIF FF EEEEE FF FIF ", " AGGAGGA A A AGGAGGA ", " AJA ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFFF FF EEEEE FF FFFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFFF FF EEEEE FF FFFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFF EEEEE FFF FFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFF FFF EEEEE FFF FFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FFF FFFF EEEEE FFFF FFF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FFF FFFF EEEEE FFFF FFF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFF EEEEE FFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFF EEEEE FFFFFF FF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFFFFF EEEEE FFFFFFFFF FF ", " AGGAGGA AGGAGGA ", " J ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGAGGA AGGAGGA ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " DCAACBABCAACD ", " I I ", " IHI ", " I I ", " DCAACBABCAACD ", " FF FFFFFFFFFFEEEFFFFFFFFFF FF ", " AGGAGGA J AGGAGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGAGGA AGGAGA ", " FF FFFFFFFFEEEFFFFFFFF FF ", " DDCACBABCACDD ", " I I ", " IHI ", " I I ", " DDCACBABCACDD ", " FF FFFFFFFFEEEFFFFFFFF FF ", " AGAGGA J AGGAGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " AGGGGA AGGGGA ", " FF FFFFFFEEEFFFFFF FF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FF FFFFFFEEEFFFFFF FF ", " AGGGGA J AGGGGA ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGAA AAGGG ", " FF FFFEEEFFF FF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FF FFFEEEFFF FF ", " GGGAA J AAGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGA AGGG ", " FFF EEE FFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFF EEE FFF ", " GGGA J AGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GG GG ", " FFFF EEE FFFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFFF EEE FFFF ", " GG J GG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFF EEE FFFFF ", " DCACBABCACD ", " I I ", " IHI ", " I I ", " DCACBABCACD ", " FFFFF EEE FFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIFFF E FFFIIFF ", " II DCACBABCACD II ", " II I I II ", " II IHI II ", " II I I II ", " II DCACBABCACD II ", " FFIIFFF E FFFIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIFFFF E FFFFIIIFF ", " III DCACBABCACD III ", " III I I III ", " III IHI III ", " III I I III ", " III DCACBABCACD III ", " FFIIIFFFF E FFFFIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIFFFFF E FFFFFIIIIIFF ", " IIIII DCACBABCACD IIIII ", " IIIII I I IIIII ", " IIIII IHI IIIII ", " IIIII I I IIIII ", " IIIII DCACBABCACD IIIII ", " FFIIIIIFFFFF E FFFFFIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF ", " IIIIIIIIDCACBABCACDIIIIIIII ", " IIIIIIII I I IIIIIIII ", " IIIIIIII IHI IIIIIIII ", " IIIIIIII I I IIIIIIII ", " IIIIIIIIDCACBABCACDIIIIIIII ", " FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFIIIIIIIIIIIIIIIIIIIIIIIFFF ", " IIIIIIDCACBABCACDIIIIII ", " IIIIII I I IIIIII ", " IIIIII IHI IIIIII ", " IIIIII I I IIIIII ", " IIIIIIDCACBABCACDIIIIII ", " FFFIIIIIIIIIIIIIIIIIIIIIIIFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFIIIIIIIIIIIIIIIIIIIFF ", " IIIIDDCCBABCCDDIIII ", " IIII I I IIII ", " IIII IHI IIII ", " IIII I I IIII ", " IIIIDDCCBABCCDDIIII ", " FFIIIIIIIIIIIIIIIIIIIFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFIIIIIIIIIFFFFF ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " FFFFFIIIIIIIIIFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " FFFFFFFFF ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " FFFFFFFFF ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCCBABCCD ", " I I ", " IHI ", " I I ", " DCCBABCCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DDCBABCDD ", " I I ", " IHI ", " I I ", " DDCBABCDD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " EEE ", " DCBABCD ", " I I ", " IHI ", " I I ", " DCBABCD ", " EEE ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DDBABDD ", " I I ", " IHI ", " I I ", " DDBABDD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " E ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " E ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DBABD ", " I I ", " IHI ", " I I ", " DBABD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDADD ", " ", " H ", " ", " DDADD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DAD ", " ", " H ", " ", " DAD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " DDD ", " ", " H ", " ", " DDD ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " D ", " ", " H ", " ", " D ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " H ", " ", " ", " ", " ", " ", " ", " ", " ") + ; + } + + // spotless:on +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StarLadderResearchHubPatterns.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StarLadderResearchHubPatterns.java new file mode 100644 index 000000000..ad1a1fe0f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StarLadderResearchHubPatterns.java @@ -0,0 +1,463 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +/** + * Star Ladder Research Hub structure patterns for tiers T0-T3. + * Characters have been normalized across all tiers for consistency. + * Each string in the array is one aisle, with layers separated by '|'. + * + * UNIFIED LEGEND (applies to all tiers): + * ' ' (space) = Air/ANY + * '@' = Controller marker (orange_wool from export) + * '#' = Controller position (red_wool from export) + * A = cosmiccore:superheavy_steel_casing + * B = cosmiccore:bolted_heavy_frame_casing + * C = cosmiccore:somarust_casing + * D = cosmiccore:soul_muted_casing + * E = cosmiccore:bichromal_nevramite_casing (T1+) + * F = cosmiccore:oscillating_gilded_pthanterum_casings (T2+) + * G = cosmiccore:highly_flexible_reinforced_trinavine_casing (T2+) + * H = cosmiccore:royal_ichorium_casing (T3+) + * I = cosmiccore:multi_purpose_interstellar_grade_casing (T3+) + * J = cosmiccore:ultra_powered_casing (T3+) + */ +public class StarLadderResearchHubPatterns { + + // spotless:off + + public static final String[] TIER_0 = { + " | | A | | | | | | ", + " | | A | | | | | | ", + " | | A | | | | | | ", + " | | BAB | | | | | | ", + " | | BAB | AAA AAA | | | | | ", + " | | BAB | AA AA AAAA AAAA AA AA | | | | | ", + " | | BAB | AA AAAA ACCCA AAAA AA | | | | | ", + " | | BAB | AABA ACCCA ABAA | | | | | ", + " | | BAB | AABABA ACCCA ABABAA | | | | | ", + " DD DD | D D | D BAB D | AA ABABAD ACCCA DABABA AA | D D | D D | DD DD | | ", + " DD DD | | BAB | A ABABA ACCCA ABABA A | | | DD DD | | ", + " DD DD | AAAAA | BAB | AA ABABA ACCCA ABABA AA | | AAAAA | DD DD | | ", + " D D | D AAAAAAAAA D | D BBBBB D | AA DABABA BBBBB ABABAD AA | D BBBBB D | D AAAAAAAAA D | D D D D | | ", + " | AAAAAAAAAAAAA | BBBBBBBBB | A ABABBBBBBBBBBBBBABA A | BBBBBBBBB | AAAAAAAAAAAAA | DCD | | ", + " | AAAAAAAAAAAAAAA | BBBBBBBBBBB | A ABABBBBBBBBBBBABA A | BBBBBBBBBBB | AAAAAAAAAAAAAAA | DCD | | ", + " | AAAAAAAAAAAAAAA | BBBBBBBBBBBBB | AA BBBBBBBBBBBBBBB AA | BBBBBBBBBBBBB | AAAAAAAAAAAAAAA | CDCDC | | ", + " | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | A BBBBBBBBBBBBBBB A | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DCDCDCD | | ", + " | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | A BBBBBBBBBBBBBBB A | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DDCDCDCDD | D D | D D ", + " | AAAAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBBBB | AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCC@@@CCCC | | ", + " | AAAAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB | CCCCCCBBBBBBBBBBBBBBBBBCCCCCC | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | DDDDDD@@@@@DDDDDD | | ", + " | AAAAAAAAAAAAAAAAAAA |AAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAA| CCCCCCBBBBBBBBBBBBBBBBBCCCCCC | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCCC@@#@@CCCCC | | ", + " | AAAAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB | CCCCCCBBBBBBBBBBBBBBBBBCCCCCC | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | DDDDDD@@@@@DDDDDD | | ", + " | AAAAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBBBB | AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCC@@@CCCC | | ", + " | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | A BBBBBBBBBBBBBBB A | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DDCDCDCDD | D D | D D ", + " | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | A BBBBBBBBBBBBBBB A | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DCDCDCD | | ", + " | AAAAAAAAAAAAAAA | BBBBBBBBBBBBB | AA BBBBBBBBBBBBBBB AA | BBBBBBBBBBBBB | AAAAAAAAAAAAAAA | CDCDC | | ", + " | AAAAAAAAAAAAAAA | BBBBBBBBBBB | A ABABBBBBBBBBBBABA A | BBBBBBBBBBB | AAAAAAAAAAAAAAA | DCD | | ", + " | AAAAAAAAAAAAA | BBBBBBBBB | A ABABBBBBBBBBBBBBABA A | BBBBBBBBB | AAAAAAAAAAAAA | DCD | | ", + " D D | D AAAAAAAAA D | D BBBBB D | AA DABABA BBBBB ABABAD AA | D BBBBB D | D AAAAAAAAA D | D D D D | | ", + " DD DD | AAAAA | BAB | AA ABABA ACCCA ABABA AA | | AAAAA | DD DD | | ", + " DD DD | | BAB | A ABABA ACCCA ABABA A | | | DD DD | | ", + " DD DD | D D | D BAB D | AA ABABAD ACCCA DABABA AA | D D | D D | DD DD | | ", + " | | BAB | AABABA ACCCA ABABAA | | | | | ", + " | | BAB | AABA ACCCA ABAA | | | | | ", + " | | BAB | AA AAAA ACCCA AAAA AA | | | | | ", + " | | BAB | AA AA AAAA AAAA AA AA | | | | | ", + " | | BAB | AAA AAA | | | | | ", + " | | BAB | | | | | | ", + " | | A | | | | | | ", + " | | A | | | | | | " + }; + + public static final String[] TIER_1 = { + " | | D | | | | | | ", + " | | D | | | | | | ", + " | | D | | | | | | ", + " | | D | | | | | | ", + " | | DDD | | | | | | ", + " | | DAD | | | | | | ", + " | | DAD | | | | | | ", + " | | DAD | | | | | | ", + " | | DDADD | | | | | | ", + " | | DBABD | | | | | | ", + " | | DBABD | E | | | | | ", + " | | DBABD | E | | | | | ", + " | | DBABD | E | | | | | ", + " | | DDBABDD | E | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DDCBABCDD | EEE | | | | | ", + " | | DCCBABCCD | EEE | | | | | ", + " | | DCCBABCCD | E | | | | | ", + " | | DCCBABCCD | | | | | | ", + " | | DCCBABCCD | | | | | | ", + " | | DDCCBABCCDD | | | | | | ", + " | | DCACBABCACD | | | | | | ", + " | | DCACBABCACD | E | | | | | ", + " | | DCACBABCACD | E | | | | | ", + " | | DCACBABCACD | E | | | | | ", + " | | DCACBABCACD | E | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DDCACBABCACDD | EEE | | | | | ", + " | | DCAACBABCAACD | EEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | A A | A A | | | ", + " | | DCAACBABCAACD | EEEEE | | A A | A A | | ", + " | | DCAACBABCAACD | AAA EEE AAA | | | A A | | ", + " | | D BAB D | AA AA AAAAEEEAAAA AA AA | | | A A | | ", + " | | D BAB D | AA AAAA ACCCA AAAA AA | | | A A | | ", + " | | BAB | AABA ACCCA ABAA | | | A A | | ", + " | | BAB | AABABA ACCCA ABABAA | | | A A | | ", + " DD DD | D D | D BAB D | AA ABABAD ACCCA DABABA AA | D D | D D | DD A A DD | | ", + " DD DD | | BAB | A ABABA ACCCA ABABA A | | | DD A A DD | | ", + " DD DD | AAAAA | BAB | AA ABABA ACCCA ABABA AA | | AAAAA | DD A A DD | | ", + " D D | D AAAAAAAAA D | D BBBBB D | AA DABABA BBBBB ABABAD AA | D BBBBB D | D AAAAAAAAA D | D D D D | | ", + " | AAAAAAAAAAAAA | BBBBBBBBB | A ABABBBBBBBBBBBBBABA A | BBBBBBBBB | AAAAAAAAAAAAA | DCD | | ", + " | AAAAAAAAAAAAAAA | DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD | A ABABBBBBBBBBBBABA A | BBBBBBBBBBB | AAAAAAAAAAAAAAA | DCD | | ", + " | AAAAAAAAAAAAAAA | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | AA BBBBBBBBBBBBBBB AA | BBBBBBBBBBBBB | AAAAAAAAAAAAAAA | CDCDC | | ", + " | AAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | A BBBBBBBBBBBBBBB A | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DCDCDCD | | ", + " | AAAAAAAAAAAAAAAAA | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | A BBBBBBBBBBBBBBB A | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DDCDCDCDD | D D | D D ", + " | AAAAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | EEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEE | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCC@@@CCCC | | ", + " | AAAAAAAAAAAAAAAAAAA | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | EEEEEEE EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE EEEEEEE | A BBBBBBBBBBBBBBBBB A | AA AAAAAAAAAAAAAAAAAAA AA | AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA | | ", + " | AAAAAAAAAAAAAAAAAAA |DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD| EEEEEEEEEEEE EEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEE EEEEEEEEEEEE | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCCC@@#@@CCCCC | | ", + " | AAAAAAAAAAAAAAAAAAA | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | EEEEEEE EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE EEEEEEE | A BBBBBBBBBBBBBBBBB A | AA AAAAAAAAAAAAAAAAAAA AA | AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA | | ", + " | AAAAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | EEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEE | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCC@@@CCCC | | ", + " | AAAAAAAAAAAAAAAAA | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | A BBBBBBBBBBBBBBB A | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DDCDCDCDD | D D | D D ", + " | AAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | A BBBBBBBBBBBBBBB A | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DCDCDCD | | ", + " | AAAAAAAAAAAAAAA | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | AA BBBBBBBBBBBBBBB AA | BBBBBBBBBBBBB | AAAAAAAAAAAAAAA | CDCDC | | ", + " | AAAAAAAAAAAAAAA | DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD | A ABABBBBBBBBBBBABA A | BBBBBBBBBBB | AAAAAAAAAAAAAAA | DCD | | ", + " | AAAAAAAAAAAAA | BBBBBBBBB | A ABABBBBBBBBBBBBBABA A | BBBBBBBBB | AAAAAAAAAAAAA | DCD | | ", + " D D | D AAAAAAAAA D | D BBBBB D | AA DABABA BBBBB ABABAD AA | D BBBBB D | D AAAAAAAAA D | D D D D | | ", + " DD DD | AAAAA | BAB | AA ABABA ACCCA ABABA AA | | AAAAA | DD A A DD | | ", + " DD DD | | BAB | A ABABA ACCCA ABABA A | | | DD A A DD | | ", + " DD DD | D D | D BAB D | AA ABABAD ACCCA DABABA AA | D D | D D | DD A A DD | | ", + " | | BAB | AABABA ACCCA ABABAA | | | A A | | ", + " | | BAB | AABA ACCCA ABAA | | | A A | | ", + " | | D BAB D | AA AAAA ACCCA AAAA AA | | | A A | | ", + " | | D BAB D | AA AA AAAAEEEAAAA AA AA | | | A A | | ", + " | | DCAACBABCAACD | AAA EEE AAA | | | A A | | ", + " | | DCAACBABCAACD | EEEEE | | A A | A A | | ", + " | | DCAACBABCAACD | EEEEE | A A | A A | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEEEE | | | | | ", + " | | DCAACBABCAACD | EEE | | | | | ", + " | | DDCACBABCACDD | EEE | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DCACBABCACD | EEE | | | | | ", + " | | DCACBABCACD | E | | | | | ", + " | | DCACBABCACD | E | | | | | ", + " | | DCACBABCACD | E | | | | | ", + " | | DCACBABCACD | E | | | | | ", + " | | DCACBABCACD | | | | | | ", + " | | DDCCBABCCDD | | | | | | ", + " | | DCCBABCCD | | | | | | ", + " | | DCCBABCCD | | | | | | ", + " | | DCCBABCCD | E | | | | | ", + " | | DCCBABCCD | EEE | | | | | ", + " | | DDCBABCDD | EEE | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DCBABCD | EEE | | | | | ", + " | | DDBABDD | E | | | | | ", + " | | DBABD | E | | | | | ", + " | | DBABD | E | | | | | ", + " | | DBABD | E | | | | | ", + " | | DBABD | | | | | | ", + " | | DDADD | | | | | | ", + " | | DAD | | | | | | ", + " | | DAD | | | | | | ", + " | | DAD | | | | | | ", + " | | DDD | | | | | | ", + " | | D | | | | | | ", + " | | D | | | | | | ", + " | | D | | | | | | ", + " | | D | | | | | | " + }; + + public static final String[] TIER_2 = { + " | | | | | | D | | | | D | | | | | | ", + " | | | | | | D | | | | D | | | | | | ", + " | | | | | | D | | | | D | | | | | | ", + " | | | | | | D | | | | D | | | | | | ", + " | | | | | | DDD | | | | DDD | | | | | | ", + " | | | | | | DAD | | | | DAD | | | | | | ", + " | | | | | | DAD | | | | DAD | | | | | | ", + " | | | | | | DAD | | | | DAD | | | | | | ", + " | | | | | | DDADD | | | | DDADD | | | | | | ", + " | | | | | | DBABD | | | | DBABD | | | | | | ", + " | | | | | E | DBABD | | | | DBABD | E | | | | | ", + " | | | | | E | DBABD | | | | DBABD | E | | | | | ", + " | | | | | E | DBABD | | | | DBABD | E | | | | | ", + " | | | | | E | DDBABDD | | | | DDBABDD | E | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DDCBABCDD | | | | DDCBABCDD | EEE | | | | | ", + " | | | | | EEE | DCCBABCCD | | | | DCCBABCCD | EEE | | | | | ", + " | | | | | E | DCCBABCCD | | | | DCCBABCCD | E | | | | | ", + " | | | | | FFFFFFFFF | DCCBABCCD | | | | DCCBABCCD | FFFFFFFFF | | | | | ", + " | | | | | FFFFF FFFFF | DCCBABCCD | | | | DCCBABCCD | FFFFF FFFFF | | | | | ", + " | | | | | FF FF | DDCCBABCCDD | | | | DDCCBABCCDD | FF FF | | | | | ", + " | | | | | FFF FFF | DCACBABCACD | | | | DCACBABCACD | FFF FFF | | | | | ", + " | | | | | FF FFFFFEFFFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFFFEFFFFF FF | | | | | ", + " | | | | | FF FFFFF E FFFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFFF E FFFFF FF | | | | | ", + " | | | | | FF FFFF E FFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFF E FFFF FF | | | | | ", + " | | | | | FF FFF E FFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFF E FFF FF | | | | | ", + " | | | | | FFFFF EEE FFFFF | DCACBABCACD | | | | DCACBABCACD | FFFFF EEE FFFFF | | | | | ", + " | | | | GG GG | FFFF EEE FFFF | DCACBABCACD | | | | DCACBABCACD | FFFF EEE FFFF | GG GG | | | | ", + " | | | | GGGA AGGG | FFF EEE FFF | DCACBABCACD | | | | DCACBABCACD | FFF EEE FFF | GGGA AGGG | | | | ", + " | | | | GGGAA AAGGG | FF FFFEEEFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFEEEFFF FF | GGGAA AAGGG | | | | ", + " | | | | AGGGGA AGGGGA | FF FFFFFFEEEFFFFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFFFFEEEFFFFFF FF | AGGGGA AGGGGA | | | | ", + " | | | | AGAGGA AGGAGA | FF FFFFFFFFEEEFFFFFFFF FF | DDCACBABCACDD | | | | DDCACBABCACDD | FF FFFFFFFFEEEFFFFFFFF FF | AGAGGA AGGAGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFFFFFFEEEFFFFFFFFFF FF | DCAACBABCAACD | | | | DCAACBABCAACD | FF FFFFFFFFFFEEEFFFFFFFFFF FF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFFFFF EEEEE FFFFFFFFF FF | DCAACBABCAACD | | | | DCAACBABCAACD | FF FFFFFFFFF EEEEE FFFFFFFFF FF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFF EEEEE FFFFFF FF | DCAACBABCAACD | | | | DCAACBABCAACD | FF FFFFFF EEEEE FFFFFF FF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FFF FFFF EEEEE FFFF FFF | DCAACBABCAACD | | | | DCAACBABCAACD | FFF FFFF EEEEE FFFF FFF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FFF FFF EEEEE FFF FFF | DCAACBABCAACD | | | | DCAACBABCAACD | FFF FFF EEEEE FFF FFF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FFFF FF EEEEE FF FFFF | DCAACBABCAACD | | | | DCAACBABCAACD | FFFF FF EEEEE FF FFFF | AGGAGGA AGGAGGA | | | | ", + " | | | A A | AGGAGGA A A AGGAGGA | F F FF EEEEE FF F F | DCAACBABCAACD | | | | DCAACBABCAACD | F F FF EEEEE FF F F | AGGAGGA A A AGGAGGA | A A | | | ", + " | | A A | A A | AGGAGGA AGGAGGA | F F FF EEEEE FF F F | DCAACBABCAACD | | | | DCAACBABCAACD | F F FF EEEEE FF F F | AGGAGGA AGGAGGA | A A | A A | | ", + " | | A A | | AGGAGGA AGGAGGA | F F FF AAA EEE AAA FF F F | DCAACBABCAACD | | | | DCAACBABCAACD | F F FF AAA EEE AAA FF F F | AGGAGGA AGGAGGA | | A A | | ", + " | | A A | | AGGAGGA AGGAGGA | F F FF AA AA AAAAEEEAAAA AA AA FF F F | D BAB D | | | | D BAB D | F F FF AA AA AAAAEEEAAAA AA AA FF F F | AGGAGGA AGGAGGA | | A A | | ", + " | | A A | | AGGAG GAGGA | FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF | D BAB D | | | | D BAB D | FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF | AGGAG GAGGA | | A A | | ", + " | | A A | | AGGA AGGA | F F FFF AABA ACCCA ABAA FFF F F | BAB | | | | BAB | F F FFF AABA ACCCA ABAA FFF F F | AGGA AGGA | | A A | | ", + " | | A A | | A A | F F FFF AABABA ACCCA ABABAA FFF F F | BAB | | | | BAB | F F FFF AABABA ACCCA ABABAA FFF F F | A A | | A A | | ", + " | | DD A A DD | D D | D D | F F FFF AA ABABAD ACCCA DABABA AA FFF F F | D BAB D | D D | DD DD | D D | D BAB D | F F FFF AA ABABAD ACCCA DABABA AA FFF F F | D D | D D | DD A A DD | | ", + " | | DD A A DD | | | F F FFF A ABABA ACCCA ABABA A FFF F F | BAB | | DD DD | | BAB | F F FFF A ABABA ACCCA ABABA A FFF F F | | | DD A A DD | | ", + " | | DD A A DD | AAAAA | | F F FFFF AA ABABA ACCCA ABABA AA FFFF F F | BAB | AAAAA | DD DD | AAAAA | BAB | F F FFFF AA ABABA ACCCA ABABA AA FFFF F F | | AAAAA | DD A A DD | | ", + " | | D D D D | D AAAAAAAAA D | D BBBBB D | F F FFF AA DABABA BBBBB ABABAD AA FFF F F | D BBBBB D | D AAAAAAAAA D | D GGGGG D | D AAAAAAAAA D | D BBBBB D | F F FFF AA DABABA BBBBB ABABAD AA FFF F F | D BBBBB D | D AAAAAAAAA D | D D D D | | ", + " | | DCD | AAAAAAAAAAAAA | BBBBBBBBB | F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F | BBBBBBBBB | AAAAAAAAAAAAA | GGGGGGGGG | AAAAAAAAAAAAA | BBBBBBBBB | F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F | BBBBBBBBB | AAAAAAAAAAAAA | DCD | | ", + " | | DCD | AAAAAAAAAAAAAAA | BBBBBBBBBBB | F F FFFF A ABABBBBBBBBBBBABA A FFFF F F | DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD | AAAAAAAAAAAAAAA | GGGGGGGGGGG | AAAAAAAAAAAAAAA | DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD | F F FFFF A ABABBBBBBBBBBBABA A FFFF F F | BBBBBBBBBBB | AAAAAAAAAAAAAAA | DCD | | ", + " | | CDCDC | AAAAAAAAAAAAAAA | BBBBBBBBBBBBB | F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | AAAAAAAAAAAAAAA | GGGGGGGGGGGGG | AAAAAAAAAAAAAAA | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F | BBBBBBBBBBBBB | AAAAAAAAAAAAAAA | CDCDC | | ", + " | | DCDCDCD | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | F F FFFF A BBBBBBBBBBBBBBB A FFFF F F | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | AAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | F F FFFF A BBBBBBBBBBBBBBB A FFFF F F | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DCDCDCD | | ", + " D D | D D | DDCDCDCDD | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | F F FFFF A BBBBBBBBBBBBBBB A FFFF F F | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | AAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAA | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | F F FFFF A BBBBBBBBBBBBBBB A FFFF F F | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DDCDCDCDD | D D | D D ", + " | | CCCC CCCC | AAAAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBBBB | F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | AAAAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCC@@@CCCC | | ", + " | | AAAAAAAAADDDDDD DDDDDDAAAAAAAAA | AA AAAAAAAAAAAAAAAAAAA AA | A BBBBBBBBBBBBBBBBB A | EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | AAAAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAAAA | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE | A BBBBBBBBBBBBBBBBB A | AA AAAAAAAAAAAAAAAAAAA AA | AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA | | ", + " | | CCCCC CCCCC | AAAAAAAAA AAAAAAAAA | BBBBBBBB BBBBBBBB | EEEEEEEEEEEEF EEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBB BBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEE FEEEEEEEEEEEE |DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD| AAAAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAAAA |DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD| EEEEEEEEEEEEF EEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEE FEEEEEEEEEEEE | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCCC@@#@@CCCCC | | ", + " | | AAAAAAAAADDDDDD DDDDDDAAAAAAAAA | AA AAAAAAAAAAAAAAAAAAA AA | A BBBBBBBBBBBBBBBBB A | EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | AAAAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAAAA | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | EEEEEEE F F EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE F F EEEEEEE | A BBBBBBBBBBBBBBBBB A | AA AAAAAAAAAAAAAAAAAAA AA | AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA | | ", + " | | CCCC CCCC | AAAAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBBBB | F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | AAAAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | F F FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF F F | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCC@@@CCCC | | ", + " D D | D D | DDCDCDCDD | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | F F FFFF A BBBBBBBBBBBBBBB A FFFF F F | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | AAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAA | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | F F FFFF A BBBBBBBBBBBBBBB A FFFF F F | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DDCDCDCDD | D D | D D ", + " | | DCDCDCD | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | F F FFFF A BBBBBBBBBBBBBBB A FFFF F F | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | AAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | F F FFFF A BBBBBBBBBBBBBBB A FFFF F F | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DCDCDCD | | ", + " | | CDCDC | AAAAAAAAAAAAAAA | BBBBBBBBBBBBB | F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | AAAAAAAAAAAAAAA | GGGGGGGGGGGGG | AAAAAAAAAAAAAAA | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | F F FFFF AA BBBBBBBBBBBBBBB AA FFFF F F | BBBBBBBBBBBBB | AAAAAAAAAAAAAAA | CDCDC | | ", + " | | DCD | AAAAAAAAAAAAAAA | BBBBBBBBBBB | F F FFFF A ABABBBBBBBBBBBABA A FFFF F F | DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD | AAAAAAAAAAAAAAA | GGGGGGGGGGG | AAAAAAAAAAAAAAA | DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD | F F FFFF A ABABBBBBBBBBBBABA A FFFF F F | BBBBBBBBBBB | AAAAAAAAAAAAAAA | DCD | | ", + " | | DCD | AAAAAAAAAAAAA | BBBBBBBBB | F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F | BBBBBBBBB | AAAAAAAAAAAAA | GGGGGGGGG | AAAAAAAAAAAAA | BBBBBBBBB | F F FFFF A ABABBBBBBBBBBBBBABA A FFFF F F | BBBBBBBBB | AAAAAAAAAAAAA | DCD | | ", + " | | D D D D | D AAAAAAAAA D | D BBBBB D | F F FFF AA DABABA BBBBB ABABAD AA FFF F F | D BBBBB D | D AAAAAAAAA D | D GGGGG D | D AAAAAAAAA D | D BBBBB D | F F FFF AA DABABA BBBBB ABABAD AA FFF F F | D BBBBB D | D AAAAAAAAA D | D D D D | | ", + " | | DD A A DD | AAAAA | | F F FFFF AA ABABA ACCCA ABABA AA FFFF F F | BAB | AAAAA | DD DD | AAAAA | BAB | F F FFFF AA ABABA ACCCA ABABA AA FFFF F F | | AAAAA | DD A A DD | | ", + " | | DD A A DD | | | F F FFF A ABABA ACCCA ABABA A FFF F F | BAB | | DD DD | | BAB | F F FFF A ABABA ACCCA ABABA A FFF F F | | | DD A A DD | | ", + " | | DD A A DD | D D | D D | F F FFF AA ABABAD ACCCA DABABA AA FFF F F | D BAB D | D D | DD DD | D D | D BAB D | F F FFF AA ABABAD ACCCA DABABA AA FFF F F | D D | D D | DD A A DD | | ", + " | | A A | | A A | F F FFF AABABA ACCCA ABABAA FFF F F | BAB | | | | BAB | F F FFF AABABA ACCCA ABABAA FFF F F | A A | | A A | | ", + " | | A A | | AGGA AGGA | F F FFF AABA ACCCA ABAA FFF F F | BAB | | | | BAB | F F FFF AABA ACCCA ABAA FFF F F | AGGA AGGA | | A A | | ", + " | | A A | | AGGAG GAGGA | FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF | D BAB D | | | | D BAB D | FF FF FFF AA AAAA ACCCA AAAA AA FFF FF FF | AGGAG GAGGA | | A A | | ", + " | | A A | | AGGAGGA AGGAGGA | F F FF AA AA AAAAEEEAAAA AA AA FF F F | D BAB D | | | | D BAB D | F F FF AA AA AAAAEEEAAAA AA AA FF F F | AGGAGGA AGGAGGA | | A A | | ", + " | | A A | | AGGAGGA AGGAGGA | F F FF AAA EEE AAA FF F F | DCAACBABCAACD | | | | DCAACBABCAACD | F F FF AAA EEE AAA FF F F | AGGAGGA AGGAGGA | | A A | | ", + " | | A A | A A | AGGAGGA AGGAGGA | F F FF EEEEE FF F F | DCAACBABCAACD | | | | DCAACBABCAACD | F F FF EEEEE FF F F | AGGAGGA AGGAGGA | A A | A A | | ", + " | | | A A | AGGAGGA A A AGGAGGA | F F FF EEEEE FF F F | DCAACBABCAACD | | | | DCAACBABCAACD | F F FF EEEEE FF F F | AGGAGGA A A AGGAGGA | A A | | | ", + " | | | | AGGAGGA AGGAGGA | FFFF FF EEEEE FF FFFF | DCAACBABCAACD | | | | DCAACBABCAACD | FFFF FF EEEEE FF FFFF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FFF FFF EEEEE FFF FFF | DCAACBABCAACD | | | | DCAACBABCAACD | FFF FFF EEEEE FFF FFF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FFF FFFF EEEEE FFFF FFF | DCAACBABCAACD | | | | DCAACBABCAACD | FFF FFFF EEEEE FFFF FFF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFF EEEEE FFFFFF FF | DCAACBABCAACD | | | | DCAACBABCAACD | FF FFFFFF EEEEE FFFFFF FF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFFFFF EEEEE FFFFFFFFF FF | DCAACBABCAACD | | | | DCAACBABCAACD | FF FFFFFFFFF EEEEE FFFFFFFFF FF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFFFFFFEEEFFFFFFFFFF FF | DCAACBABCAACD | | | | DCAACBABCAACD | FF FFFFFFFFFFEEEFFFFFFFFFF FF | AGGAGGA AGGAGGA | | | | ", + " | | | | AGAGGA AGGAGA | FF FFFFFFFFEEEFFFFFFFF FF | DDCACBABCACDD | | | | DDCACBABCACDD | FF FFFFFFFFEEEFFFFFFFF FF | AGAGGA AGGAGA | | | | ", + " | | | | AGGGGA AGGGGA | FF FFFFFFEEEFFFFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFFFFEEEFFFFFF FF | AGGGGA AGGGGA | | | | ", + " | | | | GGGAA AAGGG | FF FFFEEEFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFEEEFFF FF | GGGAA AAGGG | | | | ", + " | | | | GGGA AGGG | FFF EEE FFF | DCACBABCACD | | | | DCACBABCACD | FFF EEE FFF | GGGA AGGG | | | | ", + " | | | | GG GG | FFFF EEE FFFF | DCACBABCACD | | | | DCACBABCACD | FFFF EEE FFFF | GG GG | | | | ", + " | | | | | FFFFF EEE FFFFF | DCACBABCACD | | | | DCACBABCACD | FFFFF EEE FFFFF | | | | | ", + " | | | | | FF FFF E FFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFF E FFF FF | | | | | ", + " | | | | | FF FFFF E FFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFF E FFFF FF | | | | | ", + " | | | | | FF FFFFF E FFFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFFF E FFFFF FF | | | | | ", + " | | | | | FF FFFFFEFFFFF FF | DCACBABCACD | | | | DCACBABCACD | FF FFFFFEFFFFF FF | | | | | ", + " | | | | | FFF FFF | DCACBABCACD | | | | DCACBABCACD | FFF FFF | | | | | ", + " | | | | | FF FF | DDCCBABCCDD | | | | DDCCBABCCDD | FF FF | | | | | ", + " | | | | | FFFFF FFFFF | DCCBABCCD | | | | DCCBABCCD | FFFFF FFFFF | | | | | ", + " | | | | | FFFFFFFFF | DCCBABCCD | | | | DCCBABCCD | FFFFFFFFF | | | | | ", + " | | | | | E | DCCBABCCD | | | | DCCBABCCD | E | | | | | ", + " | | | | | EEE | DCCBABCCD | | | | DCCBABCCD | EEE | | | | | ", + " | | | | | EEE | DDCBABCDD | | | | DDCBABCDD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | | | | DCBABCD | EEE | | | | | ", + " | | | | | E | DDBABDD | | | | DDBABDD | E | | | | | ", + " | | | | | E | DBABD | | | | DBABD | E | | | | | ", + " | | | | | E | DBABD | | | | DBABD | E | | | | | ", + " | | | | | E | DBABD | | | | DBABD | E | | | | | ", + " | | | | | | DBABD | | | | DBABD | | | | | | ", + " | | | | | | DDADD | | | | DDADD | | | | | | ", + " | | | | | | DAD | | | | DAD | | | | | | ", + " | | | | | | DAD | | | | DAD | | | | | | ", + " | | | | | | DAD | | | | DAD | | | | | | ", + " | | | | | | DDD | | | | DDD | | | | | | ", + " | | | | | | D | | | | D | | | | | | ", + " | | | | | | D | | | | D | | | | | | ", + " | | | | | | D | | | | D | | | | | | ", + " | | | | | | D | | | | D | | | | | | " + }; + + public static final String[] TIER_3 = { + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | D | | H | | D | | | | | | ", + " | | | | | | D | | H | | D | | | | | | ", + " | | | | | | D | | H | | D | | | | | | ", + " | | | | | | D | | H | | D | | | | | | ", + " | | | | | | DDD | | H | | DDD | | | | | | ", + " | | | | | | DAD | | H | | DAD | | | | | | ", + " | | | | | | DAD | | H | | DAD | | | | | | ", + " | | | | | | DAD | | H | | DAD | | | | | | ", + " | | | | | | DDADD | | H | | DDADD | | | | | | ", + " | | | | | | DBABD | I I | IHI | I I | DBABD | | | | | | ", + " | | | | | E | DBABD | I I | IHI | I I | DBABD | E | | | | | ", + " | | | | | E | DBABD | I I | IHI | I I | DBABD | E | | | | | ", + " | | | | | E | DBABD | I I | IHI | I I | DBABD | E | | | | | ", + " | | | | | E | DDBABDD | I I | IHI | I I | DDBABDD | E | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DDCBABCDD | I I | IHI | I I | DDCBABCDD | EEE | | | | | ", + " | | | | | EEE | DCCBABCCD | I I | IHI | I I | DCCBABCCD | EEE | | | | | ", + " | | | | | E | DCCBABCCD | I I | IHI | I I | DCCBABCCD | E | | | | | ", + " | | | | | FFFFFFFFF | DCCBABCCD | I I | IHI | I I | DCCBABCCD | FFFFFFFFF | | | | | ", + " | | | | | FFFFFIIIIIIIIIFFFFF | DCCBABCCD | I I | IHI | I I | DCCBABCCD | FFFFFIIIIIIIIIFFFFF | | | | | ", + " | | | | | FFIIIIIIIIIIIIIIIIIIIFF | IIIIDDCCBABCCDDIIII | IIII I I IIII | IIII IHI IIII | IIII I I IIII | IIIIDDCCBABCCDDIIII | FFIIIIIIIIIIIIIIIIIIIFF | | | | | ", + " | | | | | FFFIIIIIIIIIIIIIIIIIIIIIIIFFF | IIIIIIDCACBABCACDIIIIII | IIIIII I I IIIIII | IIIIII IHI IIIIII | IIIIII I I IIIIII | IIIIIIDCACBABCACDIIIIII | FFFIIIIIIIIIIIIIIIIIIIIIIIFFF | | | | | ", + " | | | | | FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF | IIIIIIIIDCACBABCACDIIIIIIII | IIIIIIII I I IIIIIIII | IIIIIIII IHI IIIIIIII | IIIIIIII I I IIIIIIII | IIIIIIIIDCACBABCACDIIIIIIII | FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF | | | | | ", + " | | | | | FFIIIIIFFFFF E FFFFFIIIIIFF | IIIII DCACBABCACD IIIII | IIIII I I IIIII | IIIII IHI IIIII | IIIII I I IIIII | IIIII DCACBABCACD IIIII | FFIIIIIFFFFF E FFFFFIIIIIFF | | | | | ", + " | | | | | FFIIIFFFF E FFFFIIIFF | III DCACBABCACD III | III I I III | III IHI III | III I I III | III DCACBABCACD III | FFIIIFFFF E FFFFIIIFF | | | | | ", + " | | | | | FFIIFFF E FFFIIFF | II DCACBABCACD II | II I I II | II IHI II | II I I II | II DCACBABCACD II | FFIIFFF E FFFIIFF | | | | | ", + " | | | | | FFFFF EEE FFFFF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FFFFF EEE FFFFF | | | | | ", + " | | | | GG GG | FFFF EEE FFFF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FFFF EEE FFFF | GG J GG | | | | ", + " | | | | GGGA AGGG | FFF EEE FFF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FFF EEE FFF | GGGA J AGGG | | | | ", + " | | | | GGGAA AAGGG | FF FFFEEEFFF FF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FF FFFEEEFFF FF | GGGAA J AAGGG | | | | ", + " | | | | AGGGGA AGGGGA | FF FFFFFFEEEFFFFFF FF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FF FFFFFFEEEFFFFFF FF | AGGGGA J AGGGGA | | | | ", + " | | | | AGAGGA AGGAGA | FF FFFFFFFFEEEFFFFFFFF FF | DDCACBABCACDD | I I | IHI | I I | DDCACBABCACDD | FF FFFFFFFFEEEFFFFFFFF FF | AGAGGA J AGGAGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFFFFFFEEEFFFFFFFFFF FF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FF FFFFFFFFFFEEEFFFFFFFFFF FF | AGGAGGA J AGGAGGA | | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFFFFF EEEEE FFFFFFFFF FF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FF FFFFFFFFF EEEEE FFFFFFFFF FF | AGGAGGA AGGAGGA | J | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFF EEEEE FFFFFF FF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FF FFFFFF EEEEE FFFFFF FF | AGGAGGA AGGAGGA | J | | | ", + " | | | | AGGAGGA AGGAGGA | FFF FFFF EEEEE FFFF FFF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FFF FFFF EEEEE FFFF FFF | AGGAGGA AGGAGGA | J | | | ", + " | | | | AGGAGGA AGGAGGA | FFF FFF EEEEE FFF FFF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FFF FFF EEEEE FFF FFF | AGGAGGA AGGAGGA | J | | | ", + " | | | | AGGAGGA AGGAGGA | FFFF FF EEEEE FF FFFF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FFFF FF EEEEE FF FFFF | AGGAGGA AGGAGGA | J | | | ", + " | | | A A | AGGAGGA A A AGGAGGA | FIF FF EEEEE FF FIF | I DCAACBABCAACD I | I I I I | I IHI I | I I I I | I DCAACBABCAACD I | FIF FF EEEEE FF FIF | AGGAGGA A A AGGAGGA | AJA | | | ", + " | | A A | A A | AGGAGGA AGGAGGA | FIIF FF EEEEE FF FIIF | II DCAACBABCAACD II | II I I II | II IHI II | II I I II | II DCAACBABCAACD II | FIIF FF EEEEE FF FIIF | AGGAGGA AGGAGGA | A A | AJA | | ", + " | | A A | | AGGAGGA AGGAGGA | FIF FF AAA EEE AAA FF FIF | I DCAACBABCAACD I | I I I I | I IHI I | I I I I | I DCAACBABCAACD I | FIF FF AAA EEE AAA FF FIF | AGGAGGA AGGAGGA | | AJA | | ", + " | | A A | | AGGAGGA AGGAGGA | FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF | II D BAB D II | II I I II | II IHI II | II I I II | II D BAB D II | FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF | AGGAGGA AGGAGGA | | AJA | | ", + " | | A A | | AGGAG GAGGA | FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF | I D BAB D I | I I I I | I IHI I | I I I I | I D BAB D I | FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF | AGGAG GAGGA | | AJA | | ", + " | | A A | | AGGA AGGA | FIIF FFF AABA ACCCA ABAA FFF FIIF | II BAB II | II I I II | II IHI II | II I I II | II BAB II | FIIF FFF AABA ACCCA ABAA FFF FIIF | AGGA AGGA | | AJA | | ", + " | | A A | | A A | FIIF FFF AABABA ACCCA ABABAA FFF FIIF | II BAB II | II I I II | II IHI II | II I I II | II BAB II | FIIF FFF AABABA ACCCA ABABAA FFF FIIF | A A | | AJA | | ", + " | | DD A A DD | D D | D D | FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF | III D BAB D III | III D I I D III | III DD IHI DD III | III D I I D III | III D BAB D III | FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF | D D | D D | DD AJA DD | | ", + " | | DD A A DD | | | FIIF FFF A ABABA ACCCA ABABA A FFF FIIF | II BAB II | II I I II | II DD IHI DD II | II I I II | II BAB II | FIIF FFF A ABABA ACCCA ABABA A FFF FIIF | | | DD AJA DD | | ", + " | | DD A A DD | AAAAA | | FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF | III BAB III | III AAAAA III | III DD H DD III | III AAAAA III | III BAB III | FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF | | AAAAA | DD AJA DD | | ", + " | | D D D D | D AAAAAAAAA D | D BBBBB D | FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF | III D BBBBB D III | III D AAAAAAAAA D III | III D GGGGG D III | III D AAAAAAAAA D III | III D BBBBB D III | FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF | D BBBBB D | D AAAAAAAAA D | D DJD D | | ", + " | | DCD | AAAAAAAAAAAAA | BBBBBBBBB | FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF | III BBBBBBBBB III | III AAAAAAAAAAAAA III | III GGGGGGGGG III | III AAAAAAAAAAAAA III | III BBBBBBBBB III | FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF | BBBBBBBBB | AAAAAAAAAAAAA | DCD | | ", + " | | DCD | AAAAAAAAAAAAAAA | BBBBBBBBBBB | FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF | III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III | III AAAAAAAAAAAAAAA III | III GGGGGGGGGGG III | III AAAAAAAAAAAAAAA III | III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III | FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF | BBBBBBBBBBB | AAAAAAAAAAAAAAA | DCD | | ", + " | | CDCDC | AAAAAAAAAAAAAAA | BBBBBBBBBBBBB | FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | AAAAAAAAAAAAAAA | GGGGGGGGGGGGG | AAAAAAAAAAAAAAA | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF | BBBBBBBBBBBBB | AAAAAAAAAAAAAAA | CDCDC | | ", + " | | DCDCDCD | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | AAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DCDCDCD | | ", + " D D | D D | DDCDCDCDD | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | AAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAA | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DDCDCDCDD | D D | D D ", + " | | CCCCCCCCCCC | AAAAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBBBB | FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | AAAAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCC@@@CCCC | | ", + " | | AAAAAAAAADDDDDDCCCCCDDDDDDAAAAAAAAA | AA AAAAAAAAAAAAAAAAAAA AA | A BBBBBBBBBBBBBBBBB A | EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII | IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII GGGGGGGGGGGGGGGGG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII | IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE | A BBBBBBBBBBBBBBBBB A | AA AAAAAAAAAAAAAAAAAAA AA | AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA | | ", + " | | CCCCCCCCCCCCCCC | AAAAAAAAA AAAAAAAAA | BBBBBBBB BBBBBBBB | EEEEEEEEEEEEFIIIEEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBB BBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEEIIIFEEEEEEEEEEEE | DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD | AAAAAAAAAAAAAAAAAAA |HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH| AAAAAAAAAAAAAAAAAAA | DDDDDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADDDDD | EEEEEEEEEEEEFIIIEEEEEEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEEEEEEIIIFEEEEEEEEEEEE | JJJJJJ BBBBBBBBBBBBBBBBB JJJJJJ | JJJJJJ AAAAAAAAAAAAAAAAAAA JJJJJJ | JJJJJJJJJJCCCCC@@#@@CCCCCJJJJJJJJJJ | | ", + " | | AAAAAAAAADDDDDDCCCCCDDDDDDAAAAAAAAA | AA AAAAAAAAAAAAAAAAAAA AA | A BBBBBBBBBBBBBBBBB A | EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII | IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII GGGGGGGGGGGGGGGGG IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII | IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIAAAAAAAAAAAAAAAAAAAIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII | DDDDDBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDDDDD | EEEEEEE FIIIF EEEEEEEEEEEEEEEECCCCCCBBBBBBBBBBBBBBBBBCCCCCCEEEEEEEEEEEEEEEE FIIIF EEEEEEE | A BBBBBBBBBBBBBBBBB A | AA AAAAAAAAAAAAAAAAAAA AA | AAAAAAAAADDDDDD@@@@@DDDDDDAAAAAAAAA | | ", + " | | CCCCCCCCCCC | AAAAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBBBB | FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | AAAAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBBB CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCDDDDDD | FIIIF FFFFEEEEEEE AAAAAAABBBBBBBBBBBBBBBBBAAAAAAA EEEEEEEFFFF FIIIF | BBBBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAAAA | CCCC@@@CCCC | | ", + " D D | D D | DDCDCDCDD | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | AAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAA | DDDDDDDCCCCCAAAAAAAAAAAAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAAAAAAAAAAAAACCCCCDDDDDDD | FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DDCDCDCDD | D D | D D ", + " | | DCDCDCD | AAAAAAAAAAAAAAAAA | BBBBBBBBBBBBBBB | FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | AAAAAAAAAAAAAAAAA | GGGGGGGGGGGGGGG | AAAAAAAAAAAAAAAAA | DDDDDDCCCCCCCCCCCAAAAAAAAA BBBBBBBBBBBBBBB AAAAAAAAACCCCCCCCCCCDDDDDD | FIIIF FFFF A BBBBBBBBBBBBBBB A FFFF FIIIF | BBBBBBBBBBBBBBB | AAAAAAAAAAAAAAAAA | DCDCDCD | | ", + " | | CDCDC | AAAAAAAAAAAAAAA | BBBBBBBBBBBBB | FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | AAAAAAAAAAAAAAA | GGGGGGGGGGGGG | AAAAAAAAAAAAAAA | DDDDDDDDDDDDCCCCCCCCC BBBBBBBBBBBBB CCCCCCCCCDDDDDDDDDDDD | FIIF FFFF AA BBBBBBBBBBBBBBB AA FFFF FIIF | BBBBBBBBBBBBB | AAAAAAAAAAAAAAA | CDCDC | | ", + " | | DCD | AAAAAAAAAAAAAAA | BBBBBBBBBBB | FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF | III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III | III AAAAAAAAAAAAAAA III | III GGGGGGGGGGG III | III AAAAAAAAAAAAAAA III | III DDDDDDDDDDDD BBBBBBBBBBB DDDDDDDDDDDD III | FIIIF FFFF A ABABBBBBBBBBBBABA A FFFF FIIIF | BBBBBBBBBBB | AAAAAAAAAAAAAAA | DCD | | ", + " | | DCD | AAAAAAAAAAAAA | BBBBBBBBB | FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF | III BBBBBBBBB III | III AAAAAAAAAAAAA III | III GGGGGGGGG III | III AAAAAAAAAAAAA III | III BBBBBBBBB III | FIIIF FFFF A ABABBBBBBBBBBBBBABA A FFFF FIIIF | BBBBBBBBB | AAAAAAAAAAAAA | DCD | | ", + " | | D D D D | D AAAAAAAAA D | D BBBBB D | FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF | III D BBBBB D III | III D AAAAAAAAA D III | III D GGGGG D III | III D AAAAAAAAA D III | III D BBBBB D III | FIIIF FFF AA DABABA BBBBB ABABAD AA FFF FIIIF | D BBBBB D | D AAAAAAAAA D | D DJD D | | ", + " | | DD A A DD | AAAAA | | FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF | III BAB III | III AAAAA III | III DD H DD III | III AAAAA III | III BAB III | FIIIF FFFF AA ABABA ACCCA ABABA AA FFFF FIIIF | | AAAAA | DD AJA DD | | ", + " | | DD A A DD | | | FIIF FFF A ABABA ACCCA ABABA A FFF FIIF | II BAB II | II I I II | II DD IHI DD II | II I I II | II BAB II | FIIF FFF A ABABA ACCCA ABABA A FFF FIIF | | | DD AJA DD | | ", + " | | DD A A DD | D D | D D | FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF | III D BAB D III | III D I I D III | III DD IHI DD III | III D I I D III | III D BAB D III | FIIIF FFF AA ABABAD ACCCA DABABA AA FFF FIIIF | D D | D D | DD AJA DD | | ", + " | | A A | | A A | FIIF FFF AABABA ACCCA ABABAA FFF FIIF | II BAB II | II I I II | II IHI II | II I I II | II BAB II | FIIF FFF AABABA ACCCA ABABAA FFF FIIF | A A | | AJA | | ", + " | | A A | | AGGA AGGA | FIIF FFF AABA ACCCA ABAA FFF FIIF | II BAB II | II I I II | II IHI II | II I I II | II BAB II | FIIF FFF AABA ACCCA ABAA FFF FIIF | AGGA AGGA | | AJA | | ", + " | | A A | | AGGAG GAGGA | FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF | I D BAB D I | I I I I | I IHI I | I I I I | I D BAB D I | FFIFF FFF AA AAAA ACCCA AAAA AA FFF FFIFF | AGGAG GAGGA | | AJA | | ", + " | | A A | | AGGAGGA AGGAGGA | FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF | II D BAB D II | II I I II | II IHI II | II I I II | II D BAB D II | FIIF FF AA AA AAAAEEEAAAA AA AA FF FIIF | AGGAGGA AGGAGGA | | AJA | | ", + " | | A A | | AGGAGGA AGGAGGA | FIF FF AAA EEE AAA FF FIF | I DCAACBABCAACD I | I I I I | I IHI I | I I I I | I DCAACBABCAACD I | FIF FF AAA EEE AAA FF FIF | AGGAGGA AGGAGGA | | AJA | | ", + " | | A A | A A | AGGAGGA AGGAGGA | FIIF FF EEEEE FF FIIF | II DCAACBABCAACD II | II I I II | II IHI II | II I I II | II DCAACBABCAACD II | FIIF FF EEEEE FF FIIF | AGGAGGA AGGAGGA | A A | AJA | | ", + " | | | A A | AGGAGGA A A AGGAGGA | FIF FF EEEEE FF FIF | I DCAACBABCAACD I | I I I I | I IHI I | I I I I | I DCAACBABCAACD I | FIF FF EEEEE FF FIF | AGGAGGA A A AGGAGGA | AJA | | | ", + " | | | | AGGAGGA AGGAGGA | FFFF FF EEEEE FF FFFF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FFFF FF EEEEE FF FFFF | AGGAGGA AGGAGGA | J | | | ", + " | | | | AGGAGGA AGGAGGA | FFF FFF EEEEE FFF FFF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FFF FFF EEEEE FFF FFF | AGGAGGA AGGAGGA | J | | | ", + " | | | | AGGAGGA AGGAGGA | FFF FFFF EEEEE FFFF FFF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FFF FFFF EEEEE FFFF FFF | AGGAGGA AGGAGGA | J | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFF EEEEE FFFFFF FF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FF FFFFFF EEEEE FFFFFF FF | AGGAGGA AGGAGGA | J | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFFFFF EEEEE FFFFFFFFF FF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FF FFFFFFFFF EEEEE FFFFFFFFF FF | AGGAGGA AGGAGGA | J | | | ", + " | | | | AGGAGGA AGGAGGA | FF FFFFFFFFFFEEEFFFFFFFFFF FF | DCAACBABCAACD | I I | IHI | I I | DCAACBABCAACD | FF FFFFFFFFFFEEEFFFFFFFFFF FF | AGGAGGA J AGGAGGA | | | | ", + " | | | | AGAGGA AGGAGA | FF FFFFFFFFEEEFFFFFFFF FF | DDCACBABCACDD | I I | IHI | I I | DDCACBABCACDD | FF FFFFFFFFEEEFFFFFFFF FF | AGAGGA J AGGAGA | | | | ", + " | | | | AGGGGA AGGGGA | FF FFFFFFEEEFFFFFF FF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FF FFFFFFEEEFFFFFF FF | AGGGGA J AGGGGA | | | | ", + " | | | | GGGAA AAGGG | FF FFFEEEFFF FF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FF FFFEEEFFF FF | GGGAA J AAGGG | | | | ", + " | | | | GGGA AGGG | FFF EEE FFF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FFF EEE FFF | GGGA J AGGG | | | | ", + " | | | | GG GG | FFFF EEE FFFF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FFFF EEE FFFF | GG J GG | | | | ", + " | | | | | FFFFF EEE FFFFF | DCACBABCACD | I I | IHI | I I | DCACBABCACD | FFFFF EEE FFFFF | | | | | ", + " | | | | | FFIIFFF E FFFIIFF | II DCACBABCACD II | II I I II | II IHI II | II I I II | II DCACBABCACD II | FFIIFFF E FFFIIFF | | | | | ", + " | | | | | FFIIIFFFF E FFFFIIIFF | III DCACBABCACD III | III I I III | III IHI III | III I I III | III DCACBABCACD III | FFIIIFFFF E FFFFIIIFF | | | | | ", + " | | | | | FFIIIIIFFFFF E FFFFFIIIIIFF | IIIII DCACBABCACD IIIII | IIIII I I IIIII | IIIII IHI IIIII | IIIII I I IIIII | IIIII DCACBABCACD IIIII | FFIIIIIFFFFF E FFFFFIIIIIFF | | | | | ", + " | | | | | FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF | IIIIIIIIDCACBABCACDIIIIIIII | IIIIIIII I I IIIIIIII | IIIIIIII IHI IIIIIIII | IIIIIIII I I IIIIIIII | IIIIIIIIDCACBABCACDIIIIIIII | FFIIIIIIIIFFFFFEFFFFFIIIIIIIIFF | | | | | ", + " | | | | | FFFIIIIIIIIIIIIIIIIIIIIIIIFFF | IIIIIIDCACBABCACDIIIIII | IIIIII I I IIIIII | IIIIII IHI IIIIII | IIIIII I I IIIIII | IIIIIIDCACBABCACDIIIIII | FFFIIIIIIIIIIIIIIIIIIIIIIIFFF | | | | | ", + " | | | | | FFIIIIIIIIIIIIIIIIIIIFF | IIIIDDCCBABCCDDIIII | IIII I I IIII | IIII IHI IIII | IIII I I IIII | IIIIDDCCBABCCDDIIII | FFIIIIIIIIIIIIIIIIIIIFF | | | | | ", + " | | | | | FFFFFIIIIIIIIIFFFFF | DCCBABCCD | I I | IHI | I I | DCCBABCCD | FFFFFIIIIIIIIIFFFFF | | | | | ", + " | | | | | FFFFFFFFF | DCCBABCCD | I I | IHI | I I | DCCBABCCD | FFFFFFFFF | | | | | ", + " | | | | | E | DCCBABCCD | I I | IHI | I I | DCCBABCCD | E | | | | | ", + " | | | | | EEE | DCCBABCCD | I I | IHI | I I | DCCBABCCD | EEE | | | | | ", + " | | | | | EEE | DDCBABCDD | I I | IHI | I I | DDCBABCDD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | EEE | DCBABCD | I I | IHI | I I | DCBABCD | EEE | | | | | ", + " | | | | | E | DDBABDD | I I | IHI | I I | DDBABDD | E | | | | | ", + " | | | | | E | DBABD | I I | IHI | I I | DBABD | E | | | | | ", + " | | | | | E | DBABD | I I | IHI | I I | DBABD | E | | | | | ", + " | | | | | E | DBABD | I I | IHI | I I | DBABD | E | | | | | ", + " | | | | | | DBABD | I I | IHI | I I | DBABD | | | | | | ", + " | | | | | | DDADD | | H | | DDADD | | | | | | ", + " | | | | | | DAD | | H | | DAD | | | | | | ", + " | | | | | | DAD | | H | | DAD | | | | | | ", + " | | | | | | DAD | | H | | DAD | | | | | | ", + " | | | | | | DDD | | H | | DDD | | | | | | ", + " | | | | | | D | | H | | D | | | | | | ", + " | | | | | | D | | H | | D | | | | | | ", + " | | | | | | D | | H | | D | | | | | | ", + " | | | | | | D | | H | | D | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | ", + " | | | | | | | | H | | | | | | | | " + }; + + public static final String[] TIER_4 = { + // T4 not yet available + }; + + // spotless:on +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SteamAssembler.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SteamAssembler.java new file mode 100644 index 000000000..8ac99a904 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SteamAssembler.java @@ -0,0 +1,59 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.machine.multiblock.steam.WeakSteamParallelMultiBlockMachine; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderHelper; +import com.gregtechceu.gtceu.common.block.BoilerFireboxType; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import net.minecraft.network.chat.Component; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.STEEL_PLATED_BRONZE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.blocks; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.createWorkableCasingMachineModel; + +public class SteamAssembler { + + public static final MultiblockMachineDefinition HIGH_PRESSURE_ASSEMBLER = REGISTRATE + .multiblock("high_pressure_assembler", WeakSteamParallelMultiBlockMachine::new) + .rotationState(RotationState.ALL) + .recipeType(GTRecipeTypes.ASSEMBLER_RECIPES) + .recipeModifier(WeakSteamParallelMultiBlockMachine::recipeModifier, true) + .appearanceBlock(STEEL_PLATED_BRONZE) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("AAAAA", "BBBBB", "BBBBB") + .aisle("AAAAA", "BDDDB", "BBBBB") + .aisle("AAAAA", "BYBBB", "BBBBB") + .where('B', blocks(STEEL_PLATED_BRONZE.get()) + .or(Predicates.abilities(PartAbility.STEAM_IMPORT_ITEMS).setPreviewCount(1) + .setExactLimit(2)) + .or(Predicates.abilities(PartAbility.STEAM_EXPORT_ITEMS).setPreviewCount(1) + .setExactLimit(1)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1).setExactLimit(1))) + .where('#', Predicates.air()) + .where('Y', Predicates.controller(blocks(definition.getBlock()))) + .where('A', blocks(FIREBOX_STEEL.get()).setMinGlobalLimited(11) + .or(Predicates.abilities(PartAbility.STEAM).setExactLimit(1))) + .where('D', blocks(CASING_STEEL_GEARBOX.get())) + .build()) + .model(createWorkableCasingMachineModel(CosmicCore.id("block/casings/solid/steel_plated_bronze_casing"), + GTCEu.id("block/multiblock/steam_oven")) + .andThen(b -> b.addDynamicRenderer( + () -> DynamicRenderHelper.makeBoilerPartRender( + BoilerFireboxType.STEEL_FIREBOX, STEEL_PLATED_BRONZE)))) + .tooltips(Component.translatable("cosmiccore.multiblock.hpsassem.tooltip.0"), + Component.translatable("cosmiccore.multiblock.hpsassem.tooltip.1"), + Component.translatable("cosmiccore.multiblock.hpsassem.tooltip.2")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SteamCaster.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SteamCaster.java new file mode 100644 index 000000000..9842d073a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SteamCaster.java @@ -0,0 +1,49 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.machine.multiblock.steam.WeakSteamParallelMultiBlockMachine; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.CASING_BRONZE_PIPE; + +public class SteamCaster { + + public static final MultiblockMachineDefinition STEAM_CASTER = REGISTRATE + .multiblock("steam_caster", WeakSteamParallelMultiBlockMachine::new) + .rotationState(RotationState.ALL) + .appearanceBlock(BRONZE_HULL) + .recipeType(GTRecipeTypes.FLUID_SOLIDFICATION_RECIPES) + .recipeModifier(WeakSteamParallelMultiBlockMachine::recipeModifier, true) + .addOutputLimit(ItemRecipeCapability.CAP, 1) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("AAAA", "ABBA", "AAAA") + .aisle("AAAA", "BCCB", "AAAA") + .aisle("AAAA", "ADBA", "AAAA") + .where('D', Predicates.controller(blocks(definition.getBlock()))) + .where('#', Predicates.air()) + .where(' ', Predicates.any()) + .where('A', blocks(CASING_BRONZE_BRICKS.get())) + .where('B', blocks(CASING_COKE_BRICKS.get()) + .or(Predicates.abilities(PartAbility.STEAM_IMPORT_ITEMS).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.STEAM_EXPORT_ITEMS).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.STEAM).setExactLimit(1))) + .where('C', blocks(CASING_BRONZE_PIPE.get())) + .build()) + .workableCasingModel(GTCEu.id("block/casings/solid/machine_coke_bricks"), + CosmicCore.id("block/multiblock/solidifier")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SteamMixer.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SteamMixer.java new file mode 100644 index 000000000..b886744dc --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SteamMixer.java @@ -0,0 +1,55 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility; +import com.ghostipedia.cosmiccore.common.machine.multiblock.steam.WeakSteamParallelMultiBlockMachine; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.blocks; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.createWorkableCasingMachineModel; + +public class SteamMixer { + + public static final MultiblockMachineDefinition STEAM_MIXER = REGISTRATE + .multiblock("steam_mixing_vessel", WeakSteamParallelMultiBlockMachine::new) + .rotationState(RotationState.ALL) + .appearanceBlock(BRONZE_BRICKS_HULL) + .recipeType(GTRecipeTypes.MIXER_RECIPES) + .recipeModifier(WeakSteamParallelMultiBlockMachine::recipeModifier, true) + .addOutputLimit(ItemRecipeCapability.CAP, 1) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("AAA", "BCB", "BCB", " B ") + .aisle("AAA", "CEC", "CEC", "BXB") + .aisle("ADA", "BCB", "BCB", " B ") + .where('D', Predicates.controller(blocks(definition.getBlock()))) + .where('#', Predicates.air()) + .where(' ', Predicates.any()) + .where('A', blocks(BRONZE_BRICKS_HULL.get()) + .or(Predicates.abilities(PartAbility.STEAM_IMPORT_ITEMS).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.STEAM_EXPORT_ITEMS).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.EXPORT_FLUIDS).setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.STEAM).setExactLimit(1))) + .where('B', blocks(CASING_BRONZE_BRICKS.get())) + .where('C', blocks(BRONZE_HULL.get())) + .where('E', blocks(CASING_BRONZE_GEARBOX.get())) + .where('X', + blocks(CASING_BRONZE_BRICKS.get()) + .or(Predicates.abilities(CosmicPartAbility.IMPORT_EMBER).setPreviewCount(1))) + .build()) + .model(createWorkableCasingMachineModel(GTCEu.id("block/casings/solid/machine_casing_bronze_plated_bricks"), + CosmicCore.id("block/multiblock/mixing_vessel"))) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StellarIris.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StellarIris.java new file mode 100644 index 000000000..eec2e585e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StellarIris.java @@ -0,0 +1,188 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.pattern.CosmicPredicates; +import com.ghostipedia.cosmiccore.client.renderer.machine.CosmicDynamicRenderHelpers; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import net.minecraft.network.chat.Component; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GCYMBlocks.*; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.createWorkableCasingMachineModel; + +public class StellarIris { + + public final static MultiblockMachineDefinition STELLAR_IRIS = REGISTRATE + .multiblock("stellar_iris", IrisMultiblockMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.STELLAR_IRIS) + .recipeModifier(GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK)) + .appearanceBlock(CosmicBlocks.CYCLOZINE_CHEMICALLY_REPELLING_CASING) + .pattern(definition -> FactoryBlockPattern.start() + // spotless:off + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAAAAAAAAAAAA ", " ", " ", " ", " ", " ", " AAAAAAAAAAAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " BBBBBBCCCBBBBBB ", " BBBBBBCCCBBBBBB ", " BBBBBBCCCBBBBBB ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAAAAAAABBBBBBBBBBBBBBBAAAAAAAAAA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBCCCBBBBBBBBBBBB ", " BBBBBBBBBBBBCCCBBBBBBBBBBBB ", " BBBBBBBBBBBBCCCBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAAAAAABBBBBBBBBBBBBBBAAAAAAAAAA ", " D ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAAAABBBBBBAAAAAAAAAAAAAAABBBBBBAAAAAAA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBCCCBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBCCCBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBCCCBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAAABBBBBBAAAAAAAAAAAAAAABBBBBBAAAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAABBBBAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBAAAAA ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " AAAAABBBBAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAABBBAAAAAAAAAA AAAAAAAAAABBBAAAAA ", " BBBBBBBBB BBBBBBBBB ", " BBBBBBBBB BBBBBBBBB ", " BBBBBBBBB BBBBBBBBB ", " BBBBBBBBB BBBBBBBBB ", " BBBBBBBBB BBBBBBBBB ", " AAAAABBBAAAAAAAAAA AAAAAAAAAABBBAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAABBAAAAAAA AAAAAAABBAAAAA ", " BBBBBBBB BBBBBBBB ", " BBBBBBBB BBBBBBBB ", " BBBBBBBB BBBBBBBB ", " BBBBBBBB BBBBBBBB ", " BBBBBBBB BBBBBBBB ", " AAAAABBAAAAAAA AAAAAAABBAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAABBBAAAAA AAAAABBBAAAA ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " AAAABBBAAAAA AAAAABBBAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAABBAAAAA AAAAABBAAA ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " AAABBAAAAA AAAAABBAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAABBAAAAA AAAAABBAAA ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " AAABBAAAAA AAAAABBAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAABAAAA AAAABAAAA ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " AAAABAAAA AAAABAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAABBAAA AAABBAAA ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " AAABBAAA AAABBAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABBAAA AAABBAA ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " AABBAAA AAABBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAABAAAA AAAABAAA ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " AAABAAAA AAAABAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BAABAAA AAABAAB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BAABAAA AAABAAB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBAA AAAAAAAAAAAAA AABBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBBAA AAAAAAAAAAAAA AABBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBAAA AAAAAAAAAAAAAAAAAAAAAAA AAABBB ", " BBBB BBBBBBBBBBBBB BBBB ", " BBBB BBBBBCCCBBBBB BBBB ", " BBBB BBBBBCCCBBBBB BBBB ", " BBBB BBBBBCCCBBBBB BBBB ", " BBBB BBBBBBBBBBBBB BBBB ", " BBBAAA AAAAAAAAAAAAAAAAAAAAAAA AAABBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBAA AAAAAAAABBBBBBBBBBBBBAAAAAAAA AABBBB ", " BBB BBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBCCCBBBBBBBBBB BBB ", " BBB BBBBBBBBBBCCCBBBBBBBBBB BBB ", " BBB BBBBBBBBBBCCCBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBAA AAAAAAAABBBBBBBBBBBBBAAAAAAAA AABBBB ", " D ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAAAABBBBBAAAAAAAAAAAAABBBBBAAAAAA BBBBB ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBCCCBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBCCCBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBCCCBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBB AAAAAABBBBBAAAAAAAAAAAAABBBBBAAAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAAABBBAAAAAAAAAAAAAAAAAAAAAAABBBAAAAA BBBBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBBBB AAAAABBBAAAAAAAAAAAAAAAAAAAAAAABBBAAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAABBBAAAAAAAA AAAAAAAABBBAAAA BBBBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBBBB AAAABBBAAAAAAAA AAAAAAAABBBAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAABBAAAAAA AAAAAABBAAAA BBBBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBBBB AAAABBAAAAAA AAAAAABBAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAABBAAAAA AAAAABBAAAA BBBBB ", " BBB BBBBBB BBBBBB BBB ", " BBB BBBBBB BBBBBB BBB ", " BBB BBBBBB BBBBBB BBB ", " BBB BBBBBB BBBBBB BBB ", " BBB BBBBBB BBBBBB BBB ", " BBBBB AAAABBAAAAA AAAAABBAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB EAABBAAAA AAAABBAAE BBBBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBBBB EAABBAAAA AAAABBAAE BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAEEBAAAA AAAABEEAA BBBBB ", " BBB BBBBB BBBBB BBB ", " BBB BBBBB BBBBB BBB ", " BBB BBBBB BBBBB BBB ", " BBB BBBBB BBBBB BBB ", " BBB BBBBB BBBBB BBB ", " BBBBB AAEEBAAAA AAAABEEAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " AABAA AAEEEEAA AAEEEEAA AABAA ", " BBB BBBBE EBBBB BBB ", " BBB BBBBE EBBBB BBB ", " BBB BBBBE EBBBB BBB ", " BBB BBBBE EBBBB BBB ", " BBB BBBBE EBBBB BBB ", " AABAA AAEEEEAA AAEEEEAA AABAA ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " AABAA AAEEEAA AAEEEAA AABAA ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " AABAA AAEEEAA AAEEEAA AABAA ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " AABAA AAEEEAA AAEEEAA AABAA ", " BBB BBBBF FBBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBF FBBBB BBB ", " AABAA AAEEEAA AAEEEAA AABAA ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " AABAA AEEEAA AAEEEA AABAA ", " BBB EBBBBF FBBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBF FBBBBE BBB ", " AABAA AEEEAA AAEEEA AABAA ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " AABAA EEEEEAA AAEEEEE AABAA ", " BBB EBBBBF FBBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBF FBBBBE BBB ", " AABAA EEEEEAA AAEEEEE AABAA ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " F F ", " F F ", " F F ", " F F ", " F F ", " E F F E ", " E F F E ", " EEF FEE ", " EEF FEE ", " EEE EEE ", " EEE EEE ", " AABAA EEEEEAA AAEEEEE AABAA ", " BBB EBBBEF FEBBBE BBB ", " BBB EBBBEF FEBBBE BBB ", " BBB EBBBEF FEBBBE BBB ", " BBB EBBBEF FEBBBE BBB ", " BBB EBBBEF FEBBBE BBB ", " AABAA EEEEEAA AAEEEEE AABAA ", " EEE EEE ", " EEE EEE ", " EEF FEE ", " EEF FEE ", " E F F E ", " E F F E ", " F F ", " F F ", " F F ", " F F ", " F F ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " E E ", " E E ", " EE EE ", " EEF FEE ", " EEF FEE ", " EEF FEE ", " AABAA EEEEB BEEEE AABAA ", " BBB EBBBEB BEBBBE BBB ", " BBB EBBBEB BEBBBE BBB ", " BBB EBBBEB BEBBBE BBB ", " BBB EBBBEB BEBBBE BBB ", " BBB EBBBEB BEBBBE BBB ", " AABAA EEEEB BEEEE AABAA ", " EEF FEE ", " EEF FEE ", " EEF FEE ", " EE EE ", " E E ", " E E ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " FF FF ", " EF FE ", " EFA AFE ", " AABAA AAEEEA AEEEAA AABAA ", " BBB BBBEA AEBBB BBB ", " BBB BBBEA AEBBB BBB ", " BBB BBBEA AEBBB BBB ", " BBB BBBEA AEBBB BBB ", " BBB BBBEA AEBBB BBB ", " AABAA AAEEEA AEEEAA AABAA ", " EFA AFE ", " EF FE ", " FF FF ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " AABAA AAEEEB BEEEAA AABAA ", " BBB BBBEB BEBBB BBB ", " BBB BBBEB BEBBB BBB ", " BBB BBBEB BEBBB BBB ", " BBB BBBEB BEBBB BBB ", " BBB BBBEB BEBBB BBB ", " AABAA AAEEEB BEEEAA AABAA ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " AABAA AAEEEA AEEEAA AABAA ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " AABAA AAEEEA AEEEAA AABAA ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " AABAA AAEEEAA AAEEEAA AABAA ", " BBB BBBBF FBBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBF FBBBB BBB ", " AABAA AAEEEAA AAEEEAA AABAA ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " AABAA AEEEAA AAEEEA AABAA ", " BBB BBBF FBBB BBB ", " BBB BBBA ABBB BBB ", " BBB BBBA ABBB BBB ", " BBB BBBA ABBB BBB ", " BBB BBBF FBBB BBB ", " AABAA AEEEAA AAEEEA AABAA ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " AABAA EEEEAA AAEEEE AABAA ", " BBB EBBBF FBBBE BBB ", " BBB EBBBA ABBBE BBB ", " BBB EBBBA ABBBE BBB ", " BBB EBBBA ABBBE BBB ", " BBB EBBBF FBBBE BBB ", " AABAA EEEEAA AAEEEE AABAA ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AAEEAA AAEEAA AABAA ", " BBB BBBF FBBB BBB ", " BBB BBBF FBBB BBB ", " BBB BBBF FBBB BBB ", " BBB BBBF FBBB BBB ", " BBB BBBF FBBB BBB ", " AABAA AAEEAA AAEEAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABEA AEBAA AABAA ", " BBB BBE EBB BBB ", " BBB BBE EBB BBB ", " BBB BBE EBB BBB ", " BBB BBE EBB BBB ", " BBB BBE EBB BBB ", " AABAA AABEA AEBAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " GGGGG ", " ", " GGGGG ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " GGGGG ", " ", " GGGGG ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" H H ", " H H ", " H H ", " H H ", " H H ", " HH HH ", " HH HH ", " GGGHH HHGGG ", " HH HH ", " GGGHH HHGGG ", " HH HH ", " H H ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " H H ", " HH HH ", " GGGHH HHGGG ", " HH HH ", " GGGHH HHGGG ", " HH HH ", " HH HH ", " H H ", " H H ", " H H ", " H H ", " H H ") + .aisle(" ", " ", " ", " ", " ", " AACCCCCAA ", " AA HHH AA ", " G AA HHH AA G ", " AA HHH AA ", " G AA HHH AA G ", " AA HHH AA ", " AACHHHCAA ", " HHH ", " HHH ", " HHH ", " H ", " H ", " H ", " H ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " H ", " H ", " H ", " H ", " HHH ", " HHH ", " HHH ", " AACHHHCAA ", " AA HHH AA ", " G AA HHH AA G ", " AA HHH AA ", " G AA HHH AA G ", " AA HHH AA ", " AACCCCCAA ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " AACCCCCCCCCAA ", " AA AA ", " GGAA G G AAGG ", " AA AA ", " GGAA AAGG ", " AA AA ", " AACCCCCCCCCAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AACCCCCCCCCAA ", " AA AA ", " GGAA AAGG ", " AA AA ", " GGAA G G AAGG ", " AA AA ", " AACCCCCCCCCAA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " ACCCC HHH CCCCA ", " A A ", " GA G G AG ", " A A ", " GA AG ", " A A ", " ACCCC CCCCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACCCC CCCCA ", " A A ", " GA AG ", " A A ", " GA G G AG ", " A A ", " ACCCC HHH CCCCA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " ACCC HHH CCCA ", " A A ", " GA G G AG ", " A A ", " GA AG ", " A A ", " ACCC CCCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACCC CCCA ", " A A ", " GA AG ", " A A ", " GA G G AG ", " A A ", " ACCC HHH CCCA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " ACC HHH CCA ", " A A ", " G A G G A G ", " A A ", " G A A G ", " A A ", " ACC CCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACC CCA ", " A A ", " G A A G ", " A A ", " G A G G A G ", " A A ", " ACC HHH CCA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " ACC HHH CCA ", " A A ", " GA G G AG ", " A A ", " GA AG ", " A A ", " ACC CCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACC CCA ", " A A ", " GA AG ", " A A ", " GA G G AG ", " A A ", " ACC HHH CCA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GGGGG ", " ACC HHH CCA ", " A A ", " GA G G AG ", " A A ", " GA AG ", " A A ", " ACC CCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACC CCA ", " A A ", " GA AG ", " A A ", " GA G G AG ", " A A ", " ACC HHH CCA ", " GGGGG ", " ", " ", " ", " ") + .aisle(" H H ", " H H ", " H H ", " H H ", " H GGGGGGGCCCGGGGGGG H ", " HCC HHH CCH ", " H H ", " GH G G HG ", " H H ", " GH HG ", " H H ", " CC CC ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " CC CC ", " H H ", " GH HG ", " H H ", " GH G G HG ", " H H ", " HCC HHH CCH ", " H GGGGGGGCCCGGGGGGG H ", " H H ", " H H ", " H H ", " H H ") + .aisle(" ", " ", " ", " ", " GCCCCCG ", " HCCHHHHHHHHHHHHHHHCCH ", " HH HH ", " GHHGGGGGGGGGGGGGGGGGHHG ", " HH HH ", " GHH HHG ", " HH HH ", " HHC CHH ", " H H ", " H H ", " H H ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " H H ", " H H ", " H H ", " HHC CHH ", " HH HH ", " GHH HHG ", " HH HH ", " GHHGGGGGGGGGGGGGGGGGHHG ", " HH HH ", " HCCHHHHHHHHHHHHHHHCCH ", " GCCCCCG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GCC CCG ", " CCHHHHHHHHHHHHHHHCC ", " H H ", " G H G G H G ", " H H ", " G H H G ", " H H ", " HC CH ", " H H ", " H H ", " H H ", " H H ", " H H ", " H H ", " H H ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " D D D D ", " ", " ", " ", " ", " ", " H H ", " H H ", " H H ", " H H ", " H H ", " H H ", " H H ", " HC CH ", " H H ", " G H H G ", " H H ", " G H G G H G ", " H H ", " CCHHHHHHHHHHHHHHHCC ", " GCCQCCG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " GCCCCCG ", " HCCHHHHHHHHHHHHHHHCCH ", " HH HH ", " GHHGGGGGGGGGGGGGGGGGHHG ", " HH HH ", " GHH HHG ", " HH HH ", " HHC CHH ", " H H ", " H H ", " H H ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", " CCC CCC CCC CCC ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " H H ", " H H ", " H H ", " HHC CHH ", " HH HH ", " GHH HHG ", " HH HH ", " GHHGGGGGGGGGGGGGGGGGHHG ", " HH HH ", " HCCHHHHHHHHHHHHHHHCCH ", " GCCCCCG ", " ", " ", " ", " ") + .aisle(" H H ", " H H ", " H H ", " H H ", " H GGGGGGGCCCGGGGGGG H ", " HCC HHH CCH ", " H H ", " GH G G HG ", " H H ", " GH HG ", " H H ", " CC CC ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " CC CC ", " H H ", " GH HG ", " H H ", " GH G G HG ", " H H ", " HCC HHH CCH ", " H GGGGGGGCCCGGGGGGG H ", " H H ", " H H ", " H H ", " H H ") + .aisle(" ", " ", " ", " ", " GGGGG ", " ACC HHH CCA ", " A A ", " GA G G AG ", " A A ", " GA AG ", " A A ", " ACC CCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACC CCA ", " A A ", " GA AG ", " A A ", " GA G G AG ", " A A ", " ACC HHH CCA ", " GGGGG ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " ACC HHH CCA ", " A A ", " GA G G AG ", " A A ", " GA AG ", " A A ", " ACC CCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACC CCA ", " A A ", " GA AG ", " A A ", " GA G G AG ", " A A ", " ACC HHH CCA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " ACC HHH CCA ", " A A ", " G A G G A G ", " A A ", " G A A G ", " A A ", " ACC CCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACC CCA ", " A A ", " G A A G ", " A A ", " G A G G A G ", " A A ", " ACC HHH CCA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " ACCC HHH CCCA ", " A A ", " GA G G AG ", " A A ", " GA AG ", " A A ", " ACCC CCCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACCC CCCA ", " A A ", " GA AG ", " A A ", " GA G G AG ", " A A ", " ACCC HHH CCCA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " ACCCC HHH CCCCA ", " A A ", " GA G G AG ", " A A ", " GA AG ", " A A ", " ACCCC CCCCA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", "AABAA AABAA AABAA AABAA", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", "AABAA AABAA AABAA AABAA", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ACCCC CCCCA ", " A A ", " GA AG ", " A A ", " GA G G AG ", " A A ", " ACCCC HHH CCCCA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " G G ", " AACCCCCCCCCAA ", " AA AA ", " GGAA G G AAGG ", " AA AA ", " GGAA AAGG ", " AA AA ", " AACCCCCCCCCAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AACCCCCCCCCAA ", " AA AA ", " GGAA AAGG ", " AA AA ", " GGAA G G AAGG ", " AA AA ", " AACCCCCCCCCAA ", " G G ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " AACCCCCAA ", " AA HHH AA ", " G AA HHH AA G ", " AA HHH AA ", " G AA HHH AA G ", " AA HHH AA ", " AACHHHCAA ", " HHH ", " HHH ", " HHH ", " H ", " H ", " H ", " H ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " H ", " H ", " H ", " H ", " HHH ", " HHH ", " HHH ", " AACHHHCAA ", " AA HHH AA ", " G AA HHH AA G ", " AA HHH AA ", " G AA HHH AA G ", " AA HHH AA ", " AACCCCCAA ", " ", " ", " ", " ", " ") + .aisle(" H H ", " H H ", " H H ", " H H ", " H H ", " HH HH ", " HH HH ", " GGGHH HHGGG ", " HH HH ", " GGGHH HHGGG ", " HH HH ", " H H ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " H H ", " HH HH ", " GGGHH HHGGG ", " HH HH ", " GGGHH HHGGG ", " HH HH ", " HH HH ", " H H ", " H H ", " H H ", " H H ", " H H ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " GGGGG ", " ", " GGGGG ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " GGGGG ", " ", " GGGGG ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABAA AABAA AABAA ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " BBB BBB BBB BBB ", " AABAA AABAA AABAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AABEA AEBAA AABAA ", " BBB BBE EBB BBB ", " BBB BBE EBB BBB ", " BBB BBE EBB BBB ", " BBB BBE EBB BBB ", " BBB BBE EBB BBB ", " AABAA AABEA AEBAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABAA AAEEAA AAEEAA AABAA ", " BBB BBBF FBBB BBB ", " BBB BBBF FBBB BBB ", " BBB BBBF FBBB BBB ", " BBB BBBF FBBB BBB ", " BBB BBBF FBBB BBB ", " AABAA AAEEAA AAEEAA AABAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " AABAA EEEEAA AAEEEE AABAA ", " BBB EBBBF FBBBE BBB ", " BBB EBBBA ABBBE BBB ", " BBB EBBBA ABBBE BBB ", " BBB EBBBA ABBBE BBB ", " BBB EBBBF FBBBE BBB ", " AABAA EEEEAA AAEEEE AABAA ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " AABAA AEEEAA AAEEEA AABAA ", " BBB BBBF FBBB BBB ", " BBB BBBA ABBB BBB ", " BBB BBBA ABBB BBB ", " BBB BBBA ABBB BBB ", " BBB BBBF FBBB BBB ", " AABAA AEEEAA AAEEEA AABAA ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " AABAA AAEEEAA AAEEEAA AABAA ", " BBB BBBBF FBBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBF FBBBB BBB ", " AABAA AAEEEAA AAEEEAA AABAA ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " AABAA AAEEEA AEEEAA AABAA ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " AABAA AAEEEA AEEEAA AABAA ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " AABAA AAEEEB BEEEAA AABAA ", " BBB BBBEB BEBBB BBB ", " BBB BBBEB BEBBB BBB ", " BBB BBBEB BEBBB BBB ", " BBB BBBEB BEBBB BBB ", " BBB BBBEB BEBBB BBB ", " AABAA AAEEEB BEEEAA AABAA ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " FF FF ", " EF FE ", " EFA AFE ", " AABAA AAEEEA AEEEAA AABAA ", " BBB BBBEA AEBBB BBB ", " BBB BBBEA AEBBB BBB ", " BBB BBBEA AEBBB BBB ", " BBB BBBEA AEBBB BBB ", " BBB BBBEA AEBBB BBB ", " AABAA AAEEEA AEEEAA AABAA ", " EFA AFE ", " EF FE ", " FF FF ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " F F ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " E E ", " E E ", " EE EE ", " EEF FEE ", " EEF FEE ", " EEF FEE ", " AABAA EEEEB BEEEE AABAA ", " BBB EBBBEB BEBBBE BBB ", " BBB EBBBEB BEBBBE BBB ", " BBB EBBBEB BEBBBE BBB ", " BBB EBBBEB BEBBBE BBB ", " BBB EBBBEB BEBBBE BBB ", " AABAA EEEEB BEEEE AABAA ", " EEF FEE ", " EEF FEE ", " EEF FEE ", " EE EE ", " E E ", " E E ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " F F ", " F F ", " F F ", " F F ", " F F ", " E F F E ", " E F F E ", " EEF FEE ", " EEF FEE ", " EEE EEE ", " EEE EEE ", " AABAA EEEEEAA AAEEEEE AABAA ", " BBB EBBBEF FEBBBE BBB ", " BBB EBBBEF FEBBBE BBB ", " BBB EBBBEF FEBBBE BBB ", " BBB EBBBEF FEBBBE BBB ", " BBB EBBBEF FEBBBE BBB ", " AABAA EEEEEAA AAEEEEE AABAA ", " EEE EEE ", " EEE EEE ", " EEF FEE ", " EEF FEE ", " E F F E ", " E F F E ", " F F ", " F F ", " F F ", " F F ", " F F ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " AABAA EEEEEAA AAEEEEE AABAA ", " BBB EBBBBF FBBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBF FBBBBE BBB ", " AABAA EEEEEAA AAEEEEE AABAA ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " AABAA AEEEAA AAEEEA AABAA ", " BBB EBBBBF FBBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBA ABBBBE BBB ", " BBB EBBBBF FBBBBE BBB ", " AABAA AEEEAA AAEEEA AABAA ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " AABAA AAEEEAA AAEEEAA AABAA ", " BBB BBBBF FBBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBA ABBBB BBB ", " BBB BBBBF FBBBB BBB ", " AABAA AAEEEAA AAEEEAA AABAA ", " E E ", " E E ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " E E ", " E E ", " E E ", " AABAA AAEEEAA AAEEEAA AABAA ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " BBB BBBBF FBBBB BBB ", " AABAA AAEEEAA AAEEEAA AABAA ", " E E ", " E E ", " E E ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " E E ", " AABAA AAEEEEAA AAEEEEAA AABAA ", " BBB BBBBE EBBBB BBB ", " BBB BBBBE EBBBB BBB ", " BBB BBBBE EBBBB BBB ", " BBB BBBBE EBBBB BBB ", " BBB BBBBE EBBBB BBB ", " AABAA AAEEEEAA AAEEEEAA AABAA ", " E E ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAEEBAAAA AAAABEEAA BBBBB ", " BBB BBBBB BBBBB BBB ", " BBB BBBBB BBBBB BBB ", " BBB BBBBB BBBBB BBB ", " BBB BBBBB BBBBB BBB ", " BBB BBBBB BBBBB BBB ", " BBBBB AAEEBAAAA AAAABEEAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB EAABBAAAA AAAABBAAE BBBBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBB EBBBBBB BBBBBBE BBB ", " BBBBB EAABBAAAA AAAABBAAE BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAABBAAAAA AAAAABBAAAA BBBBB ", " BBB BBBBBB BBBBBB BBB ", " BBB BBBBBB BBBBBB BBB ", " BBB BBBBBB BBBBBB BBB ", " BBB BBBBBB BBBBBB BBB ", " BBB BBBBBB BBBBBB BBB ", " BBBBB AAAABBAAAAA AAAAABBAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAABBAAAAAA AAAAAABBAAAA BBBBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBB BBBBBBB BBBBBBB BBB ", " BBBBB AAAABBAAAAAA AAAAAABBAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAABBBAAAAAAAA AAAAAAAABBBAAAA BBBBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBB BBBBBBBB BBBBBBBB BBB ", " BBBBB AAAABBBAAAAAAAA AAAAAAAABBBAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAAABBBAAAAAAAAAAAAAAAAAAAAAAABBBAAAAA BBBBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBB BBBBBBBBBBB BBBBBBBBBBB BBB ", " BBBBB AAAAABBBAAAAAAAAAAAAAAAAAAAAAAABBBAAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBB AAAAAABBBBBAAAAAAAAAAAAABBBBBAAAAAA BBBBB ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBCCCBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBCCCBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBCCCBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBB AAAAAABBBBBAAAAAAAAAAAAABBBBBAAAAAA BBBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBAA AAAAAAAABBBBBBBBBBBBBAAAAAAAA AABBBB ", " BBB BBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBB BBBBBBBBBBCCCBBBBBBBBBB BBB ", " BBB BBBBBBBBBBCCCBBBBBBBBBB BBB ", " BBB BBBBBBBBBBCCCBBBBBBBBBB BBB ", " BBB BBBBBBBBBBBBBBBBBBBBBBB BBB ", " BBBBAA AAAAAAAABBBBBBBBBBBBBAAAAAAAA AABBBB ", " D ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBAAA AAAAAAAAAAAAAAAAAAAAAAA AAABBB ", " BBBB BBBBBBBBBBBBB BBBB ", " BBBB BBBBBCCCBBBBB BBBB ", " BBBB BBBBBCCCBBBBB BBBB ", " BBBB BBBBBCCCBBBBB BBBB ", " BBBB BBBBBBBBBBBBB BBBB ", " BBBAAA AAAAAAAAAAAAAAAAAAAAAAA AAABBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BBBBAA AAAAAAAAAAAAA AABBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBBAA AAAAAAAAAAAAA AABBBB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " BAABAAA AAABAAB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BAABAAA AAABAAB ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAABAAAA AAAABAAA ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " BBBB BBBB ", " AAABAAAA AAAABAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AABBAAA AAABBAA ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " AABBAAA AAABBAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAABBAAA AAABBAAA ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " AAABBAAA AAABBAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAABAAAA AAAABAAAA ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " AAAABAAAA AAAABAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAABBAAAAA AAAAABBAAA ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " BBBBB BBBBB ", " AAABBAAAAA AAAAABBAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAABBAAAAA AAAAABBAAA ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " AAABBAAAAA AAAAABBAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAABBBAAAAA AAAAABBBAAAA ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " BBBBBBB BBBBBBB ", " AAAABBBAAAAA AAAAABBBAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAABBAAAAAAA AAAAAAABBAAAAA ", " BBBBBBBB BBBBBBBB ", " BBBBBBBB BBBBBBBB ", " BBBBBBBB BBBBBBBB ", " BBBBBBBB BBBBBBBB ", " BBBBBBBB BBBBBBBB ", " AAAAABBAAAAAAA AAAAAAABBAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAABBBAAAAAAAAAA AAAAAAAAAABBBAAAAA ", " BBBBBBBBB BBBBBBBBB ", " BBBBBBBBB BBBBBBBBB ", " BBBBBBBBB BBBBBBBBB ", " BBBBBBBBB BBBBBBBBB ", " BBBBBBBBB BBBBBBBBB ", " AAAAABBBAAAAAAAAAA AAAAAAAAAABBBAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAABBBBAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBAAAAA ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " BBBBBBBBBBBBB BBBBBBBBBBBBB ", " AAAAABBBBAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAAAABBBBBBAAAAAAAAAAAAAAABBBBBBAAAAAAA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBCCCBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBCCCBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBCCCBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAAABBBBBBAAAAAAAAAAAAAAABBBBBBAAAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAAAAAAABBBBBBBBBBBBBBBAAAAAAAAAA ", " BBBBBBBBBBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBCCCBBBBBBBBBBBB ", " BBBBBBBBBBBBCCCBBBBBBBBBBBB ", " BBBBBBBBBBBBCCCBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBBBBBBBBBB ", " AAAAAAAAAABBBBBBBBBBBBBBBAAAAAAAAAA ", " D ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " BBBBBBBBBBBBBBB ", " BBBBBBCCCBBBBBB ", " BBBBBBCCCBBBBBB ", " BBBBBBCCCBBBBBB ", " BBBBBBBBBBBBBBB ", " AAAAAAAAAAAAAAAAAAAAAAAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAAAAAAAAAAAA ", " ", " ", " ", " ", " ", " AAAAAAAAAAAAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + // spotless:on + + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('H', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get())) + .where('G', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get())) + .where('F', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get())) + .where('C', blocks(ROYAL_ICHORIUM_CASING.get())) + .where('D', CosmicPredicates.stellarModuleSlot()) // Module controller anchor points - accepts air + // or formed stellar modules + .where('B', blocks(MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get())) + .where('E', blocks(ULTRA_POWERED_CASING.get())) + .where('A', blocks(CASING_HIGH_TEMPERATURE_SMELTING.get())) + .build()) + .model(createWorkableCasingMachineModel( + CosmicCore.id("block/casings/solid/vomahine_certified_chemically_resistant_casing"), + GTCEu.id("block/multiblock/fusion_reactor")) + .andThen(model -> model.addDynamicRenderer(CosmicDynamicRenderHelpers::getStellarIrisRender))) + .hasBER(true) + .tooltips(Component.translatable("cosmiccore.multiblock.iris.tooltip.0"), + Component.translatable("cosmiccore.multiblock.iris.tooltip.1"), + Component.translatable("cosmiccore.multiblock.iris.tooltip.2"), + Component.translatable("cosmiccore.multiblock.iris.tooltip.3")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StellarSmeltingModule.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StellarSmeltingModule.java new file mode 100644 index 000000000..cfa504933 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StellarSmeltingModule.java @@ -0,0 +1,63 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; +import com.ghostipedia.cosmiccore.common.data.recipe.CosmicRecipeModifiers; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.util.RelativeDirection.*; +import static com.gregtechceu.gtceu.common.data.GCYMBlocks.*; + +public class StellarSmeltingModule { + + public static final MultiblockMachineDefinition STELLAR_SMELTING_MODULE = REGISTRATE + .multiblock("stellar_smelting_module", StellarBaseModule::new) + .langValue("Ignition Complex : GRAND FORGE") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.STELLAR_SMELTING) + .appearanceBlock(CASING_HIGH_TEMPERATURE_SMELTING) + .recipeModifiers(CosmicRecipeModifiers.STELLAR_MODULE_OVERCLOCK) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start(RIGHT, BACK, UP) + .aisle(" AAAAA ", " ACCCCCA ", "AFCFFFCFA", "AFCFFFCFA", "AFCFFFCFA", " ACCCCCA ", " AAAAA ") + .aisle(" B B ", "DDDDDDDDD", "DDDDDDDDD", "GGGGGGGGG", "DDDDDDDDD", "DDDDDDDDD", " B B ") + .aisle(" B B ", "BCCCCCCCB", "GGGGGGGGG", "GGGGGGGGG", "GGGGGGGGG", "BCC CCB", " B B ") + .aisle(" B B ", "BCC CCB", "GGGBBBGGG", "GGGBBBGGG", "GGGBBBGGG", "BCC CCB", " B B ") + .aisle(" BBBBBBB ", "BCC B CCB", "GGGBBBGGG", "GGGBBBGGG", "GGGBBBGGG", "BCC B CCB", " BBBBBBB ") + .aisle(" B B ", "BCC CCB", "GGGBBBGGG", "GGGBBBGGG", "GGGBBBGGG", "BCC CCB", " B B ") + .aisle(" B B ", "BCCCCCCCB", "GGGGGGGGG", "GGGGGGGGG", "GGGGGGGGG", "BCC CCB", " B B ") + .aisle(" B B ", "DDDDDDDDD", "DDDDDDDDD", "GGGGGGGGG", "DDDDDDDDD", "DDDDDDDDD", " B B ") + .aisle(" AAAAA ", " AEEEEEA ", "AFEFFFEFA", "AFEFQFEFA", "AFEFFFEFA", " AEEEEEA ", " AAAAA ") + + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('B', blocks(ROYAL_ICHORIUM_CASING.get())) // Shared ring blocks + .where('C', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get()))// Shared ring blocks + .where('D', blocks(CASING_HIGH_TEMPERATURE_SMELTING.get())) // Shared ring blocks + .where('E', blocks(BOLTED_HEAVY_FRAME_CASING.get()) + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS)) + .or(Predicates.abilities(PartAbility.EXPORT_FLUIDS)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS)) + .or(Predicates.abilities(PartAbility.IMPORT_ITEMS))) + .where('F', blocks(ULTRA_POWERED_CASING.get())) + .where('G', blocks(MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get()) + + ) + .where('A', blocks(SOMARUST_CASING.get())) + .build()) + // spotless:on + .workableCasingModel(GTCEu.id("block/casings/gcym/high_temperature_smelting_casing"), + GTCEu.id("block/overlay/machine/alloy_blast_smelter")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StellarStarBallast.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StellarStarBallast.java new file mode 100644 index 000000000..5dc86729e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/StellarStarBallast.java @@ -0,0 +1,715 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.client.renderer.machine.CosmicDynamicRenderHelpers; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import net.minecraft.network.chat.Component; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.blocks; +import static com.gregtechceu.gtceu.common.data.GCYMBlocks.CASING_ATOMIC; +import static com.gregtechceu.gtceu.common.data.GCYMBlocks.CASING_HIGH_TEMPERATURE_SMELTING; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.createWorkableCasingMachineModel; + +public class StellarStarBallast { + + public final static MultiblockMachineDefinition STAR_BALLAST = REGISTRATE.multiblock("star_ballast", + IrisMultiblockMachine::new) + .rotationState(RotationState.Y_AXIS) + .recipeType(CosmicRecipeTypes.VOMAHINE_CORE_DRILL) + .recipeModifier(GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK)) + .appearanceBlock(CosmicBlocks.CYCLOZINE_CHEMICALLY_REPELLING_CASING) + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAAAA ", + " BBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBB ", + " AAAAA ") + .aisle(" AAAAAAA ", + " BBBBBBBBBBBBBBBBBBB ", + " CBBDDDDDBBC ", + " BB BB ", + " BB BB ", + " BBB BBB ", + " BB BB ", + " BB BB ", + " CBBDDDDDBBC ", + " BBBBBBBBBBBBBBBBBBB ", + " AAAAAAA ") + .aisle(" AADDDAA ", + " BBBBBBBBBBBBBBBBBBBBBBB ", + " CCCAAAAAAAAAAACCC ", + " AAAAAAAAAAA ", + " AAAAAAAAAAA ", + " BBBAAAAAAAAAAABBB ", + " AAAAAAAAAAA ", + " AAAAAAAAAAA ", + " CCCAAAAAAAAAAACCC ", + " BBBBBBBBBBBBBBBBBBBBBBB ", + " AADDDAA ") + .aisle(" AADFDAA ", + " BBBBBBBBGGGGGGGGGGGBBBBBBBB ", + " CCCAAAAAAAAAAAAAAAAACCC ", + " AAAAAAAAAAAAAAAAA ", + " AAAAAAACCCAAAAAAA ", + " BBBAAAAAAACCCAAAAAAABBB ", + " AAAAAAACCCAAAAAAA ", + " AAAAAAAAAAAAAAAAA ", + " CCCAAAAAAAAAAAAAAAAACCC ", + " BBBBBBBBGGGGGGGGGGGBBBBBBBB ", + " AADFDAA ") + .aisle(" AADDDAA ", + " BBBBBBBGGGBBBBBBBBBBBGGGBBBBBBB ", + " CCAAAAAAAAAAAAAAAAAAAAAAACC ", + " AAAAAAAAAAAAAAAAAAAAAAA ", + " AAAAAAAAAA C AAAAAAAAAA ", + " BBAAAAAAAAAACCCAAAAAAAAAABB ", + " AAAAAAAAAA C AAAAAAAAAA ", + " AAAAAAAAAAAAAAAAAAAAAAA ", + " CCAAAAAAAAAAAAAAAAAAAAAAACC ", + " BBBBBBBGGGBBBBBBBBBBBGGGBBBBBBB ", + " AADDDAA ") + .aisle(" AAAAAAA ", + " BBBBBBGGGBBBBBBBBBBBBBBBBBGGGBBBBBB ", + " CCAAAAAAAACBBDDDDDBBCAAAAAAAACC ", + " AAAAAAAA BB BB AAAAAAAA ", + " AAAAAAAA BB C BB AAAAAAAA ", + " BBAAAAAAAABBB CCC BBBAAAAAAAABB ", + " AAAAAAAA BB C BB AAAAAAAA ", + " AAAAAAAA BB BB AAAAAAAA ", + " CCAAAAAAAACBBDDDDDBBCAAAAAAAACC ", + " BBBBBBGGGBBBBBBBBBBBBBBBBBGGGBBBBBB ", + " AAAAAAA ") + .aisle(" AAAAA ", + " BBBBBGGBBBBBBBBBBBBBBBBBBBBBBBGGBBBBB ", + " CAAAAAAACCC CCCAAAAAAAC ", + " AAAAAAA AAAAAAA ", + " AAAAAAA C AAAAAAA ", + " BAAAAAAABBB CCC BBBAAAAAAAB ", + " AAAAAAA C AAAAAAA ", + " AAAAAAA AAAAAAA ", + " CAAAAAAACCC CCCAAAAAAAC ", + " BBBBBGGBBBBBBBBBBBBBBBBBBBBBBBGGBBBBB ", + " AAAAA ") + .aisle(" ", + " BBBBGGBBBBBBBBB BBBBBBBBBGGBBBB ", + " CAAAAACCC CCCAAAAAC ", + " AAAAA AAAAA ", + " AAAAA AAAAA ", + " BAAAAABBB C BBBAAAAAB ", + " AAAAA AAAAA ", + " AAAAA AAAAA ", + " CAAAAACCC CCCAAAAAC ", + " BBBBGGBBBBBBBBB BBBBBBBBBGGBBBB ", + " ") + .aisle(" ", + " BBBBGBBBBBBB BBBBBBBGBBBB ", + " CAAAAAC CAAAAAC ", + " AAAAA AAAAA ", + " AAAAA AAAAA ", + " BAAAAAB C BAAAAAB ", + " AAAAA AAAAA ", + " AAAAA AAAAA ", + " CAAAAAC CAAAAAC ", + " BBBBGBBBBBBB BBBBBBBGBBBB ", + " ") + .aisle(" ", + " BBBBGBBBBBB BBBBBBGBBBB ", + " CAAAACC CCAAAAC ", + " AAAA AAAA ", + " AAAA AAAA ", + " BAAAABB C BBAAAAB ", + " AAAA AAAA ", + " AAAA AAAA ", + " CAAAACC CCAAAAC ", + " BBBBGBBBBBB BBBBBBGBBBB ", + " ") + .aisle(" ", + " BBBBGBBBBB BBBBBGBBBB ", + " CAAAAC CAAAAC ", + " AAAA AAAA ", + " AAAA AAAA ", + " BAAAAB BAAAAB ", + " AAAA AAAA ", + " AAAA AAAA ", + " CAAAAC CAAAAC ", + " BBBBGBBBBB BBBBBGBBBB ", + " ") + .aisle(" ", + " BBBBGBBBBB BBBBBGBBBB ", + " CAAACC CCAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAABB BBAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAACC CCAAAC ", + " BBBBGBBBBB BBBBBGBBBB ", + " ") + .aisle(" ", + " BBBBGBBBB BBBBGBBBB ", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + " BBBBGBBBB BBBBGBBBB ", + " ") + .aisle(" ", + " BBBGBBBB BBBBGBBB ", + " CAAAAC CAAAAC ", + " AAAA AAAA ", + " AAAA AAAA ", + " BAAAAB BAAAAB ", + " AAAA AAAA ", + " AAAA AAAA ", + " CAAAAC CAAAAC ", + " BBBGBBBB BBBBGBBB ", + " ") + .aisle(" ", + " BBBGBBBB BBBBGBBB ", + " CAAAAC CAAAAC ", + " AAAA AAAA ", + " AAAA AAAA ", + " BAAAAB BAAAAB ", + " AAAA AAAA ", + " AAAA AAAA ", + " CAAAAC CAAAAC ", + " BBBGBBBB BBBBGBBB ", + " ") + .aisle(" ", + " BBBGBBBB BBBBGBBB ", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + " BBBGBBBB BBBBGBBB ", + " ") + .aisle(" ", + " BBBGBBBB BBBBGBBB ", + " CAAAAC CAAAAC ", + " AAAA AAAA ", + " AAAA AAAA ", + " BAAAAB BAAAAB ", + " AAAA AAAA ", + " AAAA AAAA ", + " CAAAAC CAAAAC ", + " BBBGBBBB BBBBGBBB ", + " ") + .aisle(" ", + " BBBGBBB BBBGBBB ", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + " BBBGBBB BBBGBBB ", + " ") + .aisle(" ", + " BBBGBBBB BBBBGBBB ", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + " BBBGBBBB BBBBGBBB ", + " ") + .aisle(" ", + " BBBGBBB BBBGBBB ", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + " BBBGBBB BBBGBBB ", + " ") + .aisle(" ", + " BBBBGBBB BBBGBBBB ", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + " BBBBGBBB BBBGBBBB ", + " ") + .aisle(" ", + " BBBGBBB BBBGBBB ", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + " BBBGBBB BBBGBBB ", + " ") + .aisle(" ", + " BBBGBBB BBBGBBB ", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + " BBBGBBB BBBGBBB ", + " ") + .aisle(" ", + " BBBGBBB BBBGBBB ", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + " BBBGBBB BBBGBBB ", + " ") + .aisle(" ", + "BBBGBBBB BBBBGBBB", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + "BBBGBBBB BBBBGBBB", + " ") + .aisle(" ", + "BBBGBBB BBBGBBB", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + "BBBGBBB BBBGBBB", + " ") + .aisle(" AAAAA AAAAA ", + "BBBGBBB BBBGBBB", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + "BBBGBBB BBBGBBB", + " AAAAA AAAAA ") + .aisle("AAAAAAA AAAAAAA", + "BBBGBBB BBBGBBB", + " DAAAD DAAAD ", + " AAA AAA ", + " AAA AAA ", + " AAA AAA ", + " AAA AAA ", + " AAA AAA ", + " DAAAD DAAAD ", + "BBBGBBB BBBGBBB", + "AAAAAAA AAAAAAA") + .aisle("AADDDAA AADDDAA", + "BBBGBBB BBBGBBB", + " DAAAD DAAAD ", + " AAA AAA ", + " AC CA ", + " ACCCC CCCCA ", + " AC CA ", + " AAA AAA ", + " DAAAD DAAAD ", + "BBBGBBB BBBGBBB", + "AADDDAA AADDDAA") + .aisle("AADFDAA AADFDAA", + "BBBGBBB BBBGBBB", + " DAAAD DAAAD ", + " AAA AAA ", + " ACCCC CCCCA ", + " ACCCCCCC CCCCCCCA ", + " ACCCC CCCCA ", + " AAA AAA ", + " DAAAD DAAAD ", + "BBBGBBB BBBGBBB", + "AADFDAA AADFDAA") + .aisle("AADDDAA AADDDAA", + "BBBGBBB BBBGBBB", + " DAAAD DAAAD ", + " AAA AAA ", + " AC CA ", + " ACCCC CCCCA ", + " AC CA ", + " AAA AAA ", + " DAAAD DAAAD ", + "BBBGBBB BBBGBBB", + "AADDDAA AADDDAA") + .aisle("AAAAAAA AAAAAAA", + "BBBGBBB BBBGBBB", + " DAAAD DAAAD ", + " AAA AAA ", + " AAA AAA ", + " AAA AAA ", + " AAA AAA ", + " AAA AAA ", + " DAAAD DAAAD ", + "BBBGBBB BBBGBBB", + "AAAAAAA AAAAAAA") + .aisle(" AAAAA AAAAA ", + "BBBGBBB BBBGBBB", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + "BBBGBBB BBBGBBB", + " AAAAA AAAAA ") + .aisle(" ", + "BBBGBBB BBBGBBB", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + " BAAAB BAAAB ", + "BBBGBBB BBBGBBB", + " ") + .aisle(" ", + "BBBGBBBB BBBBGBBB", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + "BBBGBBBB BBBBGBBB", + " ") + .aisle(" ", + " BBBGBBB BBBGBBB ", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + " BBBGBBB BBBGBBB ", + " ") + .aisle(" ", + " BBBGBBB BBBGBBB ", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + " BBBGBBB BBBGBBB ", + " ") + .aisle(" ", + " BBBGBBB BBBGBBB ", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + " BBBGBBB BBBGBBB ", + " ") + .aisle(" ", + " BBBBGBBB BBBGBBBB ", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + " BBBBGBBB BBBGBBBB ", + " ") + .aisle(" ", + " BBBGBBB BBBGBBB ", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + " BBBGBBB BBBGBBB ", + " ") + .aisle(" ", + " BBBGBBBB BBBBGBBB ", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + " BBBGBBBB BBBBGBBB ", + " ") + .aisle(" ", + " BBBGBBB BBBGBBB ", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + " BBBGBBB BBBGBBB ", + " ") + .aisle(" ", + " BBBGBBBB BBBBGBBB ", + " CAAAAC CAAAAC ", + " AAAA AAAA ", + " AAAA AAAA ", + " BAAAAB BAAAAB ", + " AAAA AAAA ", + " AAAA AAAA ", + " CAAAAC CAAAAC ", + " BBBGBBBB BBBBGBBB ", + " ") + .aisle(" ", + " BBBGBBBB BBBBGBBB ", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + " BBBGBBBB BBBBGBBB ", + " ") + .aisle(" ", + " BBBGBBBB BBBBGBBB ", + " CAAAAC CAAAAC ", + " AAAA AAAA ", + " AAAA AAAA ", + " BAAAAB BAAAAB ", + " AAAA AAAA ", + " AAAA AAAA ", + " CAAAAC CAAAAC ", + " BBBGBBBB BBBBGBBB ", + " ") + .aisle(" ", + " BBBGBBBB BBBBGBBB ", + " CAAAAC CAAAAC ", + " AAAA AAAA ", + " AAAA AAAA ", + " BAAAAB BAAAAB ", + " AAAA AAAA ", + " AAAA AAAA ", + " CAAAAC CAAAAC ", + " BBBGBBBB BBBBGBBB ", + " ") + .aisle(" ", + " BBBBGBBBB BBBBGBBBB ", + " CAAAC CAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAAB BAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAAC CAAAC ", + " BBBBGBBBB BBBBGBBBB ", + " ") + .aisle(" ", + " BBBBGBBBBB BBBBBGBBBB ", + " CAAACC CCAAAC ", + " AAA AAA ", + " AAA AAA ", + " BAAABB BBAAAB ", + " AAA AAA ", + " AAA AAA ", + " CAAACC CCAAAC ", + " BBBBGBBBBB BBBBBGBBBB ", + " ") + .aisle(" ", + " BBBBGBBBBB BBBBBGBBBB ", + " CAAAAC CAAAAC ", + " AAAA AAAA ", + " AAAA AAAA ", + " BAAAAB BAAAAB ", + " AAAA AAAA ", + " AAAA AAAA ", + " CAAAAC CAAAAC ", + " BBBBGBBBBB BBBBBGBBBB ", + " ") + .aisle(" ", + " BBBBGBBBBBB BBBBBBGBBBB ", + " CAAAACC CCAAAAC ", + " AAAA AAAA ", + " AAAA AAAA ", + " BAAAABB C BBAAAAB ", + " AAAA AAAA ", + " AAAA AAAA ", + " CAAAACC CCAAAAC ", + " BBBBGBBBBBB BBBBBBGBBBB ", + " ") + .aisle(" ", + " BBBBGBBBBBBB BBBBBBBGBBBB ", + " CAAAAAC CAAAAAC ", + " AAAAA AAAAA ", + " AAAAA AAAAA ", + " BAAAAAB C BAAAAAB ", + " AAAAA AAAAA ", + " AAAAA AAAAA ", + " CAAAAAC CAAAAAC ", + " BBBBGBBBBBBB BBBBBBBGBBBB ", + " ") + .aisle(" ", + " BBBBGGBBBBBBBBB BBBBBBBBBGGBBBB ", + " CAAAAACCC CCCAAAAAC ", + " AAAAA AAAAA ", + " AAAAA AAAAA ", + " BAAAAABBB C BBBAAAAAB ", + " AAAAA AAAAA ", + " AAAAA AAAAA ", + " CAAAAACCC CCCAAAAAC ", + " BBBBGGBBBBBBBBB BBBBBBBBBGGBBBB ", + " ") + .aisle(" AAAAA ", + " BBBBBGGBBBBBBBBBBBBBBBBBBBBBBBGGBBBBB ", + " CAAAAAAACCC CCCAAAAAAAC ", + " AAAAAAA AAAAAAA ", + " AAAAAAA C AAAAAAA ", + " BAAAAAAABBB CCC BBBAAAAAAAB ", + " AAAAAAA C AAAAAAA ", + " AAAAAAA AAAAAAA ", + " CAAAAAAACCC CCCAAAAAAAC ", + " BBBBBGGBBBBBBBBBBBBBBBBBBBBBBBGGBBBBB ", + " AAAAA ") + .aisle(" AAAAAAA ", + " BBBBBBGGGBBBBBBBBBBBBBBBBBGGGBBBBBB ", + " CCAAAAAAAACBBDDDDDBBCAAAAAAAACC ", + " AAAAAAAA BB BB AAAAAAAA ", + " AAAAAAAA BB C BB AAAAAAAA ", + " BBAAAAAAAABBB CCC BBBAAAAAAAABB ", + " AAAAAAAA BB C BB AAAAAAAA ", + " AAAAAAAA BB BB AAAAAAAA ", + " CCAAAAAAAACBBDDDDDBBCAAAAAAAACC ", + " BBBBBBGGGBBBBBBBBBBBBBBBBBGGGBBBBBB ", + " AAAAAAA ") + .aisle(" AADDDAA ", + " BBBBBBBGGGBBBBBBBBBBBGGGBBBBBBB ", + " CCAAAAAAAAAAAAAAAAAAAAAAACC ", + " AAAAAAAAAAAAAAAAAAAAAAA ", + " AAAAAAAAAA C AAAAAAAAAA ", + " BBAAAAAAAAAACCCAAAAAAAAAABB ", + " AAAAAAAAAA C AAAAAAAAAA ", + " AAAAAAAAAAAAAAAAAAAAAAA ", + " CCAAAAAAAAAAAAAAAAAAAAAAACC ", + " BBBBBBBGGGBBBBBBBBBBBGGGBBBBBBB ", + " AADDDAA ") + .aisle(" AADFDAA ", + " BBBBBBBBGGGGGGGGGGGBBBBBBBB ", + " CCCAAAAAAAAAAAAAAAAACCC ", + " AAAAAAAAAAAAAAAAA ", + " AAAAAAACCCAAAAAAA ", + " BBBAAAAAAACCCAAAAAAABBB ", + " AAAAAAACCCAAAAAAA ", + " AAAAAAAAAAAAAAAAA ", + " CCCAAAAAAAAAAAAAAAAACCC ", + " BBBBBBBBGGGGGGGGGGGBBBBBBBB ", + " AADFDAA ") + .aisle(" AADDDAA ", + " BBBBBBBBBBBBBBBBBBBBBBB ", + " CCCAAAAAAAAAAACCC ", + " AAAAAAAAAAA ", + " AAAAAAAAAAA ", + " BBBAAAAAAAAAAABBB ", + " AAAAAAAAAAA ", + " AAAAAAAAAAA ", + " CCCAAAAAAAAAAACCC ", + " BBBBBBBBBBBBBBBBBBBBBBB ", + " AADDDAA ") + .aisle(" AAAAAAA ", + " BBBBBBBBBBBBBBBBBBB ", + " CBBDDDDDBBC ", + " BB B BB ", + " BB B B BB ", + " BBBB Q BBBB ", + " BB B B BB ", + " BB B BB ", + " CBBDDDDDBBC ", + " BBBBBBBBBBBBBBBBBBB ", + " AAAAAAA ") + .aisle(" AAAAA ", + " BBBBBBBBBBB ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " BBBBBBBBBBB ", + " AAAAA ") + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('A', blocks(CASING_HIGH_TEMPERATURE_SMELTING.get())) + .where('B', blocks(MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get())) + .where('C', blocks(MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get())) + .where('D', blocks(CASING_ATOMIC.get())) + .where('E', blocks(ULTRA_POWERED_CASING.get())) + .where('F', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get()) + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(16)) + .or(Predicates.abilities(PartAbility.EXPORT_FLUIDS).setMaxGlobalLimited(16)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMaxGlobalLimited(2)) + .or(Predicates.abilities(PartAbility.INPUT_LASER).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.OUTPUT_LASER).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setMaxGlobalLimited(16)) + .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(16))) + .where('G', blocks(CASING_HIGH_TEMPERATURE_SMELTING.get())) + .build()) + .model(createWorkableCasingMachineModel( + CosmicCore.id("block/casings/solid/vomahine_certified_chemically_resistant_casing"), + GTCEu.id("block/multiblock/fusion_reactor")) + .andThen(model -> model.addDynamicRenderer(CosmicDynamicRenderHelpers::getStarBallastRender))) + .hasBER(true) + .tooltips(Component.translatable("cosmiccore.multiblock.iris.tooltip.0"), + Component.translatable("cosmiccore.multiblock.iris.tooltip.1"), + Component.translatable("cosmiccore.multiblock.iris.tooltip.2"), + Component.translatable("cosmiccore.multiblock.iris.tooltip.3")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SufferingChamber.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SufferingChamber.java new file mode 100644 index 000000000..f4351e533 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/SufferingChamber.java @@ -0,0 +1,72 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.client.renderer.machine.CosmicDynamicRenderHelpers; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.EXPORT_SOUL; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.ghostipedia.cosmiccore.common.data.datagen.CosmicMachineModels.createSeparateControllerCasingMachineModel; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GCYMBlocks.CASING_STRESS_PROOF; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; + +public class SufferingChamber { + + public static final MultiblockMachineDefinition SUFFERING_CHAMBER = REGISTRATE + .multiblock("suffering_chamber", WorkableElectricMultiblockMachine::new) + .langValue("§cSuffering Chamber") + .recipeType(CosmicRecipeTypes.SUFFERING_CHAMBER) + .rotationState(RotationState.NON_Y_AXIS) + .partAppearance((controller, part, side) -> CASING_STRESS_PROOF.getDefaultState()) + .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, + ELECTRIC_OVERCLOCK.apply(OverclockingLogic.PERFECT_OVERCLOCK)) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle("AAA AAA", "AA AA", "A A", "A A", " ", " ", " ", " ") + .aisle("A ABBBBBA A", "A ABBBBBA A", " AB BA ", " AD DA ", " A D D A ", " A E A ", " ", " ") + .aisle("AAAAAAAAAAA", " AAAAAAAAA ", " A A ", " AF FA ", " A A ", " AA AA ", " A A ", " A A ") + .aisle(" BAAAAAAAB ", " BAAAAAAAB ", " B B ", " D G H G D ", " ", " ", " ", " ") + .aisle(" BAAAAAAAB ", " BAAAAAAAB ", " ", " ", " D G G D ", " ", " ", " ") + .aisle(" BAAAAAAAB ", " BAAAXAAAB ", " ", " H H ", " I ", " E E ", " ", " ") + .aisle(" BAAAAAAAB ", " BAAAAAAAB ", " ", " ", " D G G D ", " ", " ", " ") + .aisle(" BAAAAAAAB ", " BAAAAAAAB ", " B B ", " D G H G D ", " ", " ", " ", " ") + .aisle("AAAAAAAAAAA", " AAAAAAAAA ", " A A ", " AF FA ", " A A ", " AA AA ", " A A ", " A A ") + .aisle("A ABBBBBA A", "A ABBQBBA A", " AB BA ", " AD DA ", " A D D A ", " A E A ", " ", " ") + .aisle("AAA AAA", "AA AA", "A A", "A A", " ", " ", " ", " ") + .where('Q', Predicates.controller(Predicates.blocks(definition.get()))) + .where(' ', Predicates.any()) + .where('A', blocks(CASING_STRESS_PROOF.get()).setMinGlobalLimited(185) + .or(autoAbilities(CosmicRecipeTypes.SUFFERING_CHAMBER)) + .or(abilities(PartAbility.INPUT_ENERGY).setExactLimit(1))) + .where('B', blocks(BLANK_RUNE.get())) + .where('D', blocks(RITUAL_STONE.get())) + .where('E', blocks(LIGHT_RITUAL_STONE.get())) + .where('F', blocks(RITUAL_STONE.get())) + .where('G', blocks(LIGHT_RITUAL_STONE.get())) + .where('H', blocks(RITUAL_STONE.get())) + .where('I', blocks(LIGHT_RITUAL_STONE.get())) + .where('X', abilities(EXPORT_SOUL).setMinGlobalLimited(1, 1).setMaxGlobalLimited(1)) + .build()) + // spotless:on + .model(createSeparateControllerCasingMachineModel(CosmicCore.id("block/casings/solid/soul_muted_casing"), + GTCEu.id("block/casings/gcym/stress_proof_casing"), + GTCEu.id("block/multiblock/network_switch")) + .andThen(model -> model + .addDynamicRenderer(CosmicDynamicRenderHelpers::getSufferingChamberRenderer))) + .hasBER(true) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/TitanFusion.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/TitanFusion.java new file mode 100644 index 000000000..04c017687 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/TitanFusion.java @@ -0,0 +1,84 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.recipe.CosmicRecipeModifiers; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.TitanFusionReactorMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.blocks; + +public class TitanFusion { + + public final static MultiblockMachineDefinition TITAN_FUSION_REACTOR = REGISTRATE + .multiblock("titan_fusion_reactor", + TitanFusionReactorMachine::new) + .langValue("§9Titan Fusion Reactor") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.TITAN_FUSION_RECIPES) + .appearanceBlock(OSCILLATING_GILDED_PTHANTERUM_CASING) + .partAppearance((controller, part, side) -> OSCILLATING_GILDED_PTHANTERUM_CASING.getDefaultState()) + .recipeModifiers(CosmicRecipeModifiers::titanReactorParallel, + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.PERFECT_OVERCLOCK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " AAA ", " AAAAA ", " AAAAA ", " AAAAA ", " AAA ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ") + .aisle(" BBBBBBB ", " BBBBBBB ", " BBBBBBB ", " AACAA ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " AA C AA ", " AAA C AAA ", " AA C AA ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " AACAA ", " BBBBBBB ", " BBBBBBB ", " BBBBBBB ") + .aisle(" BBBBBBBBBBB ", " BBBBBBBBBBB ", " BBBBBBBBBBB ", " CAAAAAC ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " CAAAAAC ", " BBBBBBBBBBB ", " BBBBBBBBBBB ", " BBBBBBBBBBB ") + .aisle(" BBBBBBBBBBBBB ", " BBBBBBBBBBBBB ", " BBBBBBBBBBBBB ", " CC ACACA CC ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " AA C C AA ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " CC ACACA CC ", " BBBBBBBBBBBBB ", " BBBBBBBBBBBBB ", " BBBBBBBBBBBBB ") + .aisle(" BBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBB ", " C DDD C ", " DDDD ", " DDDD ", " DDD ", " ", " ", " ", " ", " ", " ", " EEE ", " A EEEE A ", " EEEE ", " EEE ", " ", " ", " ", " ", " ", " ", " DDD ", " DDDD ", " C DDDD C ", " BBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBB ") + .aisle(" BBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBB ", " C DD DD C ", " D D ", " D D ", " DD DD ", " DDDD ", " ", " ", " ", " ", " EEEE ", " EE EE ", " A E E A ", " E E ", " EE EE ", " EEEE ", " ", " ", " ", " ", " DDDD ", " DD DD ", " D D ", " C D D C ", " BBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBB ") + .aisle(" BBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBB ", " C DD D C ", " D DD ", " DD D ", " D DD ", " D DD ", " DDD ", " ", " ", " EEE ", " EE E ", " EE E ", " A E EE A ", " EE E ", " E EE ", " E EE ", " EEE ", " ", " ", " DDD ", " DD D ", " DD D ", " D DD ", " C DD D C ", " BBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBB ") + .aisle(" BBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBB ", " C D D C ", " DD DD ", " DD DD ", " D D ", " D D ", " D DD ", " DD ", " EE ", " EE E ", " E E ", " A E E A ", " A EE EE A ", " A EE EE A ", " E E ", " E E ", " E EE ", " EE ", " DD ", " DD D ", " D D ", " D D ", " DD DD ", " C DD DD C ", " BBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBB ") + .aisle(" BBBBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBBBB ", " C DD DD C ", " DDDDD ", " DDDDD ", " DD DD ", " D D ", " D D ", " DDDD ", " EEEE ", " E E ", " E E ", " A EE EE A ", " A EEEEE A ", " A EEEEE A ", " EE EE ", " E E ", " E E ", " EEEE ", " DDDD ", " D D ", " D D ", " DD DD ", " DDDDD ", " C DDDDD C ", " BBBBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBBBB ") + .aisle("ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA", "AAAA FFFDDD AAAA", " FFF ", " FFF ", " DDDFFF ", " DD DFFF ", " D DFFF ", " D D FFF EEE ", " DDD FFF E E ", " FFFE E ", " FFFE EE ", "A FFFEEE A", "A FFF A", "A FFF A", " EEEFFF ", " EE EFFF ", " E EFFF ", " E E FFF DDD ", " EEE FFF D D ", " FFFD D ", " FFFD DD ", " FFFDDD ", " FFF ", "AAAA FFF AAAA", "ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA") + .aisle("ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA", "AAAC FG GF CAAA", " C FG GF C ", " C FG GF C ", " C FG GF C ", " C DDDDFG GF C ", " CD DFG GF EE C ", " CD DFG GFEE EC ", " CD DDFG GFE EC ", " C DD FG GFE EC ", "A C FG GFEEEE C A", "A C FG GF C A", "A C FG GF C A", "A C FG GF C A", "A C FG GF C A", " C EEEEFG GF C ", " CE EFG GF DD C ", " CE EFG GFDD DC ", " CE EEFG GFD DC ", " C EE FG GFD DC ", " C FG GFDDDD C ", " C FG GF C ", " C FG GF C ", "AAAC FG GF CAAA", "ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA") + .aisle("ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA", "ACAA F F AACA", " C F F C ", " C F F C ", " C F F C ", " C F F C ", " C DDDDDF FEEEEE C ", " C D DF FE E C ", " C D DF FE E C ", " C DDDDDF FEEEEE C ", "AC F F CA", "AC F F CA", "AC F F CA", "AC F F CA", "AC F F CA", " C F F C ", " C EEEEEF FDDDDD C ", " C E EF FD D C ", " C E EF FD D C ", " C EEEEEF FDDDDD C ", " C F F C ", " C F F C ", " C F F C ", "ACAA F F AAAA", "ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA") + .aisle("ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA", "AAAC FG GF CAAA", " C FG GF C ", " C FG GF C ", " C FG GF C ", " C FG GFEEEE C ", " C DD FG GFE EC ", " CD DDFG GFE EC ", " CD DFG GFEE EC ", " CD DFG GF EE C ", "A C DDDDFG GF C A", "A C FG GF C A", "A C FG GF C A", "A C FG GF C A", "A C FG GF C A", " C FG GFDDDD C ", " C EE FG GFD DC ", " CE EEFG GFD DC ", " CE EFG GFDD DC ", " CE EFG GF DD C ", " C EEEEFG GF C ", " C FG GF C ", " C FG GF C ", "AAAC FG GF CAAA", "ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA") + .aisle("ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA", "AAAA EEEFFF AAAA", " FFF ", " FFF ", " FFFEEE ", " FFFE EE ", " FFFE E ", " DDD FFF E E ", " D D FFF EEE ", " D DFFF ", " DD DFFF ", "A DDDFFF A", "A FFF A", "A FFF A", " FFFDDD ", " FFFD DD ", " FFFD D ", " EEE FFF D D ", " E E FFF DDD ", " E EFFF ", " EE EFFF ", " EEEFFF ", " FFF ", "AAAA FFF AAAA", "ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA", "ABBBBBBBBBBBBBBBBBBBBBA") + .aisle(" BBBBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBBBB ", " C EE EE C ", " EEEEE ", " EEEEE ", " EE EE ", " E E ", " E E ", " EEEE ", " DDDD ", " D D ", " D D ", " A DD DD A ", " A DDDDD A ", " A DDDDD A ", " DD DD ", " D D ", " D D ", " DDDD ", " EEEE ", " E E ", " E E ", " EE EE ", " EEEEE ", " C EEEEE C ", " BBBBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBBBB ") + .aisle(" BBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBB ", " C E E C ", " EE EE ", " EE EE ", " E E ", " E E ", " EE E ", " EE ", " DD ", " D DD ", " D D ", " A D D A ", " A DD DD A ", " A DD DD A ", " D D ", " D D ", " DD D ", " DD ", " EE ", " E EE ", " E E ", " E E ", " EE EE ", " C EE EE C ", " BBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBB ") + .aisle(" BBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBB ", " C E EE C ", " EE E ", " E EE ", " EE E ", " EE E ", " EEE ", " ", " ", " DDD ", " D DD ", " D DD ", " A DD D A ", " D DD ", " DD D ", " DD D ", " DDD ", " ", " ", " EEE ", " E EE ", " E EE ", " EE E ", " C E EE C ", " BBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBBBB ") + .aisle(" BBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBB ", " C EE EE C ", " E E ", " E E ", " EE EE ", " EEEE ", " ", " ", " ", " ", " DDDD ", " DD DD ", " A D D A ", " D D ", " DD DD ", " DDDD ", " ", " ", " ", " ", " EEEE ", " EE EE ", " E E ", " C E E C ", " BBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBBBB ") + .aisle(" BBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBB ", " C EEE C ", " EEEE ", " EEEE ", " EEE ", " ", " ", " ", " ", " ", " ", " DDD ", " A DDDD A ", " DDDD ", " DDD ", " ", " ", " ", " ", " ", " ", " EEE ", " EEEE ", " C EEEE C ", " BBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBB ", " BBBBBBBBBBBBBBB ") + .aisle(" BBBBBBBBBBBBB ", " BBBBBBBBBBBBB ", " BBBBBBBBBBBBB ", " CC ACACA CC ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " AA C C AA ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " C C ", " CC ACACA CC ", " BBBBBBBBBBBBB ", " BBBBBBBBBBBBB ", " BBBBBBBBBBBBB ") + .aisle(" BBBBBBBBBBB ", " BBBBBBBBBBB ", " BBBBBBBBBBB ", " CAAAAAC ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " CAAAAAC ", " BBBBBBBBBBB ", " BBBBBBBBBBB ", " BBBBBBBBBBB ") + .aisle(" BBBBBBB ", " BBBBBBB ", " BBBBBBB ", " AACAA ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " AA C AA ", " AAA C AAA ", " AA C AA ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " C ", " AACAA ", " BBBBBBB ", " BBBBBBB ", " BBBBBBB ") + .aisle(" AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ", " ", " ", " ", " ", " ", " ", " ", " ", " AAA ", " AAAAA ", " AAQAA ", " AAAAA ", " AAA ", " ", " ", " ", " ", " ", " ", " ", " ", " AAAAA ", " AAAAA ", " AAAAA ", " AAAAA ") + + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(OSCILLATING_GILDED_PTHANTERUM_CASING.get()) + .or(autoAbilities()) + .or(autoAbilities(CosmicRecipeTypes.TITAN_FUSION_RECIPES)) + .or(abilities(PartAbility.IMPORT_FLUIDS,PartAbility.IMPORT_FLUIDS_4X,PartAbility.IMPORT_FLUIDS_9X)) + .or(abilities(PartAbility.EXPORT_ITEMS,PartAbility.EXPORT_FLUIDS)) + .or(abilities(PartAbility.INPUT_ENERGY,PartAbility.INPUT_LASER).setExactLimit(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) //Part IO go here + .where('B', blocks(BICHROMAL_NEVRAMITE_CASING.get())) + .where('C', frames(GTMaterials.Neutronium)) + .where('D', blocks(GTBlocks.FUSION_CASING_MK2.get())) + .where('F', blocks(ZBLAN_REINFORCED_GLASS.get())) + .where('E', blocks(GTBlocks.FUSION_CASING_MK3.get())) + .where('G', blocks(GTBlocks.FUSION_COIL.get())) + .build()) + // spotless:on + .workableCasingModel(CosmicCore.id("block/casings/solid/oscillating_gilded_pthanterum_casings"), + GTCEu.id("block/multiblock/fusion_reactor")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/VileFissionReactor.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/VileFissionReactor.java new file mode 100644 index 000000000..2ec8a09ce --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/VileFissionReactor.java @@ -0,0 +1,63 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import com.sammy.malum.registry.common.block.MalumBlocks; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.HIGH_TEMP_FISSION_CASING; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; + +public class VileFissionReactor { + + public final static MultiblockMachineDefinition VILE_FISSION_REACTOR = REGISTRATE + .multiblock("vile_fission", + WorkableElectricMultiblockMachine::new) + .langValue("§cFestering Fission Reactor") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.VILE_FISSION) + .appearanceBlock(HIGH_TEMP_FISSION_CASING) + .partAppearance((controller, part, side) -> HIGH_TEMP_FISSION_CASING.getDefaultState()) + .recipeModifiers( + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle("AAAAAAA", " AA AA ", " A A ", " ", " ", " A ", " A ", " ABA ", " A ", " A ", " ", " ", " A A ", " AA AA ", "AAAAAAA") + .aisle("AAAAAAA", "AABBBAA", "AABCBAA", " ABCBA ", " BCB ", " BBB ", " AAA ", " AA AA ", " AAA ", " BBB ", " BCB ", " ABCBA ", "AABCBAA", "AABBBAA", "AAAAAAA") + .aisle("AAAAAAA", "ABDDDBA", " BDDDB ", " BDDDB ", " BDDDB ", " BDDDB ", " AADAA ", "AAADAAA", " AADAA ", " BDDDB ", " BDDDB ", " BDDDB ", " BDDDB ", "ABDDDBA", "AAAAAAA") + .aisle("AAAAAAA", " BD DB ", " CD DC ", " CD DC ", " CD DC ", "ABD DBA", "AAD DAA", "B D D B", "AAD DAA", "ABD DBA", " CD DC ", " CD DC ", " CD DC ", " BD DB ", "AAAAAAA") + .aisle("AAAAAAA", "ABDDDBA", " BDDDB ", " BDDDB ", " BDDDB ", " BDDDB ", " AADAA ", "AAADAAA", " AADAA ", " BDDDB ", " BDDDB ", " BDDDB ", " BDDDB ", "ABDDDBA", "AAAAAAA") + .aisle("AAAAAAA", "AABBBAA", "AABCBAA", " ABCBA ", " BCB ", " BBB ", " AAA ", " AA AA ", " AAA ", " BBB ", " BCB ", " ABCBA ", "AABCBAA", "AABBBAA", "AAAAAAA") + .aisle("AAAQAAA", " AA AA ", " A A ", " ", " ", " A ", " A ", " ABA ", " A ", " A ", " ", " ", " A A ", " AA AA ", "AAAAAAA") + + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(HIGH_TEMP_FISSION_CASING.get()) + .or(autoAbilities(CosmicRecipeTypes.VILE_FISSION)) + .or(abilities(PartAbility.INPUT_ENERGY).setMaxGlobalLimited(2,2)) + .or(abilities(CosmicPartAbility.IMPORT_EMBER).setMaxGlobalLimited(1,1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('B', blocks(CosmicBlocks.HIGHLY_CONDUCTIVE_FISSION_CASING.get())) + .where('C', blocks(GTBlocks.CASING_LAMINATED_GLASS.get())) + .where('D', blocks(MalumBlocks.BLOCK_OF_LIVING_FLESH.get())) + .build()) + // spotless:on + .workableCasingModel(CosmicCore.id("block/casings/solid/high_temperature_fission_casing"), + CosmicCore.id("block/overlay/machine/roaster")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/VoidMiner.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/VoidMiner.java new file mode 100644 index 000000000..416f7eaa8 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/VoidMiner.java @@ -0,0 +1,70 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; + +// NOTE DO NOT ADD BERS/RENDERS TO THIS YET + +public class VoidMiner { + + public final static MultiblockMachineDefinition VOID_MINER = REGISTRATE + .multiblock("void_miner", + WorkableElectricMultiblockMachine::new) + .langValue("§cVoid Miner") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.VOID_MINER) + .appearanceBlock(HIGH_TOLERANCE_RHENIUM_CASING) + .partAppearance((controller, part, side) -> HIGH_TOLERANCE_RHENIUM_CASING.getDefaultState()) + .recipeModifiers( + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" A B B A ", " AAB B A ", " AAB BAA ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle("A A", "AACCAAACC A", " AB BA ", " AB BA ", " AB BA ", " B B ", " B B ", " ", " ", " ", " ", " ", " ") + .aisle(" B A A B ", " BCA ACB ", " B AAAAA B ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " A A ", " ACCCA ", " ACDCA ", " ACDCA ", " CDC ", " CDC ", " CDC ", " A A ", " ", " ", " ", " ") + .aisle(" ", " A A ", " ACCCA ", " DBD ", " DBD ", " DBD ", " DBD ", " DBD ", " B ", " B ", " B ", " B ", " B ") + .aisle(" ", " A A ", " ACCCA ", " ACDCA ", " ACDCA ", " CDC ", " CDC ", " CDC ", " A A ", " ", " ", " ", " ") + .aisle(" B A A B ", " BCA ACB ", " B AAAAA B ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle("A A", "AACCAQACCAA", " AB BA ", " AB BA ", " AB BA ", " B B ", " B B ", " ", " ", " ", " ", " ", " ") + .aisle(" A B B A ", " AAB BAA ", " AAB BAA ", " A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" A A ", " A A ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(HIGH_TOLERANCE_RHENIUM_CASING.get()).setMinGlobalLimited(105) + .or(autoAbilities(CosmicRecipeTypes.VOID_MINER)) + .or(abilities(PartAbility.IMPORT_FLUIDS,PartAbility.IMPORT_FLUIDS_4X,PartAbility.IMPORT_FLUIDS_9X)) + .or(abilities(PartAbility.EXPORT_ITEMS)) + .or(abilities(PartAbility.INPUT_ENERGY).setExactLimit(1)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1)) + ) + .where('B', blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, CosmicMaterials.Trinavine))) //.setMinGlobalLimited(28) + .where('C', blocks(HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.get())) + .where('D', blocks(COMPUTER_CASING.get())) + .build()) + // spotless:on + .workableCasingModel(CosmicCore.id("block/casings/solid/high_tolerance_rhenium_casing"), + GTCEu.id("block/multiblock/generator/large_gas_turbine")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/VoidSaltReactor.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/VoidSaltReactor.java new file mode 100644 index 000000000..723d9d8cf --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/VoidSaltReactor.java @@ -0,0 +1,60 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import com.sammy.malum.registry.common.block.MalumBlocks; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.HIGH_TEMP_FISSION_CASING; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; + +public class VoidSaltReactor { + + public final static MultiblockMachineDefinition VILE_FISSION_REACTOR = REGISTRATE + .multiblock("void_salt_fissiom", + WorkableElectricMultiblockMachine::new) + .langValue("§5Voidtouched Salt Fission Reactor") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.VOID_SALT_FISSION) + .appearanceBlock(HIGH_TEMP_FISSION_CASING) + .partAppearance((controller, part, side) -> HIGH_TEMP_FISSION_CASING.getDefaultState()) + .recipeModifiers( + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK), + GTRecipeModifiers.BATCH_MODE) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle("AA AA", "BA AB", "B B", "B B", "B B", "BA AB", "AA AA") + .aisle("AAAAA", "ACCCA", " CDC ", " CDC ", " CDC ", "ACCCA", "AAAAA") + .aisle(" AAA ", " CCC ", " DED ", " DED ", " DED ", " CCC ", " AAA ") + .aisle("AAAAA", "ACQCA", " CDC ", " CDC ", " CDC ", "ACCCA", "AAAAA") + .aisle("AA AA", "BA AB", "B B", "B B", "B B", "BA AB", "AA AA") + + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(HIGH_TEMP_FISSION_CASING.get()) + .or(autoAbilities(CosmicRecipeTypes.VOID_SALT_FISSION)) + .or(abilities(PartAbility.INPUT_ENERGY).setMaxGlobalLimited(2,2)) + .or(abilities(PartAbility.MAINTENANCE).setExactLimit(1))) + .where('B', blocks(MalumBlocks.BLOCK_OF_SOULSTONE.get())) + .where('C', blocks(CosmicBlocks.HIGHLY_CONDUCTIVE_FISSION_CASING.get())) + .where('D', blocks(GTBlocks.CASING_LAMINATED_GLASS.get())) + .where('E', blocks(MalumBlocks.BLOCK_OF_VOID_SALTS.get())) + .build()) + // spotless:on + .workableCasingModel(CosmicCore.id("block/casings/solid/high_temperature_fission_casing"), + CosmicCore.id("block/overlay/machine/roaster")) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/VoraxReactor.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/VoraxReactor.java new file mode 100644 index 000000000..2439fd549 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/VoraxReactor.java @@ -0,0 +1,96 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility; +import com.ghostipedia.cosmiccore.client.renderer.machine.CosmicDynamicRenderHelpers; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.VoraxReactorMachine; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; + +import net.minecraft.world.level.block.Blocks; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.blocks; +import static com.gregtechceu.gtceu.common.data.GCYMBlocks.CASING_ATOMIC; +import static com.gregtechceu.gtceu.common.data.GTBlocks.*; +import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.ELECTRIC_OVERCLOCK; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.createWorkableCasingMachineModel; + +public class VoraxReactor { + + public final static MultiblockMachineDefinition VORAX_REACTOR = REGISTRATE + .multiblock("vorax_reactor", VoraxReactorMachine::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.VORAX) + .recipeModifier(ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK)) + .appearanceBlock(CASING_ATOMIC) + .partAppearance((controller, part, side) -> TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.getDefaultState()) + .generator(true) + .pattern(definition -> FactoryBlockPattern.start() + .aisle(" AAAAAAAAA ", " A A ", " AAA AAA ", " AAA ", " BBABB ", " BBB ", + " B ", " ", " ", " ", " B ", " BBB ", + " BBABB ", " AAA ", " AAA AAA ", " A A ", " AAAAAAAAA ") + .aisle("AA AA", " CCCACCC ", " A A A A ", " BAAAB ", " BB A BB ", " ", + " ", " ", " ", " ", " ", " ", + " BB A BB ", " BAAAB ", " A A A A ", " CCCACCC ", "AA AA") + .aisle("A A", " CCAAAAACC ", "A D A A D A", " DBAAABD ", " BD A DB ", " D D ", + " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", + " BD A DB ", " DBAAABD ", "A D A A D A", " CCAAAAACC ", "A A") + .aisle("A A", " CAAAAAAAC ", "A AA AA A", " BBBAAABBB ", "BB AEA BB", " AEA ", + " AEA ", " E ", " ", " E ", " AEA ", " AEA ", + "BB AEA BB", " BBBAAABBB ", "A AA AA A", " CAAAAAAAC ", "A A") + .aisle("A A", "ACAABBBAACA", "AAAAAAAAAAA", "AAAAAAAAAAA", "B AFEFA B", "B AFEFA B", + "B AFEFA B", "B EEE B", "B B", "B EEE B", "B AFEFA B", "B AFEFA B", + "B AFEFA B", "AAAAAAAAAAA", "AAAAAAAAAAA", "ACAABBBAACA", "A A") + .aisle("A A", " AAABBBAAA ", " AEA ", "AAAAAEAAAAA", "AAAEEEEEAAA", "B EEEEE B", + "B EEEEE B", "B EEEEE B", "B B", "B EEEEE B", "B EEEEE B", "B EEEEE B", + "AAAEEEEEAAA", "AAAAAEAAAAA", " AEA ", " AAABBBAAA ", "A A") + .aisle("A A", "ACAABBBAACA", "AAAAAAAAAAA", "AAAAAAAAAAA", "B AFEFA B", "B AFEFA B", + "B AFEFA B", "B EEE B", "B B", "B EEE B", "B AFEFA B", "B AFEFA B", + "B AFEFA B", "AAAAAAAAAAA", "AAAAAAAAAAA", "ACAABBBAACA", "A A") + .aisle("A A", " CAAAAAAAC ", "A AA AA A", " BBBAAABBB ", "BB AEA BB", " AEA ", + " AEA ", " E ", " ", " E ", " AEA ", " AEA ", + "BB AEA BB", " BBBAAABBB ", "A AA AA A", " CAAAAAAAC ", "A A") + .aisle("A A", " CCAAAAACC ", "A D A A D A", " DBAAABD ", " BD A DB ", " D D ", + " D D ", " D D ", " D D ", " D D ", " D D ", " D D ", + " BD A DB ", " DBAAABD ", "A D A A D A", " CCAAAAACC ", "A A") + .aisle("AA AA", " CCCACCC ", " A A A A ", " BAAAB ", " BB A BB ", " ", + " ", " ", " ", " ", " ", " ", + " BB A BB ", " BAAAB ", " A A A A ", " CCCACCC ", "AA AA") + .aisle(" AAAAAAAAA ", " A A ", " AAA AAA ", " AAA ", " BBQBB ", " BBB ", + " B ", " ", " ", " ", " B ", " BBB ", + " BBABB ", " AAA ", " AAA AAA ", " A A ", " AAAAAAAAA ") + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('C', blocks(CosmicBlocks.ULTRA_POWERED_CASING.get())) + .where('A', blocks(CASING_ATOMIC.get())) + .where('D', frames(CosmicMaterials.Trinavine)) + .where('E', blocks(Blocks.SCULK)) + .where('F', blocks(FUSION_COIL.get())) + .where('B', blocks(CosmicBlocks.TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.get()) + .or(Predicates.abilities(PartAbility.OUTPUT_LASER, PartAbility.SUBSTATION_OUTPUT_ENERGY) + .setMaxGlobalLimited(1, 1)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setMinGlobalLimited(1, 1) + .setMaxGlobalLimited(3)) + .or(Predicates.abilities(CosmicPartAbility.STERILIZE_HATCH).setExactLimit(1))) + .build()) + .model(createWorkableCasingMachineModel( + CosmicCore.id("block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing"), + GTCEu.id("block/multiblock/fusion_reactor")) + .andThen(model -> model.addDynamicRenderer(CosmicDynamicRenderHelpers::getConceptIncinerator))) + .hasBER(true) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/WASP.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/WASP.java new file mode 100644 index 000000000..ad3c377eb --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/WASP.java @@ -0,0 +1,170 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.data.recipe.CosmicRecipeModifiers; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.common.data.GCYMBlocks; +import com.gregtechceu.gtceu.common.data.GTMaterials; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.api.pattern.util.RelativeDirection.*; + +public class WASP { + + public final static MultiblockMachineDefinition WASP = REGISTRATE + .multiblock("wasp", WorkableElectricMultiblockMachine::new) + .langValue("Wide Asteroid Separation Platform [WASP]") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.WASP_RECIPES) + .recipeModifier(CosmicRecipeModifiers::asteroidYieldModifier) + .appearanceBlock(HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING) + .partAppearance((controller, part, side) -> HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.getDefaultState()) + .pattern(definition -> FactoryBlockPattern.start() + // spotless: off + .aisle(" ", " ", " B B ", + " C C ", " ", " ", + " ", " ", " ", + " ", " C C ", " B B ", + " ", " ") + .aisle(" ", " ", " B C C B ", + " C C ", " ", " ", + " ", " ", " ", + " ", " C C ", " B C C B ", + " ", " ") + .aisle(" ", " ", " BBCBCBB ", + " C C ", " ", " ", + " ", " ", " ", + " ", " C C ", " BBCBCBB ", + " ", " ") + .aisle(" ", " ", " BCCCB ", + " CCC ", " ", " ", + " ", " ", " ", + " ", " CCC ", " BCCCB ", + " ", " ") + .aisle(" ", " ", " CCCBBCBBCCC ", + " DCD ", " D A ", " ", + " ", " ", " ", + " D D ", " DCD ", " CCCBBCBBCCC ", + " ", " ") + .aisle(" ", " BCB ", " CDDDDBCBDDDDC ", + " A C A ", " A A ", " ", + " ", " ", " ", + " A A ", " A C A ", " CDDDDBCBDDDDC ", + " BCB ", " ") + .aisle(" ", " DBBBCBBBD ", " CDD C DDC ", + " A A ", " A A ", " ", + " ", " ", " ", + " A A ", " A A ", " CDD C DDC ", + " DBBBCBBBD ", " ") + .aisle(" AABCBAA ", " DB BCB BD ", " CD DC ", + " ", " ", " ", + " ", " ", " ", + " ", " ", " CD DC ", + " DB BCB BD ", " AABCBAA ") + .aisle(" AAABCBAAA ", " B E C E B ", "BBB CD E E DC BBB", + " A E E A ", " A E E A ", " E E ", + " E E ", " E E ", " E E ", + " A E E A ", " A E E A ", "BBB CD E E DC BBB", + " B E C E B ", " AAABCBAAA ") + .aisle(" AAABCBAAA ", " B B ", " BBBD DBBB ", + " A ", " AAA ", " ABA ", + " B ", " B ", " ABA ", + " AAA ", " A ", " BBBD DBBB ", + " B B ", " AAABCBAAA ") + .aisle(" BBBBBBBBB ", " BBB AAA BBB ", " CCCBB AAA BBCCC ", + "CCCCD AAA DCCCC", " D AAAAA D ", " AAAAA ", + " AAA ", " AAA ", " AAAAA ", + " D AAAAA D ", "CCCCD AAA DCCCC", " CCCBB AAA BBCCC ", + " BBB AAA BBB ", " BBBBBBBBB ") + .aisle(" CCCBBBCCC ", " CCCC A A CCCC ", " BCCCC A A CCCCB ", + " CCC AA AA CCC ", " AA AA ", " BA AB ", + " BA AB ", " BA AB ", " BA AB ", + " AA AA ", " CCC AA AA CCC ", " BCCCC A A CCCCB ", + " CCCC A A CCCC ", " CCCBQBCCC ") + .aisle(" BBBBBBBBB ", " BBB AAA BBB ", " CCCBB AAA BBCCC ", + "CCCCD AAA DCCCC", " D AAAAA D ", " AAAAA ", + " AAA ", " AAA ", " AAAAA ", + " D AAAAA D ", "CCCCD AAA DCCCC", " CCCBB AAA BBCCC ", + " BBB AAA BBB ", " BBBBBBBBB ") + .aisle(" AAABCBAAA ", " B B ", " BBBD DBBB ", + " A ", " AAA ", " ABA ", + " B ", " B ", " ABA ", + " AAA ", " A ", " BBBD DBBB ", + " B B ", " AAABCBAAA ") + .aisle(" AAABCBAAA ", " B E C E B ", "BBB CD E E DC BBB", + " A E E A ", " A E E A ", " E E ", + " E E ", " E E ", " E E ", + " A E E A ", " A E E A ", "BBB CD E E DC BBB", + " B E C E B ", " AAABCBAAA ") + .aisle(" AABCBAA ", " DB BCB BD ", " CD DC ", + " ", " ", " ", + " ", " ", " ", + " ", " ", " CD DC ", + " DB BCB BD ", " AABCBAA ") + .aisle(" ", " DBBBCBBBD ", " CDD C DDC ", + " A A ", " A A ", " ", + " ", " ", " ", + " A A ", " A A ", " CDD C DDC ", + " DBBBCBBBD ", " ") + .aisle(" ", " BCB ", " CDDDDBCBDDDDC ", + " A C A ", " A A ", " ", + " ", " ", " ", + " A A ", " A C A ", " CDDDDBCBDDDDC ", + " BCB ", " ") + .aisle(" ", " ", " CCCBBCBBCCC ", + " DCD ", " D D ", " ", + " ", " ", " ", + " D D ", " DCD ", " CCCBBCBBCCC ", + " ", " ") + .aisle(" ", " ", " BCCCB ", + " CCC ", " ", " ", + " ", " ", " ", + " ", " CCC ", " BCCCB ", + " ", " ") + .aisle(" ", " ", " BBCBCBB ", + " C C ", " ", " ", + " ", " ", " ", + " ", " C C ", " BBCBCBB ", + " ", " ") + .aisle(" ", " ", " B C C B ", + " C C ", " ", " ", + " ", " ", " ", + " ", " C C ", " B C C B ", + " ", " ") + .aisle(" ", " ", " B B ", + " C C ", " ", " ", + " ", " ", " ", + " ", " C C ", " B B ", + " ", " ") + // spotless: on + .where(' ', any()) + .where("Q", controller(blocks(definition.getBlock()))) + .where('C', blocks(CosmicBlocks.HIGH_TOLERANCE_RHENIUM_CASING.get())) + .where('A', blocks(CosmicBlocks.HIGHLY_FLEXIBLE_REINFORCED_TRINAVINE_CASING.get()) + .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(4)) + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) + .setMaxGlobalLimited(2)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setMinGlobalLimited(1, 1) + .setMaxGlobalLimited(3, 3))) + .where('E', frames(GTMaterials.Neutronium)) + .where('D', blocks(GCYMBlocks.CASING_HIGH_TEMPERATURE_SMELTING.get())) + .where('B', blocks(CosmicBlocks.NAQUADAH_PRESSURE_RESISTANT_CASING.get())) + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/highly_flexible_reinforced_trinavine_casing"), + CosmicCore.id("block/multiblock/mantle_bore")) + .hasBER(true) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/WelderMulti.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/WelderMulti.java new file mode 100644 index 000000000..5987fbd7b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/WelderMulti.java @@ -0,0 +1,93 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.client.renderer.machine.CosmicDynamicRenderHelpers; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTBlocks; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import static com.ghostipedia.cosmiccore.api.machine.part.CosmicPartAbility.IMPORT_SOUL; +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; +import static com.gregtechceu.gtceu.common.data.GCYMBlocks.CASING_NONCONDUCTING; +import static com.gregtechceu.gtceu.common.data.GCYMBlocks.CASING_STRESS_PROOF; +import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.createWorkableCasingMachineModel; + +public class WelderMulti { + + public final static MultiblockMachineDefinition SUBMERGED_WELDER = REGISTRATE + .multiblock("submerged_welder", + WorkableElectricMultiblockMachine::new) + .langValue("§3Submerged Welder") + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(CosmicRecipeTypes.HEMOPHAGIC_TRANSFUSER) + .hasBER(true) + .partAppearance((controller, part, side) -> CYCLOZINE_CHEMICALLY_REPELLING_CASING.getDefaultState()) + .recipeModifiers(GTRecipeModifiers.PARALLEL_HATCH, + GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.PERFECT_OVERCLOCK_SUBTICK)) + // spotless:off + .pattern(definition -> FactoryBlockPattern.start() + .aisle("AAAA AAAA", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle("AAAAA AAAAA", " BB BB ", " B B ", " B B ", " B B ", " B B ", " B B ", " B B ", " B B ") + .aisle("AAAAAA AAAAAA", " BBB BBB ", " B B ", " B B ", " B B ", " B B ", " B B ", " B B ", " BBB BBB ") + .aisle("AAAAAAAAAAAAAAA", " BBB BBB ", " B AAAAA B ", " EAAAAAAAE ", " E AAAAA E ", " B B ", " E E ", " B B ", " BB BB ") + .aisle(" AAAAAAAAAAAAA ", " B B ", " GGGGGGG ", " AGGGGGGGA ", " GGGGGGG ", " F F ", " ", " E E ", " ") + .aisle(" AAAAAAAAAAA ", " ", " AGGGGGGGA ", " AG GA ", " AG GA ", " F F ", " ", " E E ", " ") + .aisle(" AAAAAAAAA ", " ", " AGGGGGGGA ", " AG GGG GA ", " AG GA ", " F F ", " ", " E E ", " ") + .aisle(" AAAAAAAAA ", " ", " AGGGGGGGA ", " AG GGG GA ", " CAG GA ", " DF H F ", " DDDDD ", " E E ", " ") + .aisle(" AAAAAAAAA ", " ", " AGGGGGGGA ", " AG GA ", " AG GA ", " F F ", " ", " E E ", " ") + .aisle(" AAAAAAAAA ", " ", " AGGGGGGGA ", " AG GGG GA ", " AG GAC ", " F H FD ", " DDDDD ", " E E ", " ") + .aisle(" AAAAAAAAA ", " ", " AGGGGGGGA ", " AG GGG GA ", " AG GA ", " F F ", " ", " E E ", " ") + .aisle(" AAAAAAAAA ", " ", " AGGGGGGGA ", " AG GA ", " AG GA ", " F F ", " ", " E E ", " ") + .aisle(" AAAAAAAAA ", " ", " AGGGGGGGA ", " AG GGG GA ", " AG GAC ", " F H FD ", " DDDDDD ", " E E ", " ") + .aisle(" AAAAAAAAA ", " ", " AGGGGGGGA ", " AG GGG GA ", " AG GA ", " F F ", " ", " E E ", " ") + .aisle(" AAAAAAAAAAA ", " ", " AGGGGGGGA ", " AG GA ", " AG GA ", " F F ", " ", " E E ", " ") + .aisle(" AAAAAAAAAAAAA ", " B B ", " GGGGGGG ", " AGGGGGGGA ", " GGGGGGG ", " F F ", " ", " E E ", " ") + .aisle("AAAAAAAAAAAAAAA", " BBB BBB ", " B AAAAA B ", " EAAAQAAAE ", " E AAAAA E ", " B B ", " E E ", " B B ", " BB BB ") + .aisle("AAAAAA AAAAAA", " BBB BBB ", " B B ", " B B ", " B B ", " B B ", " B B ", " B B ", " BBB BBB ") + .aisle("AAAAA AAAAA", " BB BB ", " B B ", " B B ", " B B ", " B B ", " B B ", " B B ", " B B ") + .aisle("AAAA AAAA", " ", " ", " ", " ", " ", " ", " ", " ") + .where(' ', any()) + .where('Q', controller(blocks(definition.getBlock()))) + .where('A', blocks(WEAR_RESISTANT_RURIDIT_CASING.get())) + .where('B', blocks(CASING_STRESS_PROOF.get())) + .where('C', blocks(TRITANIUM_LINED_HEAVY_NEUTRONIUM_CASING.get())) + .where('E', blocks(CASING_STRESS_PROOF.get())) + .where('D', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get()).setMinGlobalLimited(28) + // TODO see how to limit to 1 laser OR 1 energy, not 1 of each.. + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMinGlobalLimited(1) + .setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.EXPORT_FLUIDS).setPreviewCount(1) + .setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1) + .setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1) + .setPreviewCount(1)) + .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMinGlobalLimited(1) + .setPreviewCount(1)) + .or(abilities(IMPORT_SOUL))) + .where('F', blocks(CASING_STRESS_PROOF.get())) + .where('G', blocks(CASING_NONCONDUCTING.get())) + .where('H', blocks(GTBlocks.CASING_TUNGSTENSTEEL_PIPE.get())) + .build()) + // spotless:on + .model( + createWorkableCasingMachineModel( + CosmicCore.id("block/casings/solid/naquadah_pressure_resistant_casing"), + GTCEu.id("block/multiblock/hpca")) + .andThen(model -> model + .addDynamicRenderer(CosmicDynamicRenderHelpers::getWelderArmsRenderer))) + .register(); + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/WirelessDataBankMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/WirelessDataBankMachine.java new file mode 100644 index 000000000..79e3c610b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/WirelessDataBankMachine.java @@ -0,0 +1,155 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi; + +import com.ghostipedia.cosmiccore.common.wireless.WirelessDataStore; +import com.ghostipedia.cosmiccore.utils.OwnershipUtils; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.IControllable; +import com.gregtechceu.gtceu.api.capability.IDataAccessHatch; +import com.gregtechceu.gtceu.api.capability.IEnergyContainer; +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.misc.EnergyContainerList; +import com.gregtechceu.gtceu.common.machine.owner.FTBOwner; +import com.gregtechceu.gtceu.config.ConfigHolder; + +import com.lowdragmc.lowdraglib.utils.DummyWorld; + +import net.minecraft.network.chat.Component; + +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; + +import java.util.*; + +public class WirelessDataBankMachine extends WorkableElectricMultiblockMachine + implements IFancyUIMachine, IDisplayUIMachine, IControllable { + + public static final int EUT_PER_HATCH_CHAINED = GTValues.VA[GTValues.LuV]; + + private IMaintenanceMachine maintenance; + private IEnergyContainer energyContainer; + + private final ConditionalSubscriptionHandler tickSubscription; + + protected UUID getTeamUUID() { + var team = getOwner() instanceof FTBOwner ftbOwner ? ftbOwner.getPlayerTeam(getOwnerUUID()) : null; + return team != null ? team.getTeamId() : getOwnerUUID(); + } + + public WirelessDataBankMachine(BlockEntityCreationInfo holder) { + super(holder); + this.energyContainer = new EnergyContainerList(new ArrayList<>()); + this.tickSubscription = new ConditionalSubscriptionHandler(this, this::tick, this::isSubscriptionActive); + } + + protected boolean isSubscriptionActive() { + return isFormed(); + } + + private void tick() { + if (isWorkingEnabled() && isFormed()) { + getRecipeLogic() + .setStatus(isSubscriptionActive() ? RecipeLogic.Status.WORKING : RecipeLogic.Status.SUSPEND); + energyContainer.removeEnergy(calculateEnergyUsage()); + addHatchesToWirelessNetwork(); + } else { + removeHatchesFromWirelessNetwork(); + } + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + if (getLevel() instanceof DummyWorld) return; + + List energyContainers = new ArrayList<>(); + Map ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", Long2ObjectMaps::emptyMap); + + for (IMultiPart part : getParts()) { + IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.BOTH); + if (part instanceof IMaintenanceMachine maintenanceMachine) + this.maintenance = maintenanceMachine; + if (io == IO.NONE || io == IO.OUT) continue; + for (var handler : part.getRecipeHandlers()) { + var handlerIO = handler.getHandlerIO(); + if (io != IO.BOTH && handlerIO != IO.BOTH && io != handlerIO) continue; + if (handler.hasCapability(EURecipeCapability.CAP) && + handler instanceof IEnergyContainer container) { + energyContainers.add(container); + } + } + } + + if (this.maintenance == null) { + onStructureInvalid(); + return; + } + + this.energyContainer = new EnergyContainerList(new ArrayList<>(energyContainers)); + + tickSubscription.updateSubscription(); + } + + private int calculateEnergyUsage() { + int receivers = getOpticalHatches().size(); + boolean hasMaintenance = ConfigHolder.INSTANCE.machines.enableMaintenance && this.maintenance != null; + var maintenanceMultiplier = hasMaintenance ? (1 + ((float) this.maintenance.getNumMaintenanceProblems() / 10)) : + 1; + return (int) Math.floor(receivers * maintenanceMultiplier * EUT_PER_HATCH_CHAINED); + } + + @Override + public void onStructureInvalid() { + if (isWorkingEnabled() && getRecipeLogic().getStatus() == RecipeLogic.Status.WORKING) + removeHatchesFromWirelessNetwork(); + super.onStructureInvalid(); + this.energyContainer = new EnergyContainerList(new ArrayList<>()); + getRecipeLogic().setStatus(RecipeLogic.Status.SUSPEND); + tickSubscription.unsubscribe(); + } + + @Override + public void addDisplayText(List textList) { + MultiblockDisplayText.builder(textList, isFormed()) + .setWorkingStatus(true, isActive() && isWorkingEnabled())// transform into two-state system for display + .setWorkingStatusKeys( + "gtceu.multiblock.idling", + "gtceu.multiblock.idling", + "gtceu.multiblock.data_bank.providing") + .addEnergyUsageExactLine(calculateEnergyUsage()) + .addWorkingStatusLine() + .addEmptyLine() + .addCustom(list -> OwnershipUtils.addOwnerLine(list, getOwner(), true)); + } + + private void addHatchesToWirelessNetwork() { + WirelessDataStore.addHatches(getTeamUUID(), getOpticalHatches()); + } + + private void removeHatchesFromWirelessNetwork() { + WirelessDataStore.removeHatches(getTeamUUID(), getOpticalHatches()); + } + + private List getOpticalHatches() { + List hatches = new ArrayList<>(); + + for (var part : getParts()) { + net.minecraft.world.level.block.Block block = part.self().getBlockState().getBlock(); + if (part instanceof IDataAccessHatch hatch && PartAbility.OPTICAL_DATA_RECEPTION.isApplicable(block)) { + hatches.add(hatch); + } + } + + return hatches; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/AlchemicalFissionReactor.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/AlchemicalFissionReactor.java new file mode 100644 index 000000000..5df4cc002 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/AlchemicalFissionReactor.java @@ -0,0 +1,170 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKeys; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.transfer.fluid.FluidHandlerList; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import net.minecraft.network.chat.Component; +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; + +import it.unimi.dsi.fastutil.longs.Long2ObjectMap; +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public class AlchemicalFissionReactor extends WorkableElectricMultiblockMachine { + + // Base Heat capacity (maybe we make it so there's ways to raise this so there's more 'buffer' in each zone. tbd + // that sounds like block predicates lol) + @Getter + public static long HEAT_CAPACITY = 10_000L; + @Getter + public static long COOLANT_DELTA = 0; + @Getter + public static long HEATING_DELTA = 10; + + // Heat Band Max Ranges of Reactor Heat % (eg. Low is 0-33%) + public static final int LOW = 33; + public static final int MODERATE = 66; + public static final int HIGH = 100; + + @Getter + @DescSynced + @Persisted + public static long heat = 0; + + @Nullable + protected FluidHandlerList inputFluidHandlers; + + @Getter + @DescSynced + @Persisted + public static long heatCapacity = HEAT_CAPACITY; + + @Nullable + protected TickableSubscription fissionLogicSubs; + + @DescSynced + private static final Object2IntMap coolantTiers = new Object2IntOpenHashMap<>(); + + static { + coolantTiers.put(GTMaterials.Oxygen.getFluid(FluidStorageKeys.LIQUID, 1), 16); + coolantTiers.put(GTMaterials.Helium.getFluid(FluidStorageKeys.LIQUID, 1), 64); + } + + + public AlchemicalFissionReactor(BlockEntityCreationInfo holder) { + super(holder); + } + + public static long getHeatCapacity() { + return heatCapacity; + } + + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + // I don't even know if this works I copied my old code from like 2024 :) + + List inputFluidContainers = new ArrayList<>(); + Long2ObjectMap ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", + Long2ObjectMaps::emptyMap); + for (IMultiPart part : getParts()) { + IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.BOTH); + if (io == IO.NONE || io == IO.OUT) continue; + var handlerLists = part.getRecipeHandlers(); + for (var handlerList : handlerLists) { + if ((handlerList.getHandlerIO() != IO.IN)) continue; + handlerList.getCapability(FluidRecipeCapability.CAP).stream() + .filter(IFluidHandler.class::isInstance) + .map(IFluidHandler.class::cast) + .forEach(inputFluidContainers::add); + } + } + + this.inputFluidHandlers = new FluidHandlerList(inputFluidContainers); + updateFissionSubscription(); + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + updateFissionSubscription(); + heat = 0; + } + + protected void updateFissionSubscription() { + if (this.isFormed) { + fissionLogicSubs = subscribeServerTick(fissionLogicSubs, this::updateHeat); + } else if (fissionLogicSubs != null) { + fissionLogicSubs.unsubscribe(); + fissionLogicSubs = null; + } + } + + // Main Heating Logic + public void updateHeat() { + if (recipeLogic.isWorking()) { + if (heat >= HEAT_CAPACITY) { + heat = HEAT_CAPACITY - HEATING_DELTA; + } + heat += HEATING_DELTA; + } else { + heat -= HEATING_DELTA; + if (heat <= 0) { + heat = 0; + } + } + } + + /* + * Get all coolant tanks + * get all valid coolants + * drain all valid coolants + * convert what was drained into cooling + * apply / return coolant delta for that tick + */ + public void setCoolantDelta() { + if (inputFluidHandlers != null) { + for (var handler : inputFluidHandlers.handlers) { + FluidStack coolant = handler.getFluidInTank(0); + } + var test = inputFluidHandlers.getFluidInTank(0); + } + } + + @Override + public boolean onWorking() { + return super.onWorking(); + } + + // Todo, coolant drain stuff. + private void processCoolant() {} + + @Override + public void addDisplayText(List textList) { + super.addDisplayText(textList); + if (isFormed) { + textList.add(Component.translatable("cosmiccore.multiblock.heat_value", + FormattingUtil.formatNumber2Places(heat))); + textList.add(Component.translatable("cosmiccore.multiblock.heat_capacity", + FormattingUtil.formatNumber2Places(getHeatCapacity()))); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/CosmicLargeTurbineMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/CosmicLargeTurbineMachine.java new file mode 100644 index 000000000..3f8f9ae0d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/CosmicLargeTurbineMachine.java @@ -0,0 +1,206 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.common.machine.multiblock.part.RotorHolderPartMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; +import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack; +import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; +import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; +import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.common.machine.multiblock.generator.LargeTurbineMachine; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; + +import lombok.Getter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class CosmicLargeTurbineMachine extends WorkableElectricMultiblockMachine + implements ITieredMachine { + + public static final int MIN_DURABILITY_TO_WARN = 10; + + private final long BASE_EU_OUTPUT; + @Getter + private final int tier; + + public CosmicLargeTurbineMachine(BlockEntityCreationInfo holder, int tier) { + super(holder); + this.tier = tier; + this.BASE_EU_OUTPUT = 3072; + } + + @Nullable + private RotorHolderPartMachine getRotorHolder() { + for (IMultiPart part : getParts()) { + if (part instanceof RotorHolderPartMachine rotorHolder) { + return rotorHolder; + } + } + return null; + } + + @Override + public long getOverclockVoltage() { + var rotorHolder = getRotorHolder(); + if (rotorHolder != null && rotorHolder.hasRotor()) + return BASE_EU_OUTPUT * rotorHolder.getTotalPower() / 100; + return 0; + } + + /** + * @return EUt multiplier that should be applied to the turbine's output + */ + protected double productionBoost() { + var rotorHolder = getRotorHolder(); + if (rotorHolder != null && rotorHolder.hasRotor()) { + int maxSpeed = rotorHolder.getMaxRotorHolderSpeed(); + int currentSpeed = rotorHolder.getRotorSpeed(); + if (currentSpeed >= maxSpeed) return 1; + return Math.pow(1.0 * currentSpeed / maxSpeed, 2); + } + return 0; + } + + public boolean hasRotor() { + var rotorHolder = getRotorHolder(); + return rotorHolder != null && rotorHolder.hasRotor(); + } + + public int getRotorSpeed() { + var rotorHolder = getRotorHolder(); + if (rotorHolder != null && rotorHolder.hasRotor()) { + return rotorHolder.getRotorSpeed(); + } + return 0; + } + + public int getMaxRotorHolderSpeed() { + var rotorHolder = getRotorHolder(); + if (rotorHolder != null && rotorHolder.hasRotor()) { + return rotorHolder.getMaxRotorHolderSpeed(); + } + return 0; + } + + public int getTotalEfficiency() { + var rotorHolder = getRotorHolder(); + if (rotorHolder != null && rotorHolder.hasRotor()) { + return rotorHolder.getTotalEfficiency(); + } + return -1; + } + + public long getCurrentProduction() { + return isActive() && recipeLogic.getLastRecipe() != null ? + recipeLogic.getLastRecipe().getOutputEUt().voltage() : 0; + } + + public int getRotorDurabilityPercent() { + var rotorHolder = getRotorHolder(); + if (rotorHolder != null && rotorHolder.hasRotor()) { + return rotorHolder.getRotorDurabilityPercent(); + } + return -1; + } + + ////////////////////////////////////// + // ****** Recipe Logic *******// + ////////////////////////////////////// + /** + * Recipe Modifier for Large Turbine Multiblocks - can be used as a valid {@link RecipeModifier} + *

+ * Recipe is fast parallelized up to {@code (baseEUt * power) / recipeEUt} times. + * Duration is then multiplied by the holder efficiency. + *

+ * + * @param machine a {@link LargeTurbineMachine} + * @param recipe recipe + * @return A {@link ModifierFunction} for the given Turbine Multiblock and recipe + */ + public static ModifierFunction recipeModifier(@NotNull MetaMachine machine, @NotNull GTRecipe recipe) { + if (!(machine instanceof CosmicLargeTurbineMachine turbineMachine)) { + return RecipeModifier.nullWrongType(CosmicLargeTurbineMachine.class, machine); + } + + var rotorHolder = turbineMachine.getRotorHolder(); + if (rotorHolder == null) return ModifierFunction.NULL; + + EnergyStack EUt = recipe.getOutputEUt(); + long turbineMaxVoltage = turbineMachine.getOverclockVoltage(); + double holderEfficiency = rotorHolder.getTotalEfficiency() / 100.0; + + if (EUt.isEmpty() || turbineMaxVoltage <= EUt.voltage() || holderEfficiency <= 0) return ModifierFunction.NULL; + + // get the amount of parallel required to match the desired output voltage + int maxParallel = (int) (turbineMaxVoltage / EUt.getTotalEU()); + int actualParallel = ParallelLogic.getParallelAmountFast(turbineMachine, recipe, maxParallel); + double eutMultiplier = turbineMachine.productionBoost() * actualParallel; + + return ModifierFunction.builder() + .inputModifier(ContentModifier.multiplier(actualParallel)) + .outputModifier(ContentModifier.multiplier(actualParallel)) + .eutMultiplier(eutMultiplier) + .parallels(actualParallel) + .durationMultiplier(holderEfficiency) + .build(); + } + + @Override + public boolean regressWhenWaiting() { + return false; + } + + @Override + public boolean canVoidRecipeOutputs(RecipeCapability capability) { + return true; + } + + ////////////////////////////////////// + // ******* GUI ********// + ////////////////////////////////////// + + @Override + public void addDisplayText(List textList) { + super.addDisplayText(textList); + if (isFormed()) { + var rotorHolder = getRotorHolder(); + + if (rotorHolder != null && rotorHolder.getRotorEfficiency() > 0) { + textList.add(Component.translatable("gtceu.multiblock.turbine.rotor_speed", + FormattingUtil.formatNumbers(rotorHolder.getRotorSpeed()), + FormattingUtil.formatNumbers(rotorHolder.getMaxRotorHolderSpeed()))); + textList.add(Component.translatable("gtceu.multiblock.turbine.efficiency", + rotorHolder.getTotalEfficiency())); + + long maxProduction = getOverclockVoltage(); + long currentProduction = getCurrentProduction(); + + if (isActive()) { + textList.add(3, Component.translatable("gtceu.multiblock.turbine.energy_per_tick", + FormattingUtil.formatNumbers(currentProduction), + FormattingUtil.formatNumbers(maxProduction))); + } + + int rotorDurability = rotorHolder.getRotorDurabilityPercent(); + if (rotorDurability > MIN_DURABILITY_TO_WARN) { + textList.add(Component.translatable("gtceu.multiblock.turbine.rotor_durability", rotorDurability)); + } else { + textList.add(Component.translatable("gtceu.multiblock.turbine.rotor_durability", rotorDurability) + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + } + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/DivingBellMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/DivingBellMachine.java new file mode 100644 index 000000000..a77e17295 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/DivingBellMachine.java @@ -0,0 +1,202 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import java.util.Optional; +import com.ghostipedia.cosmiccore.common.data.CosmicAttachmentTypes; + +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.teleporter.LandingZoneHelper; +import com.ghostipedia.cosmiccore.common.teleporter.SafeTeleporter; +import com.ghostipedia.cosmiccore.common.teleporter.TeleportPadRegistry; + +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; + +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.phys.AABB; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * Diving Bell Machine Controller + * + * Detects players standing directly on top of the controller block and teleports them to the Deep Below dimension. + * - Energy cost: 500,000 EU per teleport + * - Cooldown: 100 ticks (5 seconds) + * - Only teleports one player per activation + */ +public class DivingBellMachine extends WorkableElectricMultiblockMachine { + + + // Configuration values + private static final int TELEPORT_COST_EU = 500000; // 500k EU per teleport + private static final int COOLDOWN_TICKS = 100; // 5 seconds - idk just in case players try to abuse it. + + // Teleport destination settings + private static final String TARGET_DIMENSION = "frontiers:the_deep_below"; // Dimension to teleport to + private static final int DESTINATION_SEARCH_START_Y = 100; // Y level to start searching for safe ground + + // State + @Persisted + private int cooldownRemaining = 0; + + protected TickableSubscription tickSubscription; + + public DivingBellMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + // Subscribe to server ticks when structure forms + tickSubscription = subscribeServerTick(tickSubscription, this::checkForPlayers); + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + // Unsubscribe when structure breaks + if (tickSubscription != null) { + tickSubscription.unsubscribe(); + tickSubscription = null; + } + } + + // Tick handler that checks for players and teleports them. + private void checkForPlayers() { + // Decrement cooldown + if (cooldownRemaining > 0) { + cooldownRemaining--; + return; + } + + // Check if we have enough energy + if (!hasEnoughEnergy()) { + return; + } + + // Detect players on top platform + List players = getPlayersOnPlatform(); + if (players.isEmpty()) { + return; + } + + // Teleport first player only (one at a time) + ServerPlayer target = players.get(0); + if (teleportPlayerToDeepBelow(target)) { + // Consume energy and start cooldown + consumeEnergy(TELEPORT_COST_EU); + cooldownRemaining = COOLDOWN_TICKS; + } + } + + // Check if there is enough energy for a teleport. + private boolean hasEnoughEnergy() { + long available = energyContainer.getEnergyStored(); + return available >= TELEPORT_COST_EU; + } + + // Consume energy for teleportation. + private void consumeEnergy(long amount) { + energyContainer.removeEnergy(amount); + } + + // Get all players standing directly on top of the controller block. + private List getPlayersOnPlatform() { + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return List.of(); + } + + // Detection zone is 1 block directly above the controller + BlockPos controllerPos = getBlockPos(); + BlockPos detectionPos = controllerPos.above(1); + + AABB detectionZone = new AABB(detectionPos); + + return serverLevel.getEntitiesOfClass(ServerPlayer.class, detectionZone); + } + + // Teleport a player to the Deep Below dimension. + private boolean teleportPlayerToDeepBelow(ServerPlayer player) { + if (!(getLevel() instanceof ServerLevel currentLevel)) { + return false; + } + + // Save origin data to player capability + Optional.of(player.getData(CosmicAttachmentTypes.TELEPORT_ORIGIN)).ifPresent(cap -> { + cap.setOriginDimension(currentLevel.dimension()); + cap.setOriginPosition(player.position()); + cap.setOriginRotation(player.getYRot(), player.getXRot()); + }); + + // Get Deep Below dimension + ResourceKey targetDim = getTargetDimension(); + ServerLevel deepBelow = player.server.getLevel(targetDim); + + if (deepBelow == null) { + player.displayClientMessage( + Component.translatable("cosmiccore.divingbell.dimension_missing"), true); + return false; + } + + BlockPos landingPos = getOrCreateSafeLanding(deepBelow, player); + + player.changeDimension(SafeTeleporter.toSafe(deepBelow, landingPos, player)); + + // Success message + player.displayClientMessage( + Component.translatable("cosmiccore.divingbell.descended"), true); + + return true; + } + + // Get the target dimension (Deep Below). + private ResourceKey getTargetDimension() { + ResourceLocation dimLoc = ResourceLocation.parse(TARGET_DIMENSION); + return ResourceKey.create(net.minecraft.core.registries.Registries.DIMENSION, dimLoc); + } + + // Find or create a safe landing platform in the Deep Below. + private BlockPos getOrCreateSafeLanding(ServerLevel deepBelow, ServerPlayer player) { + TeleportPadRegistry registry = TeleportPadRegistry.get(deepBelow); + + // Landing pad uses same X/Z as player's current position (vertical teleport) + BlockPos currentPos = player.blockPosition(); + int targetX = currentPos.getX(); + int targetZ = currentPos.getZ(); + + // Find safe Y level for this X/Z position + BlockPos safePos = LandingZoneHelper.findSafeYLevel(deepBelow, targetX, targetZ, DESTINATION_SEARCH_START_Y); + + // Check if escape pad already exists at this position + if (registry.hasPadAt(safePos) && + LandingZoneHelper.isPadIntact(deepBelow, safePos, CosmicBlocks.DIVING_BELL_ESCAPE_PAD.get())) { + // Reuse existing pad + return safePos; + } + + // Need to create new platform + LandingZoneHelper.buildPlatform(deepBelow, safePos, new LandingZoneHelper.PlatformOptions( + Blocks.STONE, + CosmicBlocks.DIVING_BELL_ESCAPE_PAD.get(), + 1 // 3x3 platform + )); + + // Register in saved data + registry.registerPad(safePos); + + return safePos; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/ExoticCombustionEngineMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/ExoticCombustionEngineMachine.java new file mode 100644 index 000000000..a2f1071ce --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/ExoticCombustionEngineMachine.java @@ -0,0 +1,295 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKeys; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.fancy.IFancyTooltip; +import com.gregtechceu.gtceu.api.gui.fancy.TooltipsPanel; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; +import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; +import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; +import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; +import com.gregtechceu.gtceu.utils.FormattingUtil; +import com.gregtechceu.gtceu.utils.GTMath; +import com.gregtechceu.gtceu.utils.GTUtil; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import net.minecraft.ChatFormatting; +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.neoforged.neoforge.fluids.FluidStack; + +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class ExoticCombustionEngineMachine extends WorkableElectricMultiblockMachine implements ITieredMachine { + + + private String currentLubricant; + private String currentBooster; + @Getter + private final int tier; + // Probably a bad idea, most likely a better way to do this + @Getter + @DescSynced + private static final Object2IntMap lubricantTiers = new Object2IntOpenHashMap<>(); + @Getter + @DescSynced + private static final Object2IntMap boostingTiers = new Object2IntOpenHashMap<>(); + + static { + // Boosting Tiers + boostRecipes = new ArrayList<>(); + addBooster(CosmicMaterials.Ichor.getFluid(1), 3, 2); + addBooster(GTMaterials.Oxygen.getFluid(FluidStorageKeys.LIQUID, 1), 2, 1); + addBooster(GTMaterials.Oxygen.getFluid(1), 1, 1); + // Lubricant Tiers + lubricantRecipes = new ArrayList<>(); + addLube(CosmicMaterials.TearsOfTheUniverse.getFluid(FluidStorageKeys.LIQUID, 1), 4, 288); + addLube(CosmicMaterials.Triphenylphosphine.getFluid(FluidStorageKeys.LIQUID, 1), 3, 144); + addLube(GTMaterials.Lubricant.getFluid(1), 2, 72); + + } + + static List lubricantRecipes; + static List boostRecipes; + static final String LUBRICATION_KEY = "lubrication"; + static final String BOOST_KEY = "boost"; + static final String DURATION_KEY = "duration"; + + static void addLube(FluidStack lube, int lubrication, int duration) { + lubricantRecipes.add(GTRecipeBuilder.ofRaw() + .inputFluids(lube) + .addData(LUBRICATION_KEY, lubrication) + .addData(DURATION_KEY, duration) + .build()); + } + + static void addBooster(FluidStack booster, int boost, int duration) { + boostRecipes.add(GTRecipeBuilder.ofRaw() + .inputFluids(booster) + .addData(BOOST_KEY, boost) + .addData(DURATION_KEY, duration) + .build()); + } + + private int runningTimer = 0; + private int boostAmount = 0, boostDuration = 0; + private int lubeDuration = 0; + + public ExoticCombustionEngineMachine(BlockEntityCreationInfo holder, int tier) { + super(holder); + this.tier = tier; + } + + private boolean isIntakesObstructed() { + var dir = this.getFrontFacing(); + var axis = dir.getAxis(); + var centerPos = this.getBlockPos().relative(dir); + for (int x = -1; x < 2; x++) { + for (int y = -1; y < 2; y++) { + if (x == 0 && y == 0) + continue; + var blockPos = switch (axis) { + case X -> centerPos.offset(0, x, y); + case Y -> centerPos.offset(x, 0, y); + case Z -> centerPos.offset(x, y, 0); + }; + var blockState = this.getLevel().getBlockState(blockPos); + if (!blockState.isAir()) + return true; + } + } + return false; + } + + @Override + public long getOverclockVoltage() { + return GTValues.V[tier]; + } + + public static ModifierFunction recipeModifier(MetaMachine machine, GTRecipe recipe) { + if (!(machine instanceof ExoticCombustionEngineMachine engineMachine)) { + return RecipeModifier.nullWrongType(ExoticCombustionEngineMachine.class, machine); + } + long EUt = recipe.getOutputEUt().voltage(); + if (EUt * recipe.duration < 720) { + return ModifierFunction.NULL; + } + + Optional lubeRecipe = lubricantRecipes.stream().filter( + lr -> RecipeHelper.matchRecipe(engineMachine, lr).isSuccess()).findFirst(); + + // Has a variant of lubricant + if (EUt > 0 && !engineMachine.isIntakesObstructed() && lubeRecipe.isPresent()) { + int maxParallel = (int) (engineMachine.getOverclockVoltage() / EUt); + int actualParallel = ParallelLogic.getParallelAmount(engineMachine, recipe, maxParallel); + int tier = lubeRecipe.get().data.getInt(LUBRICATION_KEY); + float durationModifier = (tier / 2.0F); + double eutMultiplier; + int consumptionMult = 1; + if (engineMachine.boostAmount == 0) { + eutMultiplier = actualParallel; + } else { + consumptionMult = engineMachine.boostAmount * 2; + eutMultiplier = actualParallel * engineMachine.boostAmount * 3; + } + + return ModifierFunction.builder() + .inputModifier(ContentModifier.multiplier(consumptionMult * actualParallel)) + .outputModifier(ContentModifier.multiplier(actualParallel)) + .durationMultiplier(durationModifier) + .eutMultiplier(eutMultiplier) + .parallels(actualParallel) + .build(); + + } + return ModifierFunction.NULL; + } + + @Override + public boolean onWorking() { + boolean value = super.onWorking(); + var recipe = recipeLogic.getLastRecipe(); + if (recipe != null) { + long EUt = recipe.getOutputEUt().voltage(); + int duration = recipe.duration; + if ((EUt / recipe.parallels) * duration < 720) { + this.getRecipeLogic().setWaiting(Component.translatable("cosmiccore.errors.bad_fuel")); + + } + } + + if (lubeDuration <= 0) { + for (GTRecipe lubeRecipe : lubricantRecipes) { + if (RecipeHelper.matchRecipe(this, lubeRecipe).isSuccess() && + RecipeHelper.handleRecipeIO(this, lubeRecipe, IO.IN, getRecipeLogic().getChanceCaches()) + .isSuccess()) { + lubeDuration = lubeRecipe.data.getInt(DURATION_KEY); + currentLubricant = RecipeHelper.getInputFluids(lubeRecipe).get(0).getTranslationKey(); + break; + } + } + // no lubricant matched + if (lubeDuration == 0) { + recipeLogic.interruptRecipe(); + return false; + } + } + lubeDuration--; + + if (boostDuration <= 0) { + boostDuration = 1; + boostAmount = 0; + for (GTRecipe boostRecipe : boostRecipes) { + if (RecipeHelper.matchRecipe(this, boostRecipe).isSuccess() && + RecipeHelper.handleRecipeIO(this, boostRecipe, IO.IN, getRecipeLogic().getChanceCaches()) + .isSuccess()) { + boostAmount = boostRecipe.data.getInt(BOOST_KEY); + boostDuration = boostRecipe.data.getInt(DURATION_KEY); + currentBooster = RecipeHelper.getInputFluids(boostRecipe).get(0).getTranslationKey(); + break; + } + } + } + boostDuration--; + + runningTimer++; + if (runningTimer > 72000) runningTimer %= 72000; + + return value; + } + + @Override + public boolean regressWhenWaiting() { + return false; + } + + @Override + public void addDisplayText(List textList) { + MultiblockDisplayText.Builder builder = MultiblockDisplayText.builder(textList, isFormed()) + .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()); + var voltageName = Component.literal(GTValues.VNF[GTUtil.getFloorTierByVoltage(getOverclockVoltage())]); + var amperageName = boostAmount != 0 ? boostAmount * 3 : boostAmount; + if (recipeLogic.isSuspend() && !recipeLogic.getFancyTooltip().isEmpty()) { + builder.addCustom(t -> t.add(recipeLogic.getFancyTooltip().get(0))); + return; + } + builder.addCustom(t -> t.add(Component.translatable("gtceu.multiblock.max_energy_per_tick_amps", + FormattingUtil.formatNumbers(getOverclockVoltage() * amperageName), + amperageName, voltageName).withStyle(ChatFormatting.GRAY))); + if (isActive() && isWorkingEnabled()) { + builder.addCurrentEnergyProductionLine( + recipeLogic.getLastRecipe() != null ? recipeLogic.getLastRecipe().getOutputEUt().voltage() : 0); + } + + builder.addFuelNeededLine(getRecipeFluidInputInfo(), recipeLogic.getDuration()); + + if (isFormed && currentBooster != null) { + builder.addCustom(tl -> tl.add(Component + .translatable("cosmiccore.multiblock.booster_used", + Component.translatable(currentBooster)) + .withStyle(ChatFormatting.AQUA))); + } + + if (isFormed && currentLubricant != null) { + builder.addCustom(tl -> tl.add(Component + .translatable("cosmiccore.multiblock.lubricant_used", + Component.translatable(currentLubricant)) + .withStyle(ChatFormatting.YELLOW))); + } + + builder.addWorkingStatusLine(); + } + + @Nullable + public String getRecipeFluidInputInfo() { + // Previous Recipe is always null on first world load, so try to acquire a new recipe + GTRecipe recipe = recipeLogic.getLastRecipe(); + if (recipe == null) { + Iterator iterator = recipeLogic.searchRecipe(); + // noinspection ConstantValue + recipe = iterator != null && iterator.hasNext() ? iterator.next() : null; + if (recipe == null) return null; + } + FluidStack requiredFluidInput = RecipeHelper.getInputFluids(recipe).get(0); + + long ocAmount = getMaxVoltage() / recipe.getOutputEUt().voltage(); + int neededAmount = GTMath.saturatedCast(ocAmount * requiredFluidInput.getAmount()); + return ChatFormatting.RED + FormattingUtil.formatNumbers(neededAmount) + "mB"; + } + + @Override + public void attachTooltips(TooltipsPanel tooltipsPanel) { + super.attachTooltips(tooltipsPanel); + tooltipsPanel.attachTooltips(new IFancyTooltip.Basic( + () -> GuiTextures.INDICATOR_NO_STEAM.get(false), + () -> List.of(Component.translatable("gtceu.multiblock.large_combustion_engine.obstructed") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))), + this::isIntakesObstructed, + () -> null)); + } + +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/FloralPropagatorMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/FloralPropagatorMachine.java new file mode 100644 index 000000000..e8c06974d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/FloralPropagatorMachine.java @@ -0,0 +1,13 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; + +public class FloralPropagatorMachine extends WorkableElectricMultiblockMachine { + + + public FloralPropagatorMachine(BlockEntityCreationInfo holder) { + super(holder); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/LarvaMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/LarvaMachine.java new file mode 100644 index 000000000..fccfaf69c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/LarvaMachine.java @@ -0,0 +1,476 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; +import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; +import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.ghostipedia.cosmiccore.utils.ItemData; + +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.machine.multiblock.part.ItemBusPartMachine; +import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; + +import net.minecraft.core.component.DataComponents; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.block.Blocks; +import net.neoforged.neoforge.fluids.FluidStack; + +import com.mojang.datafixers.util.Pair; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.SCANNER_RECIPES; +import static com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour.getCircuitConfiguration; + +public class LarvaMachine extends WorkableElectricMultiblockMachine { + + private static ItemStack getNamedPaper(String name) { + ItemStack stack = new ItemStack(Items.PAPER); + stack.set(DataComponents.CUSTOM_NAME, Component.literal(name)); + return stack; + } + + public LarvaMachine(BlockEntityCreationInfo holder) { + super(holder, m -> new LarvaRecipeLogic((LarvaMachine) m)); + } + + public static String ASTROID_NBT_TYPE = "AsteroidType"; + public static String ASTROID_NBT_TIER = "Tier"; + public static String ASTEROID_SIZE = "Size"; + + private static Map> LARVA_LOOTTABLE = null; + private static Map LARVA_TIERS = null; + private static Map> LARVA_INPUTS = null; + private static Map RESEARCH_RECIPES = null; + + public static int getAsteroidSize(ItemStack stack) { + if (stack.isEmpty()) return 0; + return ItemData.readTag(stack).getInt(ASTEROID_SIZE); + } + + private static ItemStack setAsteroidSize(ItemStack stack, int size) { + if (stack.isEmpty()) return stack; + ItemData.mutateTag(stack, tag -> tag.putInt(ASTEROID_SIZE, size)); + return stack; + } + + public static ItemStack getAstroidDataChip(String id, int tier) { + ItemStack stack = CosmicItems.TARGETING_CHIP.asStack(); + ItemData.mutateTag(stack, tag -> { + tag.putString(ASTROID_NBT_TYPE, id); + tag.putInt(ASTROID_NBT_TIER, tier); + }); + return stack; + } + + // This gets called from our CosmicRecipes class, not anywhere here. Put here to centralize recipe creation. + public static void generateTargettingChipRecipes(RecipeOutput provider) { + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("carbonic_asteroid")) + .inputItems(new ItemStack(Blocks.IRON_ORE.asItem(), 1)) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("carbonic_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("ferric_asteroid")) + .inputItems(new ItemStack(Blocks.IRON_ORE.asItem(), 1)) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("ferric_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("rare_metal_asteroid")) + .inputItems(TagPrefix.rawOre, GTMaterials.Cooperite) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("rare_metal_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("auric_asteroid")) + .inputItems(TagPrefix.rawOre, GTMaterials.Gold) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("auric_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("brimstone_asteroid")) + .inputItems(TagPrefix.dust, GTMaterials.Netherrack) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("brimstone_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("lith_asteroid")) + .inputItems(TagPrefix.rawOre, GTMaterials.CertusQuartz) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("lith_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("mafic_asteroid")) + .inputItems(TagPrefix.rawOre, GTMaterials.Tungstate) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("mafic_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("mossy_asteroid")) + .inputItems(TagPrefix.rawOre, GTMaterials.Emerald) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("mossy_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("occult_asteroid")) + .inputItems(TagPrefix.rawOre, GTMaterials.Alunite) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("occult_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("oxide_asteroid")) + .inputFluids(GTMaterials.Ice, 1000) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("oxide_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("sanguine_asteroid")) + .inputItems(TagPrefix.rawOre, CosmicMaterials.Moondrop) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("sanguine_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + SCANNER_RECIPES.recipeBuilder(CosmicCore.id("wasteland_asteroid")) + .inputItems(TagPrefix.rawOre, CosmicMaterials.PaleOreBad) + .inputItems(CosmicItems.TARGETING_CHIP.asStack()) + .outputItems(getAstroidDataChip("wasteland_asteroid", 1)) + .duration(40) + .EUt(GTValues.VA[GTValues.HV]) + .save(provider); + } + + private static Map> getLarvaLoottable() { + if (LARVA_LOOTTABLE == null) { + LARVA_LOOTTABLE = new HashMap<>(); + // spotless: off + // Beetle Data Orb (NC) -> Tier (0-based)-> -> Astroid + LARVA_LOOTTABLE.put(getAstroidDataChip("carbonic_asteroid", 1), + Pair.of(0, CosmicItems.CARBON_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("ferric_asteroid", 1), + Pair.of(0, CosmicItems.FERRIC_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("rare_metal_asteroid", 1), + Pair.of(0, CosmicItems.RARE_METAL_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("auric_asteroid", 1), + Pair.of(0, CosmicItems.AURIC_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("brimstone_asteroid", 1), + Pair.of(0, CosmicItems.BRIMSTONE_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("lith_asteroid", 1), + Pair.of(0, CosmicItems.LITH_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("mafic_asteroid", 1), + Pair.of(0, CosmicItems.MAFIC_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("mossy_asteroid", 1), + Pair.of(0, CosmicItems.MOSSY_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("occult_asteroid", 1), + Pair.of(0, CosmicItems.OCCULT_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("oxide_asteroid", 1), + Pair.of(0, CosmicItems.OXIDE_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("sanguine_asteroid", 1), + Pair.of(0, CosmicItems.SANGUINE_ASTEROID.asStack())); + LARVA_LOOTTABLE.put(getAstroidDataChip("wasteland_asteroid", 1), + Pair.of(0, CosmicItems.WASTELAND_ASTEROID.asStack())); + // spotless: on + } + return LARVA_LOOTTABLE; + } + + private static Map getLarvaTiers() { + if (LARVA_TIERS == null) { + LARVA_TIERS = new HashMap<>(); + LARVA_TIERS.put(CosmicItems.HAULER_PROBE_GRADE_1.asStack(), 0); + LARVA_TIERS.put(CosmicItems.HAULER_PROBE_GRADE_2.asStack(), 1); + LARVA_TIERS.put(CosmicItems.HAULER_PROBE_GRADE_3.asStack(), 2); + LARVA_TIERS.put(CosmicItems.HAULER_PROBE_GRADE_4.asStack(), 3); + LARVA_TIERS.put(CosmicItems.HAULER_PROBE_GRADE_5.asStack(), 4); + } + return LARVA_TIERS; + } + + private static Map> getLarvaInputs() { + if (LARVA_INPUTS == null) { + LARVA_INPUTS = new HashMap<>(); + LARVA_INPUTS.put(0, Pair.of(CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(4), + GTMaterials.RocketFuel.getFluid(8000))); + LARVA_INPUTS.put(1, Pair.of(CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(16), + GTMaterials.RocketFuel.getFluid(16000))); + LARVA_INPUTS.put(2, Pair.of(CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(64), + GTMaterials.RocketFuel.getFluid(64000))); + LARVA_INPUTS.put(3, Pair.of(CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(256), + GTMaterials.RocketFuel.getFluid(256000))); + LARVA_INPUTS.put(4, Pair.of(CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(1024), + GTMaterials.RocketFuel.getFluid(1024000))); + } + return LARVA_INPUTS; + } + + public static class LarvaRecipeLogic extends RecipeLogic { + + public LarvaRecipeLogic(LarvaMachine machine) { + super(machine); + } + + @Override + public @NotNull Iterator searchRecipe() { + var larvaMachine = (LarvaMachine) machine; + + // Available Fluid Stacks in the multiblock (for checking cable+coolant) + var availableFluids = new ArrayList(); + // Available Item Stacks in the multiblock (for checking cable+coolant) + var availableItems = new ArrayList(); + + // Inputs set to be consumed + var finalRecipeItemInputs = new ArrayList(); + var finalRecipeFluidInputs = new ArrayList(); + + // Outputs for the recipe + var finalRecipeItemOutputs = new ArrayList(); + + var fluidHandlers = machine.getCapabilitiesFlat(IO.IN, FluidRecipeCapability.CAP); + for (var handler : fluidHandlers) { + if (!(handler instanceof NotifiableFluidTank itemHandler)) continue; + for (var content : itemHandler.getContents()) { + if (!(content instanceof FluidStack stack)) continue; + availableFluids.add(stack.copy()); + } + } + + var itemHandlers = machine.getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP); + for (var handler : itemHandlers) { + if (!(handler instanceof NotifiableItemStackHandler itemHandler)) continue; + for (var content : itemHandler.getContents()) { + if (!(content instanceof ItemStack stack)) continue; + availableItems.add(stack.copy()); + } + } + + var tiers = getLarvaTiers(); + var lootTable = getLarvaLoottable(); + var inputs = getLarvaInputs(); + + var parts = larvaMachine.getParts(); + for (var part : parts) { + // TODO: Make this specifically be our new bus + if (!(part instanceof ItemBusPartMachine itemBus)) continue; + if (!itemBus.getInventory().handlerIO.equals(IO.IN)) continue; + + // Find tier and output + // Enforced through the filters in the bus: 1 larva and 1 data orb per bus + var tier = -1; + ItemStack output = null; + + for (var content : itemBus.getInventory().getContents()) { + if (!(content instanceof ItemStack stack)) continue; + var tempTier = mapGet(tiers, stack); + if (tempTier == null) continue; + tier = tempTier; + } + if (tier == -1) continue; + + for (var content : itemBus.getInventory().getContents()) { + if (!(content instanceof ItemStack stack)) continue; + var loot = mapGet(lootTable, stack); + if (loot == null) continue; + // Tier is lower than needed for recipe; Throw here? Let the user know somehow? + if (tier < loot.getFirst()) continue; + output = loot.getSecond(); + } + if (output == null) continue; + + // TODO: For now circuit is a dumb parallel with 0 being 1x, 1 being 2x etc + + var circuit = itemBus.getCircuitInventory(); + var circuitStack = circuit.getStackInSlot(0); + var multiplier = getCircuitConfiguration(circuitStack) + 1; + + var recipeInputs = inputs.get(tier); + var itemInput = recipeInputs.getFirst().copy(); + var fluidInput = recipeInputs.getSecond().copy(); + var itemOutput = output.copy(); + itemInput.setCount(recipeInputs.getFirst().getCount() * multiplier); + fluidInput.setAmount(recipeInputs.getSecond().getAmount() * multiplier); + // Should do it? This'll set the NBT of the asteroid appropriately + var sizedAsteroid = setAsteroidSize(itemOutput, getCircuitConfiguration(circuitStack)); + + if (canConsumeItem(availableItems, itemInput) && + canConsumeFluid(availableFluids, fluidInput)) { + // Subtract the inputs from our list of available inputs + consumeItem(availableItems, itemInput); + // Subtract the inputs from our list of available inputs + consumeItem(availableItems, itemInput); + consumeFluid(availableFluids, fluidInput); + + // actually add inputs and outputs to the lists for the final recipe + finalRecipeItemInputs.add(itemInput); + finalRecipeFluidInputs.add(fluidInput); + finalRecipeItemOutputs.add(sizedAsteroid); + } else { + // not enough inputs + } + + } + if (finalRecipeItemOutputs.isEmpty()) { + return Collections.emptyIterator(); + } + + var builder = GTRecipeBuilder + .of(CosmicCore.id("larva_recipe"), CosmicRecipeTypes.BEES) + .EUt(GTValues.VA[GTValues.ZPM]) + .duration(20 * 60); + + for (var itemInput : finalRecipeItemInputs) { + builder.inputItems(itemInput); + } + for (var inputFluid : finalRecipeFluidInputs) { + builder.inputFluids(inputFluid); + } + for (var outputItem : finalRecipeItemOutputs) { + builder.outputItems(outputItem); + } + + return Collections.singleton(builder.build()).iterator(); + } + + // Helper function for accessing map based on Itemstack.isSameItemSameTags + + private static V mapGet(Map map, ItemStack item) { + if (item == null) return null; + for (var entry : map.entrySet()) { + if (ItemStack.isSameItemSameComponents(item, entry.getKey())) { + return entry.getValue(); + } + } + return null; + } + + /** + * Checks if the given item can be fully consumed from the list. + */ + private static boolean canConsumeItem(List available, ItemStack toConsume) { + if (toConsume.isEmpty()) { + return true; + } + + int remaining = toConsume.getCount(); + + for (ItemStack stack : available) { + if (ItemStack.isSameItemSameComponents(stack, toConsume)) { + remaining -= stack.getCount(); + if (remaining <= 0) { + return true; + } + } + } + + return false; + } + + /** + * Attempts to consume the given item from the list. + * Returns true if the full amount was successfully removed, false otherwise. + * Mutates the list’s stack counts and empties stacks as needed. + */ + private static boolean consumeItem(List available, ItemStack toConsume) { + if (toConsume.isEmpty()) { + return true; + } + + int remaining = toConsume.getCount(); + + for (ItemStack stack : available) { + if (ItemStack.isSameItemSameComponents(stack, toConsume)) { + int taken = Math.min(stack.getCount(), remaining); + stack.shrink(taken); + remaining -= taken; + if (remaining <= 0) { + return true; + } + } + } + + return false; // not enough found + } + + /** + * Checks if the given fluid can be fully consumed from the list. + */ + private static boolean canConsumeFluid(List available, FluidStack toConsume) { + if (toConsume.isEmpty()) { + return true; + } + + int needed = toConsume.getAmount(); + + for (FluidStack stack : available) { + if (toConsume.isFluidEqual(stack)) { + needed -= stack.getAmount(); + if (needed <= 0) { + return true; + } + } + } + + return false; + } + + /** + * Removes the given fluid amount from matching stacks in the list. + * Returns true if the full amount was successfully removed, false otherwise. + * Mutates the list’s FluidStacks. + */ + private static boolean consumeFluid(List available, FluidStack toConsume) { + if (toConsume.isEmpty()) { + return true; + } + + int remaining = toConsume.getAmount(); + + for (FluidStack stack : available) { + if (toConsume.isFluidEqual(stack)) { + int taken = Math.min(stack.getAmount(), remaining); + stack.shrink(taken); + remaining -= taken; + + if (remaining <= 0) { + return true; + } + } + } + + return false; + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/LinkTestStationMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/LinkTestStationMachine.java new file mode 100644 index 000000000..3e7e8e695 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/LinkTestStationMachine.java @@ -0,0 +1,105 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock; +import com.ghostipedia.cosmiccore.api.machine.multiblock.LinkedWorkableElectricMultiblockMachine; + +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.GlobalPos; +import net.minecraft.network.chat.Component; + +import java.util.List; +import java.util.Set; + +/** + * Simple test multiblock for verifying cross-dimensional linking. + * Displays linked partners in UI and logs link events. + */ +public class LinkTestStationMachine extends LinkedWorkableElectricMultiblockMachine { + + + public LinkTestStationMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + + // ==================== Link Configuration ==================== + + @Override + public LinkRole getLinkRole() { + // Test station is a peer - can link bidirectionally + return LinkRole.PEER; + } + + @Override + public int getMaxPartners() { + // Allow up to 4 partners for testing + return 4; + } + + @Override + public boolean canLinkTo(GlobalPos partner, ILinkedMultiblock partnerMachine) { + // Accept links from any ILinkedMultiblock for testing + return true; + } + + // ==================== Link Lifecycle ==================== + + @Override + public void onLinkEstablished(GlobalPos partner) { + super.onLinkEstablished(partner); + CosmicCore.LOGGER.info("[LinkTestStation] Link established to {} in {}", + partner.pos(), partner.dimension().location()); + } + + @Override + public void onLinkBroken(GlobalPos partner) { + super.onLinkBroken(partner); + CosmicCore.LOGGER.info("[LinkTestStation] Link broken to {} in {}", + partner.pos(), partner.dimension().location()); + } + + // ==================== Display ==================== + + @Override + public void addDisplayText(List textList) { + super.addDisplayText(textList); + + if (!isFormed()) return; + + // Show link status + Set partners = getLinkedPartners(); + if (partners.isEmpty()) { + textList.add(Component.literal("No linked partners") + .withStyle(ChatFormatting.GRAY)); + textList.add(Component.literal("Use datastick to link") + .withStyle(ChatFormatting.DARK_GRAY)); + } else { + textList.add(Component.literal("Linked Partners: " + partners.size()) + .withStyle(ChatFormatting.GREEN)); + + for (GlobalPos partner : partners) { + String dim = partner.dimension().location().toString(); + String pos = String.format("[%d, %d, %d]", + partner.pos().getX(), + partner.pos().getY(), + partner.pos().getZ()); + + // Show if partner is online + boolean online = getPartnerMachine(partner) != null; + ChatFormatting color = online ? ChatFormatting.GREEN : ChatFormatting.RED; + String status = online ? "[+]" : "[-]"; + + textList.add(Component.literal(" " + status + " " + dim + " " + pos) + .withStyle(color)); + } + } + + // Show effective roles + LinkRole myRole = getLinkRole(); + textList.add(Component.literal("Role: " + myRole.name()) + .withStyle(ChatFormatting.AQUA)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/ManaDigitizerMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/ManaDigitizerMachine.java new file mode 100644 index 000000000..193256ecd --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/ManaDigitizerMachine.java @@ -0,0 +1,129 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.part.CropHolderPartMachines; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.IEnergyContainer; +import com.gregtechceu.gtceu.api.capability.recipe.*; +import com.gregtechceu.gtceu.api.fluids.store.FluidStorageKeys; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; +import com.gregtechceu.gtceu.api.misc.EnergyContainerList; +import com.gregtechceu.gtceu.common.data.GTMaterials; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.neoforged.neoforge.fluids.FluidStack; + +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; +import it.unimi.dsi.fastutil.objects.Object2IntMap; +import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.annotation.Nullable; + +public class ManaDigitizerMachine extends WorkableElectricMultiblockMachine { + + @Nullable + protected EnergyContainerList inputEnergyContainers; + @DescSynced + private static final Object2IntMap validIngredients = new Object2IntOpenHashMap<>(); + @DescSynced + private static final Object2IntMap validIngredientsFluids = new Object2IntOpenHashMap<>(); + + @Nullable + protected TickableSubscription botanySubs; + + static { + // Boosting Tiers + validIngredients.put(Items.TNT, 1); + validIngredientsFluids.put(GTMaterials.Argon.getFluid(FluidStorageKeys.PLASMA, 1), 3); + } + + public ManaDigitizerMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + + List inputEnergyContainers = new ArrayList<>(); + Map ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", Long2ObjectMaps::emptyMap); + for (IMultiPart part : getParts()) { + IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.IN); + if (io == IO.NONE || io == IO.OUT) continue; + var handlers = part.getRecipeHandlers(); + for (var handler : handlers) { + IO handlerIO = handler.getHandlerIO(); + if (handlerIO == IO.IN) { + var containers = handler.getCapability(EURecipeCapability.CAP).stream() + .filter(IEnergyContainer.class::isInstance) + .map(IEnergyContainer.class::cast) + .toList(); + inputEnergyContainers.addAll(containers); + traitSubscriptions.add(handler.subscribe(this::updateBotanySubscription)); + + } + } + } + this.inputEnergyContainers = new EnergyContainerList(inputEnergyContainers); + updateBotanySubscription(); + } + + protected void updateBotanySubscription() { + if (isFormed) { + botanySubs = subscribeServerTick(botanySubs, this::updateBotanyTick); + } + } + + protected void updateBotanyTick() { + if (!isWorkingEnabled() || inputEnergyContainers == null) { + return; + } + var cropList = getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP) + .stream().filter(IRecipeHandler::shouldSearchContent) + .filter(CropHolderPartMachines.class::isInstance) + .map(container -> container.getContents() + .stream() + .filter(ItemStack.class::isInstance) + .map(ItemStack.class::cast) + .filter(s -> !s.isEmpty()) + .toList()) + .toList(); + int flowers = 0; + for (int i = 0; i < cropList.size(); i++) { + if (!cropList.get(i).isEmpty()) { + flowers++; + } + } + + if (inputEnergyContainers.getEnergyStored() > GTValues.V[6] * flowers) { + inputEnergyContainers.removeEnergy(GTValues.V[6] * flowers); + } else { + // Stop Item/Fluid Generation + } + } + + @Override + public void onLoad() { + super.onLoad(); + if (!isRemote() && isFormed()) { + updateBotanySubscription(); + } + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + this.inputEnergyContainers = null; + updateBotanySubscription(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MothCargoDropOffMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MothCargoDropOffMachine.java new file mode 100644 index 000000000..ebaffce42 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MothCargoDropOffMachine.java @@ -0,0 +1,131 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock; +import com.ghostipedia.cosmiccore.api.machine.multiblock.LinkedWorkableMultiblockMachine; + +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; + +import net.minecraft.ChatFormatting; +import net.minecraft.core.GlobalPos; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; +import net.neoforged.neoforge.items.IItemHandler; + +import java.util.ArrayList; +import java.util.List; + +/** + * Moth Cargo Drop Off - The "receiver" multiblock for the Cargo Moths system. + *

+ * Receives items and fluids from linked Moth Cargo Stations. + * Does NOT require power - just a place for moths to land! + *

+ * This is a simple, compact multiblock designed for easy placement at outposts. + */ +public class MothCargoDropOffMachine extends LinkedWorkableMultiblockMachine { + + + // ==================== Constructor ==================== + + public MothCargoDropOffMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + + // ==================== Linking Overrides ==================== + + @Override + public LinkRole getLinkRole() { + // Drop Off is REMOTE - it receives from Stations but doesn't initiate + return LinkRole.REMOTE; + } + + @Override + public int getMaxPartners() { + // Can receive from multiple stations (N:1 support) + return 16; + } + + @Override + public boolean canLinkTo(GlobalPos partner, ILinkedMultiblock partnerMachine) { + // Only link to Cargo Stations + if (!(partnerMachine instanceof MothCargoStationMachine)) { + return false; + } + + // Same dimension only + GlobalPos myPos = getGlobalPos(); + if (myPos == null) return false; + + return myPos.dimension().equals(partner.dimension()); + } + + // ==================== Handler Access ==================== + + /** + * Get all item output handlers from the multiblock. + * Called by MothCargoStationMachine to insert items. + */ + public List getItemOutputHandlers() { + List handlers = new ArrayList<>(); + + var itemCaps = getCapabilitiesFlat(IO.OUT, ItemRecipeCapability.CAP); + if (itemCaps != null) { + for (var handler : itemCaps) { + if (handler instanceof NotifiableItemStackHandler itemHandler) { + handlers.add(itemHandler); + } + } + } + + return handlers; + } + + /** + * Get all fluid output handlers from the multiblock. + * Called by MothCargoStationMachine to insert fluids. + */ + public List getFluidOutputHandlers() { + List handlers = new ArrayList<>(); + + var fluidCaps = getCapabilitiesFlat(IO.OUT, FluidRecipeCapability.CAP); + if (fluidCaps != null) { + for (var handler : fluidCaps) { + if (handler instanceof NotifiableFluidTank fluidHandler) { + handlers.add(fluidHandler); + } + } + } + + return handlers; + } + + // ==================== UI ==================== + + @Override + public void addDisplayText(List textList) { + if (!isFormed()) { + textList.add(Component.literal("Structure not formed") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + return; + } + + // Linked stations + int linkedCount = getLinkedPartners().size(); + if (linkedCount > 0) { + textList.add(Component.literal("Receiving from " + linkedCount + " station(s)") + .setStyle(Style.EMPTY.withColor(ChatFormatting.GREEN))); + } else { + textList.add(Component.literal("No stations linked!") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + textList.add(Component.literal("Use a datastick to link to a Moth Cargo Station") + .setStyle(Style.EMPTY.withColor(ChatFormatting.GRAY))); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MothCargoStationMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MothCargoStationMachine.java new file mode 100644 index 000000000..570ffb0a6 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MothCargoStationMachine.java @@ -0,0 +1,643 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock; +import com.ghostipedia.cosmiccore.api.machine.multiblock.LinkedWorkableMultiblockMachine; +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.MothCargoStation; + +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.GlobalPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.capability.IFluidHandler; +import net.neoforged.neoforge.items.IItemHandler; + +import lombok.Getter; +import lombok.Setter; + +import java.util.*; + +/** + * Moth Cargo Station - The "sender" multiblock for the Cargo Moths system. + *

+ * Ships items and fluids to linked Moth Cargo Drop Off stations using moths. + * Does NOT require power - just moths! + *

+ * Features: + *

    + *
  • Cycle-based shipping (configurable via moth home tiers)
  • + *
  • Multiple distribution modes (1:1, 1:N fill first, 1:N round robin, N:1)
  • + *
  • Feeding bonuses from honey/oil
  • + *
  • Same-dimension only linking
  • + *
+ */ +public class MothCargoStationMachine extends LinkedWorkableMultiblockMachine { + + + // ==================== Constants ==================== + + /** Base items per moth per cycle (1 stack) */ + public static final int BASE_ITEMS_PER_MOTH = 64; + /** Base fluid per moth per cycle (1000 mB) */ + public static final int BASE_FLUID_PER_MOTH = 1000; + + /** Cycle times in ticks per tier (T1=60s, T2=30s, T3=15s, T4=5s) */ + public static final int[] CYCLE_TICKS_BY_TIER = { 1200, 600, 300, 100 }; + /** Moths per home by tier (T1=1, T2=2, T3=4, T4=8) */ + public static final int[] MOTHS_PER_HOME_BY_TIER = { 1, 2, 4, 8 }; + /** Max moth homes per station */ + public static final int MAX_MOTH_HOMES = 5; + + /** Feeding multipliers */ + public static final int MULTIPLIER_REGULAR_HONEY = 2; + public static final int MULTIPLIER_LOFTY_HONEY = 4; + public static final int MULTIPLIER_PALE_OIL = 8; + + // ==================== Distribution Modes ==================== + + public enum DistributionMode { + /** Direct 1:1 transfer to single receiver */ + DIRECT, + /** Fill receivers in order until full, then move to next */ + FILL_FIRST, + /** Distribute equally across all receivers (round robin) */ + ROUND_ROBIN + } + + // ==================== State ==================== + + @Persisted + @DescSynced + @Getter + @Setter + private DistributionMode distributionMode = DistributionMode.FILL_FIRST; + + @Persisted + @Getter + private int mothHomeTier = 1; // 1-4 + + @Persisted + @Getter + private int mothHomeCount = 0; // 0-5 + + @Persisted + private int ticksSinceLastCycle = 0; + + @Persisted + private int roundRobinIndex = 0; + + @Persisted + @DescSynced + @Getter + private int currentFeedingMultiplier = 1; + + private TickableSubscription shippingSubscription; + + // ==================== Constructor ==================== + + public MothCargoStationMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + + // ==================== Linking Overrides ==================== + + @Override + public LinkRole getLinkRole() { + // Station is the CONTROLLER - it initiates transfers to Drop Offs + return LinkRole.CONTROLLER; + } + + @Override + public int getMaxPartners() { + // Can link to multiple drop-off points + return 16; + } + + @Override + public boolean canLinkTo(GlobalPos partner, ILinkedMultiblock partnerMachine) { + // Only link to Drop Off stations + if (!(partnerMachine instanceof MothCargoDropOffMachine)) { + return false; + } + + // Same dimension only + GlobalPos myPos = getGlobalPos(); + if (myPos == null) return false; + + return myPos.dimension().equals(partner.dimension()); + } + + // ==================== Lifecycle ==================== + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + + // Scan for moth homes in structure + scanForMothHomes(); + + subscribeToShipping(); + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + unsubscribeFromShipping(); + // Reset moth home stats + mothHomeTier = 0; + mothHomeCount = 0; + } + + @Override + public void onUnload() { + super.onUnload(); + unsubscribeFromShipping(); + } + + /** + * Scan the multiblock structure for Forestry beehive blocks (used as moth homes). + * Sets mothHomeTier and mothHomeCount based on what's found. + * All moth homes must be the same tier. + * + * Tier mapping: + * T1: forestry:beehive_forest + * T2: forestry:beehive_lush + * T3: forestry:beehive_desert + * T4: forestry:beehive_end + */ + private void scanForMothHomes() { + Level level = getLevel(); + if (level == null) { + mothHomeTier = 0; + mothHomeCount = 0; + return; + } + + BlockPos controllerPos = getBlockPos(); + int foundTier = 0; + int foundCount = 0; + boolean mixedTiers = false; + + // Scan a 7x7x7 region around the controller (covers 5x5x5 structure plus margin) + int scanRadius = 3; + for (int x = -scanRadius; x <= scanRadius; x++) { + for (int y = -scanRadius; y <= scanRadius; y++) { + for (int z = -scanRadius; z <= scanRadius; z++) { + BlockPos checkPos = controllerPos.offset(x, y, z); + net.minecraft.world.level.block.Block block = level.getBlockState(checkPos).getBlock(); + ResourceLocation blockId = BuiltInRegistries.BLOCK.getKey(block); + + int tier = getBeehiveTier(blockId); + if (tier > 0) { + if (foundCount == 0) { + // First moth home found - set the tier + foundTier = tier; + foundCount = 1; + } else if (tier == foundTier) { + // Same tier - count it + foundCount++; + } else { + // Mixed tiers detected + mixedTiers = true; + } + } + } + } + } + + // Enforce same-tier requirement + if (mixedTiers) { + CosmicCore.LOGGER.warn("Moth Cargo Station at {} has mixed tier moth homes - using lowest functionality", + controllerPos); + // Still use what we found, but warn + } + + // Cap at max moth homes + foundCount = Math.min(foundCount, MAX_MOTH_HOMES); + + mothHomeTier = foundTier; + mothHomeCount = foundCount; + + CosmicCore.LOGGER.debug("Moth Cargo Station at {} found {} T{} moth homes", + controllerPos, mothHomeCount, mothHomeTier); + } + + /** + * Get the tier of a beehive block by its registry name. + * + * @return tier (1-4) or 0 if not a valid beehive + */ + private int getBeehiveTier(ResourceLocation blockId) { + if (blockId.equals(MothCargoStation.BEEHIVE_FOREST)) return 1; + if (blockId.equals(MothCargoStation.BEEHIVE_LUSH)) return 2; + if (blockId.equals(MothCargoStation.BEEHIVE_DESERT)) return 3; + if (blockId.equals(MothCargoStation.BEEHIVE_END)) return 4; + return 0; + } + + private void subscribeToShipping() { + if (shippingSubscription == null) { + shippingSubscription = subscribeServerTick(this::onShippingTick); + } + } + + private void unsubscribeFromShipping() { + if (shippingSubscription != null) { + shippingSubscription.unsubscribe(); + shippingSubscription = null; + } + } + + // ==================== Shipping Logic ==================== + + private void onShippingTick() { + if (!isFormed() || getLevel() == null || getLevel().isClientSide()) { + return; + } + + // Check if we have moths + if (mothHomeCount <= 0) { + return; + } + + ticksSinceLastCycle++; + + int cycleTime = getCycleTimeTicks(); + if (ticksSinceLastCycle >= cycleTime) { + ticksSinceLastCycle = 0; + performShippingCycle(); + } + } + + /** + * Get the cycle time in ticks based on moth home tier. + */ + public int getCycleTimeTicks() { + int tierIndex = Math.max(0, Math.min(mothHomeTier - 1, CYCLE_TICKS_BY_TIER.length - 1)); + return CYCLE_TICKS_BY_TIER[tierIndex]; + } + + /** + * Get total moths available for shipping. + */ + public int getTotalMoths() { + int tierIndex = Math.max(0, Math.min(mothHomeTier - 1, MOTHS_PER_HOME_BY_TIER.length - 1)); + return mothHomeCount * MOTHS_PER_HOME_BY_TIER[tierIndex]; + } + + /** + * Get capacity per cycle (items or mB). + */ + public int getCapacityPerCycle(boolean isFluid) { + int baseCapacity = isFluid ? BASE_FLUID_PER_MOTH : BASE_ITEMS_PER_MOTH; + return getTotalMoths() * baseCapacity * currentFeedingMultiplier; + } + + /** + * Perform one shipping cycle - transfer items/fluids to linked drop-offs. + */ + private void performShippingCycle() { + Set partners = getLinkedPartners(); + if (partners.isEmpty()) { + return; + } + + // Get list of valid, formed drop-off partners + List dropOffs = getActiveDropOffs(partners); + if (dropOffs.isEmpty()) { + return; + } + + // Calculate capacity for this cycle + int itemCapacity = getCapacityPerCycle(false); + int fluidCapacity = getCapacityPerCycle(true); + + // Ship items + shipItems(dropOffs, itemCapacity); + + // Ship fluids + shipFluids(dropOffs, fluidCapacity); + + // Consume feeding materials (TODO) + consumeFeedingMaterials(); + } + + /** + * Get active (formed and loaded) drop-off machines from partner list. + */ + private List getActiveDropOffs(Set partners) { + List result = new ArrayList<>(); + + if (!(getLevel() instanceof ServerLevel serverLevel)) { + return result; + } + + for (GlobalPos partner : partners) { + MetaMachine machine = LinkedMultiblockHelper.getMachine(serverLevel.getServer(), partner); + if (machine instanceof MothCargoDropOffMachine dropOff && dropOff.isFormed()) { + result.add(dropOff); + } + } + + return result; + } + + /** + * Ship items to drop-offs based on distribution mode. + */ + private void shipItems(List dropOffs, int maxItems) { + // Get our input items + List inputHandlers = getItemInputHandlers(); + if (inputHandlers.isEmpty()) { + return; + } + + int remainingCapacity = maxItems; + + switch (distributionMode) { + case DIRECT -> { + // Ship to first drop-off only + if (!dropOffs.isEmpty()) { + remainingCapacity = shipItemsToDropOff(dropOffs.get(0), inputHandlers, remainingCapacity); + } + } + case FILL_FIRST -> { + // Fill each drop-off in order until capacity exhausted + for (MothCargoDropOffMachine dropOff : dropOffs) { + if (remainingCapacity <= 0) break; + remainingCapacity = shipItemsToDropOff(dropOff, inputHandlers, remainingCapacity); + } + } + case ROUND_ROBIN -> { + // Distribute items evenly starting from round robin index + int perDropOff = Math.max(1, remainingCapacity / dropOffs.size()); + for (int i = 0; i < dropOffs.size() && remainingCapacity > 0; i++) { + int index = (roundRobinIndex + i) % dropOffs.size(); + int toShip = Math.min(perDropOff, remainingCapacity); + int shipped = shipItemsToDropOff(dropOffs.get(index), inputHandlers, toShip); + remainingCapacity -= (toShip - shipped); + } + roundRobinIndex = (roundRobinIndex + 1) % dropOffs.size(); + } + } + } + + /** + * Ship items to a single drop-off, returns remaining capacity. + */ + private int shipItemsToDropOff(MothCargoDropOffMachine dropOff, List sources, int maxItems) { + List destHandlers = dropOff.getItemOutputHandlers(); + if (destHandlers.isEmpty()) { + return maxItems; + } + + int remaining = maxItems; + + for (IItemHandler source : sources) { + if (!(source instanceof NotifiableItemStackHandler sourceNotifiable)) { + continue; + } + + for (int slot = 0; slot < source.getSlots() && remaining > 0; slot++) { + // Use internal extract to bypass IO check + ItemStack stack = sourceNotifiable.extractItemInternal(slot, remaining, true); // Simulate + if (stack.isEmpty()) continue; + + // Try to insert into destination using internal method + ItemStack toInsert = stack.copy(); + int originalCount = toInsert.getCount(); + + for (IItemHandler dest : destHandlers) { + if (dest instanceof NotifiableItemStackHandler destNotifiable) { + // Use insertItemInternal which bypasses the IO check + for (int destSlot = 0; destSlot < dest.getSlots() && !toInsert.isEmpty(); destSlot++) { + toInsert = destNotifiable.insertItemInternal(destSlot, toInsert, false); + } + } else { + // Fallback to standard insertion + for (int destSlot = 0; destSlot < dest.getSlots() && !toInsert.isEmpty(); destSlot++) { + toInsert = dest.insertItem(destSlot, toInsert, false); + } + } + if (toInsert.isEmpty()) break; + } + + // Actually extract what we inserted + int inserted = originalCount - toInsert.getCount(); + if (inserted > 0) { + sourceNotifiable.extractItemInternal(slot, inserted, false); + remaining -= inserted; + } + } + } + + return remaining; + } + + /** + * Ship fluids to drop-offs based on distribution mode. + */ + private void shipFluids(List dropOffs, int maxFluid) { + List inputHandlers = getFluidInputHandlers(); + if (inputHandlers.isEmpty()) { + return; + } + + int remainingCapacity = maxFluid; + + switch (distributionMode) { + case DIRECT -> { + if (!dropOffs.isEmpty()) { + remainingCapacity = shipFluidsToDropOff(dropOffs.get(0), inputHandlers, remainingCapacity); + } + } + case FILL_FIRST -> { + for (MothCargoDropOffMachine dropOff : dropOffs) { + if (remainingCapacity <= 0) break; + remainingCapacity = shipFluidsToDropOff(dropOff, inputHandlers, remainingCapacity); + } + } + case ROUND_ROBIN -> { + int perDropOff = Math.max(1, remainingCapacity / dropOffs.size()); + for (int i = 0; i < dropOffs.size() && remainingCapacity > 0; i++) { + int index = (roundRobinIndex + i) % dropOffs.size(); + int toShip = Math.min(perDropOff, remainingCapacity); + int shipped = shipFluidsToDropOff(dropOffs.get(index), inputHandlers, toShip); + remainingCapacity -= (toShip - shipped); + } + } + } + } + + /** + * Ship fluids to a single drop-off, returns remaining capacity. + */ + private int shipFluidsToDropOff(MothCargoDropOffMachine dropOff, List sources, int maxFluid) { + List destHandlers = dropOff.getFluidOutputHandlers(); + if (destHandlers.isEmpty()) { + return maxFluid; + } + + int remaining = maxFluid; + + for (IFluidHandler source : sources) { + for (int tank = 0; tank < source.getTanks() && remaining > 0; tank++) { + FluidStack available = source.getFluidInTank(tank); + if (available.isEmpty()) continue; + + int toDrain = Math.min(available.getAmount(), remaining); + FluidStack drained = source.drain(available.copyWithAmount(toDrain), + IFluidHandler.FluidAction.SIMULATE); + if (drained.isEmpty()) continue; + + // Try to insert into destination + int filled = 0; + for (IFluidHandler dest : destHandlers) { + int thisFill = dest.fill(drained.copy(), IFluidHandler.FluidAction.EXECUTE); + filled += thisFill; + drained.shrink(thisFill); + if (drained.isEmpty()) break; + } + + // Actually drain what we inserted + if (filled > 0) { + source.drain(available.copyWithAmount(filled), IFluidHandler.FluidAction.EXECUTE); + remaining -= filled; + } + } + } + + return remaining; + } + + /** + * Consume feeding materials and update multiplier. + */ + private void consumeFeedingMaterials() { + // TODO: Check input bus for honey/oil and consume per cycle + // For now, default multiplier + currentFeedingMultiplier = 1; + } + + // ==================== Handler Access ==================== + + /** + * Get all item input handlers from the multiblock. + */ + private List getItemInputHandlers() { + List handlers = new ArrayList<>(); + + var itemCaps = getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP); + if (itemCaps != null) { + for (var handler : itemCaps) { + if (handler instanceof NotifiableItemStackHandler itemHandler) { + handlers.add(itemHandler); + } + } + } + + return handlers; + } + + /** + * Get all fluid input handlers from the multiblock. + */ + private List getFluidInputHandlers() { + List handlers = new ArrayList<>(); + + var fluidCaps = getCapabilitiesFlat(IO.IN, FluidRecipeCapability.CAP); + if (fluidCaps != null) { + for (var handler : fluidCaps) { + if (handler instanceof NotifiableFluidTank fluidHandler) { + handlers.add(fluidHandler); + } + } + } + + return handlers; + } + + // ==================== UI ==================== + + @Override + public void addDisplayText(List textList) { + if (!isFormed()) { + textList.add(Component.literal("Structure not formed") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + return; + } + + // Moth home info + if (mothHomeCount > 0) { + textList.add(Component.literal("Moth Homes: " + mothHomeCount + " (T" + mothHomeTier + ")") + .setStyle(Style.EMPTY.withColor(ChatFormatting.GREEN))); + textList.add(Component.literal("Total Moths: " + getTotalMoths()) + .setStyle(Style.EMPTY.withColor(ChatFormatting.AQUA))); + textList.add(Component.literal("Cycle Time: " + (getCycleTimeTicks() / 20) + "s") + .setStyle(Style.EMPTY.withColor(ChatFormatting.YELLOW))); + } else { + textList.add(Component.literal("No Moth Homes installed!") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + } + + // Distribution mode + textList.add(Component.literal("Mode: " + distributionMode.name()) + .setStyle(Style.EMPTY.withColor(ChatFormatting.WHITE))); + + // Linked partners + int linkedCount = getLinkedPartners().size(); + if (linkedCount > 0) { + textList.add(Component.literal("Linked Drop-Offs: " + linkedCount) + .setStyle(Style.EMPTY.withColor(ChatFormatting.GREEN))); + } else { + textList.add(Component.literal("No Drop-Offs linked!") + .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); + } + + // Capacity info + if (mothHomeCount > 0) { + textList.add(Component + .literal("Capacity: " + getCapacityPerCycle(false) + " items / " + getCapacityPerCycle(true) + + " mB per cycle") + .setStyle(Style.EMPTY.withColor(ChatFormatting.GRAY))); + } + } + + @Override + protected InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { + if (!isRemote()) { + // Cycle through distribution modes + DistributionMode[] modes = DistributionMode.values(); + int nextIndex = (distributionMode.ordinal() + 1) % modes.length; + distributionMode = modes[nextIndex]; + + context.getPlayer().displayClientMessage( + Component.literal("Distribution Mode: " + distributionMode.name()) + .setStyle(Style.EMPTY.withColor(ChatFormatting.AQUA)), + true); + } + return InteractionResult.SUCCESS; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MultithreadedMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MultithreadedMachine.java new file mode 100644 index 000000000..dfa9a1803 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MultithreadedMachine.java @@ -0,0 +1,538 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.IMultithreadedMachine; + +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.common.machine.multiblock.part.EnergyHatchPartMachine; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.DyeColor; + +import it.unimi.dsi.fastutil.ints.Int2ObjectLinkedOpenHashMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +/** + * A multiblock machine that can run multiple independent recipes simultaneously. + * Each "thread" is assigned a color-coded set of input buses/hatches. + * The maximum number of threads is determined by the energy hatch amperage. + *

+ * Design: + * - 4A energy hatch = 4 max threads + * - 16A energy hatch = 16 max threads + * - Each thread needs a uniquely colored input bus/hatch pair + * - All threads share output buses/hatches + * - Energy is split evenly among active threads + */ +public class MultithreadedMachine extends WorkableElectricMultiblockMachine implements IMultithreadedMachine { + + + /** + * Maximum possible threads (limited by largest energy hatch amperage) + */ + public static final int MAX_THREADS = 16; + + /** + * Map of thread color -> RecipeLogic for that thread + */ + private final Int2ObjectMap threadLogics = new Int2ObjectLinkedOpenHashMap<>(); + + /** + * Map of thread color -> input handler list for that thread + */ + private final Int2ObjectMap> threadInputHandlers = new Int2ObjectLinkedOpenHashMap<>(); + + /** + * Shared output handlers for all threads + */ + private List sharedOutputHandlers = new ArrayList<>(); + + /** + * Maximum number of threads allowed by the energy hatch + */ + @Persisted + @DescSynced + private int maxThreads = 0; + + /** + * Currently active thread count + */ + @Persisted + @DescSynced + private int activeThreadCount = 0; + + /** + * Total amperage available from energy hatch(es) + */ + private int totalAmperage = 0; + + @Nullable + private TickableSubscription threadTickSubscription; + + /** + * Rotates the per-tick iteration start so the same threads aren't always last in line for the shared energy pool. + */ + private int tickRotation = 0; + + public MultithreadedMachine(BlockEntityCreationInfo holder) { + super(holder, m -> new RecipeLogic(m) { + + @Override + public void serverTick() {} + }); + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + + // Clear previous state + threadLogics.clear(); + threadInputHandlers.clear(); + sharedOutputHandlers.clear(); + maxThreads = 0; + totalAmperage = 0; + + // Detect energy hatch amperage to determine max threads + detectEnergyHatchAmperage(); + + // Partition input handlers by color + partitionHandlersByColor(); + + // Collect shared output handlers + collectOutputHandlers(); + + // Create thread logics for each color group + createThreadLogics(); + + // Start the thread tick subscription + updateThreadSubscription(); + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + + // Deactivate all threads + for (MultithreadedRecipeLogic logic : threadLogics.values()) { + logic.deactivateThread(); + } + + threadLogics.clear(); + threadInputHandlers.clear(); + sharedOutputHandlers.clear(); + maxThreads = 0; + activeThreadCount = 0; + totalAmperage = 0; + + if (threadTickSubscription != null) { + threadTickSubscription.unsubscribe(); + threadTickSubscription = null; + } + } + + /** + * Detect the amperage of energy hatches to determine max thread count. + */ + private void detectEnergyHatchAmperage() { + Map ioMap = getMultiblockState().getMatchContext() + .getOrCreate("ioMap", Long2ObjectMaps::emptyMap); + + for (IMultiPart part : getParts()) { + if (part instanceof EnergyHatchPartMachine energyHatch) { + IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.IN); + if (io == IO.IN || io == IO.BOTH) { + totalAmperage += energyHatch.getAmperage(); + } + } + } + + // Max threads = total amperage, capped at MAX_THREADS + maxThreads = Math.min(totalAmperage, MAX_THREADS); + } + + /** + * Partition input handlers by their paint color. + * Reads color from the part directly because RecipeHandlerList caches its color at first + * access and never updates after a repaint. + */ + private void partitionHandlersByColor() { + for (IMultiPart part : getParts()) { + if (part instanceof IMaintenanceMachine) continue; + int color = part.self().getPaintingColor(); + for (RecipeHandlerList handlerList : part.getRecipeHandlers()) { + if (handlerList.getHandlerIO() != IO.IN && handlerList.getHandlerIO() != IO.BOTH) continue; + if (!hasRecipeCapability(handlerList)) continue; + threadInputHandlers.computeIfAbsent(color, k -> new ArrayList<>()).add(handlerList); + } + } + } + + /** + * Collect output handlers that will be shared by all threads. + */ + private void collectOutputHandlers() { + for (IMultiPart part : getParts()) { + if (part instanceof IMaintenanceMachine) continue; + for (RecipeHandlerList handlerList : part.getRecipeHandlers()) { + if (handlerList.getHandlerIO() != IO.OUT && handlerList.getHandlerIO() != IO.BOTH) continue; + if (!hasRecipeCapability(handlerList)) continue; + sharedOutputHandlers.add(handlerList); + } + } + } + + /** + * True if the handler list carries any recipe capability other than EU. Energy is wired in + * separately via {@link #addEnergyHandlersToThread} so it must be excluded here, but every + * other capability — items, fluids, souls, embers, heat, sterile, future ones — is fair game + * for thread partitioning and shared outputs. + */ + private static boolean hasRecipeCapability(RecipeHandlerList handlerList) { + for (RecipeCapability cap : handlerList.getHandlerMap().keySet()) { + if (cap != EURecipeCapability.CAP) return true; + } + return false; + } + + /** + * Create a MultithreadedRecipeLogic for each color group, up to maxThreads. + */ + private void createThreadLogics() { + // Calculate EU/t budget per thread + // Each thread gets 1A of voltage from the total amperage pool + // With 16A UV hatch and 16 threads, each gets 1A UV = 524,288 EU/t + // IMPORTANT: EnergyContainerList.getInputVoltage() returns TOTAL EU/t (voltage*amperage compacted) + // We need to use getHighestInputVoltage() which returns the actual per-amp voltage + long euPerThread = energyContainer != null ? energyContainer.getHighestInputVoltage() : 0; + + for (Int2ObjectMap.Entry> entry : threadInputHandlers.int2ObjectEntrySet()) { + if (threadLogics.size() >= maxThreads) break; + + int color = entry.getIntKey(); + MultithreadedRecipeLogic logic = new MultithreadedRecipeLogic(this, threadLogics.size(), color); + logic.setMaxEUtPerThread(euPerThread); + applyThreadHandlers(logic, entry.getValue()); + logic.activateThread(); + threadLogics.put(color, logic); + } + + activeThreadCount = threadLogics.size(); + } + + /** + * Build and assign the per-thread proxy + flat capability maps for the given input handlers. + * Output handlers and energy handlers are shared across threads. + */ + private void applyThreadHandlers(MultithreadedRecipeLogic logic, List inputHandlers) { + Map> threadProxy = new EnumMap<>(IO.class); + Map, List>>> threadFlat = new EnumMap<>(IO.class); + + threadProxy.put(IO.IN, new ArrayList<>(inputHandlers)); + threadProxy.put(IO.OUT, new ArrayList<>(sharedOutputHandlers)); + + for (Map.Entry> proxyEntry : threadProxy.entrySet()) { + IO io = proxyEntry.getKey(); + Map, List>> capMap = new HashMap<>(); + for (RecipeHandlerList handlerList : proxyEntry.getValue()) { + for (var capEntry : handlerList.getHandlerMap().entrySet()) { + capMap.computeIfAbsent(capEntry.getKey(), k -> new ArrayList<>()).addAll(capEntry.getValue()); + } + } + threadFlat.put(io, capMap); + } + + addEnergyHandlersToThread(threadProxy, threadFlat); + + logic.setThreadCapabilitiesProxy(threadProxy); + logic.setThreadCapabilitiesFlat(threadFlat); + } + + /** + * Add energy handlers to a thread's capability maps so recipes can consume EU. + * Must add to both proxy and flat maps for full compatibility. + */ + private void addEnergyHandlersToThread( + Map> threadProxy, + Map, List>>> threadFlat) { + // Get energy handlers from the machine's global capabilities (proxy) + var machineProxy = getCapabilitiesProxy(); + if (machineProxy != null && machineProxy.containsKey(IO.IN)) { + for (RecipeHandlerList handlerList : machineProxy.get(IO.IN)) { + if (handlerList.hasCapability(EURecipeCapability.CAP)) { + threadProxy.computeIfAbsent(IO.IN, k -> new ArrayList<>()).add(handlerList); + } + } + } + + // Also add to flat map + var machineFlat = getCapabilitiesFlat(); + if (machineFlat != null && machineFlat.containsKey(IO.IN)) { + var inCaps = machineFlat.get(IO.IN); + if (inCaps != null && inCaps.containsKey(EURecipeCapability.CAP)) { + var energyHandlers = inCaps.get(EURecipeCapability.CAP); + if (energyHandlers != null && !energyHandlers.isEmpty()) { + threadFlat.computeIfAbsent(IO.IN, k -> new HashMap<>()) + .put(EURecipeCapability.CAP, new ArrayList<>(energyHandlers)); + } + } + } + } + + /** + * Re-run input partitioning after a part's paint color changes. Preserves in-progress + * recipes on threads whose color still exists, only colors that disappeared from the + * structure get their threads torn down. New colors that appear get fresh threads + * (subject to the maxThreads cap). + * This might be a genuinely hacky solution, I'm not sure lmoa :icant: + */ + public void refreshThreadPartitioning() { + if (!isFormed()) return; + if (getLevel() == null || getLevel().isClientSide) return; + + Int2ObjectMap> newPartition = new Int2ObjectLinkedOpenHashMap<>(); + for (IMultiPart part : getParts()) { + if (part instanceof IMaintenanceMachine) continue; + int color = part.self().getPaintingColor(); + for (RecipeHandlerList handlerList : part.getRecipeHandlers()) { + if (handlerList.getHandlerIO() != IO.IN && handlerList.getHandlerIO() != IO.BOTH) continue; + if (!hasRecipeCapability(handlerList)) continue; + newPartition.computeIfAbsent(color, k -> new ArrayList<>()).add(handlerList); + } + } + + IntList staleColors = new IntArrayList(); + for (int color : threadLogics.keySet()) { + if (!newPartition.containsKey(color)) staleColors.add(color); + } + for (int color : staleColors) { + MultithreadedRecipeLogic stale = threadLogics.remove(color); + if (stale != null) stale.deactivateThread(); + threadInputHandlers.remove(color); + } + + long euPerThread = energyContainer != null ? energyContainer.getHighestInputVoltage() : 0; + for (Int2ObjectMap.Entry> entry : newPartition.int2ObjectEntrySet()) { + int color = entry.getIntKey(); + List inputHandlers = entry.getValue(); + threadInputHandlers.put(color, inputHandlers); + + MultithreadedRecipeLogic logic = threadLogics.get(color); + if (logic == null) { + if (threadLogics.size() >= maxThreads) continue; + logic = new MultithreadedRecipeLogic(this, threadLogics.size(), color); + logic.activateThread(); + threadLogics.put(color, logic); + } + logic.setMaxEUtPerThread(euPerThread); + applyThreadHandlers(logic, inputHandlers); + } + + activeThreadCount = threadLogics.size(); + updateThreadSubscription(); + } + + /** + * Update the tick subscription for thread processing. + */ + private void updateThreadSubscription() { + if (isFormed() && !threadLogics.isEmpty()) { + threadTickSubscription = subscribeServerTick(threadTickSubscription, this::tickThreads); + } else if (threadTickSubscription != null) { + threadTickSubscription.unsubscribe(); + threadTickSubscription = null; + } + } + + /** + * Called every server tick to process all thread logics. If this fails to be called I and everyone else should + * panic + */ + private void tickThreads() { + if (!isFormed() || !isWorkingEnabled()) return; + + int runningThreads = 0; + for (MultithreadedRecipeLogic logic : threadLogics.values()) { + if (logic.isThreadActive()) { + logic.serverTick(); + if (logic.isWorking()) { + runningThreads++; + } + } + } + + activeThreadCount = runningThreads; + } + + /** + * Calculate energy available per thread. + * Energy is split evenly among all active threads, should be evenly but for all i knwo this is wrong + */ + private long getEnergyPerThread() { + if (energyContainer == null || activeThreadCount == 0) return 0; + return energyContainer.getInputVoltage() * totalAmperage / Math.max(1, getRunningThreadCount()); + } + + public Int2ObjectMap getThreadLogics() { + return threadLogics; + } + + public int getMaxThreads() { + return maxThreads; + } + + public int getActiveThreadCount() { + return activeThreadCount; + } + + public int getTotalAmperage() { + return totalAmperage; + } + + /** + * Get the number of threads currently running recipes. + */ + public int getRunningThreadCount() { + int count = 0; + for (MultithreadedRecipeLogic logic : threadLogics.values()) { + if (logic.isWorking()) count++; + } + return count; + } + + /** + * Get the input handlers for a specific thread color. + */ + @Nullable + public List getThreadInputHandlers(int color) { + return threadInputHandlers.get(color); + } + + /** + * Get the shared output handlers. + */ + public List getSharedOutputHandlers() { + return sharedOutputHandlers; + } + + /** + * Get a color name for display purposes. + */ + public static String getColorName(int color) { + if (color == -1) return "Unpainted"; + for (DyeColor dye : DyeColor.values()) { + if (dye.getFireworkColor() == color || dye.getTextColor() == color) { + return dye.getName(); + } + } + return "Color #" + Integer.toHexString(color); + } + + @Override + public void addDisplayText(List textList) { + // Basic multiblock status + var builder = MultiblockDisplayText.builder(textList, isFormed()) + .setWorkingStatus(isWorkingEnabled(), getRunningThreadCount() > 0); + + if (isFormed()) { + // Thread status header + builder.addCustom(tl -> { + tl.add(Component.translatable("cosmiccore.machine.multithreaded.thread_status") + .withStyle(ChatFormatting.AQUA)); + tl.add(Component.translatable("cosmiccore.machine.multithreaded.max_threads", + FormattingUtil.formatNumbers(maxThreads)) + .withStyle(ChatFormatting.GRAY)); + tl.add(Component.translatable("cosmiccore.machine.multithreaded.active_threads", + FormattingUtil.formatNumbers(getRunningThreadCount()), + FormattingUtil.formatNumbers(threadLogics.size())) + .withStyle(ChatFormatting.GRAY)); + }); + + // Per-thread status + builder.addCustom(tl -> { + for (MultithreadedRecipeLogic logic : threadLogics.values()) { + String colorName = getColorName(logic.getThreadColor()); + ChatFormatting statusColor = logic.isWorking() ? ChatFormatting.GREEN : ChatFormatting.YELLOW; + + String status; + if (logic.isWorking()) { + int percent = (int) (logic.getProgressPercent() * 100); + status = percent + "%"; + } else if (logic.isIdle()) { + status = "Idle"; + } else if (logic.isWaiting()) { + status = "Waiting"; + } else { + status = "Suspended"; + } + + tl.add(Component.literal(" [" + colorName + "] " + status) + .withStyle(statusColor)); + } + }); + + // Energy info + builder.addEnergyUsageLine(energyContainer); + builder.addEnergyTierLine(tier); + } + + getDefinition().getAdditionalDisplay().accept(this, textList); + } + + // === IMultithreadedMachine interface implementation === + + @Override + public Int2ObjectMap getThreadLogicsMap() { + return threadLogics; + } + + @Override + public int getMaxThreadCount() { + return maxThreads; + } + + @Override + public int getCurrentThreadCount() { + return threadLogics.size(); + } + + @Override + public boolean beforeWorking(@Nullable GTRecipe recipe) { + // Called by individual thread logics + return super.beforeWorking(recipe); + } + + @Override + public boolean onWorking() { + // Called by individual thread logics + return super.onWorking(); + } + + @Override + public void afterWorking() { + // Called by individual thread logics + super.afterWorking(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MultithreadedRecipeLogic.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MultithreadedRecipeLogic.java new file mode 100644 index 000000000..ff7ab420e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/MultithreadedRecipeLogic.java @@ -0,0 +1,526 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.IRecipeCapabilityHolder; +import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; +import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.ActionResult; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.Iterator; + +/** + * A RecipeLogic instance that represents a single "thread" in a MultithreadedMachine. + * Each thread can process one recipe independently of other threads. + *

+ * This class implements IRecipeCapabilityHolder to provide a filtered view of handlers + * that only includes this thread's color-coded inputs and shared outputs. + */ +public class MultithreadedRecipeLogic extends RecipeLogic implements IRecipeCapabilityHolder { + + + /** + * Toggle to log per-thread recipe matching and tick-drain decisions. Flip on when investigating thread behavior. + */ + public static boolean DEBUG = false; + + /** + * A multithreaded machine attaches one of these per thread, so unlike the base {@link RecipeLogic#TYPE} this + * trait type must permit multiple instances on a single machine. GTCEu 8.0's MachineTraitHolder otherwise + * rejects the second attach, which aborts EMI's multiblock-preview build and with it all GT recipe display. + */ + public static final MachineTraitType TYPE = new MachineTraitType<>(RecipeLogic.class, true); + + private static String describe(ActionResult r) { + StringBuilder sb = new StringBuilder(); + sb.append(r.reason() == null ? "" : r.reason().getString()); + if (r.capability() != null) sb.append(" cap=").append(r.capability().name); + if (r.io() != null) sb.append(" io=").append(r.io()); + return sb.toString(); + } + + private final int threadIndex; + + private final int threadColor; + + @Persisted + @DescSynced + private boolean threadActive = false; + + /** + * Maximum EU/t this thread can use. + * Set by the parent MultithreadedMachine based on energy hatch amperage / thread count. + */ + private long maxEUtPerThread = 0; + + /** + * This thread's capability proxy - filtered to only include its handlers. + * Set by the parent MultithreadedMachine. + */ + private Map> threadCapabilitiesProxy = new EnumMap<>(IO.class); + + /** + * Flattened capability map for this thread. + */ + private Map, List>>> threadCapabilitiesFlat = new EnumMap<>(IO.class); + + public MultithreadedRecipeLogic(IRecipeLogicMachine machine, int threadIndex, int threadColor) { + super(machine); + this.threadIndex = threadIndex; + this.threadColor = threadColor; + } + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + public int getThreadIndex() { + return threadIndex; + } + + public int getThreadColor() { + return threadColor; + } + + public boolean isThreadActive() { + return threadActive; + } + + public long getMaxEUtPerThread() { + return maxEUtPerThread; + } + + public void setMaxEUtPerThread(long maxEUtPerThread) { + this.maxEUtPerThread = maxEUtPerThread; + } + + public void setThreadCapabilitiesProxy(Map> threadCapabilitiesProxy) { + this.threadCapabilitiesProxy = threadCapabilitiesProxy; + } + + public void setThreadCapabilitiesFlat( + Map, List>>> threadCapabilitiesFlat) { + this.threadCapabilitiesFlat = threadCapabilitiesFlat; + } + + + // === IRecipeCapabilityHolder implementation === + // These methods provide a filtered view of handlers for this thread only + + @Override + public Map> getCapabilitiesProxy() { + return threadCapabilitiesProxy; + } + + @Override + public Map, List>>> getCapabilitiesFlat() { + return threadCapabilitiesFlat; + } + + /** + * Called by the parent machine to activate this thread. + */ + public void activateThread() { + this.threadActive = true; + } + + /** + * Called by the parent machine to deactivate this thread. + */ + public void deactivateThread() { + this.threadActive = false; + if (isWorking()) { + setStatus(Status.IDLE); + this.progress = 0; + this.duration = 0; + this.lastRecipe = null; + } + } + + /** + * Check if this thread can process recipes. + */ + public boolean canWork() { + return threadActive && machine.isRecipeLogicAvailable(); + } + + @Override + public void serverTick() { + if (!canWork()) { + if (isWorking()) { + setStatus(Status.SUSPEND); + } + return; + } + super.serverTick(); + } + + /** + * MTRL already has it's own ticksub, this fuckass no-op prevents double dipping into the EU pool the machine has + * and breaking thread EU alloc + * this took me 2hrs to realize this fucking override existed again, ugh. + */ + @Override + public void updateTickSubscription() {} + + /** + * Get the parent MultithreadedMachine. + */ + @Nullable + private MultithreadedMachine getParentMachine() { + if (machine instanceof MultithreadedMachine mtm) { + return mtm; + } + return null; + } + + /** + * Standard overclock voltage multiplier (4x per OC level). + */ + private static final double OC_VOLTAGE_FACTOR = 4.0; + + /** + * Standard overclock duration multiplier (0.5x per OC level - halves duration). + */ + private static final double OC_DURATION_FACTOR = 0.5; + + /** + * Calculate the maximum number of overclock levels that fit within the thread's EU/t budget. + * Each overclock level multiplies EU/t by 4 and halves duration. + * + * @param baseEUt The base recipe EU/t + * @return Number of overclock levels possible (0 = no overclocking) + */ + protected int calculateMaxOverclockLevels(long baseEUt) { + if (maxEUtPerThread <= 0 || baseEUt <= 0) { + return 0; + } + + int levels = 0; + long currentEUt = baseEUt; + + // Each OC level multiplies EU/t by 4 + while (currentEUt * OC_VOLTAGE_FACTOR <= maxEUtPerThread) { + currentEUt = (long) (currentEUt * OC_VOLTAGE_FACTOR); + levels++; + } + + return levels; + } + + /** + * Apply overclocking to a recipe within this thread's energy budget. + * Overclocking multiplies EU/t by 4 and halves duration per level. + * + * @param recipe The base recipe + * @return The overclocked recipe copy, or a copy of the original if no overclocking is possible + */ + @Nullable + protected GTRecipe applyThreadOverclock(GTRecipe recipe) { + long baseEUt = recipe.getInputEUt().getTotalEU(); + + // If base recipe exceeds budget, can't run at all + if (baseEUt > maxEUtPerThread && maxEUtPerThread > 0) { + return null; + } + + int ocLevels = calculateMaxOverclockLevels(baseEUt); + if (ocLevels <= 0) { + // No overclocking possible, return a copy of the recipe + return recipe.copy(); + } + + // Calculate overclocked values + double eutMultiplier = Math.pow(OC_VOLTAGE_FACTOR, ocLevels); + double durationMultiplier = Math.pow(OC_DURATION_FACTOR, ocLevels); + + // Build modifier to apply overclock + ModifierFunction modifier = ModifierFunction.builder() + .eutMultiplier(eutMultiplier) + .durationMultiplier(durationMultiplier) + .build(); + + // Apply to a COPY of the recipe to avoid modifying the original + return modifier.apply(recipe.copy()); + } + + /** + * Override to apply thread-specific recipe modification and check availability. + * Applies overclocking within the thread's energy budget. + * + * IMPORTANT: The 'match' parameter is the RAW recipe from the recipe type, + * NOT yet modified by the machine. We must NOT call machine.fullModifyRecipe() + * as that would apply overclock based on full machine power. + */ + @Override + public boolean checkMatchedRecipeAvailable(GTRecipe match) { + long baseEUt = match.getInputEUt().getTotalEU(); + + if (baseEUt > maxEUtPerThread && maxEUtPerThread > 0) { + if (DEBUG) CosmicCore.LOGGER.info("[basin t#{} c=0x{}] reject {}: EU {} > budget {}", + threadIndex, Integer.toHexString(threadColor), match.getId(), baseEUt, maxEUtPerThread); + return false; + } + + GTRecipe modified = applyThreadOverclock(match); + if (modified == null) { + if (DEBUG) CosmicCore.LOGGER.info("[basin t#{} c=0x{}] reject {}: overclock returned null", + threadIndex, Integer.toHexString(threadColor), match.getId()); + return false; + } + + GTRecipe trimmed = RecipeHelper.trimRecipeOutputs(modified, machine.getOutputLimits()); + if (trimmed == null) { + if (DEBUG) CosmicCore.LOGGER.info("[basin t#{} c=0x{}] reject {}: trimRecipeOutputs returned null", + threadIndex, Integer.toHexString(threadColor), match.getId()); + return false; + } + + ActionResult result = checkRecipe(trimmed); + if (!result.isSuccess()) { + if (DEBUG) CosmicCore.LOGGER.info("[basin t#{} c=0x{}] reject {}: checkRecipe -> {}", + threadIndex, Integer.toHexString(threadColor), match.getId(), + describe(result)); + return false; + } + + setupRecipe(trimmed); + + if (lastRecipe != null && getStatus() == Status.WORKING) { + lastOriginRecipe = match; + lastFailedMatches = null; + if (DEBUG) CosmicCore.LOGGER.info("[basin t#{} c=0x{}] STARTED {}", + threadIndex, Integer.toHexString(threadColor), match.getId()); + return true; + } + + if (DEBUG) CosmicCore.LOGGER.info( + "[basin t#{} c=0x{}] reject {}: setupRecipe finished but lastRecipe={} status={}", + threadIndex, Integer.toHexString(threadColor), match.getId(), + lastRecipe == null ? "null" : "", getStatus()); + return false; + } + + /** + * Override searchRecipe to use THIS THREAD as the capability holder, + * not the machine. This is critical for proper recipe filtering. + */ + @Override + public @NotNull Iterator searchRecipe() { + if (DEBUG) { + var flat = getCapabilitiesFlat(); + var inMap = flat.getOrDefault(IO.IN, java.util.Collections.emptyMap()); + var outMap = flat.getOrDefault(IO.OUT, java.util.Collections.emptyMap()); + CosmicCore.LOGGER.info("[basin t#{} c=0x{}] searchRecipe: IN caps={} OUT caps={} budget={}", + threadIndex, Integer.toHexString(threadColor), + inMap.keySet(), outMap.keySet(), maxEUtPerThread); + } + return machine.getRecipeType().searchRecipe(this, r -> { + ActionResult res = matchRecipe(r); + if (DEBUG && !res.isSuccess()) { + CosmicCore.LOGGER.info("[basin t#{} c=0x{}] match-fail {}: {}", + threadIndex, Integer.toHexString(threadColor), r.getId(), + describe(res)); + } + return res.isSuccess(); + }); + } + + /** + * Override findAndHandleRecipe to ensure we ALWAYS go through our custom + * checkMatchedRecipeAvailable, even when re-running a cached recipe. + * The base implementation has a shortcut path that bypasses our EU budget checks. + */ + @Override + public void findAndHandleRecipe() { + lastFailedMatches = null; + + // If we have a cached origin recipe, try to re-apply our thread-specific overclock + if (!recipeDirty && lastOriginRecipe != null) { + // Re-apply OUR thread overclock to the origin recipe + GTRecipe modified = applyThreadOverclock(lastOriginRecipe); + if (modified != null) { + GTRecipe trimmed = RecipeHelper.trimRecipeOutputs(modified, machine.getOutputLimits()); + if (trimmed != null && checkRecipe(trimmed).isSuccess()) { + setupRecipe(trimmed); + recipeDirty = false; + return; + } + } + } + + // No valid cached recipe, search for a new one + lastRecipe = null; + lastOriginRecipe = null; + handleSearchingRecipes(searchRecipe()); + recipeDirty = false; + } + + /** + * Override checkRecipe to use this thread's capability holder. + * Also checks recipe conditions. + */ + @Override + public ActionResult checkRecipe(GTRecipe recipe) { + // First check recipe conditions + var conditionResult = RecipeHelper.checkConditions(recipe, this); + if (!conditionResult.isSuccess()) return conditionResult; + + // Use this thread as the capability holder for matching + return matchRecipe(recipe); + } + + /** + * Override to use this thread's capability holder for recipe matching. + * This ensures recipe searching uses this thread's handlers. + */ + @Override + protected ActionResult matchRecipe(GTRecipe recipe) { + // Use this thread as the capability holder instead of the machine + return RecipeHelper.matchContents(this, recipe); + } + + /** + * Override to use this thread's handlers instead of the machine's global handlers. + */ + @Override + protected ActionResult handleRecipeIO(GTRecipe recipe, IO io) { + // Use this thread as the capability holder instead of the machine + return RecipeHelper.handleRecipeIO(this, recipe, io, chanceCaches); + } + + /** + * Override to use this thread's handlers for tick-based IO. + */ + @Override + protected ActionResult handleTickRecipeIO(GTRecipe recipe, IO io) { + if (DEBUG && io == IO.IN && machine instanceof MultithreadedMachine mtm) { + var ec = mtm.getEnergyContainer(); + long before = ec != null ? ec.getEnergyStored() : -1; + long requested = sumEURequest(recipe); + ActionResult result = RecipeHelper.handleTickRecipeIO(this, recipe, io, chanceCaches); + long after = ec != null ? ec.getEnergyStored() : -1; + CosmicCore.LOGGER.info( + "[basin t#{} c=0x{}] tick drain: req={} drained={} buffer {} -> {} {}", + threadIndex, Integer.toHexString(threadColor), requested, before - after, before, after, + result.isSuccess() ? "OK" : "FAIL: " + describe(result)); + return result; + } + return RecipeHelper.handleTickRecipeIO(this, recipe, io, chanceCaches); + } + + private static long sumEURequest(GTRecipe recipe) { + var euList = recipe.tickInputs.get(EURecipeCapability.CAP); + if (euList == null) return 0; + long total = 0; + for (var content : euList) { + if (content.getContent() instanceof com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack es) { + total += es.getTotalEU(); + } + } + return total; + } + + /** + * Override to use this thread's capability holder for tick recipe matching. + * This is critical for EU consumption - the base implementation uses the machine, + * but we need to use this thread's handlers. + */ + @Override + public ActionResult handleTickRecipe(GTRecipe recipe) { + if (!recipe.hasTick()) return ActionResult.SUCCESS; + + var result = RecipeHelper.matchTickRecipe(this, recipe); + if (!result.isSuccess()) return result; + + result = handleTickRecipeIO(recipe, IO.IN); + if (!result.isSuccess()) return result; + + return handleTickRecipeIO(recipe, IO.OUT); + } + + /** + * Override onRecipeFinish to prevent the base class from applying machine-level overclock. + * The base implementation calls machine.fullModifyRecipe(lastOriginRecipe) which would + * apply overclock based on full machine power, ignoring our thread budget. + */ + @Override + public void onRecipeFinish() { + machine.afterWorking(); + if (lastRecipe != null) { + // Reset run attempt tracking + // Note: runAttempt and runDelay are package-private in base class + // but we can still access them since we're in the same hierarchy + + consecutiveRecipes++; + handleRecipeIO(lastRecipe, IO.OUT); + + // CRITICAL: Do NOT call machine.fullModifyRecipe here! + // Instead, re-apply OUR thread-specific overclock to the origin recipe + if (lastOriginRecipe != null) { + GTRecipe modified = applyThreadOverclock(lastOriginRecipe); + if (modified == null) { + markLastRecipeDirty(); + } else { + // Trim outputs + GTRecipe trimmed = RecipeHelper.trimRecipeOutputs(modified, machine.getOutputLimits()); + if (trimmed == null) { + markLastRecipeDirty(); + } else { + lastRecipe = trimmed; + } + } + } else { + markLastRecipeDirty(); + } + + // Try to run the recipe again + var recipeCheck = checkRecipe(lastRecipe); + if (!recipeDirty && !isSuspendAfterFinish() && recipeCheck.isSuccess()) { + setupRecipe(lastRecipe); + } else { + if (isSuspendAfterFinish()) { + setStatus(Status.SUSPEND); + } else { + setStatus(Status.IDLE); + } + consecutiveRecipes = 0; + progress = 0; + duration = 0; + isActive = false; + } + } + } + + /** + * Get the recipe currently being processed by this thread. + */ + @Nullable + public GTRecipe getCurrentRecipe() { + return lastRecipe; + } + + /** + * Get progress as a percentage (0.0 to 1.0) + */ + public double getProgressPercent() { + if (duration == 0) return 0; + return (double) progress / duration; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/OreExtractionDrillLogic.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/OreExtractionDrillLogic.java new file mode 100644 index 000000000..a5e7d9711 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/OreExtractionDrillLogic.java @@ -0,0 +1,492 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.transfer.item.NotifiableAccountedInvWrapper; +import com.gregtechceu.gtceu.utils.GTTransferUtils; + +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import net.minecraft.core.BlockPos; +import net.minecraft.core.NonNullList; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.storage.loot.LootParams; +import net.minecraft.world.level.storage.loot.parameters.LootContextParams; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.common.Tags; +import net.neoforged.neoforge.items.IItemHandlerModifiable; + +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public class OreExtractionDrillLogic extends RecipeLogic { + + + public static final int TICKS_PER_ORE = 100; + public static final int CHUNKS_PER_SIDE = 9; + public static final int BLOCKS_PER_CHUNK = 16; + public static final int AREA_SIZE = CHUNKS_PER_SIDE * BLOCKS_PER_CHUNK; + public static final int SCAN_BLOCKS_PER_TICK = 16384; + + public enum DrillPhase { + IDLE, + SCANNING, + MINING, + COMPLETE + } + + @Persisted + private DrillPhase phase = DrillPhase.IDLE; + + @Persisted + private List pendingOres = new ArrayList<>(); + + @Persisted + private int currentOreIndex = 0; + + @Persisted + private int miningProgress = 0; + + @Persisted + private int centerChunkX = Integer.MIN_VALUE; + @Persisted + private int centerChunkZ = Integer.MIN_VALUE; + + @Persisted + private int scanX = 0; + @Persisted + private int scanY = 0; + @Persisted + private int scanZ = 0; + @Persisted + private boolean scanningRight = true; + + private Set ourLoadedChunks = new HashSet<>(); + private Set structureChunks = new HashSet<>(); + + private Map oreTypeCounts = new LinkedHashMap<>(); + + @Persisted + private long totalBlocksToScan = 0; + @Persisted + private long blocksScanned = 0; + + private int minX, maxX, minZ, maxZ, minY, startY; + private boolean boundsInitialized = false; + + @Nullable + private NotifiableAccountedInvWrapper cachedItemHandler = null; + + public OreExtractionDrillLogic(OreExtractionDrillMachine machine) { + super(machine); + } + + @Override + public OreExtractionDrillMachine getMachine() { + return (OreExtractionDrillMachine) super.getMachine(); + } + + + @Override + public void serverTick() { + if (!getMachine().isFormed() || !getMachine().isWorkingEnabled()) { + return; + } + + if (!boundsInitialized) { + initializeBounds(); + } + + switch (phase) { + case IDLE -> startScanning(); + case SCANNING -> tickScanning(); + case MINING -> tickMining(); + case COMPLETE -> {} // Do nothing, wait for restart + } + } + + private void initializeBounds() { + BlockPos machinePos = getMachine().getBlockPos(); + int halfArea = AREA_SIZE / 2; + + minX = machinePos.getX() - halfArea; + maxX = machinePos.getX() + halfArea - 1; + minZ = machinePos.getZ() - halfArea; + maxZ = machinePos.getZ() + halfArea - 1; + minY = getMachine().getLevel().getMinBuildHeight(); + startY = machinePos.getY(); + + // Calculate total blocks to scan + long width = maxX - minX + 1; + long depth = maxZ - minZ + 1; + long height = startY - minY + 1; + totalBlocksToScan = width * depth * height; + + boundsInitialized = true; + } + + private void startScanning() { + pendingOres.clear(); + oreTypeCounts.clear(); + currentOreIndex = 0; + miningProgress = 0; + blocksScanned = 0; + + scanX = minX; + scanY = startY; + scanZ = minZ; + scanningRight = true; + + phase = DrillPhase.SCANNING; + setStatus(Status.WORKING); + } + + private void tickScanning() { + if (!(getMachine().getLevel() instanceof ServerLevel serverLevel)) return; + + for (int i = 0; i < SCAN_BLOCKS_PER_TICK; i++) { + if (scanY < minY) { + finishScanning(); + return; + } + + BlockPos pos = new BlockPos(scanX, scanY, scanZ); + BlockState state = serverLevel.getBlockState(pos); + + if (isOre(state)) { + pendingOres.add(pos); + String oreName = getOreMaterialName(state); + oreTypeCounts.merge(oreName, 1, Integer::sum); + } + + blocksScanned++; + advanceScanPosition(); + } + } + + private void advanceScanPosition() { + if (scanningRight) { + scanX++; + if (scanX > maxX) { + scanX = maxX; + scanZ++; + scanningRight = false; + if (scanZ > maxZ) { + scanZ = minZ; + scanY--; + scanningRight = true; + scanX = minX; + } + } + } else { + scanX--; + if (scanX < minX) { + scanX = minX; + scanZ++; + scanningRight = true; + if (scanZ > maxZ) { + scanZ = minZ; + scanY--; + scanX = minX; + } + } + } + } + + private void finishScanning() { + if (pendingOres.isEmpty()) { + phase = DrillPhase.COMPLETE; + setStatus(Status.IDLE); + } else { + phase = DrillPhase.MINING; + currentOreIndex = 0; + miningProgress = 0; + updateChunkWindow(pendingOres.get(0)); + } + } + + private void tickMining() { + if (!(getMachine().getLevel() instanceof ServerLevel serverLevel)) return; + + if (currentOreIndex >= pendingOres.size()) { + releaseAllMiningChunks(); + startScanning(); + return; + } + + if (!getMachine().drainEnergy(false)) { + setStatus(Status.WAITING); + return; + } + getMachine().drainEnergy(true); + setStatus(Status.WORKING); + + miningProgress++; + + if (miningProgress >= TICKS_PER_ORE) { + miningProgress = 0; + processCurrentOre(serverLevel); + currentOreIndex++; + if (currentOreIndex < pendingOres.size()) { + updateChunkWindow(pendingOres.get(currentOreIndex)); + } + } + } + + private void processCurrentOre(ServerLevel serverLevel) { + if (currentOreIndex >= pendingOres.size()) return; + + BlockPos orePos = pendingOres.get(currentOreIndex); + BlockState state = serverLevel.getBlockState(orePos); + + if (!isOre(state)) { + return; + } + + NonNullList drops = NonNullList.create(); + LootParams.Builder builder = new LootParams.Builder(serverLevel) + .withParameter(LootContextParams.BLOCK_STATE, state) + .withParameter(LootContextParams.ORIGIN, Vec3.atLowerCornerOf(orePos)) + .withParameter(LootContextParams.TOOL, ItemStack.EMPTY); + drops.addAll(state.getDrops(builder)); + outputDrops(drops); + + float removalChance = getMachine().getRemovalChance(); + if (serverLevel.getRandom().nextFloat() < removalChance) { + serverLevel.setBlock(orePos, Blocks.STONE.defaultBlockState(), 3); + pendingOres.set(currentOreIndex, null); + } + } + + private void outputDrops(NonNullList drops) { + var handler = getCachedItemHandler(); + if (handler == null) return; + + GTTransferUtils.addItemsToItemHandler(handler, false, drops); + } + + @Nullable + private NotifiableAccountedInvWrapper getCachedItemHandler() { + if (cachedItemHandler == null) { + var caps = getMachine().getCapabilitiesFlat(IO.OUT, ItemRecipeCapability.CAP); + if (caps != null && !caps.isEmpty()) { + cachedItemHandler = new NotifiableAccountedInvWrapper(caps.stream() + .map(IItemHandlerModifiable.class::cast) + .toArray(IItemHandlerModifiable[]::new)); + } + } + return cachedItemHandler; + } + + public void invalidateCache() { + cachedItemHandler = null; + } + + private void updateChunkWindow(BlockPos targetPos) { + if (!(getMachine().getLevel() instanceof ServerLevel serverLevel)) return; + + ChunkPos newCenter = new ChunkPos(targetPos); + if (newCenter.x == centerChunkX && newCenter.z == centerChunkZ) return; + + Set newWindow = new HashSet<>(); + for (int dx = -1; dx <= 1; dx++) { + for (int dz = -1; dz <= 1; dz++) { + newWindow.add(new ChunkPos(newCenter.x + dx, newCenter.z + dz)); + } + } + + Set toUnload = new HashSet<>(ourLoadedChunks); + toUnload.removeAll(newWindow); + toUnload.removeAll(structureChunks); + + for (ChunkPos chunk : toUnload) { + unloadChunk(serverLevel, chunk); + } + + for (ChunkPos chunk : newWindow) { + if (!ourLoadedChunks.contains(chunk)) { + loadChunk(serverLevel, chunk); + } + } + + centerChunkX = newCenter.x; + centerChunkZ = newCenter.z; + } + + private void loadChunk(ServerLevel level, ChunkPos chunk) { + if (ourLoadedChunks.contains(chunk)) return; + + level.setChunkForced(chunk.x, chunk.z, true); + ourLoadedChunks.add(chunk); + } + + private void unloadChunk(ServerLevel level, ChunkPos chunk) { + if (structureChunks.contains(chunk)) return; + if (!ourLoadedChunks.remove(chunk)) return; + + level.setChunkForced(chunk.x, chunk.z, false); + } + + public void loadStructureChunks() { + if (!(getMachine().getLevel() instanceof ServerLevel serverLevel)) return; + + structureChunks.clear(); + + BlockPos machinePos = getMachine().getBlockPos(); + for (int dx = -2; dx <= 2; dx++) { + for (int dz = -2; dz <= 2; dz++) { + ChunkPos chunk = new ChunkPos(machinePos.offset(dx, 0, dz)); + if (!structureChunks.contains(chunk)) { + structureChunks.add(chunk); + loadChunk(serverLevel, chunk); + } + } + } + } + + private void releaseAllMiningChunks() { + if (!(getMachine().getLevel() instanceof ServerLevel serverLevel)) return; + + Set toUnload = new HashSet<>(ourLoadedChunks); + toUnload.removeAll(structureChunks); + + for (ChunkPos chunk : toUnload) { + unloadChunk(serverLevel, chunk); + } + + centerChunkX = Integer.MIN_VALUE; + centerChunkZ = Integer.MIN_VALUE; + } + + public void releaseAllChunks() { + if (!(getMachine().getLevel() instanceof ServerLevel serverLevel)) return; + + for (ChunkPos chunk : ourLoadedChunks) { + serverLevel.setChunkForced(chunk.x, chunk.z, false); + } + + ourLoadedChunks.clear(); + structureChunks.clear(); + centerChunkX = Integer.MIN_VALUE; + centerChunkZ = Integer.MIN_VALUE; + } + + public void restartDrill() { + releaseAllMiningChunks(); + phase = DrillPhase.IDLE; + pendingOres.clear(); + oreTypeCounts.clear(); + currentOreIndex = 0; + miningProgress = 0; + blocksScanned = 0; + boundsInitialized = false; + } + + private boolean isOre(BlockState state) { + return state.is(Tags.Blocks.ORES); + } + + private String getOreMaterialName(BlockState state) { + try { + ItemStack blockItem = new ItemStack(state.getBlock()); + if (!blockItem.isEmpty()) { + var materialStack = ChemicalHelper.getMaterialStack(blockItem); + if (materialStack != null && materialStack.material() != null) { + Material mat = materialStack.material(); + String localizedName = mat.getLocalizedName().getString(); + if (!localizedName.contains("material.gtceu.") && !localizedName.contains("null")) { + return localizedName + " Ore"; + } + } + } + } catch (Exception ignored) {} + + return parseOreNameFromDescriptionId(state.getBlock().getDescriptionId()); + } + + private static final String[] STONE_TYPES = { + "stone", "deepslate", "granite", "diorite", "andesite", "tuff", + "sand", "red_sand", "gravel", "basalt", "netherrack", "endstone", + "blackstone", "marble", "sandstone", "red_sandstone", "smooth_basalt" + }; + + private String parseOreNameFromDescriptionId(String descId) { + String key = descId.toLowerCase(); + String[] parts = key.split("\\."); + if (parts.length < 2) return descId; + + String orePart = parts[parts.length - 1].replace("_ore", ""); + + for (String stone : STONE_TYPES) { + String prefix = stone + "_"; + if (orePart.startsWith(prefix)) { + orePart = orePart.substring(prefix.length()); + break; + } + } + + return formatMaterialName(orePart) + " Ore"; + } + + private String formatMaterialName(String raw) { + String[] words = raw.split("_"); + StringBuilder result = new StringBuilder(); + for (String word : words) { + if (!word.isEmpty()) { + if (result.length() > 0) result.append(" "); + result.append(Character.toUpperCase(word.charAt(0))); + if (word.length() > 1) { + result.append(word.substring(1)); + } + } + } + return result.toString(); + } + + public DrillPhase getPhase() { + return phase; + } + + public Map getOreTypeCounts() { + return oreTypeCounts; + } + + public int getPendingOreCount() { + return pendingOres.size(); + } + + public int getCurrentOreIndex() { + return currentOreIndex; + } + + public int getMiningProgress() { + return miningProgress; + } + + public float getMiningProgressPercent() { + return (float) miningProgress / TICKS_PER_ORE; + } + + public int getMiningProgressSeconds() { + return miningProgress / 20; + } + + public int getTotalMiningSeconds() { + return TICKS_PER_ORE / 20; + } + + public float getScanProgressPercent() { + if (totalBlocksToScan <= 0) return 0f; + return (float) blocksScanned / totalBlocksToScan * 100f; + } + + @Override + public void findAndHandleRecipe() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/OreExtractionDrillMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/OreExtractionDrillMachine.java new file mode 100644 index 000000000..5d797b6e8 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/OreExtractionDrillMachine.java @@ -0,0 +1,204 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.client.gui.widget.drill.OreExtractionDrillFancyUIWidget; +import com.ghostipedia.cosmiccore.client.gui.widget.drill.OreExtractionDrillWidget; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.IEnergyContainer; +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.misc.EnergyContainerList; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.widget.Widget; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.Style; +import net.minecraft.world.entity.player.Player; + +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Map; + +public class OreExtractionDrillMachine extends WorkableElectricMultiblockMachine { + + @Getter + private final int tier; + + public OreExtractionDrillMachine(BlockEntityCreationInfo holder, int tier) { + super(holder, m -> new OreExtractionDrillLogic((OreExtractionDrillMachine) m)); + this.tier = tier; + } + + @NotNull + @Override + public OreExtractionDrillLogic getRecipeLogic() { + return (OreExtractionDrillLogic) super.getRecipeLogic(); + } + + public float getRemovalChance() { + return switch (tier) { + case GTValues.LV -> 0.50f; + case GTValues.HV -> 0.25f; + case GTValues.IV -> 0.125f; + case GTValues.ZPM -> 0.0625f; + default -> 0.50f; + }; + } + + public int getEffectiveYieldMultiplier() { + return Math.round(1.0f / getRemovalChance()); + } + + public int getTierIndex() { + return switch (tier) { + case GTValues.LV -> 0; + case GTValues.HV -> 1; + case GTValues.IV -> 2; + case GTValues.ZPM -> 3; + default -> 0; + }; + } + + public long getEnergyPerTick() { + return GTValues.V[tier]; + } + + public boolean drainEnergy(boolean simulate) { + var energyHandlers = this.getCapabilitiesFlat(IO.IN, EURecipeCapability.CAP); + if (energyHandlers == null) return false; + + var energyList = new EnergyContainerList( + energyHandlers.stream() + .filter(IEnergyContainer.class::isInstance) + .map(IEnergyContainer.class::cast) + .toList()); + + long toDrain = getEnergyPerTick(); + if (energyList.getEnergyStored() < toDrain) { + return false; + } + + if (!simulate) { + energyList.removeEnergy(toDrain); + } + return true; + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + getRecipeLogic().invalidateCache(); + getRecipeLogic().loadStructureChunks(); + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + getRecipeLogic().invalidateCache(); + getRecipeLogic().releaseAllChunks(); + } + + @Override + public void onUnload() { + super.onUnload(); + getRecipeLogic().releaseAllChunks(); + } + + @Override + protected net.minecraft.world.InteractionResult onScrewdriverClick( + com.gregtechceu.gtceu.utils.ExtendedUseOnContext context) { + if (!isRemote()) { + getRecipeLogic().restartDrill(); + context.getPlayer().sendSystemMessage( + Component.translatable("cosmiccore.machine.ore_extraction_drill.restarted")); + } + return net.minecraft.world.InteractionResult.sidedSuccess(isRemote()); + } + + @Override + public Widget createUIWidget() { + return new OreExtractionDrillWidget(() -> this); + } + + @Override + public ModularUI createUI(Player entityPlayer) { + return new ModularUI(OreExtractionDrillWidget.WIDTH + 16, OreExtractionDrillWidget.HEIGHT + 70, this, + entityPlayer) + .widget(new OreExtractionDrillFancyUIWidget(this, OreExtractionDrillWidget.WIDTH + 16, + OreExtractionDrillWidget.HEIGHT + 70, this::getTierIndex)); + } + + @Override + public void addDisplayText(List textList) { + if (isFormed()) { + var logic = getRecipeLogic(); + + textList.add(Component.translatable("gtceu.multiblock.max_energy_per_tick", + FormattingUtil.formatNumbers(getEnergyPerTick()), GTValues.VNF[tier])); + + textList.add(Component.literal(String.format("Removal Chance: %.1f%% (%dx yield)", + getRemovalChance() * 100f, getEffectiveYieldMultiplier())).withStyle(ChatFormatting.GOLD)); + + OreExtractionDrillLogic.DrillPhase phase = logic.getPhase(); + Component phaseText = switch (phase) { + case IDLE -> Component.literal("Idle").withStyle(ChatFormatting.GRAY); + case SCANNING -> Component.literal(String.format("Scanning... %.1f%%", logic.getScanProgressPercent())) + .withStyle(ChatFormatting.YELLOW); + case MINING -> Component.literal("Mining").withStyle(ChatFormatting.GREEN); + case COMPLETE -> Component.literal("Complete").withStyle(ChatFormatting.AQUA); + }; + textList.add(Component.literal("Phase: ").append(phaseText)); + + if (phase == OreExtractionDrillLogic.DrillPhase.SCANNING) { + int foundSoFar = logic.getPendingOreCount(); + textList.add(Component.literal(String.format("Ores found: %d", foundSoFar)) + .withStyle(ChatFormatting.GRAY)); + } else if (phase == OreExtractionDrillLogic.DrillPhase.MINING) { + int current = logic.getCurrentOreIndex(); + int total = logic.getPendingOreCount(); + int progressSec = logic.getMiningProgressSeconds(); + int totalSec = logic.getTotalMiningSeconds(); + textList.add(Component.literal(String.format("Ore: %d / %d (%ds / %ds)", + current + 1, total, progressSec, totalSec)).withStyle(ChatFormatting.WHITE)); + + Map oreCounts = logic.getOreTypeCounts(); + if (!oreCounts.isEmpty()) { + textList.add(Component.literal("Ore Types:").withStyle(ChatFormatting.GRAY)); + oreCounts.entrySet().stream() + .sorted((a, b) -> b.getValue().compareTo(a.getValue())) + .limit(5) + .forEach(entry -> { + MutableComponent oreName = Component.translatable(entry.getKey()); + textList.add(Component.literal(" ") + .append(oreName) + .append(Component.literal(": " + entry.getValue())) + .withStyle(ChatFormatting.GRAY)); + }); + if (oreCounts.size() > 5) { + textList.add(Component.literal(String.format(" ... and %d more types", + oreCounts.size() - 5)).withStyle(ChatFormatting.DARK_GRAY)); + } + } + } else if (phase == OreExtractionDrillLogic.DrillPhase.COMPLETE) { + textList.add(Component.literal("Use screwdriver to restart scan") + .withStyle(ChatFormatting.ITALIC, ChatFormatting.GRAY)); + } + } else { + Component tooltip = Component.translatable("gtceu.multiblock.invalid_structure.tooltip") + .withStyle(ChatFormatting.GRAY); + textList.add(Component.translatable("gtceu.multiblock.invalid_structure") + .withStyle(Style.EMPTY.withColor(ChatFormatting.RED) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, tooltip)))); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/PCBFoundryMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/PCBFoundryMachine.java new file mode 100644 index 000000000..bb46b08f3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/PCBFoundryMachine.java @@ -0,0 +1,62 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import com.lowdragmc.lowdraglib.gui.widget.*; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; + +import java.util.List; + +public class PCBFoundryMachine extends WorkableElectricMultiblockMachine implements IDisplayUIMachine { + + public PCBFoundryMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + @Override + public void addDisplayText(List textList) { + int numParallels; + int batchParallels; + boolean exact; + if (recipeLogic.isActive() && recipeLogic.getLastRecipe() != null) { + numParallels = recipeLogic.getLastRecipe().parallels; + batchParallels = recipeLogic.getLastRecipe().batchParallels; + exact = true; + } else { + exact = false; + numParallels = getParallelHatch() + .map(c -> c.getCurrentParallel() * 4) + .orElse(0); + batchParallels = 0; + } + var builder = MultiblockDisplayText.builder(textList, isFormed()) + .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) + .addEnergyUsageLine(energyContainer) + .addEnergyTierLine(tier) + .addMachineModeLine(getRecipeType(), getRecipeTypes().length > 1); + builder.addCustom((components) -> { + if (numParallels > 1) { + Component parallels = Component.literal(FormattingUtil.formatNumbers(numParallels)) + .withStyle(ChatFormatting.GOLD); + Component parallelsClassic = Component.literal(FormattingUtil.formatNumbers(numParallels / 4)) + .withStyle(ChatFormatting.DARK_PURPLE); + String key = "cosmic.multiblock.parallel"; + if (exact) key += ".exact"; + textList.add(Component.translatable(key, parallels, parallelsClassic) + .withStyle(ChatFormatting.GRAY)); + } + }) + .addBatchModeLine(isBatchEnabled(), batchParallels) + .addWorkingStatusLine() + .addProgressLine(recipeLogic.getProgress(), recipeLogic.getMaxProgress(), + recipeLogic.getProgressPercent()) + .addOutputLines(recipeLogic.getLastRecipe()); + getDefinition().getAdditionalDisplay().accept(this, textList); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/RegressionPersistentWorkableElectricMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/RegressionPersistentWorkableElectricMachine.java new file mode 100644 index 000000000..1a065c83f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/RegressionPersistentWorkableElectricMachine.java @@ -0,0 +1,34 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; + +public class RegressionPersistentWorkableElectricMachine extends WorkableElectricMultiblockMachine { + + public RegressionPersistentWorkableElectricMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + @Override + public boolean regressWhenWaiting() { + return false; + } + + // TODO: Machine Fails and recipe voids if per-Tick is not satisfied. + @Override + public boolean onWorking() { + // var logic = this.getRecipeLogic(); + // var recipe = recipeLogic.getLastRecipe(); + // + // if (recipe != null && recipeLogic.isWorking()) { + // var validIngredients = RecipeHelper.matchTickRecipe(this.getRecipeLogic().machine, recipe); + // if (!validIngredients.isSuccess()) { + // recipeLogic.interruptRecipe(); + // recipeLogic.setStatus(RecipeLogic.Status.SUSPEND); + // return false; + // } + // return super.onWorking(); + // } + return super.onWorking(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/StarLadderMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/StarLadderMachine.java new file mode 100644 index 000000000..7ac2e1a38 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/StarLadderMachine.java @@ -0,0 +1,110 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock; +import com.ghostipedia.cosmiccore.api.machine.multiblock.LinkedWorkableElectricMultiblockMachine; +import com.ghostipedia.cosmiccore.client.gui.widget.starladder.StarLadderFancyUIWidget; +import com.ghostipedia.cosmiccore.client.gui.widget.starladder.StarLadderWidget; +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper; + +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import net.minecraft.ChatFormatting; +import net.minecraft.core.GlobalPos; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; + +import java.util.List; + +public class StarLadderMachine extends LinkedWorkableElectricMultiblockMachine { + + + @SaveField + private final StarLadderUplinkManager uplinkManager = new StarLadderUplinkManager(this); + + public StarLadderMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + public StarLadderUplinkManager getUplinkManager() { + return uplinkManager; + } + + + @Override + public LinkRole getLinkRole() { + return LinkRole.CONTROLLER; + } + + @Override + public int getMaxPartners() { + return 1; + } + + @Override + public boolean canLinkTo(GlobalPos partner, ILinkedMultiblock partnerMachine) { + return partnerMachine instanceof StarLadderResearchHubMachine; + } + + public ILinkedMultiblock getLinkedPartnerMachine(GlobalPos partner) { + return getPartnerMachine(partner); + } + + @Override + public void onLoad() { + super.onLoad(); + if (!isRemote()) { + subscribeServerTick(this::tickUplink); + } + } + + private void tickUplink() { + uplinkManager.tick(); + } + + @Override + public void addDisplayText(List textList) { + super.addDisplayText(textList); + if (!isFormed()) return; + + GlobalPos hub = getLinkedPartners().stream().findFirst().orElse(null); + if (hub == null) { + textList.add(Component.literal("No linked Research Hub").withStyle(ChatFormatting.GRAY)); + return; + } + + boolean online = getPartnerMachine(hub) != null; + textList.add(Component.literal("Research Hub: " + (online ? "Online" : "Offline")) + .withStyle(online ? ChatFormatting.GREEN : ChatFormatting.RED)); + textList.add(Component.literal(" " + LinkedMultiblockHelper.getDimensionName(hub.dimension().location())) + .withStyle(ChatFormatting.GRAY)); + textList.add(Component.literal(" [%d, %d, %d]".formatted( + hub.pos().getX(), hub.pos().getY(), hub.pos().getZ())) + .withStyle(ChatFormatting.GRAY)); + + StarLadderUplinkState uplinkState = uplinkManager.getState(); + if (uplinkState.isFightState()) { + textList.add(Component.literal("Uplink: ACTIVE") + .withStyle(ChatFormatting.RED, ChatFormatting.BOLD)); + textList.add(Component.literal(" Progress: " + (uplinkManager.getProgress() * 100 / 6000) + "%") + .withStyle(ChatFormatting.GOLD)); + } else if (uplinkState == StarLadderUplinkState.COMPLETED) { + textList.add(Component.literal("Uplink: ESTABLISHED") + .withStyle(ChatFormatting.GREEN, ChatFormatting.BOLD)); + } + } + + @Override + public Widget createUIWidget() { + return new StarLadderWidget(() -> this); + } + + @Override + public ModularUI createUI(Player entityPlayer) { + return new ModularUI(StarLadderWidget.WIDTH + 16, StarLadderWidget.HEIGHT + 70, this, entityPlayer) + .widget(new StarLadderFancyUIWidget(this, StarLadderWidget.WIDTH + 16, StarLadderWidget.HEIGHT + 70, + () -> 0)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/StarLadderResearchHubMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/StarLadderResearchHubMachine.java new file mode 100644 index 000000000..24ebf2b35 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/StarLadderResearchHubMachine.java @@ -0,0 +1,567 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.api.capability.ILinkedMultiblock; +import com.ghostipedia.cosmiccore.api.machine.multiblock.LinkedWorkableElectricMultiblockMachine; +import com.ghostipedia.cosmiccore.client.gui.widget.starladder.StarLadderFancyUIWidget; +import com.ghostipedia.cosmiccore.client.gui.widget.starladder.StarLadderResearchHubWidget; +import com.ghostipedia.cosmiccore.client.renderer.RingUpgradePreviewRenderer; +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.StarLadderResearchHub; + +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.pattern.BlockPattern; +import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.syncdata.annotation.UpdateListener; +import net.minecraft.ChatFormatting; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.core.GlobalPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.SoundType; +import net.minecraft.world.phys.BlockHitResult; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import lombok.Getter; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class StarLadderResearchHubMachine extends LinkedWorkableElectricMultiblockMachine { + + + private static final ResourceKey REQUIRED_DIMENSION = ResourceKey.create( + Registries.DIMENSION, ResourceLocation.fromNamespaceAndPath("ad_astra", "earth_orbit")); + + @Persisted + @DescSynced + @UpdateListener(methodName = "onRingTierSynced") + private int ringTier = 0; + + @Persisted + @DescSynced + @UpdateListener(methodName = "onRingPreviewSynced") + private boolean ringPreviewEnabled = false; + + @Persisted + @DescSynced + private int partialRingIndex = 0; + + public StarLadderResearchHubMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + public int getRingTier() { + return ringTier; + } + + public boolean isRingPreviewEnabled() { + return ringPreviewEnabled; + } + + public int getPartialRingIndex() { + return partialRingIndex; + } + + @OnlyIn(Dist.CLIENT) + @SuppressWarnings("unused") + protected void onRingPreviewSynced(boolean newValue, boolean oldValue) { + if (newValue) { + RingUpgradePreviewRenderer.enablePreview(getBlockPos(), getFrontFacing(), ringTier); + } else { + RingUpgradePreviewRenderer.disablePreview(getBlockPos()); + } + } + + @OnlyIn(Dist.CLIENT) + @SuppressWarnings("unused") + protected void onRingTierSynced(int newValue, int oldValue) { + if (ringPreviewEnabled) { + RingUpgradePreviewRenderer.updatePreview(getBlockPos(), getFrontFacing(), newValue); + } + } + + public void toggleRingPreview() { + // ringTier is 0-3, max tier is 3 + if (!isFormed() || ringTier >= 3) { + ringPreviewEnabled = false; + return; + } + ringPreviewEnabled = !ringPreviewEnabled; + } + + public boolean canUpgrade() { + // Can upgrade from 0 (to build T1) up through 2 (to build T3) + return isFormed() && ringTier < 3; + } + + public net.minecraft.world.level.block.Block getNextRingBlock() { + if (!canUpgrade()) return null; + return RingUpgradePreviewRenderer.getRingBlock(ringTier + 1); + } + + public int getNextRingBlockCount() { + if (!canUpgrade()) return 0; + return RingUpgradePreviewRenderer.getRingBlockCount(ringTier + 1); + } + + public Set getNextRingPositions() { + if (!canUpgrade()) return Set.of(); + return RingUpgradePreviewRenderer.calculateRingPositions(getBlockPos(), getFrontFacing(), ringTier + 1); + } + + public Map getNextRingPositionsWithBlocks() { + if (!canUpgrade()) return Map.of(); + return RingUpgradePreviewRenderer.calculateRingPositionsWithBlocks(getBlockPos(), getFrontFacing(), ringTier + 1); + } + + public int autoBuildNextRing(Player player) { + if (!canUpgrade() || getLevel() == null) return 0; + + Map positionsWithBlocks = getNextRingPositionsWithBlocks(); + if (positionsWithBlocks.isEmpty()) return 0; + + boolean isCreative = player.isCreative(); + int placed = 0; + + for (Map.Entry entry : positionsWithBlocks.entrySet()) { + BlockPos pos = entry.getKey(); + net.minecraft.world.level.block.Block targetBlock = entry.getValue(); + + if (!getLevel().isEmptyBlock(pos)) continue; + + if (!isCreative) { + // Find and consume a matching block from player inventory + ItemStack consumed = consumeBlockFromInventory(player, targetBlock); + if (consumed.isEmpty()) continue; // Try next position, might have different block type + } + + // Place the block + getLevel().setBlock(pos, targetBlock.defaultBlockState(), net.minecraft.world.level.block.Block.UPDATE_ALL); + + // Play place sound + SoundType soundType = targetBlock.defaultBlockState().getSoundType(); + getLevel().playSound(null, pos, soundType.getPlaceSound(), SoundSource.BLOCKS, + (soundType.getVolume() + 1.0F) / 2.0F, soundType.getPitch() * 0.8F); + + placed++; + } + + return placed; + } + + private ItemStack consumeBlockFromInventory(Player player, net.minecraft.world.level.block.Block targetBlock) { + for (int i = 0; i < player.getInventory().getContainerSize(); i++) { + ItemStack stack = player.getInventory().getItem(i); + if (stack.isEmpty()) continue; + + if (stack.getItem() instanceof BlockItem blockItem) { + if (blockItem.getBlock() == targetBlock) { + ItemStack consumed = stack.split(1); + if (stack.isEmpty()) { + player.getInventory().setItem(i, ItemStack.EMPTY); + } + return consumed; + } + } + } + return ItemStack.EMPTY; + } + + public int countBlocksInInventory(Player player, net.minecraft.world.level.block.Block targetBlock) { + int count = 0; + for (int i = 0; i < player.getInventory().getContainerSize(); i++) { + ItemStack stack = player.getInventory().getItem(i); + if (stack.isEmpty()) continue; + + if (stack.getItem() instanceof BlockItem blockItem) { + if (blockItem.getBlock() == targetBlock) { + count += stack.getCount(); + } + } + } + return count; + } + + public int countEmptyRingPositions() { + if (!canUpgrade() || getLevel() == null) return 0; + + Map positions = getNextRingPositionsWithBlocks(); + int empty = 0; + for (BlockPos pos : positions.keySet()) { + if (getLevel().isEmptyBlock(pos)) { + empty++; + } + } + return empty; + } + + public Map countEmptyRingPositionsByBlock() { + if (!canUpgrade() || getLevel() == null) return Map.of(); + + Map positions = getNextRingPositionsWithBlocks(); + Map counts = new java.util.HashMap<>(); + for (Map.Entry entry : positions.entrySet()) { + if (getLevel().isEmptyBlock(entry.getKey())) { + counts.merge(entry.getValue(), 1, Integer::sum); + } + } + return counts; + } + + public Map getNextRingBlockCounts() { + if (!canUpgrade()) return Map.of(); + return RingUpgradePreviewRenderer.getDeltaBlockCounts(ringTier); + } + + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + + // Use the tier from the pattern that matched during checkPattern() + this.ringTier = Math.max(0, lastMatchedTier); + this.partialRingIndex = 0; // No partial rings with strict pattern matching + + // Disable preview if max tier reached (T3 is max) + if (ringPreviewEnabled && ringTier >= 3) { + ringPreviewEnabled = false; + } + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + this.ringTier = 0; + this.partialRingIndex = 0; + this.ringPreviewEnabled = false; + } + + @Override + protected InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { + if (!isRemote()) { + Player playerIn = context.getPlayer(); + if (playerIn.isShiftKeyDown()) { + // Shift+Screwdriver = Auto-build + return handleAutoBuild(playerIn); + } else { + // Normal Screwdriver = Toggle preview + return handlePreviewToggle(playerIn); + } + } + return super.onScrewdriverClick(context); + } + + @Override + protected InteractionResult onSoftMalletClick(ExtendedUseOnContext context) { + Player playerIn = context.getPlayer(); + if (!isRemote()) { + if (playerIn.isShiftKeyDown()) { + return handleDebugBuildT0(playerIn); + } + } + return super.onSoftMalletClick(context); + } + + private InteractionResult handlePreviewToggle(Player player) { + if (canUpgrade()) { + toggleRingPreview(); + + if (ringPreviewEnabled) { + int totalCount = getNextRingBlockCount(); + player.displayClientMessage( + Component.literal("Ring Preview: ON") + .withStyle(ChatFormatting.GREEN) + .append(Component.literal(" (" + totalCount + " blocks needed)") + .withStyle(ChatFormatting.GRAY)), + true); + } else { + player.displayClientMessage( + Component.literal("Ring Preview: OFF").withStyle(ChatFormatting.RED), + true); + } + return InteractionResult.SUCCESS; + } else if (ringTier >= 3) { + player.displayClientMessage( + Component.literal("Maximum tier reached!").withStyle(ChatFormatting.GOLD), + true); + return InteractionResult.SUCCESS; + } + return InteractionResult.PASS; + } + + private InteractionResult handleAutoBuild(Player player) { + if (!canUpgrade()) { + if (ringTier >= 3) { + player.displayClientMessage( + Component.literal("Maximum tier reached!").withStyle(ChatFormatting.GOLD), + true); + } + return InteractionResult.SUCCESS; + } + + int needed = countEmptyRingPositions(); + + if (needed == 0) { + player.displayClientMessage( + Component.literal("Ring already complete! Break and rebuild structure to upgrade tier.") + .withStyle(ChatFormatting.YELLOW), + true); + return InteractionResult.SUCCESS; + } + + // Check if player has any of the required blocks (skip for creative) + if (!player.isCreative()) { + Map neededByBlock = countEmptyRingPositionsByBlock(); + boolean hasAnyBlocks = false; + for (net.minecraft.world.level.block.Block block : neededByBlock.keySet()) { + if (countBlocksInInventory(player, block) > 0) { + hasAnyBlocks = true; + break; + } + } + + if (!hasAnyBlocks) { + player.displayClientMessage( + Component.literal("Missing blocks for next tier!").withStyle(ChatFormatting.RED), + true); + return InteractionResult.SUCCESS; + } + } + + int placed = autoBuildNextRing(player); + int remaining = countEmptyRingPositions(); + + if (remaining == 0) { + player.displayClientMessage( + Component.literal("Ring complete! ").withStyle(ChatFormatting.GREEN) + .append(Component.literal("Placed " + placed + " blocks.") + .withStyle(ChatFormatting.WHITE)), + true); + // Play a completion sound + getLevel().playSound(null, getBlockPos(), SoundEvents.PLAYER_LEVELUP, SoundSource.BLOCKS, 0.5F, 1.0F); + + // Force structure re-evaluation by invalidating first, then rechecking + // This ensures onStructureFormed() is called again with the new tier + onStructureInvalid(); + getMultiblockState().setError(null); + if (checkPattern()) { + onStructureFormed(); + } + } else { + player.displayClientMessage( + Component.literal("Placed " + placed + " blocks. ").withStyle(ChatFormatting.YELLOW) + .append(Component.literal(remaining + " positions remaining.") + .withStyle(ChatFormatting.GRAY)), + true); + } + + return InteractionResult.SUCCESS; + } + + /** + * Auto-build T0 structure for easier testing. + * Only works in creative mode. Use Shift+Soft Mallet to trigger. + */ + private InteractionResult handleDebugBuildT0(Player player) { + if (!player.isCreative()) { + player.displayClientMessage( + Component.literal("Creative mode only!").withStyle(ChatFormatting.RED), + true); + return InteractionResult.SUCCESS; + } + + if (getLevel() == null) return InteractionResult.PASS; + + Map t0Positions = RingUpgradePreviewRenderer.calculateRingPositionsWithBlocks( + getBlockPos(), getFrontFacing(), 0); + + if (t0Positions.isEmpty()) { + player.displayClientMessage( + Component.literal("No T0 positions found!").withStyle(ChatFormatting.RED), + true); + return InteractionResult.SUCCESS; + } + + int placed = 0; + int skipped = 0; + for (Map.Entry entry : t0Positions.entrySet()) { + BlockPos pos = entry.getKey(); + net.minecraft.world.level.block.Block targetBlock = entry.getValue(); + + if (!getLevel().isEmptyBlock(pos)) { + skipped++; + continue; + } + + getLevel().setBlock(pos, targetBlock.defaultBlockState(), net.minecraft.world.level.block.Block.UPDATE_ALL); + + SoundType soundType = targetBlock.defaultBlockState().getSoundType(); + getLevel().playSound(null, pos, soundType.getPlaceSound(), SoundSource.BLOCKS, + (soundType.getVolume() + 1.0F) / 2.0F, soundType.getPitch() * 0.8F); + + placed++; + } + + player.displayClientMessage( + Component.literal("Built T0: ").withStyle(ChatFormatting.LIGHT_PURPLE) + .append(Component.literal(placed + " blocks placed, " + skipped + " skipped") + .withStyle(ChatFormatting.WHITE)), + true); + + getLevel().playSound(null, getBlockPos(), SoundEvents.PLAYER_LEVELUP, SoundSource.BLOCKS, 0.5F, 1.2F); + + // Force structure re-evaluation + onStructureInvalid(); + getMultiblockState().setError(null); + if (checkPattern()) { + onStructureFormed(); + } + + return InteractionResult.SUCCESS; + } + + // Cache of tier patterns for checkPattern - built lazily + private static BlockPattern[] tierPatterns; + + // Tracks which tier pattern matched during the last successful checkPattern() + // This is used by onStructureFormed() to set the correct tier + private int lastMatchedTier = -1; + + private static BlockPattern[] getTierPatterns() { + if (tierPatterns == null) { + tierPatterns = new BlockPattern[] { + StarLadderResearchHub.buildT0Pattern(), + StarLadderResearchHub.buildT1Pattern(), + StarLadderResearchHub.buildT2Pattern(), + StarLadderResearchHub.buildT3Pattern() + }; + } + return tierPatterns; + } + + @Override + public boolean checkPattern() { + // TODO: Re-enable dimension check after testing + // Check dimension requirement + // if (getLevel() != null && !getLevel().dimension().equals(REQUIRED_DIMENSION)) { + // return false; + // } + + // Try each tier pattern from T3 to T0 (highest first) + // The highest tier that matches determines the structure's tier + var state = getMultiblockState(); + + for (int tier = 3; tier >= 0; tier--) { + BlockPattern pattern = getTierPatterns()[tier]; + if (pattern.checkPatternAt(state, false)) { + lastMatchedTier = tier; + return true; + } + state.setError(null); + } + + lastMatchedTier = -1; + return false; + } + + @Override + public LinkRole getLinkRole() { + return LinkRole.REMOTE; + } + + @Override + public int getMaxPartners() { + return 1; + } + + @Override + public boolean canLinkTo(GlobalPos partner, ILinkedMultiblock partnerMachine) { + return partnerMachine instanceof StarLadderMachine; + } + + public ILinkedMultiblock getLinkedPartnerMachine(GlobalPos partner) { + return getPartnerMachine(partner); + } + + @Override + public void addDisplayText(List textList) { + super.addDisplayText(textList); + if (!isFormed()) return; + + // Display tier (0-3) + textList.add(Component.literal("Tier: T" + ringTier) + .withStyle(ChatFormatting.AQUA)); + + // Display upgrade info if not at max tier + if (canUpgrade()) { + // Show what's needed for next tier + Map neededByBlock = countEmptyRingPositionsByBlock(); + if (!neededByBlock.isEmpty()) { + textList.add(Component.literal("Next Tier (T" + (ringTier + 1) + ") Needs:") + .withStyle(ChatFormatting.GRAY)); + for (Map.Entry entry : neededByBlock.entrySet()) { + textList.add(Component.literal(" " + entry.getValue() + "x ") + .withStyle(ChatFormatting.WHITE) + .append(entry.getKey().getName().copy().withStyle(ChatFormatting.YELLOW))); + } + } + + if (ringPreviewEnabled) { + textList.add(Component.literal(" [Preview: ON]") + .withStyle(ChatFormatting.GREEN)); + } else { + textList.add(Component.literal(" [Screwdriver: preview | Shift: build]") + .withStyle(ChatFormatting.DARK_GRAY)); + } + } else if (ringTier >= 3) { + textList.add(Component.literal("Maximum tier reached!") + .withStyle(ChatFormatting.GOLD)); + } + + GlobalPos ladder = getLinkedPartners().stream().findFirst().orElse(null); + if (ladder == null) { + textList.add(Component.literal("Not linked to Star Ladder").withStyle(ChatFormatting.GRAY)); + return; + } + + boolean online = getPartnerMachine(ladder) != null; + textList.add(Component.literal("Star Ladder: " + (online ? "Online" : "Offline")) + .withStyle(online ? ChatFormatting.GREEN : ChatFormatting.RED)); + textList.add(Component.literal(" " + LinkedMultiblockHelper.getDimensionName(ladder.dimension().location())) + .withStyle(ChatFormatting.GRAY)); + textList.add(Component.literal(" [%d, %d, %d]".formatted( + ladder.pos().getX(), ladder.pos().getY(), ladder.pos().getZ())) + .withStyle(ChatFormatting.GRAY)); + } + + @Override + public Widget createUIWidget() { + return new StarLadderResearchHubWidget(() -> this); + } + + @Override + public ModularUI createUI(Player entityPlayer) { + return new ModularUI(StarLadderResearchHubWidget.WIDTH + 16, StarLadderResearchHubWidget.HEIGHT + 70, this, + entityPlayer) + .widget(new StarLadderFancyUIWidget(this, StarLadderResearchHubWidget.WIDTH + 16, + StarLadderResearchHubWidget.HEIGHT + 70, this::getRingTier)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/StarLadderUplinkManager.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/StarLadderUplinkManager.java new file mode 100644 index 000000000..b99cff885 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/StarLadderUplinkManager.java @@ -0,0 +1,726 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.api.capability.souls.SoulType; +import com.ghostipedia.cosmiccore.api.data.savedData.StarLadderSavedData; +import com.ghostipedia.cosmiccore.api.data.souls.SoulNetwork; +import com.ghostipedia.cosmiccore.api.data.souls.SoulNetworkSavedData; +import com.ghostipedia.cosmiccore.api.recipe.ingredient.SoulStack; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; +import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; +import com.ghostipedia.cosmiccore.common.network.packet.StarLadderUplinkPackets; +import com.ghostipedia.cosmiccore.common.network.packet.StarLadderUplinkPackets.WhisperStyle; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.common.data.GTItems; +import com.gregtechceu.gtceu.common.data.GTMaterials; +import com.gregtechceu.gtceu.common.machine.owner.FTBOwner; + +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.common.util.INBTSerializable; + +import java.util.*; +import java.util.function.Supplier; + +public class StarLadderUplinkManager implements INBTSerializable { + + private static final int MAX_PROGRESS = 6000; + + private static final int TICKS_PER_SECOND = 20; + + private static final int PHASE_1_SOUL_DRAIN_PER_SECOND = 5000; + private static final int PHASE_2_SOUL_DRAIN_PER_SECOND = 12000; + private static final int PHASE_3_SOUL_DRAIN_PER_SECOND = 25000; + + private static final int PROGRESS_PER_TICK = 1; + private static final int DEMAND_PROGRESS_BURST = 50; + private static final int DEMAND_MISS_PENALTY = 30; + + private static final int FIRST_DEMAND_TICK = 200; + private static final int DEMAND_INTERVAL_TICKS = 600; + private static final int DEMAND_TIMER_TICKS = 1200; + + private static final int INTERRUPTED_WHISPER_1_TICK = 20; + private static final int INTERRUPTED_WHISPER_2_TICK = 60; + private static final int INTERRUPTED_WHISPER_3_TICK = 100; + private static final int INTERRUPTED_DURATION = 120; + + private final StarLadderMachine machine; + + private StarLadderUplinkState state = StarLadderUplinkState.IDLE; + private int tickCounter = 0; + private int progress = 0; + private ServerPlayer initiatingPlayer; + + private final DemandSlot bulkDemand = new DemandSlot(); + private final DemandSlot complexDemand = new DemandSlot(); + private int demandCount = 0; + private int nextDemandTick = FIRST_DEMAND_TICK; + + private int syncCooldown = 0; + + private static final Random RANDOM = new Random(); + + public StarLadderUplinkManager(StarLadderMachine machine) { + this.machine = machine; + } + + // ---- Public API ---- + + public void initiate(ServerPlayer player) { + if (state != StarLadderUplinkState.IDLE) return; + if (!machine.isFormed()) return; + if (machine.getLinkedPartners().isEmpty()) return; + if (isTeamEstablished()) return; + + initiatingPlayer = player; + state = StarLadderUplinkState.INTERRUPTED; + tickCounter = 0; + + playSound(SoundEvents.WARDEN_AMBIENT, 0.6f, 0.5f); + StarLadderUplinkPackets.sendCloseScreen(player); + } + + public void abort(ServerPlayer player) { + if (state == StarLadderUplinkState.IDLE || state == StarLadderUplinkState.COMPLETED) return; + + resetToIdle(); + syncToPlayer(player); + } + + public void confirm(ServerPlayer player) { + if (state != StarLadderUplinkState.AWAITING_CONFIRMATION) return; + + initiatingPlayer = player; + state = StarLadderUplinkState.ACTIVE_PHASE_1; + tickCounter = 0; + progress = 0; + demandCount = 0; + nextDemandTick = FIRST_DEMAND_TICK; + clearDemands(); + + syncToPlayer(player); + } + + public StarLadderUplinkState getState() { + if (state == StarLadderUplinkState.IDLE && isTeamEstablished()) { + return StarLadderUplinkState.COMPLETED; + } + return state; + } + + public int getProgress() { + return progress; + } + + public DemandSlot getBulkDemand() { + return bulkDemand; + } + + public DemandSlot getComplexDemand() { + return complexDemand; + } + + // ---- Tick Logic ---- + + public void tick() { + if (state == StarLadderUplinkState.IDLE || state == StarLadderUplinkState.COMPLETED) return; + + tickCounter++; + + switch (state) { + case INTERRUPTED -> tickInterrupted(); + case ACTIVE_PHASE_1, ACTIVE_PHASE_2, ACTIVE_PHASE_3 -> tickActivePhase(); + case FAILED -> tickFailed(); + default -> {} + } + + if (syncCooldown > 0) syncCooldown--; + } + + private void tickInterrupted() { + if (initiatingPlayer == null || !initiatingPlayer.isAlive()) { + resetToIdle(); + return; + } + + if (tickCounter == INTERRUPTED_WHISPER_1_TICK) { + StarLadderUplinkPackets.sendObserverWhisper(initiatingPlayer, + W + "interrupted.silence", WhisperStyle.AMBIENT); + playSound(SoundEvents.SCULK_CLICKING, 0.3f, 0.4f); + } + if (tickCounter == INTERRUPTED_WHISPER_2_TICK) { + StarLadderUplinkPackets.sendObserverWhisper(initiatingPlayer, + W + "interrupted.pressure", WhisperStyle.AMBIENT); + playSound(SoundEvents.SCULK_CLICKING, 0.5f, 0.6f); + } + if (tickCounter == INTERRUPTED_WHISPER_3_TICK) { + StarLadderUplinkPackets.sendObserverWhisper(initiatingPlayer, + W + "interrupted.no", WhisperStyle.OBSERVER); + playSound(SoundEvents.WARDEN_HEARTBEAT, 0.8f, 0.8f); + } + if (tickCounter >= INTERRUPTED_DURATION) { + state = StarLadderUplinkState.AWAITING_CONFIRMATION; + tickCounter = 0; + } + } + + private void tickActivePhase() { + if (!machine.isFormed()) { + failUplink(); + return; + } + + boolean drained = drainSoul(); + + if (drained) { + progress = Math.min(MAX_PROGRESS, progress + PROGRESS_PER_TICK); + } + + tickDemandSlot(bulkDemand); + tickDemandSlot(complexDemand); + + if (tickCounter >= nextDemandTick) { + if (!bulkDemand.isActive()) generateDemand(bulkDemand, getBulkPool()); + if (!complexDemand.isActive()) generateDemand(complexDemand, getComplexPool()); + } + + checkInputBusForDemands(); + + if (progress >= MAX_PROGRESS) { + advancePhase(); + return; + } + + if (tickCounter % 60 == 0) { + playSound(SoundEvents.WARDEN_HEARTBEAT, 0.2f, 0.6f); + } + + sendFightWhispers(); + syncIfNeeded(); + } + + private void tickDemandSlot(DemandSlot slot) { + if (!slot.isActive()) return; + slot.timer++; + if (slot.timer >= slot.timerMax) { + progress = Math.max(0, progress - DEMAND_MISS_PENALTY); + slot.clear(); + nextDemandTick = tickCounter + DEMAND_INTERVAL_TICKS / 2; + playSound(SoundEvents.ANVIL_LAND, 0.3f, 0.5f); + } + } + + private void tickFailed() { + if (tickCounter >= 100) { + resetToIdle(); + } + } + + // ---- Phase Helpers ---- + + private int getSoulDrainPerSecond() { + return switch (state) { + case ACTIVE_PHASE_1 -> PHASE_1_SOUL_DRAIN_PER_SECOND; + case ACTIVE_PHASE_2 -> PHASE_2_SOUL_DRAIN_PER_SECOND; + case ACTIVE_PHASE_3 -> PHASE_3_SOUL_DRAIN_PER_SECOND; + default -> 0; + }; + } + + private List getBulkPool() { + return switch (state) { + case ACTIVE_PHASE_1 -> PHASE_1_BULK; + case ACTIVE_PHASE_2 -> PHASE_2_BULK; + case ACTIVE_PHASE_3 -> PHASE_3_BULK; + default -> PHASE_1_BULK; + }; + } + + private List getComplexPool() { + return switch (state) { + case ACTIVE_PHASE_1 -> PHASE_1_COMPLEX; + case ACTIVE_PHASE_2 -> PHASE_2_COMPLEX; + case ACTIVE_PHASE_3 -> PHASE_3_COMPLEX; + default -> PHASE_1_COMPLEX; + }; + } + + // ---- Soul Drain ---- + + private boolean drainSoul() { + if (!(machine.getLevel() instanceof ServerLevel serverLevel)) return false; + + UUID ownerUUID = machine.getOwnerUUID(); + if (ownerUUID == null) return false; + + var team = machine.getOwner() instanceof FTBOwner ftbOwner ? ftbOwner.getPlayerTeam(ownerUUID) : null; + UUID networkId = team != null ? team.getTeamId() : ownerUUID; + + int drainPerTick = getSoulDrainPerSecond() / TICKS_PER_SECOND; + + SoulNetwork network = SoulNetworkSavedData.getSoulNetwork(serverLevel, networkId); + SoulStack drainStack = new SoulStack(SoulType.Refined, drainPerTick); + SoulStack result = network.syphon(drainStack, false); + + return result.amount() >= drainPerTick; + } + + // ---- Hardware Demands ---- + + private void generateDemand(DemandSlot slot, List pool) { + DemandEntry entry = pool.get(RANDOM.nextInt(pool.size())); + ItemStack demandStack = entry.itemSupplier.get(); + if (demandStack.isEmpty()) return; + + int qty = entry.minQty + RANDOM.nextInt(entry.maxQty - entry.minQty + 1); + + slot.item = demandStack.copyWithCount(1); + slot.qty = qty; + slot.delivered = 0; + slot.timer = 0; + slot.timerMax = DEMAND_TIMER_TICKS; + demandCount++; + + playSound(SoundEvents.NOTE_BLOCK_BELL.value(), 0.6f, 0.5f); + syncIfNeeded(); + } + + private void clearDemands() { + bulkDemand.clear(); + complexDemand.clear(); + } + + private void checkInputBusForDemands() { + var itemHandlers = machine.getCapabilitiesFlat(IO.IN, ItemRecipeCapability.CAP); + checkSlotAgainstBus(bulkDemand, itemHandlers); + checkSlotAgainstBus(complexDemand, itemHandlers); + } + + private void checkSlotAgainstBus(DemandSlot slot, List itemHandlers) { + if (!slot.isActive()) return; + if (slot.delivered >= slot.qty) return; + + for (var handler : itemHandlers) { + if (!(handler instanceof NotifiableItemStackHandler itemHandler)) continue; + + for (int i = 0; i < itemHandler.getSlots(); i++) { + ItemStack slotStack = itemHandler.getStackInSlot(i); + if (slotStack.isEmpty()) continue; + if (!slotStack.is(slot.item.getItem())) continue; + + int needed = slot.qty - slot.delivered; + int toTake = Math.min(slotStack.getCount(), needed); + ItemStack extracted = itemHandler.extractItemInternal(i, toTake, false); + if (extracted.isEmpty()) continue; + slot.delivered += extracted.getCount(); + + if (slot.delivered >= slot.qty) { + progress = Math.min(MAX_PROGRESS, progress + DEMAND_PROGRESS_BURST); + slot.clear(); + nextDemandTick = tickCounter + DEMAND_INTERVAL_TICKS; + playSound(SoundEvents.EXPERIENCE_ORB_PICKUP, 0.7f, 1.2f); + syncIfNeeded(); + return; + } + } + } + } + + // ---- Fight Whispers ---- + + private static final String W = "cosmiccore.star_ladder.whisper."; + + private record Whisper(String key, WhisperStyle style) {} + + private static Whisper ambient(String id) { + return new Whisper(W + "ambient." + id, WhisperStyle.AMBIENT); + } + + private static Whisper observer(String id) { + return new Whisper(W + "observer." + id, WhisperStyle.OBSERVER); + } + + private static Whisper reflection(String id) { + return new Whisper(W + "reflection." + id, WhisperStyle.REFLECTION); + } + + private static final Whisper[] PHASE_1_WHISPERS = { + // Ambient — machine strain, sensory + ambient("p1.conduits_heating"), + ambient("p1.groaning_walls"), + ambient("p1.air_tastes_iron"), + ambient("p1.floor_vibrating"), + ambient("p1.low_hum"), + ambient("p1.sparks_corner"), + ambient("p1.lights_flicker"), + ambient("p1.smell_of_ozone"), + ambient("p1.dust_falling"), + ambient("p1.pipes_rattling"), + ambient("p1.static_on_skin"), + ambient("p1.shadows_wrong"), + ambient("p1.metal_ticking"), + ambient("p1.pressure_dropping"), + ambient("p1.something_woke_up"), + // Observer — terse, dismissive + observer("p1.stop"), + observer("p1.not_here"), + observer("p1.leave"), + observer("p1.no"), + // Reflection — determined + reflection("p1.keep_feeding"), + reflection("p1.hold"), + reflection("p1.its_working"), + }; + + private static final Whisper[] PHASE_2_WHISPERS = { + // Ambient — escalating, structural + ambient("p2.structure_resonating"), + ambient("p2.heat_distortion"), + ambient("p2.something_cracks"), + ambient("p2.machine_screams"), + ambient("p2.ears_ringing"), + ambient("p2.metal_expanding"), + ambient("p2.temperature_climbing"), + ambient("p2.bolts_shearing"), + ambient("p2.gravity_hiccup"), + ambient("p2.light_bends"), + ambient("p2.blood_in_mouth"), + ambient("p2.walls_humming"), + ambient("p2.floor_buckling"), + ambient("p2.smell_of_burning"), + ambient("p2.time_stutters"), + ambient("p2.vision_doubles"), + // Observer — warning, cold + observer("p2.dont_understand"), + observer("p2.not_yours"), + observer("p2.i_was_patient"), + observer("p2.you_were_warned"), + observer("p2.still_time"), + observer("p2.enough"), + // Reflection — pushing through + reflection("p2.channel_widening"), + reflection("p2.dont_stop"), + reflection("p2.halfway"), + }; + + private static final Whisper[] PHASE_3_WHISPERS = { + // Ambient — reality failing + ambient("p3.everything_shaking"), + ambient("p3.veil_fraying"), + ambient("p3.light_bending_wrong"), + ambient("p3.hands_shaking"), + ambient("p3.walls_breathing"), + ambient("p3.static_all_frequencies"), + ambient("p3.reality_thins"), + ambient("p3.colors_wrong"), + ambient("p3.sound_from_nowhere"), + ambient("p3.edges_dissolving"), + ambient("p3.gravity_uncertain"), + ambient("p3.air_tastes_of_stars"), + ambient("p3.heartbeat_in_walls"), + ambient("p3.ground_not_solid"), + ambient("p3.sky_too_close"), + ambient("p3.something_looking_back"), + ambient("p3.tinnitus_screaming"), + // Observer — yielding, ominous + observer("p3.fine"), + observer("p3.remember_this"), + observer("p3.you_chose_this"), + observer("p3.will_not_forget"), + observer("p3.see_what_happens"), + observer("p3.door_opens_both_ways"), + observer("p3.congratulations"), + // Reflection — final push + reflection("p3.almost_through"), + reflection("p3.one_more_push"), + reflection("p3.can_feel_it"), + }; + + private void sendFightWhispers() { + if (initiatingPlayer == null) return; + if (tickCounter % 200 != 0) return; + + Whisper[] whispers = switch (state) { + case ACTIVE_PHASE_2 -> PHASE_2_WHISPERS; + case ACTIVE_PHASE_3 -> PHASE_3_WHISPERS; + default -> PHASE_1_WHISPERS; + }; + Whisper whisper = whispers[RANDOM.nextInt(whispers.length)]; + StarLadderUplinkPackets.sendObserverWhisper(initiatingPlayer, whisper.key, whisper.style); + } + + // ---- State Transitions ---- + + private void advancePhase() { + switch (state) { + case ACTIVE_PHASE_1 -> { + state = StarLadderUplinkState.ACTIVE_PHASE_2; + tickCounter = 0; + progress = 0; + clearDemands(); + nextDemandTick = FIRST_DEMAND_TICK; + playSound(SoundEvents.WARDEN_ROAR, 0.5f, 0.7f); + if (initiatingPlayer != null) { + StarLadderUplinkPackets.sendObserverWhisper(initiatingPlayer, + W + "transition.phase_2", WhisperStyle.AMBIENT); + } + } + case ACTIVE_PHASE_2 -> { + state = StarLadderUplinkState.ACTIVE_PHASE_3; + tickCounter = 0; + progress = 0; + clearDemands(); + nextDemandTick = FIRST_DEMAND_TICK; + playSound(SoundEvents.WARDEN_ROAR, 0.7f, 0.5f); + if (initiatingPlayer != null) { + StarLadderUplinkPackets.sendObserverWhisper(initiatingPlayer, + W + "transition.phase_3", WhisperStyle.AMBIENT); + } + } + case ACTIVE_PHASE_3 -> { + completeUplink(); + } + default -> {} + } + syncIfNeeded(); + } + + private void completeUplink() { + state = StarLadderUplinkState.IDLE; + tickCounter = 0; + clearDemands(); + + markTeamEstablished(); + + playSound(SoundEvents.UI_TOAST_CHALLENGE_COMPLETE, 0.8f, 1.0f); + if (initiatingPlayer != null) { + StarLadderUplinkPackets.sendObserverWhisper(initiatingPlayer, + W + "transition.complete", WhisperStyle.REFLECTION); + } + syncIfNeeded(); + } + + private void failUplink() { + state = StarLadderUplinkState.FAILED; + tickCounter = 0; + clearDemands(); + progress = 0; + playSound(SoundEvents.RESPAWN_ANCHOR_DEPLETE.value(), 0.8f, 0.6f); + syncIfNeeded(); + } + + private void resetToIdle() { + state = StarLadderUplinkState.IDLE; + tickCounter = 0; + progress = 0; + initiatingPlayer = null; + clearDemands(); + demandCount = 0; + syncIfNeeded(); + } + + // ---- Team Persistence ---- + + private UUID resolveTeamId() { + UUID ownerUUID = machine.getOwnerUUID(); + if (ownerUUID == null) return null; + if (machine.getOwner() instanceof FTBOwner ftbOwner) { + var team = ftbOwner.getPlayerTeam(ownerUUID); + if (team != null) return team.getTeamId(); + } + return ownerUUID; + } + + private boolean isTeamEstablished() { + if (!(machine.getLevel() instanceof ServerLevel serverLevel)) return false; + UUID teamId = resolveTeamId(); + if (teamId == null) return false; + return StarLadderSavedData.getOrCreate(serverLevel).isEstablished(teamId); + } + + private void markTeamEstablished() { + if (!(machine.getLevel() instanceof ServerLevel serverLevel)) return; + UUID teamId = resolveTeamId(); + if (teamId == null) return; + StarLadderSavedData.getOrCreate(serverLevel).setEstablished(teamId); + } + + // ---- Sync ---- + + private void syncIfNeeded() { + if (initiatingPlayer == null) return; + if (syncCooldown > 0 && (bulkDemand.isActive() || complexDemand.isActive())) return; + + syncToPlayer(initiatingPlayer); + syncCooldown = 5; + } + + private void syncToPlayer(ServerPlayer player) { + StarLadderUplinkPackets.sendUplinkSync(player, getState(), progress, + getSoulDrainPerSecond(), bulkDemand, complexDemand); + } + + // ---- NBT ---- + + @Override + public CompoundTag serializeNBT(HolderLookup.Provider provider) { + var tag = new CompoundTag(); + tag.putString("state", state.name()); + tag.putInt("progress", progress); + tag.putInt("tickCounter", tickCounter); + return tag; + } + + @Override + public void deserializeNBT(HolderLookup.Provider provider, CompoundTag tag) { + try { + state = StarLadderUplinkState.valueOf(tag.getString("state")); + } catch (IllegalArgumentException e) { + state = StarLadderUplinkState.IDLE; + } + progress = tag.getInt("progress"); + tickCounter = tag.getInt("tickCounter"); + + if (state != StarLadderUplinkState.IDLE) { + state = StarLadderUplinkState.IDLE; + progress = 0; + tickCounter = 0; + } + } + + // ---- Sound ---- + + private void playSound(net.minecraft.sounds.SoundEvent sound, float volume, float pitch) { + if (initiatingPlayer != null) { + initiatingPlayer.playNotifySound(sound, SoundSource.BLOCKS, volume, pitch); + } + } + + // ---- Demand Slot ---- + + public static class DemandSlot { + + public ItemStack item = ItemStack.EMPTY; + public int qty = 0; + public int delivered = 0; + public int timer = 0; + public int timerMax = 0; + + public boolean isActive() { + return !item.isEmpty(); + } + + public int remaining() { + return Math.max(0, qty - delivered); + } + + public void clear() { + item = ItemStack.EMPTY; + qty = 0; + delivered = 0; + timer = 0; + timerMax = 0; + } + } + + // ---- Demand Pools ---- + + private record DemandEntry(Supplier itemSupplier, int minQty, int maxQty) {} + + private static DemandEntry material(TagPrefix prefix, com.gregtechceu.gtceu.api.data.chemical.material.Material mat, + int min, int max) { + return new DemandEntry(() -> ChemicalHelper.get(prefix, mat), min, max); + } + + private static DemandEntry item(Supplier supplier, int min, int max) { + return new DemandEntry(supplier, min, max); + } + + // Phase 1: EV-tier bulk materials + private static final List PHASE_1_BULK = List.of( + material(TagPrefix.ingot, GTMaterials.Steel, 500, 2000), + material(TagPrefix.ingot, GTMaterials.Aluminium, 500, 2000), + material(TagPrefix.ingot, GTMaterials.StainlessSteel, 200, 800), + material(TagPrefix.plate, GTMaterials.Steel, 200, 1000), + material(TagPrefix.plate, GTMaterials.Aluminium, 200, 800), + material(TagPrefix.dust, GTMaterials.Redstone, 1000, 4000), + material(TagPrefix.dust, GTMaterials.Glowstone, 500, 2000), + material(TagPrefix.gem, GTMaterials.Diamond, 64, 256), + material(TagPrefix.ingot, GTMaterials.Gold, 200, 800), + material(TagPrefix.dust, GTMaterials.Lapis, 500, 2000)); + + // Phase 1: HV-tier complex components + private static final List PHASE_1_COMPLEX = List.of( + material(TagPrefix.gear, GTMaterials.StainlessSteel, 32, 512), + material(TagPrefix.spring, CosmicMaterials.EnergeticAlloy, 32, 512), + material(TagPrefix.plate, CosmicMaterials.PrismaticTungstensteel, 64, 512), + material(TagPrefix.frameGt, GTMaterials.StainlessSteel, 32, 512), + material(TagPrefix.wireFine, CosmicMaterials.EnergeticAlloy, 128, 512), + item(CosmicItems.ADVANCED_RAM_WAFER::asStack, 64, 256), + item(CosmicItems.ENTHEL_CPU::asStack, 16, 64), + item(CosmicItems.ENTHELIC_PCB::asStack, 16, 64), + item(GTItems.SMD_DIODE::asStack, 64, 256), + item(GTItems.SMD_INDUCTOR::asStack, 64, 256)); + + // Phase 2: EV-tier bulk alloys + private static final List PHASE_2_BULK = List.of( + material(TagPrefix.ingot, GTMaterials.TungstenSteel, 512, 2048), + material(TagPrefix.ingot, GTMaterials.Titanium, 512, 2048), + material(TagPrefix.ingot, GTMaterials.Chromium, 512, 2048), + material(TagPrefix.ingot, GTMaterials.Tungsten, 512, 2048), + material(TagPrefix.ingot, CosmicMaterials.VibrantAlloy, 512, 2048), + material(TagPrefix.ingot, CosmicMaterials.Signalum, 512, 2048), + material(TagPrefix.ingot, CosmicMaterials.Lumium, 512, 2048), + material(TagPrefix.ingot, CosmicMaterials.Enderium, 512, 2048), + material(TagPrefix.dust, GTMaterials.Platinum, 512, 2048), + material(TagPrefix.gem, GTMaterials.Emerald, 512, 2048)); + + // Phase 2: EV-tier complex components + private static final List PHASE_2_COMPLEX = List.of( + material(TagPrefix.gear, CosmicMaterials.VibrantAlloy, 16, 64), + material(TagPrefix.spring, CosmicMaterials.Signalum, 32, 128), + material(TagPrefix.plate, CosmicMaterials.Enderium, 32, 128), + material(TagPrefix.wireFine, CosmicMaterials.Lumium, 64, 256), + item(GTItems.LAPOTRON_CRYSTAL::asStack, 16, 64), + item(GTItems.ENERGIUM_CRYSTAL::asStack, 16, 64), + item(CosmicItems.EFFICACY_CHIP::asStack, 256, 512), + item(CosmicItems.CAPACITY_CHIP::asStack, 256, 512), + item(CosmicItems.POTENCY_CHIP::asStack, 256, 512), + item(CosmicItems.VERBOSITY_CHIP::asStack, 256, 512)); + + // Phase 3: IV-tier exotic bulk + private static final List PHASE_3_BULK = List.of( + material(TagPrefix.ingot, GTMaterials.Uranium235, 32, 128), + material(TagPrefix.ingot, GTMaterials.Osmium, 50, 200), + material(TagPrefix.ingot, GTMaterials.Plutonium239, 50, 200), + material(TagPrefix.ingot, GTMaterials.Americium, 32, 128), + material(TagPrefix.ingot, CosmicMaterials.Virtue, 50, 200), + material(TagPrefix.ingot, CosmicMaterials.MelodicAlloy, 32, 128), + material(TagPrefix.ingot, GTMaterials.Stellite100, 16, 64), + material(TagPrefix.ingot, GTMaterials.HSSG, 50, 200), + material(TagPrefix.ingot, CosmicMaterials.Chlorophyte, 32, 128), + material(TagPrefix.ingot, CosmicMaterials.Halizine, 50, 200)); + + // Phase 3: IV-tier complex components + private static final List PHASE_3_COMPLEX = List.of( + material(TagPrefix.gear, CosmicMaterials.MelodicAlloy, 8, 32), + material(TagPrefix.frameGt, GTMaterials.NaquadahAlloy, 16, 64), + material(TagPrefix.plate, CosmicMaterials.SolSteel, 16, 64), + material(TagPrefix.wireFine, CosmicMaterials.VoidSpark, 32, 128), + item(CosmicItems.LUCIDIC_PROCESSOR::asStack, 4, 16), + item(CosmicItems.ENTHELIC_PROCESSOR_MAINFRAME::asStack, 2, 8), + item(CosmicItems.ESCHATON_PROCESSOR::asStack, 2, 8), + item(CosmicItems.LUCIDIC_PROCESSOR_ASSEMBLY::asStack, 2, 8), + item(CosmicItems.DRONE_FRAME_1::asStack, 2, 8), + item(CosmicItems.INDUSTRIAL_DRONE::asStack, 2, 8)); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/StarLadderUplinkState.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/StarLadderUplinkState.java new file mode 100644 index 000000000..cb725a43c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/StarLadderUplinkState.java @@ -0,0 +1,21 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +public enum StarLadderUplinkState { + + IDLE, + INTERRUPTED, + AWAITING_CONFIRMATION, + ACTIVE_PHASE_1, + ACTIVE_PHASE_2, + ACTIVE_PHASE_3, + COMPLETED, + FAILED; + + public boolean isActive() { + return this == ACTIVE_PHASE_1 || this == ACTIVE_PHASE_2 || this == ACTIVE_PHASE_3; + } + + public boolean isFightState() { + return isActive() || this == INTERRUPTED || this == AWAITING_CONFIRMATION; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/TitanFusionReactorMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/TitanFusionReactorMachine.java new file mode 100644 index 000000000..cf6ef3aa3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/TitanFusionReactorMachine.java @@ -0,0 +1,186 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDisplayUIMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; +import com.lowdragmc.lowdraglib.gui.texture.TextTexture; +import com.lowdragmc.lowdraglib.gui.widget.*; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.DropSaved; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; + +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class TitanFusionReactorMachine extends WorkableElectricMultiblockMachine implements IDisplayUIMachine { + + @Persisted + @DescSynced + @DropSaved + @Getter + private long EUSpent = 0L; + + @Persisted + @DescSynced + @DropSaved + @Getter + private int reactorTier = 3; // To 10, 7 Upgrades + + @Persisted + @DescSynced + @DropSaved + private boolean canUpgrade = false; + + + + public TitanFusionReactorMachine(BlockEntityCreationInfo holder) { + super(holder, HelixFusionRecipeLogic::new); + } + + long cost = upgradeCost(reactorTier); + + public void attemptUpgrade() { + if (reactorTier >= 10) { + cost = 0L; + return; + } + long costNow = upgradeCost(reactorTier); + if (EUSpent < costNow) { + cost = costNow; + return; + } + EUSpent -= costNow; + reactorTier++; + + cost = upgradeCost(reactorTier); + } + + static long upgradeCost(int reactorTier) { + final long BASE = 8_000_000_000L; + final long MAX = 1_000_000_000_000_000L; + final int MIN_TIER = 3, MAX_TIER = 10; + // Could be a clamp but the clamp was being dumb + // Dumb solution for dumb person is this not a clamp but totally a clamp + int t = Math.max(MIN_TIER, Math.min(MAX_TIER, reactorTier)); + if (t >= MAX_TIER) return 0L; + + double r = Math.pow((double) MAX / (double) BASE, 1.0 / (MAX_TIER - MIN_TIER)); + double raw = BASE * Math.pow(r, t - MIN_TIER); + + return Math.round(raw / 1_000_000.0) * 1_000_000L; + } + + @Override // IDEK if this does anything + public ModularUI createUI(Player entityPlayer) { + return new ModularUI(330, 208, this, entityPlayer).widget(new FancyMachineUIWidget(this, 300, 208)); + } + + public void increaseEUConsumed(long EUSpent) { + this.EUSpent += EUSpent; + } + + @Override + public Widget createUIWidget() { + var group = new WidgetGroup(0, 0, 220 + 8, 160 + 8); + group.addWidget(new DraggableScrollableWidgetGroup(4, 4, 220, 160).setBackground(getScreenTexture()) + .addWidget(new LabelWidget(4, 5, self().getBlockState().getBlock().getDescriptionId())) + .addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) + .textSupplier(this.getLevel().isClientSide ? null : this::addDisplayText) + .setMaxWidthLimit(200) + .clickHandler(this::handleDisplayClick))); + group.setBackground(GuiTextures.BACKGROUND_INVERSE); + group.addWidget(new ButtonWidget( + 9, + 142, + 210, + 20, + new GuiTextureGroup( + GuiTextures.BUTTON, + new TextTexture("Upgrade Reactor Tier")), + clickData -> attemptUpgrade())); + return group; + } + + @Override + public void addDisplayText(List textList) { + int numParallels; + int batchParallels; + boolean exact; + if (recipeLogic.isActive() && recipeLogic.getLastRecipe() != null) { + numParallels = recipeLogic.getLastRecipe().parallels; + batchParallels = recipeLogic.getLastRecipe().batchParallels; + exact = true; + } else { + exact = false; + numParallels = getParallelHatch() + .map(c -> c.getCurrentParallel() * 64 * reactorTier) + .orElse(0); + batchParallels = 0; + } + var builder = MultiblockDisplayText.builder(textList, isFormed()) + .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()) + .addEnergyUsageLine(energyContainer) + .addEnergyTierLine(tier) + .addMachineModeLine(getRecipeType(), getRecipeTypes().length > 1); + builder.addCustom((components) -> { + if (numParallels > 1) { + Component parallels = Component.literal(FormattingUtil.formatNumbers(numParallels)) + .withStyle(ChatFormatting.GOLD); + String key = "cosmic.multiblock.parallel_fixed_64"; + if (exact) key += ".exact"; + textList.add(Component.translatable(key, parallels) + .withStyle(ChatFormatting.GRAY)); + } + }); + builder.addCustom((components) -> { + // TODO: TRACK AND DISPLAY ORVEX APPROPRIATELY + textList.add(Component.translatable("cosmic.multiblock.orvex_tier", Component + .literal(FormattingUtil.formatNumberReadable(this.reactorTier)).withStyle(ChatFormatting.GOLD))); + textList.add(Component.translatable("cosmic.multiblock.orvex_count", Component + .literal(FormattingUtil.formatNumberReadable(this.EUSpent)).withStyle(ChatFormatting.AQUA))); + textList.add(Component.translatable("cosmic.multiblock.orvex_upgrade_requires", + Component.literal(FormattingUtil.formatNumberReadable(this.cost)).withStyle(ChatFormatting.AQUA))); + }) + .addBatchModeLine(isBatchEnabled(), batchParallels) + .addWorkingStatusLine() + .addProgressLine(recipeLogic.getProgress(), recipeLogic.getMaxProgress(), + recipeLogic.getProgressPercent()) + .addOutputLines(recipeLogic.getLastRecipe()); + getDefinition().getAdditionalDisplay().accept(this, textList); + } + + public static class HelixFusionRecipeLogic extends RecipeLogic { + + public HelixFusionRecipeLogic(IRecipeLogicMachine machine) { + super(machine); + } + + @Override + public void onRecipeFinish() { + if (lastRecipe != null) { + var inputs = lastRecipe.getInputEUt(); + long totalEUt = inputs.getTotalEU() * lastRecipe.duration; + ((TitanFusionReactorMachine) machine).increaseEUConsumed(totalEUt); + } + super.onRecipeFinish(); + } + } + + public static long clampLong(long v, long min, long max) { + return Math.max(min, Math.min(v, max)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/VoidFluidDrillLogic.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/VoidFluidDrillLogic.java new file mode 100644 index 000000000..229cee3e3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/VoidFluidDrillLogic.java @@ -0,0 +1,144 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.data.worldgen.bedrockfluid.BedrockFluidVeinSavedData; +import com.gregtechceu.gtceu.api.data.worldgen.bedrockfluid.FluidVeinWorldEntry; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.data.recipe.builder.GTRecipeBuilder; + +import net.minecraft.core.SectionPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.material.Fluid; +import net.neoforged.neoforge.fluids.FluidStack; + +import org.jetbrains.annotations.Nullable; + +public class VoidFluidDrillLogic extends RecipeLogic { + + public static final int MAX_PROGRESS = 20; + + @Nullable + private Fluid veinFluid; + + public VoidFluidDrillLogic(VoidFluidDrillMachine machine) { + super(machine); + } + + @Nullable + public Fluid getVeinFluid() { + return veinFluid; + } + + @Override + public VoidFluidDrillMachine getMachine() { + return (VoidFluidDrillMachine) super.getMachine(); + } + + @Override + public void findAndHandleRecipe() { + if (getMachine().getLevel() instanceof ServerLevel serverLevel) { + lastRecipe = null; + var data = BedrockFluidVeinSavedData.getOrCreate(serverLevel); + if (veinFluid == null) { + this.veinFluid = data.getFluidInChunk(getChunkX(), getChunkZ()); + if (this.veinFluid == null) { + if (subscription != null) { + subscription.unsubscribe(); + subscription = null; + } + return; + } + } + var match = getFluidDrillRecipe(); + if (match != null) { + if (RecipeHelper.matchContents(this.machine, match).isSuccess()) { + setupRecipe(match); + } + } + } + } + + @Nullable + private GTRecipe getFluidDrillRecipe() { + if (getMachine().getLevel() instanceof ServerLevel serverLevel && veinFluid != null) { + var data = BedrockFluidVeinSavedData.getOrCreate(serverLevel); + var recipe = GTRecipeBuilder.ofRaw() + .duration(MAX_PROGRESS) + .EUt(GTValues.V[7]) + .outputFluids(new FluidStack(veinFluid, + getFluidToProduce(data.getFluidVeinWorldEntry(getChunkX(), getChunkZ())))) + .build(); + if (RecipeHelper.matchContents(getMachine(), recipe).isSuccess()) { + return recipe; + } + } + return null; + } + + public int getFluidToProduce() { + if (getMachine().getLevel() instanceof ServerLevel serverLevel && veinFluid != null) { + var data = BedrockFluidVeinSavedData.getOrCreate(serverLevel); + return getFluidToProduce(data.getFluidVeinWorldEntry(getChunkX(), getChunkZ())); + } + return 0; + } + + private int getFluidToProduce(FluidVeinWorldEntry entry) { + var definition = entry.getDefinition(); + if (definition != null) { + int depletedYield = definition.value().getDepletedYield(); + int regularYield = entry.getFluidYield(); + int remainingOperations = entry.getOperationsRemaining(); + + int produced = Math.max(depletedYield, + regularYield * remainingOperations / BedrockFluidVeinSavedData.MAXIMUM_VEIN_OPERATIONS); + produced *= VoidFluidDrillMachine.getRigMultiplier(getMachine().getTier()); + + // Overclocks produce 50% more fluid + if (isOverclocked()) { + produced = produced * 3 / 2; + } + return produced; + } + return 0; + } + + @Override + public void onRecipeFinish() { + machine.afterWorking(); + if (lastRecipe != null) { + RecipeHelper.handleRecipeIO(this.machine, lastRecipe, IO.OUT, this.chanceCaches); + } + // try it again + var match = getFluidDrillRecipe(); + if (match != null) { + if (RecipeHelper.matchContents(this.machine, match).isSuccess()) { + setupRecipe(match); + return; + } + } + if (suspendAfterFinish) { + setStatus(RecipeLogic.Status.SUSPEND); + suspendAfterFinish = false; + } else { + setStatus(RecipeLogic.Status.IDLE); + } + progress = 0; + duration = 0; + } + + protected boolean isOverclocked() { + return getMachine().getEnergyTier() > getMachine().getTier(); + } + + private int getChunkX() { + return SectionPos.blockToSectionCoord(getMachine().getBlockPos().getX()); + } + + private int getChunkZ() { + return SectionPos.blockToSectionCoord(getMachine().getBlockPos().getZ()); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/VoidFluidDrillMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/VoidFluidDrillMachine.java new file mode 100644 index 000000000..5fd47afb5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/VoidFluidDrillMachine.java @@ -0,0 +1,86 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.IEnergyContainer; +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.misc.EnergyContainerList; +import com.gregtechceu.gtceu.common.machine.trait.FluidDrillLogic; +import com.gregtechceu.gtceu.utils.FormattingUtil; +import com.gregtechceu.gtceu.utils.GTUtil; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.HoverEvent; +import net.minecraft.network.chat.Style; +import net.minecraft.world.level.material.Fluid; + +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class VoidFluidDrillMachine extends WorkableElectricMultiblockMachine { + + public VoidFluidDrillMachine(BlockEntityCreationInfo holder) { + super(holder, m -> new VoidFluidDrillLogic((VoidFluidDrillMachine) m)); + } + + @NotNull + @Override + public VoidFluidDrillLogic getRecipeLogic() { + return (VoidFluidDrillLogic) super.getRecipeLogic(); + } + + public int getEnergyTier() { + var energyContainer = this.getCapabilitiesFlat(IO.IN, EURecipeCapability.CAP); + if (energyContainer == null) return this.tier; + var energyCont = new EnergyContainerList(energyContainer.stream().filter(IEnergyContainer.class::isInstance) + .map(IEnergyContainer.class::cast).toList()); + + return Math.min(this.tier + 1, Math.max(this.tier, GTUtil.getFloorTierByVoltage(energyCont.getInputVoltage()))); + } + + @Override + public void addDisplayText(List textList) { + if (isFormed()) { + int energyContainer = getEnergyTier(); + long maxVoltage = GTValues.V[energyContainer]; + String voltageName = GTValues.VNF[energyContainer]; + textList.add(Component.translatable("gtceu.multiblock.max_energy_per_tick", maxVoltage, voltageName)); + + if (getRecipeLogic().getVeinFluid() != null) { + // Fluid name + Fluid drilledFluid = getRecipeLogic().getVeinFluid(); + Component fluidInfo = drilledFluid.getFluidType().getDescription().copy() + .withStyle(ChatFormatting.GREEN); + textList.add(Component.translatable("gtceu.multiblock.fluid_rig.drilled_fluid", fluidInfo) + .withStyle(ChatFormatting.GRAY)); + + // Fluid amount + Component amountInfo = Component.literal(FormattingUtil.formatNumbers( + getRecipeLogic().getFluidToProduce() * 20L / FluidDrillLogic.MAX_PROGRESS) + + " mB/s").withStyle(ChatFormatting.BLUE); + textList.add(Component.translatable("gtceu.multiblock.fluid_rig.fluid_amount", amountInfo) + .withStyle(ChatFormatting.GRAY)); + } else { + Component noFluid = Component.translatable("gtceu.multiblock.fluid_rig.no_fluid_in_area") + .withStyle(ChatFormatting.RED); + textList.add(Component.translatable("gtceu.multiblock.fluid_rig.drilled_fluid", noFluid) + .withStyle(ChatFormatting.GRAY)); + } + } else { + Component tooltip = Component.translatable("gtceu.multiblock.invalid_structure.tooltip") + .withStyle(ChatFormatting.GRAY); + textList.add(Component.translatable("gtceu.multiblock.invalid_structure") + .withStyle(Style.EMPTY.withColor(ChatFormatting.RED) + .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, tooltip)))); + } + } + + public static int getRigMultiplier(int tier) { + return 256; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/VoraxReactorMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/VoraxReactorMachine.java new file mode 100644 index 000000000..b70776542 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/logic/VoraxReactorMachine.java @@ -0,0 +1,188 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.part.SterilizationHatchPartMachine; + +import com.gregtechceu.gtceu.api.capability.IEnergyContainer; +import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.misc.EnergyContainerList; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import net.minecraft.network.chat.Component; +import net.neoforged.neoforge.fluids.FluidStack; + +import it.unimi.dsi.fastutil.longs.Long2ObjectMaps; +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.annotation.Nullable; + +public class VoraxReactorMachine extends WorkableElectricMultiblockMachine { + + @DescSynced + @Getter + @Persisted + private float contagionDelta = 30; + + @DescSynced + @Getter + @Persisted + private float contagionStrength = 0; + + @DescSynced + @Getter + @Persisted + private boolean isCleaning = true; + + private SterilizationHatchPartMachine sterileHatch = null; + + + @Nullable + protected TickableSubscription contagionSubscription; + @Nullable + protected EnergyContainerList outputEnergyContainers; + + public VoraxReactorMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + + List outputEnergyContainers = new ArrayList<>(); + Map ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", Long2ObjectMaps::emptyMap); + for (IMultiPart part : getParts()) { + if (part instanceof SterilizationHatchPartMachine) { + sterileHatch = (SterilizationHatchPartMachine) part; + } + IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.IN); + if (io == IO.NONE || io == IO.IN) continue; + var handlers = part.getRecipeHandlers(); + for (var handler : handlers) { + IO handlerIO = handler.getHandlerIO(); + if (handlerIO == IO.IN) { + var containers = handler.getCapability(EURecipeCapability.CAP).stream() + .filter(IEnergyContainer.class::isInstance) + .map(IEnergyContainer.class::cast) + .toList(); + outputEnergyContainers.addAll(containers); + traitSubscriptions.add(handler.subscribe(this::updateContagionSubs)); + + } + } + } + this.outputEnergyContainers = new EnergyContainerList(outputEnergyContainers); + updateContagionSubs(); + } + + @Override + public void onLoad() { + super.onLoad(); + if (!isRemote() && isFormed()) { + updateContagionSubs(); + } + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + this.outputEnergyContainers = null; + contagionStrength = 0; + updateContagionSubs(); + } + + protected void updateContagionSubs() { + if ((outputEnergyContainers != null)) { + contagionSubscription = subscribeServerTick(contagionSubscription, this::updateContagion); + } else if (contagionSubscription != null) { + contagionSubscription.unsubscribe(); + contagionSubscription = null; + } + } + + public void updateContagion() { + if (recipeLogic.isWorking()) { + if (!isCleaning && contagionStrength >= 100000) { + contagionStrength = 100000; + // recipeLogic.setStatus(RecipeLogic.Status.SUSPEND); + // doExplosion(12f + getTier()); + } else { + + contagionDelta += 0.05F; + contagionStrength += contagionDelta; + isCleaning = false; + } + } + if (recipeLogic.isIdle() || recipeLogic.isSuspend() || recipeLogic.isWaiting() || !this.isWorkingEnabled()) { + if (contagionStrength != 0) { + if (sterileHatch != null) { + FluidStack sterileThingy = sterileHatch.fluidTank.getFluidInTank(0); + if (!sterileThingy.isEmpty() && sterileThingy.getAmount() >= 15) { + contagionDelta -= 0.5F; + sterileThingy.shrink(15); + contagionStrength += contagionDelta; + isCleaning = true; + } else { + isCleaning = false; + } + } + } + } + contagionDelta = clamp(contagionDelta, -150, 50); + contagionStrength = clamp(contagionStrength, 0, 100000); + } + + @Override + public boolean beforeWorking(@org.jetbrains.annotations.Nullable GTRecipe recipe) { + if (contagionDelta <= 0) { + contagionDelta = 0; + } + return super.beforeWorking(recipe); + } + + @Override + public boolean onWorking() { + updateContagion(); + return super.onWorking(); + } + + @Override + public boolean regressWhenWaiting() { + return false; + } + + @Override + public void addDisplayText(List textList) { + super.addDisplayText(textList); + if (isFormed) { + textList.add(Component.translatable("cosmiccore.multiblock.current_contagion", + FormattingUtil.formatNumber2Places(contagionStrength))); + textList.add(Component.translatable("cosmiccore.multiblock.contagion_rate", + FormattingUtil.formatNumber2Places(contagionDelta))); + if (sterileHatch != null && sterileHatch.fluidTank.getFluidInTank(0).getAmount() < 15) { + textList.add(Component.translatable("cosmiccore.multiblock.cleaning_status.error")); + } else { + textList.add(Component.translatable("cosmiccore.multiblock.cleaning_status", + isCleaning ? "Cleaning" : "Growing")); + } + + } + } + + public static float clamp(float v, float min, float max) { + return Math.max(min, Math.min(v, max)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/MultiblockInit.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/MultiblockInit.java new file mode 100644 index 000000000..84f816b63 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/MultiblockInit.java @@ -0,0 +1,79 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.modular; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.*; + +// Class for Bulk-Init +public class MultiblockInit { + + public static void init() { + // Vomahine Modular Hardware + // ShredderMultiblock.init(); + + // MegaStructures + PrismaticOreFoundry.init(); + StellarIris.init(); + StellarSmeltingModule.init(); + // StellarStarBallast.init(); + HemophagicTransfuser.init(); + PlasmiteDistillery.init(); + HeavyAssembler.init(); + PCBFoundry.init(); + WelderMulti.init(); + CryogenicsChamber.init(); + // StarLadderOld.init(); + VoidMiner.init(); + FluidVoidRig.init(); + VoraxReactor.init(); + SpiritCrucible.init(); + AtmoPump.init(); + DroneStation.init(); + DreamersBasin.init(); + OreExtractionDrill.init(); + OneiricSieve.init(); + // CosmicModularMachines.init(); + ManaDigitizer.init(); + ArcaneDistillery.init(); + BioVat.init(); + CelestialBore.init(); + ChromaticDistillery.init(); + ChromaticFlotationPlant.init(); + DrygmyGrove.init(); + HellFireFoundry.init(); + IndustChemVat.init(); + IPBF.init(); + Laminator.init(); + ComponentAssemblyLine.init(); + LargeSpoolingMachine.init(); + LunarHammer.init(); + MantleBore.init(); + NPR.init(); + OrbitalForge.init(); + Polymerizer.init(); + SteamAssembler.init(); + SteamCaster.init(); + SteamMixer.init(); + SufferingChamber.init(); + TitanFusion.init(); + DawnForge.init(); + ManaEtchingFactory.init(); + ArcaneCrucible.init(); + CinderHearth.init(); + PyrothermicRefinery.init(); + EclipsedDawnForge.init(); + WASP.init(); + LARVA.init(); + Roaster.init(); + VileFissionReactor.init(); + VoidSaltReactor.init(); + AtomicReconstructor.init(); + DivingBell.init(); + LinkTestStation.init(); + StarLadder.init(); + StarLadderResearchHub.init(); + // KryosynCrackingChamber.init(); + + // Cargo Moths System + MothCargoStation.init(); + MothCargoDropOff.init(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/StarLadderOld.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/StarLadderOld.java new file mode 100644 index 000000000..7e1a58a5b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/StarLadderOld.java @@ -0,0 +1,181 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.modular; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.block.IMultiblockProvider; +import com.ghostipedia.cosmiccore.api.block.IMultiblockReciever; +import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; +import com.ghostipedia.cosmiccore.common.data.CosmicModularMachines; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.IEnergyContainer; +import com.gregtechceu.gtceu.api.data.RotationState; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.misc.EnergyContainerList; +import com.gregtechceu.gtceu.api.pattern.FactoryBlockPattern; +import com.gregtechceu.gtceu.api.pattern.Predicates; +import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; +import com.gregtechceu.gtceu.common.data.GTRecipeTypes; + +import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; +import com.lowdragmc.lowdraglib.gui.texture.TextTexture; +import com.lowdragmc.lowdraglib.gui.widget.*; +import net.minecraft.network.chat.Component; + +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; + +import javax.annotation.Nullable; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; + +public class StarLadderOld extends WorkableElectricMultiblockMachine implements IMultiblockProvider { + + @Nullable + protected EnergyContainerList inputEnergyContainers; + // assuming a collection is just like a map, but it lost the actual mapping + @Getter + protected boolean isFuelable; + private final Collection starLadderReceivers = ConcurrentHashMap.newKeySet(); + + public StarLadderOld(BlockEntityCreationInfo holder) { + super(holder); + } + + + protected int tetherTier = 0; + + @Override + public int getModulatorTier() { + return 0; + } + + private int getMaxModules() { + if (this.tetherTier == 1) return 6; + if (this.tetherTier == 2) return 12; + if (this.tetherTier == 3) return 16; + return 4; + } + + @Override + public IEnergyContainer getEnergyContainersForModules() { + return this.inputEnergyContainers; + } + + @Override + public boolean amIAModule(IMultiblockProvider receiver) { + return this.starLadderReceivers.contains(receiver); + } + + @Override + public void onStructureFormed() { + super.onStructureFormed(); + } + + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + this.starLadderReceivers.forEach(IMultiblockReciever::sendWorkingDisabled); + this.starLadderReceivers.forEach(s -> s.setModularMultiBlock(null)); + } + + public void isfuelable(boolean fuelable) { + this.isFuelable = fuelable; + } + // New Code ft. Ghost what the HELL are you doing... + // @NotNull + // protected static TraceabilityPredicate starLadderModulesOld() { + // return new TraceabilityPredicate(MultiblockState -> { + // var blockState = MultiblockState.getBlockState(); + // Block block = blockState.getBlock(); + // MetaMachine metaMachine = MetaMachine.getMachine(level, pos); + // if (blockState.is(STAR_LADDER_BLOCKS)) { + // if(block == CosmicBlocks.STAR_LADDER_CASING.get()) return true; + // } + // if(metaMachine == null) return false; + // if (metaMachine instanceof IMultiblockProvider) return false; + // if (!(metaMachine instanceof IMultiblockReciever starLadderReceiver)) return false; + // if(starLadderReceiver.getModularMultiBlock() != this){ + // starLadderReceiver.setModularMultiBlock(this); + // this.starLadderReceivers.add(starLadderReceiver); + // } + // return true; + // }, () -> CosmicCoreAPI.STARLADDER_CASINGS.entrySet().stream() + // // sort to make autogenerated jei previews not pick random coils each game load + // .map(coil -> BlockInfo.fromBlockState(coil.getValue().get().defaultBlockState())) + // .toArray(BlockInfo[]::new)) + // .addTooltips(Component.translatable("gtceu.multiblock.pattern.error.coils")); + // } + + public static final MultiblockMachineDefinition STAR_LADDER = REGISTRATE + .multiblock("star_ladder", StarLadderOld::new) + .rotationState(RotationState.NON_Y_AXIS) + .recipeType(GTRecipeTypes.DUMMY_RECIPES) + .recipeModifier(GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK)) + .appearanceBlock(CosmicBlocks.CYCLOZINE_CHEMICALLY_REPELLING_CASING) + .pattern(definition -> FactoryBlockPattern.start() + .aisle("A A", "A A", "A A", "A A") + .aisle("AAAAA", "A B A", "Q Q", "A A") + .where(' ', any()) + .where("B", controller(blocks(definition.getBlock()))) + .where('A', blocks(CosmicBlocks.CYCLOZINE_CHEMICALLY_REPELLING_CASING.get()) + .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(16)) + .or(Predicates.abilities(PartAbility.EXPORT_FLUIDS).setMaxGlobalLimited(16)) + .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMaxGlobalLimited(2)) + .or(Predicates.abilities(PartAbility.INPUT_LASER).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.OUTPUT_LASER).setMaxGlobalLimited(1)) + .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setMaxGlobalLimited(16)) + .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(16))) + .where("Q", blocks(CosmicModularMachines.STAR_LADDER_TEST_MODULE[GTValues.ZPM].get())) + // blocks(Arrays.stream(CosmicModularMachines.STAR_LADDER_TEST_MODULE).filter(Objects::nonNull).map(Supplier::get).toArray(IMachineBlock[]::new)) + .build()) + .workableCasingModel(CosmicCore.id("block/casings/solid/vomahine_certified_chemically_resistant_casing"), + GTCEu.id("block/multiblock/fusion_reactor")) + .tooltips(Component.translatable("cosmiccore.multiblock.iris.tooltip.0"), + Component.translatable("cosmiccore.multiblock.iris.tooltip.1"), + Component.translatable("cosmiccore.multiblock.iris.tooltip.2"), + Component.translatable("cosmiccore.multiblock.iris.tooltip.3")) + .register(); + + @Override + public Widget createUIWidget() { + var group = new WidgetGroup(0, 0, 182 + 8, 117 + 8); + group.addWidget(new DraggableScrollableWidgetGroup(4, 4, 182, 117).setBackground(getScreenTexture()) + .addWidget(new LabelWidget(4, 5, self().getBlockState().getBlock().getDescriptionId())) + .addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) + .textSupplier(this.getLevel().isClientSide ? null : this::addDisplayText) + .setMaxWidthLimit(150) + .clickHandler(this::handleDisplayClick))); + group.setBackground(GuiTextures.BACKGROUND_INVERSE); + group.addWidget(new ButtonWidget( + 27, + 100, + 158, + 20, + new GuiTextureGroup( + GuiTextures.BUTTON, + new TextTexture("cosmiccore.multiblock.send_orbit_data")), + clickData -> isfuelable(true))); + return group; + } + + @Override + public void addDisplayText(List textList) { + if (isFormed()) { + textList.add(Component.translatable("cosmiccore.multiblock.advanced.star_ladder_tier", tetherTier, + getMaxModules())); + } + } + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/VomahineShredder/ShredderMultiblock.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/VomahineShredder/ShredderMultiblock.java new file mode 100644 index 000000000..b2e944466 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/VomahineShredder/ShredderMultiblock.java @@ -0,0 +1,126 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.modular.VomahineShredder; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.registry.registrate.MultiblockMachineBuilder; + +import java.util.Locale; +import java.util.function.BiFunction; + +import static com.ghostipedia.cosmiccore.api.registries.CosmicRegistration.REGISTRATE; +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.GTValues.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; + +public class ShredderMultiblock { + + // public final static MultiblockMachineDefinition VOMAHINE_SHREDDER = REGISTRATE + // .multiblock("vomahine_shredder", WorkableElectricMultiblockMachine::new) + // .rotationState(RotationState.NON_Y_AXIS) + // .recipeModifier(GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK_SUBTICK)) + // .appearanceBlock(CosmicBlocks.CYCLOZINE_CHEMICALLY_REPELLING_CASING) + // .recipeType(GTRecipeTypes.DUMMY_RECIPES) + // .pattern(definition -> FactoryBlockPattern.start() + // .aisle("AAAAAAAAAAAAA", "ADDDDDDDDDDDA", "ADDDDDDDDDDDA", "AAAAAAADDDDDA", " AAAAAAA") + // .aisle("ACCCCCCCCCCCA", "ACCCCCCCCCCCB", "ACCCCCCCCCCCB", "ACCCCCCCCCCCB", " CCCCCCA") + // .aisle("ACCCCCCCCCCCA", "ACDDDDCEEEEC ", "ACDDDDCEEEEC ", "ACCCCCCEEEEC ", " C CA") + // .aisle("ACCCCCCCCCCCA", "ACCCCCCEEEEC ", "ACCCCCCEEEEC ", "ACCCCCCEEEEC ", " C CA") + // .aisle("AAAAAACCCCCCA", "AAAAAACEEEEC ", "AAAAAACEEEEC ", "ABBBBBCEEEEC ", " C CA") + // .aisle("AAAAAACCCCCCA", "AFFFFACCCCCCB", "AAAAAACCCCCCB", "A BCCCCCCB", " CCCCCCA") + // .aisle("AAAAAAAAAAAAA", "G AB BA", "A AB BA", "A AB BA", " AAAAAAA") + // .where(' ', any()) + // .where("G", controller(blocks(definition.getBlock()))) + // .where('A', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get())) + // .where('B', blocks(MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get())) + // .where('C', blocks(MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get())) + // .where('D', blocks(CASING_ATOMIC.get())) + // .where('E', blocks(ULTRA_POWERED_CASING.get()) + // .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(16)) + // .or(Predicates.abilities(PartAbility.EXPORT_FLUIDS).setMaxGlobalLimited(16)) + // .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMaxGlobalLimited(2)) + // .or(Predicates.abilities(PartAbility.INPUT_LASER).setMaxGlobalLimited(1)) + // .or(Predicates.abilities(PartAbility.OUTPUT_LASER).setMaxGlobalLimited(1)) + // .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setMaxGlobalLimited(16)) + // .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(16))) + // .where('F', blocks(definition.getBlock())) + // .build()) + // .workableCasingRenderer(CosmicCore.id("block/casings/solid/vomahine_certified_chemically_resistant_casing"), + // GTCEu.id("block/multiblock/fusion_reactor")) + // .tooltips(Component.translatable("cosmiccore.multiblock.shredder.tooltip.0"), + // Component.translatable("cosmiccore.multiblock.shredder.tooltip.1"), + // Component.translatable("cosmiccore.multiblock.shredder.tooltip.2"), + // Component.translatable("cosmiccore.multiblock.shredder.tooltip.3")) + // .hasTESR(true) + // .register(); + // + // // Shredder Modules + // + // public static final MultiblockMachineDefinition[] SHREDDER_MODULE = registerTieredMultis("shredder_module", + // WorkableElectricMultiblockMachine::new, (tier, builder) -> builder + // .rotationState(RotationState.ALL) + // .langValue("Shredder Module MK %s".formatted(toRomanNumeral(tier - 5))) + // .recipeType(GTRecipeTypes.MACERATOR_RECIPES) + // .recipeModifiers(GTRecipeModifiers.DEFAULT_ENVIRONMENT_REQUIREMENT, + // FusionReactorMachine::recipeModifier) + // .appearanceBlock(() -> FusionReactorMachine.getCasingState(tier)) + // .pattern((definition) -> { + // var casing = blocks(FusionReactorMachine.getCasingState(tier)); + // return FactoryBlockPattern.start() + // .aisle("AAAAAAAAAAAAA", "ADDDDDDDDDDDA", "ADDDDDDDDDDDA", "AAAAAAADDDDDA", + // " AAAAAAA") + // .aisle("ACCCCCCCCCCCA", "ACCCCCCCCCCCB", "ACCCCCCCCCCCB", "ACCCCCCCCCCCB", + // " CCCCCCA") + // .aisle("ACCCCCCCCCCCA", "ACDDDDCEEEEC ", "ACDDDDCEEEEC ", "ACCCCCCEEEEC ", + // " C CA") + // .aisle("ACCCCCCCCCCCA", "ACCCCCCEEEEC ", "ACCCCCCEEEEC ", "ACCCCCCEEEEC ", + // " C CA") + // .aisle("AAAAAACCCCCCA", "AAAAAACEEEEC ", "AAAAAACEEEEC ", "ABBBBBCEEEEC ", + // " C CA") + // .aisle("AAAAAACCCCCCA", "AFFFFACCCCCCB", "AAAAAACCCCCCB", "A BCCCCCCB", + // " CCCCCCA") + // .aisle("AAAAAAAAAAAAA", "G AB BA", "A AB BA", "A AB BA", + // " AAAAAAA") + // .where(' ', any()) + // .where("F", controller(blocks(definition.getBlock())) + // .or(blocks(CASING_ATOMIC.get()).setMaxGlobalLimited(4))) + // .where('A', blocks(CYCLOZINE_CHEMICALLY_REPELLING_CASING.get())) + // .where('B', blocks(MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get())) + // .where('C', blocks(MULTIPURPOSE_INTERSTELLAR_GRADE_CASING.get())) + // .where('D', blocks(CASING_ATOMIC.get())) + // .where('E', blocks(ULTRA_POWERED_CASING.get()) + // .or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(16)) + // .or(Predicates.abilities(PartAbility.EXPORT_FLUIDS).setMaxGlobalLimited(16)) + // .or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMaxGlobalLimited(2)) + // .or(Predicates.abilities(PartAbility.INPUT_LASER).setMaxGlobalLimited(1)) + // .or(Predicates.abilities(PartAbility.OUTPUT_LASER).setMaxGlobalLimited(1)) + // .or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setMaxGlobalLimited(16)) + // .or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(16))) + // .where('G', blocks(definition.getBlock())) + // .build(); + // }) + // .workableCasingRenderer( + // CosmicCore.id("block/casings/solid/vomahine_certified_chemically_resistant_casing"), + // GTCEu.id("block/multiblock/fusion_reactor")) + // .hasTESR(true) + // .register(), + // ZPM, UV, UHV); + + public static MultiblockMachineDefinition[] registerTieredMultis(String name, + BiFunction factory, + BiFunction builder, + int... tiers) { + MultiblockMachineDefinition[] definitions = new MultiblockMachineDefinition[GTValues.TIER_COUNT]; + for (int tier : tiers) { + var register = REGISTRATE + .multiblock(GTValues.VN[tier].toLowerCase(Locale.ROOT) + "_" + name, + holder -> factory.apply(holder, tier)) + .tier(tier); + definitions[tier] = builder.apply(tier, register); + } + return definitions; + } + + public static void init() {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/modules/StarLadderDummy.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/modules/StarLadderDummy.java new file mode 100644 index 000000000..466f86b5e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/multi/modular/modules/StarLadderDummy.java @@ -0,0 +1,31 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.multi.modular.modules; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.ModularizedWorkableElectricMultiblockMachine; + +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; + +import static com.ghostipedia.cosmiccore.common.data.CosmicBlocks.*; +import static com.gregtechceu.gtceu.api.GTValues.*; +import static com.gregtechceu.gtceu.api.pattern.Predicates.*; + +public class StarLadderDummy extends ModularizedWorkableElectricMultiblockMachine { + + public StarLadderDummy(BlockEntityCreationInfo holder, int tier, int moduleTier, int minModuleTier) { + super(holder, tier, moduleTier, minModuleTier); + } + + @Override + public void sendWorkingDisabled() { + this.recipeLogic.setWorkingEnabled(false); + } + + @Override + public void sendWorkingEnabled() { + this.recipeLogic.setWorkingEnabled(true); + } + + @Override + public String getNameForDisplays() { + return this.getDefinition().getId().toLanguageKey("block", "display_count"); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/CosmicParallelHatchPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/CosmicParallelHatchPartMachine.java new file mode 100644 index 000000000..f5f0fd645 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/CosmicParallelHatchPartMachine.java @@ -0,0 +1,57 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.part; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; +import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import net.minecraft.util.Mth; + +import lombok.Getter; +import org.jetbrains.annotations.NotNull; + +public class CosmicParallelHatchPartMachine extends TieredPartMachine implements IFancyUIMachine { + + private static final int MIN_PARALLEL = 1; + + private final int maxParallel; + + @Persisted + private int currentParallel; + + public CosmicParallelHatchPartMachine(BlockEntityCreationInfo holder, int tier) { + super(holder, tier); + this.maxParallel = (int) Math.pow(4, tier - GTValues.EV); + } + + public int getCurrentParallel() { + return currentParallel; + } + + public void setCurrentParallel(int parallelAmount) { + this.currentParallel = Mth.clamp(parallelAmount, MIN_PARALLEL, this.maxParallel); + for (MultiblockControllerMachine controller : this.getControllers()) { + if (controller instanceof IRecipeLogicMachine rlm) { + rlm.getRecipeLogic().markLastRecipeDirty(); + } + } + } + + @Override + public Widget createUIWidget() { + WidgetGroup parallelAmountGroup = new WidgetGroup(0, 0, 100, 20); + parallelAmountGroup.addWidget(new IntInputWidget(this::getCurrentParallel, this::setCurrentParallel) + .setMin(MIN_PARALLEL) + .setMax(maxParallel)); + + return parallelAmountGroup; + } + +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/CropHolderPartMachines.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/CropHolderPartMachines.java new file mode 100644 index 000000000..46a6521ef --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/CropHolderPartMachines.java @@ -0,0 +1,113 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.part; + +import com.ghostipedia.cosmiccore.api.CosmicGuiTextures; +import com.ghostipedia.cosmiccore.common.data.CosmicBotanyItemRegistration; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.widget.BlockableSlotWidget; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; + +import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.utils.Position; + +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemNameBlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.BushBlock; + +import org.jetbrains.annotations.NotNull; + +import java.util.Arrays; + +public class CropHolderPartMachines extends MultiblockPartMachine implements IFancyUIMachine { + + @Persisted + private final CropHolderHandler heldCrops; + @Persisted + @DescSynced + private boolean isLocked; + + public CropHolderPartMachines(BlockEntityCreationInfo holder) { + super(holder); + heldCrops = new CropHolderHandler(this); + } + + public boolean isLocked() { + return isLocked; + } + + public void setLocked(boolean locked) { + this.isLocked = locked; + } + + private class CropHolderHandler extends NotifiableItemStackHandler { + + public CropHolderHandler(MetaMachine machine) { + super(machine, 1, IO.IN, IO.BOTH, size -> new CustomItemStackHandler(size) { + + @Override + public int getSlotLimit(int slot) { + return 1; + } + }); + } + + @Override + public int getSlotLimit(int slot) { + return 1; + } + + @Override + public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate) { + if (!isLocked()) { + return super.extractItem(slot, amount, simulate); + } + return ItemStack.EMPTY; + } + + @Override + public boolean isItemValid(int slot, @NotNull ItemStack stack) { + var item = stack.getItem(); + if (stack.isEmpty()) { + return true; + } + if (item instanceof ItemNameBlockItem plantBlock) { + var block = plantBlock.getBlock(); + if (block instanceof BushBlock) { + return true; + } + } + if (item instanceof BlockItem plantBlock) { + var block = plantBlock.getBlock(); + if (block instanceof BushBlock) { + return true; + } + } + var flowers = Arrays.stream(CosmicBotanyItemRegistration.CosmicBotanyItem.values()) + .filter(i -> i.item.is(item)).toList(); + return !flowers.isEmpty(); + + // TODO; Come back for manual Recipe map Injection + } + } + + @Override + public Widget createUIWidget() { + return new WidgetGroup(new Position(0, 0)) + .addWidget(new ImageWidget(0, 15, 84, 60, GuiTextures.PROGRESS_BAR_RESEARCH_STATION_BASE)) + .addWidget(new BlockableSlotWidget(heldCrops, 0, 33, 36) + .setIsBlocked(this::isLocked) + .setBackground(GuiTextures.SLOT, CosmicGuiTextures.PLANT_OVERLAY)); + } + +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/ModuleHatchPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/ModuleHatchPartMachine.java new file mode 100644 index 000000000..78782a47d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/ModuleHatchPartMachine.java @@ -0,0 +1,115 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.part; + +import com.ghostipedia.cosmiccore.common.data.CosmicItems; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; + +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.jei.IngredientIO; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.world.item.ItemStack; + +import java.util.List; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault +public class ModuleHatchPartMachine extends TieredIOPartMachine { + + @Persisted + private final NotifiableItemStackHandler inventory; + + public ModuleHatchPartMachine(BlockEntityCreationInfo holder, int tier) { + super(holder, tier, IO.IN); + this.inventory = new NotifiableItemStackHandler(this, getSlots(tier), IO.IN); + this.inventory.setFilter(ModuleHatchPartMachine::isModule); + } + + public NotifiableItemStackHandler getInventory() { + return inventory; + } + + private static List MODULES = null; + + private static boolean isModule(ItemStack stack) { + if (MODULES == null) { + MODULES = List.of( + CosmicItems.PROD_MOD_1.asItem(), + CosmicItems.PROD_MOD_2.asItem(), + CosmicItems.PROD_MOD_3.asItem(), + CosmicItems.PROD_MOD_4.asItem(), + CosmicItems.PARA_MOD_1.asItem(), + CosmicItems.PARA_MOD_2.asItem(), + CosmicItems.PARA_MOD_3.asItem(), + CosmicItems.PARA_MOD_4.asItem(), + CosmicItems.RESONANT_MODULE.asItem(), + CosmicItems.PROTOCYTE_MOD.asItem(), + CosmicItems.FUSION_MODULE_MK1.asItem()); + } + return MODULES.contains(stack.getItem()); + } + + private int getSlots(int tier) { + // Always have 4 slots, change this to give different slots per tier + switch (tier) { + case GTValues.UV: + return 4; + case GTValues.UHV: + return 8; + case GTValues.UEV: + return 12; + default: + return 4; + } + } + + ////////////////////////////////////// + // ***** Initialization ******// + ////////////////////////////////////// + + @Override + public void onMachineDestroyed() { + super.onMachineDestroyed(); + getInventory().dropInventoryInWorld(); + } + + protected RecipeHandlerList getHandlerList() { + return RecipeHandlerList.NO_DATA; + } + + ////////////////////////////////////// + // ********** GUI ***********// + ////////////////////////////////////// + + @Override + public Widget createUIWidget() { + int rowSize = 4; + int colSize = this.getInventory().getSlots() / 4; + var group = new WidgetGroup(0, 0, 18 * rowSize + 16, 18 * colSize + 16); + var container = new WidgetGroup(4, 4, 18 * rowSize + 8, 18 * colSize + 8); + int index = 0; + for (int y = 0; y < colSize; y++) { + for (int x = 0; x < rowSize; x++) { + container.addWidget( + new SlotWidget(getInventory().storage, index++, 4 + x * 18, 4 + y * 18, true, io.support(IO.IN)) + .setBackgroundTexture(GuiTextures.SLOT) + .setIngredientIO(IngredientIO.INPUT)); + } + } + + container.setBackground(GuiTextures.BACKGROUND_INVERSE); + group.addWidget(container); + + return group; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/SoulHatchPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/SoulHatchPartMachine.java index a2ac30e19..4f52845c4 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/SoulHatchPartMachine.java +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/SoulHatchPartMachine.java @@ -1,21 +1,24 @@ package com.ghostipedia.cosmiccore.common.machine.multiblock.part; import com.ghostipedia.cosmiccore.api.machine.trait.NotifiableSoulContainer; +import com.ghostipedia.cosmiccore.utils.OwnershipUtils; + import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.machine.IMachineBlockEntity; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; -import com.gregtechceu.gtceu.utils.FormattingUtil; + import com.lowdragmc.lowdraglib.gui.widget.*; import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; -import com.lowdragmc.lowdraglib.syncdata.field.ManagedFieldHolder; +import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.client.resources.language.I18n; import net.minecraft.network.chat.Component; -import net.minecraft.world.entity.player.Player; -import wayoftime.bloodmagic.util.helper.PlayerHelper; +import net.minecraft.server.TickTask; + +import java.util.List; import javax.annotation.ParametersAreNonnullByDefault; @@ -23,68 +26,100 @@ @MethodsReturnNonnullByDefault public class SoulHatchPartMachine extends TieredIOPartMachine { - protected static final ManagedFieldHolder MANAGED_FIELD_HOLDER = new ManagedFieldHolder(SoulHatchPartMachine.class, TieredIOPartMachine.MANAGED_FIELD_HOLDER); - @Persisted @DescSynced + @Persisted + @DescSynced private final NotifiableSoulContainer soulContainer; - public SoulHatchPartMachine(IMachineBlockEntity holder, int tier, IO io) { + public SoulHatchPartMachine(BlockEntityCreationInfo holder, int tier, IO io) { super(holder, tier, io); - this.soulContainer = new NotifiableSoulContainer(this, io, getMaxCapacity(tier), getMaxConsumption(tier)); + this.soulContainer = new NotifiableSoulContainer(this, io, getMaxConsumption(tier), getMaxCapacity(tier)); } @Override - public Widget createUIWidget() { - var group = new WidgetGroup(0,0,128,63); - - group.addWidget(new ImageWidget(4, 4, 120, 55, GuiTextures.DISPLAY)); - group.addWidget(new LabelWidget(8, 8, Component.translatable("gui.cosmiccore.soul_hatch.label." + (this.io == IO.IN ? "import" : "export")))); + public void addedToController(MultiblockControllerMachine controller) { + super.addedToController(controller); + var level = controller.self().getLevel(); + if (level != null && level.getServer() != null) { + level.getServer().tell(new TickTask(0, this::invalidateIfDuplicate)); + } + } - if (soulContainer.getOwner() == null) { - group.addWidget(new LabelWidget(8, 18, I18n.get("gui.cosmiccore.soul_hatch.no_network")).setClientSideWidget()); - } else { - group.addWidget(new LabelWidget(8, 18, () -> I18n.get("gui.cosmiccore.soul_hatch.owner", PlayerHelper.getUsernameFromUUID(this.soulContainer.getOwner()))).setClientSideWidget()); - group.addWidget(new LabelWidget(8, 28, () -> I18n.get("gui.cosmiccore.soul_hatch.lp", FormattingUtil.formatNumbers(soulContainer.getCurrentEssence()))).setClientSideWidget()); + private void invalidateIfDuplicate() { + for (var controller : getControllers()) { + for (var part : controller.getParts()) { + if (part == this) continue; + if (part instanceof SoulHatchPartMachine soulHatch && soulHatch.io == this.io) { + controller.onStructureInvalid(); + } + } } + } + + @Override + public Widget createUIWidget() { + var group = new WidgetGroup(0, 0, 176, 117); + + var scrollable = new DraggableScrollableWidgetGroup(4, 4, 168, 109).setBackground(GuiTextures.DISPLAY); + scrollable.addWidget(new LabelWidget(4, 5, + "gui.cosmiccore.soul_hatch.label." + (this.io == IO.IN ? "import" : "export"))); + scrollable.addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) + .textSupplier(getLevel() != null && !getLevel().isClientSide ? this::addDisplayText : null) + .setMaxWidthLimit(160)); + group.addWidget(scrollable); group.setBackground(GuiTextures.BACKGROUND_INVERSE); return group; } - public static int getMaxCapacity(int tier) { + private void addDisplayText(List textList) { + textList.add(Component.translatable("gui.cosmiccore.soul_hatch.owner", + OwnershipUtils.getName(getOwner()))); + + var stacks = this.soulContainer.getStacks(); + textList.add(Component.empty()); + if (stacks.isEmpty()) { + textList.add(Component.translatable("gui.cosmiccore.soul.empty_network").withStyle(ChatFormatting.GRAY)); + } else { + textList.add(Component.translatable("gui.cosmiccore.soul.network_contents").withStyle(ChatFormatting.GOLD)); + for (var stack : stacks) { + textList.add(Component.literal(" ").append(stack.type().toComponent(stack.amount()))); + } + } + } + + public static int getMaxConsumption(int tier) { return switch (tier) { - case GTValues.ZPM -> 10000000; - case GTValues.UV -> 20000000; - case GTValues.UHV -> 50000000; - case GTValues.UEV -> 100000000; - case GTValues.UIV -> 250000000; - case GTValues.UXV -> 500000000; - case GTValues.OpV -> 1000000000; + case GTValues.IV -> 10_000; + case GTValues.LuV -> 50_000; + case GTValues.ZPM -> 5_000_000; + case GTValues.UV -> 10_000_000; + case GTValues.UHV -> 25_000_000; + case GTValues.UEV -> 50_000_000; + case GTValues.UIV -> 125_000_000; + case GTValues.UXV -> 250_000_000; + case GTValues.OpV -> 500_000_000; case GTValues.MAX -> Integer.MAX_VALUE; default -> 0; }; } - public static int getMaxConsumption(int tier) { + public static int getMaxCapacity(int tier) { return switch (tier) { - case GTValues.ZPM -> 5000000; - case GTValues.UV -> 10000000; - case GTValues.UHV -> 25000000; - case GTValues.UEV -> 50000000; - case GTValues.UIV -> 125000000; - case GTValues.UXV -> 250000000; - case GTValues.OpV -> 500000000; + case GTValues.IV -> 1_000_000; + case GTValues.LuV -> 10_000_000; + case GTValues.ZPM -> 50_000_000; + case GTValues.UV -> 100_000_000; + case GTValues.UHV -> 250_000_000; + case GTValues.UEV -> 500_000_000; + case GTValues.UIV -> 1_000_000_000; + case GTValues.UXV -> 1_500_000_000; + case GTValues.OpV -> 2_000_000_000; case GTValues.MAX -> Integer.MAX_VALUE; default -> 0; }; } - public void attachSoulNetwork(Player player) { - this.soulContainer.setOwner(player.getUUID()); - } - - @Override - public ManagedFieldHolder getFieldHolder() { return MANAGED_FIELD_HOLDER;} @Override public int tintColor(int index) { diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/SterilizationHatchPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/SterilizationHatchPartMachine.java new file mode 100644 index 000000000..cb01ce9b4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/SterilizationHatchPartMachine.java @@ -0,0 +1,123 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.part; + +import com.ghostipedia.cosmiccore.api.capability.recipe.SterileRecipeCapability; +import com.ghostipedia.cosmiccore.api.machine.trait.NotifiableSterileTank; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.UITemplate; +import com.gregtechceu.gtceu.api.gui.widget.TankWidget; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import net.neoforged.neoforge.fluids.crafting.SizedFluidIngredient; +import com.gregtechceu.gtceu.utils.GTTransferUtils; + +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.syncdata.ISubscription; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.entity.player.Player; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class SterilizationHatchPartMachine extends TieredIOPartMachine + implements IRecipeHandler, IUIMachine { + + @Nullable + protected TickableSubscription autoIOSubs; + @Nullable + protected ISubscription tankSubs; + public final NotifiableFluidTank fluidTank; + + public SterilizationHatchPartMachine(BlockEntityCreationInfo holder, int tier, IO io, int tankSize) { + super(holder, tier, io); + fluidTank = new NotifiableSterileTank(this, 1, tankSize, IO.IN, IO.IN); + } + + @Override + public List handleRecipeInner(IO io, GTRecipe recipe, List left, boolean simulate) { + return this.fluidTank.handleRecipeInner(io, recipe, left, !simulate); + } + + @Override + public @NotNull List getContents() { + return List.of(this.fluidTank.getFluidInTank(0)); + } + + @Override + public double getTotalContentAmount() { + return this.fluidTank.getFluidInTank(0).getAmount(); + } + + @Override + public RecipeCapability getCapability() { + return SterileRecipeCapability.CAP; + } + + @Override + public void onNeighborChanged(net.minecraft.world.level.block.Block block, BlockPos fromPos, boolean isMoving) { + super.onNeighborChanged(block, fromPos, isMoving); + updateTankSubscription(); + } + + @Override + public void onRotated(Direction oldFacing, Direction newFacing) { + super.onRotated(oldFacing, newFacing); + updateTankSubscription(newFacing); + } + + protected void updateTankSubscription() { + updateTankSubscription(getFrontFacing()); + } + + protected void updateTankSubscription(Direction newFacing) { + if (isWorkingEnabled() && ((io.support(IO.OUT) && !fluidTank.isEmpty()) || io.support(IO.IN)) && + GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), newFacing)) { + autoIOSubs = subscribeServerTick(autoIOSubs, this::autoIO); + } else if (autoIOSubs != null) { + autoIOSubs.unsubscribe(); + autoIOSubs = null; + } + } + + protected void autoIO() { + if (getOffsetTimer() % 5 == 0) { + if (isWorkingEnabled()) { + if (io == IO.OUT) { + fluidTank.exportToNearby(getFrontFacing()); + } else if (io == IO.IN) { + fluidTank.importFromNearby(getFrontFacing()); + } else if (io == IO.BOTH) { + fluidTank.importFromNearby(getFrontFacing()); + fluidTank.exportToNearby(getFrontFacing().getOpposite()); + } + } + updateTankSubscription(); + } + } + + // GUI + @Override + public ModularUI createUI(Player entityPlayer) { + var group = new WidgetGroup(0, 0, 176, 164); + group.addWidget(new LabelWidget(5, 5, "gui.cosmiccore.sterilization_hatch")); + group.addWidget(new TankWidget(this.fluidTank, 79, 30, true, true) + .setBackground(GuiTextures.FLUID_SLOT)); + return new ModularUI(176, 164, this, entityPlayer) + .background(GuiTextures.BACKGROUND) + .widget(group) + .widget(UITemplate.bindPlayerInventory(entityPlayer.getInventory(), GuiTextures.SLOT, 7, 84, true)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/ThermiaHatchPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/ThermiaHatchPartMachine.java new file mode 100644 index 000000000..56ebe99f8 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/ThermiaHatchPartMachine.java @@ -0,0 +1,113 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.part; + +import com.ghostipedia.cosmiccore.api.capability.recipe.IHeatContainer; +import com.ghostipedia.cosmiccore.api.machine.trait.NotifiableThermiaContainer; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import net.minecraft.client.resources.language.I18n; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; + +public class ThermiaHatchPartMachine extends TieredIOPartMachine implements IHeatContainer { + + + @Persisted + @DescSynced + private final NotifiableThermiaContainer thermiaContainer; + + public ThermiaHatchPartMachine(BlockEntityCreationInfo holder, int tier, IO io) { + super(holder, tier, io); + long currentTemp = 0; + this.thermiaContainer = createThermiaContainer(); + } + + protected NotifiableThermiaContainer createThermiaContainer() { + NotifiableThermiaContainer container; + if (io == IO.OUT) { + container = new NotifiableThermiaContainer(this, IO.OUT, getThermiaLimits(tier), 0); + container.setSideOutputCondition(s -> s == getFrontFacing()); + container.setCapabilityValidator(s -> s == null || s == getFrontFacing()); + } else { + container = new NotifiableThermiaContainer(this, IO.IN, getThermiaLimits(tier), 0); + container.setSideInputCondition(s -> s == getFrontFacing()); + container.setCapabilityValidator(s -> s == null || s == getFrontFacing()); + } + return container; + } + + @Override + public Widget createUIWidget() { + var group = new WidgetGroup(0, 0, 128, 63); + + group.addWidget(new ImageWidget(4, 4, 120, 55, GuiTextures.DISPLAY)); + group.addWidget(new LabelWidget(8, 8, Component + .translatable("gui.cosmiccore.thermia_hatch.label." + (this.io == IO.IN ? "import" : "export")))); + group.addWidget(new LabelWidget(8, 18, () -> I18n.get("gui.cosmiccore.thermia_hatch.hatch_limit"))); + group.addWidget(new LabelWidget(8, 28, + () -> I18n.get(FormattingUtil.formatNumbers(thermiaContainer.getOverloadLimit()), "K")) + .setClientSideWidget()); + group.addWidget(new LabelWidget(8, 38, () -> I18n.get("gui.cosmiccore.thermia_hatch.stored_temp")) + .setClientSideWidget()); + group.addWidget(new LabelWidget(8, 48, + () -> I18n.get(FormattingUtil.formatNumbers(thermiaContainer.getCurrentTemp()), "K")) + .setClientSideWidget()); + group.setBackground(GuiTextures.BACKGROUND_INVERSE); + return group; + } + + public static int getThermiaLimits(int tier) { + return switch (tier) { + case GTValues.ZPM -> 95000; + case GTValues.UV -> 128000; + case GTValues.UHV -> 108000; + case GTValues.UEV -> 158000; + case GTValues.UIV -> 198400; + case GTValues.UXV -> 360000; + case GTValues.OpV -> 2500000; + case GTValues.MAX -> Integer.MAX_VALUE; + default -> 0; + }; + } + + @Override + public long acceptHeatFromNetwork(Direction side) { + return 0; + } + + @Override + public boolean inputsHeat(Direction side) { + return false; + } + + @Override + public boolean outputsHeat(Direction side) { + return IHeatContainer.super.outputsHeat(side); + } + + @Override + public long changeHeat(long heatDifference) { + return 0; + } + + @Override + public long getOverloadLimit() { + return 0; + } + + @Override + public long getHeatStorage() { + return 0; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/WirelessDataHatchPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/WirelessDataHatchPartMachine.java new file mode 100644 index 000000000..ae7f19645 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/part/WirelessDataHatchPartMachine.java @@ -0,0 +1,78 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.part; + +import com.ghostipedia.cosmiccore.common.wireless.WirelessDataStore; +import com.ghostipedia.cosmiccore.utils.OwnershipUtils; + +import com.gregtechceu.gtceu.api.capability.IDataAccessHatch; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.common.machine.owner.FTBOwner; +import com.gregtechceu.gtceu.common.recipe.condition.ResearchCondition; + +import com.lowdragmc.lowdraglib.gui.widget.*; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.network.chat.Component; + +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.List; +import java.util.UUID; + +import javax.annotation.ParametersAreNonnullByDefault; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +public class WirelessDataHatchPartMachine extends MultiblockPartMachine implements IDataAccessHatch { + + public WirelessDataHatchPartMachine(BlockEntityCreationInfo holder) { + super(holder); + } + + @Override + public GTRecipe modifyRecipe(GTRecipe recipe) { + return IDataAccessHatch.super.modifyRecipe(recipe); + } + + @Override + public boolean isCreative() { + return false; + } + + @Override + public boolean isRecipeAvailable(@NotNull GTRecipe recipe, @NotNull Collection seen) { + var team = getOwner() instanceof FTBOwner ftbOwner ? ftbOwner.getPlayerTeam(getOwnerUUID()) : null; + var owner = team != null ? team.getTeamId() : getOwnerUUID(); + + seen.add(this); + var dataStore = WirelessDataStore.getWirelessDataStore(owner); + return recipe.conditions.stream().noneMatch(ResearchCondition.class::isInstance) || + dataStore.isRecipeAvailable(recipe, seen); + } + + private UUID getTeamUUID() { + var team = getOwner() instanceof FTBOwner ftbOwner ? ftbOwner.getPlayerTeam(getOwnerUUID()) : null; + return team != null ? team.getTeamId() : getOwnerUUID(); + } + + @Override + public Widget createUIWidget() { + var group = new WidgetGroup(0, 0, 182 + 8, 117 + 8); + group.addWidget(new DraggableScrollableWidgetGroup(4, 4, 182, 117).setBackground(GuiTextures.DISPLAY) + .addWidget(new LabelWidget(4, 5, self().getBlockState().getBlock().getDescriptionId())) + .addWidget(new ComponentPanelWidget(4, 17, this::addDisplayText) + .textSupplier(this.getLevel().isClientSide ? null : this::addDisplayText) + .setMaxWidthLimit(200))); + group.setBackground(GuiTextures.BACKGROUND_INVERSE); + return group; + } + + public void addDisplayText(List textList) { + MultiblockDisplayText.builder(textList, isFormed()) + .addCustom(list -> OwnershipUtils.addOwnerLine(list, getOwner(), true)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/steam/WeakSteamParallelMultiBlockMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/steam/WeakSteamParallelMultiBlockMachine.java new file mode 100644 index 000000000..56bdf559a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/multiblock/steam/WeakSteamParallelMultiBlockMachine.java @@ -0,0 +1,60 @@ +package com.ghostipedia.cosmiccore.common.machine.multiblock.steam; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeHelper; +import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; +import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; +import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; +import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.common.machine.multiblock.steam.SteamParallelMultiblockMachine; + +import org.jetbrains.annotations.NotNull; + +public class WeakSteamParallelMultiBlockMachine extends SteamParallelMultiblockMachine { + + // if in millibuckets, this is 0.5, Meaning 0.5mb of steam -> 1 EU + private static final double CONVERSION_RATE = 0.5D; + + public WeakSteamParallelMultiBlockMachine(BlockEntityCreationInfo holder) { + super(holder); + setMaxParallels(4); + } + + @Override + public double getConversionRate() { + return CONVERSION_RATE; + } + + public static ModifierFunction recipeModifier(@NotNull MetaMachine machine, @NotNull GTRecipe recipe) { + if (RecipeHelper.getRecipeEUtTier(recipe) > GTValues.LV) return ModifierFunction.NULL; + // long euTick = RecipeHelper.getRecipeEUtTier(recipe); + int parallel = ParallelLogic.getParallelAmount(machine, recipe, 4); + // double eutMulti = (euTick * 0.5 * parallel <= 32) ? (parallel * 0.5) : (32.0 / euTick); + + return ModifierFunction.builder() + .modifyAllContents(ContentModifier.multiplier(parallel)) + .eutModifier(ContentModifier.multiplier(parallel)) + .durationMultiplier(parallel * 0.75) + .parallels(parallel) + .build(); + } + + public static RecipeModifier recipeModifierCanRunAtMost(int tier) { + return (@NotNull MetaMachine machine, @NotNull GTRecipe recipe) -> { + if (RecipeHelper.getRecipeEUtTier(recipe) > tier) return ModifierFunction.NULL; + // long euTick = RecipeHelper.getRecipeEUtTier(recipe); + int parallel = ParallelLogic.getParallelAmount(machine, recipe, 4); + // double eutMulti = (euTick * 0.5 * parallel <= 32) ? (parallel * 0.5) : (32.0 / euTick); + + return ModifierFunction.builder() + .modifyAllContents(ContentModifier.multiplier(parallel)) + .eutModifier(ContentModifier.multiplier(parallel)) + .durationMultiplier(parallel * 0.75) + .parallels(parallel) + .build(); + }; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/part/AugmentedMEPatternBuffer.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/part/AugmentedMEPatternBuffer.java new file mode 100644 index 000000000..d19e9a296 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/part/AugmentedMEPatternBuffer.java @@ -0,0 +1,14 @@ +package com.ghostipedia.cosmiccore.common.machine.part; + +import com.ghostipedia.cosmiccore.mixin.accessor.GTMMEBufferAccessor; + +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.integration.ae2.machine.MEPatternBufferPartMachine; + +public class AugmentedMEPatternBuffer extends MEPatternBufferPartMachine { + + public AugmentedMEPatternBuffer(BlockEntityCreationInfo holder) { + super(holder); + GTMMEBufferAccessor.setMaxPatternCount(45); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/part/SensorPartMachine.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/part/SensorPartMachine.java new file mode 100644 index 000000000..be61a1725 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/part/SensorPartMachine.java @@ -0,0 +1,52 @@ +package com.ghostipedia.cosmiccore.common.machine.part; + +import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; + +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.BlockHitResult; + +import org.jetbrains.annotations.NotNull; + +public class SensorPartMachine extends TieredPartMachine { + + private final ConditionalSubscriptionHandler signalUpdateHandler; + + public SensorPartMachine(BlockEntityCreationInfo holder, int tier) { + super(holder, tier); + this.signalUpdateHandler = new ConditionalSubscriptionHandler(this, this::updateSignal, () -> true); + } + + @Override + public boolean canConnectRedstone(@NotNull Direction side) { + return side == getFrontFacing(); + } + + @Override + public void removedFromController(@NotNull MultiblockControllerMachine controller) { + super.removedFromController(controller); + signalUpdateHandler.updateSubscription(); + } + + @Override + public void addedToController(@NotNull MultiblockControllerMachine controller) { + super.addedToController(controller); + signalUpdateHandler.updateSubscription(); + } + + @Override + public boolean shouldOpenUI(Player player, InteractionHand hand, BlockHitResult hit) { + return true; + } + + /** + * Called to update the redstone signal output. Subclasses should override this. + */ + protected void updateSignal() { + // Subclasses implement actual signal logic + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/machine/part/WirelessDataSensor.java b/src/main/java/com/ghostipedia/cosmiccore/common/machine/part/WirelessDataSensor.java new file mode 100644 index 000000000..4185f73c9 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/machine/part/WirelessDataSensor.java @@ -0,0 +1,178 @@ +package com.ghostipedia.cosmiccore.common.machine.part; + +import com.ghostipedia.cosmiccore.api.data.wireless.WirelessEnergySavedData; +import com.ghostipedia.cosmiccore.api.machine.multiblock.DimensionalEnergyCapacitor; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.gui.widget.LongInputWidget; +import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.common.machine.owner.FTBOwner; +import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; + +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.TextBoxWidget; +import com.lowdragmc.lowdraglib.gui.widget.Widget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import com.lowdragmc.lowdraglib.utils.LocalizationUtils; + +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.math.BigInteger; +import java.util.List; +import java.util.UUID; + +public class WirelessDataSensor extends SensorPartMachine { + + private static Level serverLevel; + private static UUID playerUUID; + private static UUID wirelessUUID; + + + + private static final int DEFAULT_MIN_PERCENT = 33; + private static final int DEFAULT_MAX_PERCENT = 66; + + @Persisted + public long minValue, maxValue; + + @Persisted + private boolean usePercent; + + @Persisted + @DescSynced + private boolean isInverted; + + @Persisted + @DescSynced + private int signal; + + private LongInputWidget minValueInput; + private LongInputWidget maxValueInput; + + public long getMinValue() { + return minValue; + } + + public void setMinValue(long minValue) { + this.minValue = minValue; + } + + public long getMaxValue() { + return maxValue; + } + + public void setMaxValue(long maxValue) { + this.maxValue = maxValue; + } + + public boolean isUsePercent() { + return usePercent; + } + + public boolean isInverted() { + return isInverted; + } + + public void setInverted(boolean inverted) { + this.isInverted = inverted; + } + + public int getSignal() { + return signal; + } + + public void setSignal(int signal) { + this.signal = signal; + } + + public WirelessDataSensor(BlockEntityCreationInfo holder) { + super(holder, GTValues.EV); + this.minValue = DEFAULT_MIN_PERCENT; + this.maxValue = DEFAULT_MAX_PERCENT; + this.usePercent = true; + } + + @Override + public int getOutputSignal(@Nullable Direction side) { + if (serverLevel == null && !getLevel().isClientSide()) { + serverLevel = getLevel(); + } + // Get the UUID appended to 'us' (the machine) + if (wirelessUUID == null) { + var owner = this.getOwner(); + if (owner == null) return 0; + var team = MachineOwner.getOwner(owner.getPlayerUUID()) instanceof FTBOwner ftbOwner ? ftbOwner.getTeam() : null; + wirelessUUID = team != null ? team.getTeamId() : playerUUID; + } + if (side == getFrontFacing().getOpposite()) { + // Wireless Data collection + var controllerPSS = getControllers().stream().filter(DimensionalEnergyCapacitor.class::isInstance) + .map(DimensionalEnergyCapacitor.class::cast) + .toList(); + if (controllerPSS.isEmpty()) { + signal = 0; + return signal; + } + var wirelessData = WirelessEnergySavedData.getOrCreate((ServerLevel) serverLevel); + var percentStorage = (wirelessData.getEnergyStored(wirelessUUID).multiply(BigInteger.valueOf(10000)) + .divide(wirelessData.getEnergyCapacity(wirelessUUID)).intValue() / 100.0F); + var controller = controllerPSS.get(0); + // If the PSS has too much energy, send a signal + if (maxValue <= percentStorage) { + return signal = isInverted() ? 0 : 15; + } + // If the PSS has too little energy, disable the signal. + if (minValue >= percentStorage) { + return signal = isInverted() ? 15 : 0; + } + } + return signal; + } + + @Override + public void updateSignal() { + super.updateSignal(); + } + + @Override + public boolean canConnectRedstone(@NotNull Direction side) { + if (getControllers().isEmpty()) return false; + return side == getFrontFacing(); + } + + @Override + public Widget createUIWidget() { + WidgetGroup group = new WidgetGroup(0, 0, 176, 105); + group.addWidget(new LabelWidget(10, 5, "cover.advanced_energy_detector.label")); + + group.addWidget(new TextBoxWidget(10, 55, 25, + List.of(LocalizationUtils.format("cover.advanced_energy_detector.min")))); + + group.addWidget(new TextBoxWidget(10, 80, 25, + List.of(LocalizationUtils.format("cover.advanced_energy_detector.max")))); + + minValueInput = new LongInputWidget(40, 50, 176 - 40 - 10, 20, this::getMinValue, this::setMinValue); + maxValueInput = new LongInputWidget(40, 75, 176 - 40 - 10, 20, this::getMaxValue, this::setMaxValue); + minValueInput.setMin(0L).setMax(100L); + maxValueInput.setMin(0L).setMax(100L); + group.addWidget(minValueInput); + group.addWidget(maxValueInput); + + // Invert Redstone Output Toggle: + group.addWidget(new ToggleButtonWidget( + 9, 20, 20, 20, + GuiTextures.INVERT_REDSTONE_BUTTON, this::isInverted, this::setInverted) + .isMultiLang() + .setTooltipText("cover.advanced_energy_detector.invert")); + return group; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/mob/DimensionMobScaling.java b/src/main/java/com/ghostipedia/cosmiccore/common/mob/DimensionMobScaling.java new file mode 100644 index 000000000..56edd396e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/mob/DimensionMobScaling.java @@ -0,0 +1,151 @@ +package com.ghostipedia.cosmiccore.common.mob; + +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; + +import java.util.HashMap; +import java.util.Map; + +/** + * Defines mob stat scaling per dimension. + * Higher tier dimensions have stronger mobs to match progression. + */ +public final class DimensionMobScaling { + + private DimensionMobScaling() {} + + /** + * Scaling configuration for a dimension. + */ + public static class ScalingConfig { + + public final double healthMultiplier; + public final double damageMultiplier; + public final double armorMultiplier; + public final double speedMultiplier; + + public ScalingConfig(double health, double damage, double armor, double speed) { + this.healthMultiplier = health; + this.damageMultiplier = damage; + this.armorMultiplier = armor; + this.speedMultiplier = speed; + } + + /** + * Create a config with just health/damage multipliers (armor and speed unchanged). + */ + public static ScalingConfig basic(double health, double damage) { + return new ScalingConfig(health, damage, 1.0, 1.0); + } + + /** + * Create a config with all stats scaled uniformly. + */ + public static ScalingConfig uniform(double multiplier) { + return new ScalingConfig(multiplier, multiplier, multiplier, 1.0); + } + } + + // Default config for unregistered dimensions (no scaling) + public static final ScalingConfig DEFAULT = new ScalingConfig(1.0, 1.0, 1.0, 1.0); + + // Dimension -> Scaling config map + private static final Map, ScalingConfig> DIMENSION_SCALING = new HashMap<>(); + + // --- Dimension Keys --- + + // Vanilla + public static final ResourceKey NETHER = Level.NETHER; + public static final ResourceKey END = Level.END; + + // Aether + private static ResourceKey aetherDim(String name) { + return ResourceKey.create(Registries.DIMENSION, ResourceLocation.fromNamespaceAndPath("aether", name)); + } + + public static final ResourceKey AETHER = aetherDim("the_aether"); + + // Undergarden + private static ResourceKey undergardenDim(String name) { + return ResourceKey.create(Registries.DIMENSION, ResourceLocation.fromNamespaceAndPath("undergarden", name)); + } + + public static final ResourceKey UNDERGARDEN = undergardenDim("undergarden"); + + // Ad Astra + private static ResourceKey adAstraDim(String name) { + return ResourceKey.create(Registries.DIMENSION, ResourceLocation.fromNamespaceAndPath("ad_astra", name)); + } + + public static final ResourceKey MOON = adAstraDim("moon"); + public static final ResourceKey MOON_ORBIT = adAstraDim("moon_orbit"); + public static final ResourceKey MARS = adAstraDim("mars"); + public static final ResourceKey MARS_ORBIT = adAstraDim("mars_orbit"); + public static final ResourceKey VENUS = adAstraDim("venus"); + public static final ResourceKey VENUS_ORBIT = adAstraDim("venus_orbit"); + public static final ResourceKey MERCURY = adAstraDim("mercury"); + public static final ResourceKey MERCURY_ORBIT = adAstraDim("mercury_orbit"); + public static final ResourceKey GLACIO = adAstraDim("glacio"); + public static final ResourceKey GLACIO_ORBIT = adAstraDim("glacio_orbit"); + public static final ResourceKey EARTH_ORBIT = adAstraDim("earth_orbit"); + + // Frontiers - The Deep Below + private static ResourceKey frontiersDim(String name) { + return ResourceKey.create(Registries.DIMENSION, ResourceLocation.fromNamespaceAndPath("frontiers", name)); + } + + public static final ResourceKey DEEP_BELOW = frontiersDim("the_deep_below"); + + /** + * Register all dimension scaling configurations. + * Called during mod initialization. + */ + public static void registerScaling() { + // Tier 1: Nether - 2x HP, 1.5x damage + register(NETHER, ScalingConfig.basic(2.0, 1.5)); + + // Tier 2: Aether - 3x HP, 2x damage + register(AETHER, ScalingConfig.basic(3.0, 2.0)); + + // Tier 3: Undergarden - 4x HP, 2.5x damage + register(UNDERGARDEN, ScalingConfig.basic(4.0, 2.5)); + + // Tier 4: Ad Astra planets/orbits - 5x HP, 3x damage + for (ResourceKey dim : new ResourceKey[] { + MOON, MOON_ORBIT, MARS, MARS_ORBIT, VENUS, VENUS_ORBIT, + MERCURY, MERCURY_ORBIT, GLACIO, GLACIO_ORBIT, EARTH_ORBIT + }) { + register(dim, ScalingConfig.basic(5.0, 3.0)); + } + + // Tier 5: The Deep Below - 6x HP, 4x damage + register(DEEP_BELOW, ScalingConfig.basic(6.0, 4.0)); + + // The End - 2.5x HP, 2x damage (between Nether and Aether) + register(END, ScalingConfig.basic(2.5, 2.0)); + } + + /** + * Register scaling for a dimension. + */ + public static void register(ResourceKey dimension, ScalingConfig config) { + DIMENSION_SCALING.put(dimension, config); + } + + /** + * Get the scaling config for a dimension. + * Returns DEFAULT if dimension has no registered scaling. + */ + public static ScalingConfig getScaling(ResourceKey dimension) { + return DIMENSION_SCALING.getOrDefault(dimension, DEFAULT); + } + + /** + * Check if a dimension has custom scaling registered. + */ + public static boolean hasScaling(ResourceKey dimension) { + return DIMENSION_SCALING.containsKey(dimension); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/mob/MobScalingHandler.java b/src/main/java/com/ghostipedia/cosmiccore/common/mob/MobScalingHandler.java new file mode 100644 index 000000000..2de132335 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/mob/MobScalingHandler.java @@ -0,0 +1,132 @@ +package com.ghostipedia.cosmiccore.common.mob; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.mob.DimensionMobScaling.ScalingConfig; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.Mob; +import net.minecraft.core.Holder; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.ai.attributes.Attribute; +import net.minecraft.world.entity.ai.attributes.AttributeInstance; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.neoforged.neoforge.event.entity.EntityJoinLevelEvent; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; + +/** + * Handles applying dimension-based stat scaling to mobs when they spawn/load. + */ +@EventBusSubscriber(modid = CosmicCore.MOD_ID, bus = EventBusSubscriber.Bus.GAME) +public final class MobScalingHandler { + + private MobScalingHandler() {} + + private static final ResourceLocation HEALTH_MODIFIER_ID = CosmicCore.id("mob_scale_health"); + private static final ResourceLocation DAMAGE_MODIFIER_ID = CosmicCore.id("mob_scale_damage"); + private static final ResourceLocation ARMOR_MODIFIER_ID = CosmicCore.id("mob_scale_armor"); + private static final ResourceLocation SPEED_MODIFIER_ID = CosmicCore.id("mob_scale_speed"); + + private static final String SCALED_TAG = "cosmiccore:dimension_scaled"; + + @SubscribeEvent + public static void onEntityJoinLevel(EntityJoinLevelEvent event) { + Entity entity = event.getEntity(); + Level level = event.getLevel(); + + // Only process on server side + if (level.isClientSide()) return; + + // Only scale hostile/neutral mobs, not players or passive animals + if (!shouldScale(entity)) return; + + LivingEntity living = (LivingEntity) entity; + + // Check if already scaled (prevents double-scaling) + if (living.getPersistentData().getBoolean(SCALED_TAG)) return; + + // Get scaling config for this dimension + ScalingConfig config = DimensionMobScaling.getScaling(level.dimension()); + + // Skip if no scaling needed + if (config == DimensionMobScaling.DEFAULT) return; + + // Apply scaling + applyScaling(living, config); + + // Mark as scaled + living.getPersistentData().putBoolean(SCALED_TAG, true); + } + + /** + * Determine if an entity should receive dimension scaling. + */ + private static boolean shouldScale(Entity entity) { + // Must be a living entity + if (!(entity instanceof LivingEntity)) return false; + + // Don't scale players + if (entity instanceof Player) return false; + + // Scale all monsters (hostile mobs) + if (entity instanceof Monster) return true; + + // Scale neutral mobs (Mob class but not Monster) + // This includes wolves, iron golems, piglins, etc. + if (entity instanceof Mob) return true; + + return false; + } + + /** + * Apply scaling modifiers to a living entity. + */ + private static void applyScaling(LivingEntity entity, ScalingConfig config) { + // Health - use MULTIPLY_BASE so it multiplies the base value + applyMultiplier(entity, Attributes.MAX_HEALTH, HEALTH_MODIFIER_ID, config.healthMultiplier); + + // Heal to full after increasing max health + if (config.healthMultiplier > 1.0) { + entity.setHealth(entity.getMaxHealth()); + } + + // Damage + applyMultiplier(entity, Attributes.ATTACK_DAMAGE, DAMAGE_MODIFIER_ID, config.damageMultiplier); + + // Armor + if (config.armorMultiplier != 1.0) { + applyMultiplier(entity, Attributes.ARMOR, ARMOR_MODIFIER_ID, config.armorMultiplier); + } + + // Speed + if (config.speedMultiplier != 1.0) { + applyMultiplier(entity, Attributes.MOVEMENT_SPEED, SPEED_MODIFIER_ID, config.speedMultiplier); + } + } + + /** + * Apply a multiplicative attribute modifier. + */ + private static void applyMultiplier(LivingEntity entity, + Holder attribute, + ResourceLocation id, double multiplier) { + AttributeInstance instance = entity.getAttribute(attribute); + if (instance == null) return; + + instance.removeModifier(id); + + double modifierValue = multiplier - 1.0; + + if (modifierValue != 0.0) { + instance.addPermanentModifier(new AttributeModifier( + id, + modifierValue, + AttributeModifier.Operation.ADD_MULTIPLIED_BASE)); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/network/CCoreNetwork.java b/src/main/java/com/ghostipedia/cosmiccore/common/network/CCoreNetwork.java new file mode 100644 index 000000000..105a99082 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/network/CCoreNetwork.java @@ -0,0 +1,84 @@ +package com.ghostipedia.cosmiccore.common.network; + +import com.ghostipedia.cosmiccore.common.network.packet.AbyssTimeWarnPacket; +import com.ghostipedia.cosmiccore.common.network.packet.BootsControlPacket; +import com.ghostipedia.cosmiccore.common.network.packet.OxygenWarnPacket; +import com.ghostipedia.cosmiccore.common.network.packet.StarLadderUplinkPackets; +import com.ghostipedia.cosmiccore.common.network.packet.StellarUpgradePacket; +import com.ghostipedia.cosmiccore.common.network.packet.SyncOxygenBarPacket; +import com.ghostipedia.cosmiccore.common.network.packet.SyncPredictedVeinsPacket; +import com.ghostipedia.cosmiccore.common.network.packet.SyncTimeBarPacket; +import com.ghostipedia.cosmiccore.common.reflection.network.DashPacket; +import com.ghostipedia.cosmiccore.common.reflection.network.SoulSuperPacket; +import com.ghostipedia.cosmiccore.common.reflection.network.SyncQuakeMovementPacket; +import com.ghostipedia.cosmiccore.common.reflection.ui.ScarSelectionPackets; +import com.ghostipedia.cosmiccore.common.reflection.ui.VoidUIPackets; + +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.level.ServerPlayer; +import net.neoforged.neoforge.network.PacketDistributor; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent; +import net.neoforged.neoforge.network.registration.PayloadRegistrar; + +public class CCoreNetwork { + + private static final String PROTOCOL_VERSION = "1.0.0"; + + public static void sendToServer(CustomPacketPayload packet) { + PacketDistributor.sendToServer(packet); + } + + public static void sendToPlayer(ServerPlayer player, CustomPacketPayload packet) { + PacketDistributor.sendToPlayer(player, packet); + } + + public static void registerPayloads(RegisterPayloadHandlersEvent event) { + PayloadRegistrar registrar = event.registrar(PROTOCOL_VERSION); + + registrar.playToClient(SyncTimeBarPacket.TYPE, SyncTimeBarPacket.CODEC, SyncTimeBarPacket::execute); + registrar.playToClient(AbyssTimeWarnPacket.TYPE, AbyssTimeWarnPacket.CODEC, AbyssTimeWarnPacket::execute); + registrar.playToClient(SyncOxygenBarPacket.TYPE, SyncOxygenBarPacket.CODEC, SyncOxygenBarPacket::execute); + registrar.playToClient(OxygenWarnPacket.TYPE, OxygenWarnPacket.CODEC, OxygenWarnPacket::execute); + registrar.playToClient(SyncQuakeMovementPacket.TYPE, SyncQuakeMovementPacket.CODEC, + SyncQuakeMovementPacket::execute); + registrar.playToClient(SyncPredictedVeinsPacket.TYPE, SyncPredictedVeinsPacket.CODEC, + SyncPredictedVeinsPacket::execute); + + registrar.playToServer(DashPacket.TYPE, DashPacket.CODEC, DashPacket::execute); + registrar.playToServer(SoulSuperPacket.TYPE, SoulSuperPacket.CODEC, SoulSuperPacket::execute); + registrar.playToServer(StellarUpgradePacket.TYPE, StellarUpgradePacket.CODEC, StellarUpgradePacket::execute); + registrar.playToServer(BootsControlPacket.TYPE, BootsControlPacket.CODEC, BootsControlPacket::execute); + + registrar.playToClient(VoidUIPackets.OpenVoidScreenPacket.TYPE, VoidUIPackets.OpenVoidScreenPacket.CODEC, + VoidUIPackets.OpenVoidScreenPacket::execute); + registrar.playToServer(VoidUIPackets.BargainChoicePacket.TYPE, VoidUIPackets.BargainChoicePacket.CODEC, + VoidUIPackets.BargainChoicePacket::execute); + registrar.playToClient(VoidUIPackets.ThresholdEncounterPacket.TYPE, + VoidUIPackets.ThresholdEncounterPacket.CODEC, VoidUIPackets.ThresholdEncounterPacket::execute); + registrar.playToClient(VoidUIPackets.OpenHubPacket.TYPE, VoidUIPackets.OpenHubPacket.CODEC, + VoidUIPackets.OpenHubPacket::execute); + registrar.playToServer(VoidUIPackets.DefianceChoicePacket.TYPE, VoidUIPackets.DefianceChoicePacket.CODEC, + VoidUIPackets.DefianceChoicePacket::execute); + registrar.playToServer(VoidUIPackets.SoulShapeChoicePacket.TYPE, VoidUIPackets.SoulShapeChoicePacket.CODEC, + VoidUIPackets.SoulShapeChoicePacket::execute); + + registrar.playToClient(ScarSelectionPackets.OpenScarSelectionPacket.TYPE, + ScarSelectionPackets.OpenScarSelectionPacket.CODEC, + ScarSelectionPackets.OpenScarSelectionPacket::execute); + registrar.playToServer(ScarSelectionPackets.ScarRemovalPacket.TYPE, + ScarSelectionPackets.ScarRemovalPacket.CODEC, ScarSelectionPackets.ScarRemovalPacket::execute); + + registrar.playToServer(StarLadderUplinkPackets.UplinkActionPacket.TYPE, + StarLadderUplinkPackets.UplinkActionPacket.CODEC, + StarLadderUplinkPackets.UplinkActionPacket::execute); + registrar.playToClient(StarLadderUplinkPackets.CloseScreenPacket.TYPE, + StarLadderUplinkPackets.CloseScreenPacket.CODEC, + StarLadderUplinkPackets.CloseScreenPacket::execute); + registrar.playToClient(StarLadderUplinkPackets.UplinkSyncPacket.TYPE, + StarLadderUplinkPackets.UplinkSyncPacket.CODEC, + StarLadderUplinkPackets.UplinkSyncPacket::execute); + registrar.playToClient(StarLadderUplinkPackets.ObserverWhisperPacket.TYPE, + StarLadderUplinkPackets.ObserverWhisperPacket.CODEC, + StarLadderUplinkPackets.ObserverWhisperPacket::execute); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/AbyssTimeWarnPacket.java b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/AbyssTimeWarnPacket.java new file mode 100644 index 000000000..4b6ceece2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/AbyssTimeWarnPacket.java @@ -0,0 +1,42 @@ +package com.ghostipedia.cosmiccore.common.network.packet; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.neoforged.neoforge.network.handling.IPayloadContext; + +import org.jetbrains.annotations.NotNull; + +public class AbyssTimeWarnPacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("abyss_time_warn")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(AbyssTimeWarnPacket::encode, AbyssTimeWarnPacket::new); + + private final String message; + + public AbyssTimeWarnPacket(Component message) { + this.message = message.getString(); + } + + public AbyssTimeWarnPacket(FriendlyByteBuf buffer) { + this.message = buffer.readUtf(); + } + + public void encode(FriendlyByteBuf buffer) { + buffer.writeUtf(message); + } + + public void execute(IPayloadContext context) { + Minecraft.getInstance().gui.setOverlayMessage(Component.literal(message), false); + } + + @Override + public @NotNull Type type() { + return TYPE; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/BootsControlPacket.java b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/BootsControlPacket.java new file mode 100644 index 000000000..f1469a741 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/BootsControlPacket.java @@ -0,0 +1,105 @@ +package com.ghostipedia.cosmiccore.common.network.packet; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.item.armor.boots.ICosmicBoots; + +import com.gregtechceu.gtceu.api.item.armor.ArmorComponentItem; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.network.handling.IPayloadContext; + +import org.jetbrains.annotations.NotNull; + +public class BootsControlPacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("boots_control")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(BootsControlPacket::encode, BootsControlPacket::new); + + public enum Action { + SPEED_INCREASE, + SPEED_DECREASE, + JUMP_INCREASE, + JUMP_DECREASE, + TOGGLE_STEP, + TOGGLE_INERTIA + } + + private final Action action; + + public BootsControlPacket(Action action) { + this.action = action; + } + + public BootsControlPacket(FriendlyByteBuf buf) { + this.action = buf.readEnum(Action.class); + } + + public void encode(FriendlyByteBuf buffer) { + buffer.writeEnum(action); + } + + public void execute(IPayloadContext context) { + if (!(context.player() instanceof ServerPlayer player)) return; + + ItemStack boots = player.getItemBySlot(EquipmentSlot.FEET); + if (!isCosmicBoots(boots)) return; + + String messageKey = null; + Object messageArg = null; + + switch (action) { + case SPEED_INCREASE -> { + double newValue = ICosmicBoots.changeSpeedModifier(boots, ICosmicBoots.MODIFIER_INCREMENT); + messageKey = "cosmiccore.boots.message.speed"; + messageArg = String.format("%.0f%%", newValue * 100); + } + case SPEED_DECREASE -> { + double newValue = ICosmicBoots.changeSpeedModifier(boots, -ICosmicBoots.MODIFIER_INCREMENT); + messageKey = "cosmiccore.boots.message.speed"; + messageArg = String.format("%.0f%%", newValue * 100); + } + case JUMP_INCREASE -> { + double newValue = ICosmicBoots.changeJumpModifier(boots, ICosmicBoots.MODIFIER_INCREMENT); + messageKey = "cosmiccore.boots.message.jump"; + messageArg = String.format("%.0f%%", newValue * 100); + } + case JUMP_DECREASE -> { + double newValue = ICosmicBoots.changeJumpModifier(boots, -ICosmicBoots.MODIFIER_INCREMENT); + messageKey = "cosmiccore.boots.message.jump"; + messageArg = String.format("%.0f%%", newValue * 100); + } + case TOGGLE_STEP -> { + boolean enabled = ICosmicBoots.toggleStepAssist(boots); + messageKey = "cosmiccore.boots.message.step"; + messageArg = enabled ? "§aON" : "§cOFF"; + } + case TOGGLE_INERTIA -> { + boolean enabled = ICosmicBoots.toggleInertiaCancel(boots); + messageKey = "cosmiccore.boots.message.inertia"; + messageArg = enabled ? "§aON" : "§cOFF"; + } + } + + if (messageKey != null) { + player.displayClientMessage(Component.translatable(messageKey, messageArg), true); + } + } + + private static boolean isCosmicBoots(ItemStack stack) { + if (stack.isEmpty()) return false; + if (!(stack.getItem() instanceof ArmorComponentItem armorItem)) return false; + return armorItem.getArmorLogic() instanceof ICosmicBoots; + } + + @Override + public @NotNull Type type() { + return TYPE; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/OxygenWarnPacket.java b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/OxygenWarnPacket.java new file mode 100644 index 000000000..0a1270ae2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/OxygenWarnPacket.java @@ -0,0 +1,46 @@ +package com.ghostipedia.cosmiccore.common.network.packet; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.neoforged.neoforge.network.handling.IPayloadContext; + +import org.jetbrains.annotations.NotNull; + +public class OxygenWarnPacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("oxygen_warn")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(OxygenWarnPacket::encode, OxygenWarnPacket::new); + + private final String message; + private final int seconds; + + public OxygenWarnPacket(String message, int seconds) { + this.message = message; + this.seconds = seconds; + } + + public OxygenWarnPacket(FriendlyByteBuf buf) { + this.message = buf.readUtf(); + this.seconds = buf.readVarInt(); + } + + public void encode(FriendlyByteBuf buffer) { + buffer.writeUtf(message); + buffer.writeVarInt(seconds); + } + + public void execute(IPayloadContext context) { + Minecraft.getInstance().gui.setOverlayMessage(Component.translatable(message, seconds), false); + } + + @Override + public @NotNull Type type() { + return TYPE; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/StarLadderUplinkPackets.java b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/StarLadderUplinkPackets.java new file mode 100644 index 000000000..28a607a1c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/StarLadderUplinkPackets.java @@ -0,0 +1,331 @@ +package com.ghostipedia.cosmiccore.common.network.packet; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.StarLadderMachine; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.StarLadderUplinkManager.DemandSlot; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.StarLadderUplinkState; +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.network.handling.IPayloadContext; + +import org.jetbrains.annotations.NotNull; + +public class StarLadderUplinkPackets { + + public enum UplinkAction { + INITIATE, + CONFIRM, + ABORT + } + + public static class UplinkActionPacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("uplink_action")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(UplinkActionPacket::encode, UplinkActionPacket::new); + + private final BlockPos machinePos; + private final UplinkAction action; + + public UplinkActionPacket(BlockPos machinePos, UplinkAction action) { + this.machinePos = machinePos; + this.action = action; + } + + public UplinkActionPacket(FriendlyByteBuf buf) { + this.machinePos = buf.readBlockPos(); + this.action = buf.readEnum(UplinkAction.class); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeBlockPos(machinePos); + buf.writeEnum(action); + } + + public void execute(IPayloadContext ctx) { + if (!(ctx.player() instanceof ServerPlayer player)) return; + + if (!(player.level() instanceof ServerLevel serverLevel)) return; + var machine = MetaMachine.getMachine(serverLevel, machinePos); + if (!(machine instanceof StarLadderMachine starLadder)) return; + + switch (action) { + case INITIATE -> starLadder.getUplinkManager().initiate(player); + case CONFIRM -> starLadder.getUplinkManager().confirm(player); + case ABORT -> starLadder.getUplinkManager().abort(player); + } + } + + @Override + public @NotNull Type type() { + return TYPE; + } + } + + public static class CloseScreenPacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("uplink_close_screen")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(CloseScreenPacket::encode, CloseScreenPacket::new); + + public CloseScreenPacket() {} + + public CloseScreenPacket(FriendlyByteBuf buf) {} + + public void encode(FriendlyByteBuf buf) {} + + public void execute(IPayloadContext ctx) { + Minecraft.getInstance().setScreen(null); + } + + @Override + public @NotNull Type type() { + return TYPE; + } + } + + public static class UplinkSyncPacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("uplink_sync")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(UplinkSyncPacket::encode, UplinkSyncPacket::new); + + private final StarLadderUplinkState state; + private final int progress; + private final int drainRate; + private final ItemStack bulkItem; + private final int bulkQtyRemaining; + private final int bulkTimer; + private final int bulkTimerMax; + private final ItemStack complexItem; + private final int complexQtyRemaining; + private final int complexTimer; + private final int complexTimerMax; + + public UplinkSyncPacket(StarLadderUplinkState state, int progress, int drainRate, + DemandSlot bulk, DemandSlot complex) { + this.state = state; + this.progress = progress; + this.drainRate = drainRate; + this.bulkItem = bulk.item; + this.bulkQtyRemaining = bulk.remaining(); + this.bulkTimer = bulk.timer; + this.bulkTimerMax = bulk.timerMax; + this.complexItem = complex.item; + this.complexQtyRemaining = complex.remaining(); + this.complexTimer = complex.timer; + this.complexTimerMax = complex.timerMax; + } + + public UplinkSyncPacket(RegistryFriendlyByteBuf buf) { + this.state = buf.readEnum(StarLadderUplinkState.class); + this.progress = buf.readVarInt(); + this.drainRate = buf.readVarInt(); + this.bulkItem = ItemStack.OPTIONAL_STREAM_CODEC.decode(buf); + this.bulkQtyRemaining = buf.readVarInt(); + this.bulkTimer = buf.readVarInt(); + this.bulkTimerMax = buf.readVarInt(); + this.complexItem = ItemStack.OPTIONAL_STREAM_CODEC.decode(buf); + this.complexQtyRemaining = buf.readVarInt(); + this.complexTimer = buf.readVarInt(); + this.complexTimerMax = buf.readVarInt(); + } + + public void encode(RegistryFriendlyByteBuf buf) { + buf.writeEnum(state); + buf.writeVarInt(progress); + buf.writeVarInt(drainRate); + ItemStack.OPTIONAL_STREAM_CODEC.encode(buf, bulkItem); + buf.writeVarInt(bulkQtyRemaining); + buf.writeVarInt(bulkTimer); + buf.writeVarInt(bulkTimerMax); + ItemStack.OPTIONAL_STREAM_CODEC.encode(buf, complexItem); + buf.writeVarInt(complexQtyRemaining); + buf.writeVarInt(complexTimer); + buf.writeVarInt(complexTimerMax); + } + + public void execute(IPayloadContext ctx) { + StarLadderUplinkClientState.update(state, progress, drainRate, + bulkItem, bulkQtyRemaining, bulkTimer, bulkTimerMax, + complexItem, complexQtyRemaining, complexTimer, complexTimerMax); + } + + @Override + public @NotNull Type type() { + return TYPE; + } + } + + public enum WhisperStyle { + REFLECTION, + OBSERVER, + AMBIENT + } + + public static class ObserverWhisperPacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("uplink_observer_whisper")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(ObserverWhisperPacket::encode, ObserverWhisperPacket::new); + + private static final Style REFLECTION_STYLE = Style.EMPTY.withItalic(true).withColor(0x9966CC); + private static final Style OBSERVER_STYLE = Style.EMPTY.withColor(0x88CCFF).withBold(false); + private static final Style AMBIENT_STYLE = Style.EMPTY.withItalic(true).withColor(0xCC6644); + + private final String text; + private final WhisperStyle style; + + public ObserverWhisperPacket(String text, WhisperStyle style) { + this.text = text; + this.style = style; + } + + public ObserverWhisperPacket(FriendlyByteBuf buf) { + this.text = buf.readUtf(); + this.style = buf.readEnum(WhisperStyle.class); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeUtf(text); + buf.writeEnum(style); + } + + public void execute(IPayloadContext ctx) { + var player = Minecraft.getInstance().player; + if (player == null) return; + + Component translated = Component.translatable(text); + Component message = switch (style) { + case REFLECTION -> Component.literal("...").append(translated).withStyle(REFLECTION_STYLE); + case OBSERVER -> translated.copy().withStyle(OBSERVER_STYLE); + case AMBIENT -> translated.copy().withStyle(AMBIENT_STYLE); + }; + player.sendSystemMessage(message); + } + + @Override + public @NotNull Type type() { + return TYPE; + } + } + + public static class ClientDemand { + + public ItemStack item = ItemStack.EMPTY; + public int qtyRemaining = 0; + public int timerTicks = 0; + public int timerMax = 0; + + public boolean isActive() { + return !item.isEmpty(); + } + + public float getTimerProgress() { + return timerMax > 0 ? (float) timerTicks / timerMax : 0f; + } + + public void reset() { + item = ItemStack.EMPTY; + qtyRemaining = 0; + timerTicks = 0; + timerMax = 0; + } + } + + public static class StarLadderUplinkClientState { + + private static StarLadderUplinkState state = StarLadderUplinkState.IDLE; + private static int progress = 0; + private static int drainRate = 0; + private static final ClientDemand bulk = new ClientDemand(); + private static final ClientDemand complex = new ClientDemand(); + + public static void update(StarLadderUplinkState newState, int newProgress, int newDrainRate, + ItemStack bulkItem, int bulkQty, int bulkTimer, int bulkTimerMax, + ItemStack complexItem, int complexQty, int complexTimer, + int complexTimerMax) { + state = newState; + progress = newProgress; + drainRate = newDrainRate; + bulk.item = bulkItem; + bulk.qtyRemaining = bulkQty; + bulk.timerTicks = bulkTimer; + bulk.timerMax = bulkTimerMax; + complex.item = complexItem; + complex.qtyRemaining = complexQty; + complex.timerTicks = complexTimer; + complex.timerMax = complexTimerMax; + } + + public static StarLadderUplinkState getState() { + return state; + } + + public static int getProgress() { + return progress; + } + + public static int getDrainRate() { + return drainRate; + } + + public static ClientDemand getBulkDemand() { + return bulk; + } + + public static ClientDemand getComplexDemand() { + return complex; + } + + public static float getUplinkProgress() { + return progress / 6000f; + } + + public static void reset() { + state = StarLadderUplinkState.IDLE; + progress = 0; + drainRate = 0; + bulk.reset(); + complex.reset(); + } + } + + public static void sendInitiate(BlockPos machinePos) { + CCoreNetwork.sendToServer(new UplinkActionPacket(machinePos, UplinkAction.INITIATE)); + } + + public static void sendConfirm(BlockPos machinePos) { + CCoreNetwork.sendToServer(new UplinkActionPacket(machinePos, UplinkAction.CONFIRM)); + } + + public static void sendAbort(BlockPos machinePos) { + CCoreNetwork.sendToServer(new UplinkActionPacket(machinePos, UplinkAction.ABORT)); + } + + public static void sendCloseScreen(ServerPlayer player) { + CCoreNetwork.sendToPlayer(player, new CloseScreenPacket()); + } + + public static void sendUplinkSync(ServerPlayer player, StarLadderUplinkState state, int progress, + int drainRate, DemandSlot bulk, DemandSlot complex) { + CCoreNetwork.sendToPlayer(player, new UplinkSyncPacket(state, progress, drainRate, bulk, complex)); + } + + public static void sendObserverWhisper(ServerPlayer player, String text, WhisperStyle style) { + CCoreNetwork.sendToPlayer(player, new ObserverWhisperPacket(text, style)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/StellarUpgradePacket.java b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/StellarUpgradePacket.java new file mode 100644 index 000000000..d898b2ea1 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/StellarUpgradePacket.java @@ -0,0 +1,77 @@ +package com.ghostipedia.cosmiccore.common.network.packet; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.multiblock.IrisMultiblockMachine; +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarIrisUpgrade; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.level.ServerPlayer; +import net.neoforged.neoforge.network.handling.IPayloadContext; + +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; + +public class StellarUpgradePacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("stellar_upgrade")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(StellarUpgradePacket::encode, StellarUpgradePacket::new); + + private final BlockPos machinePos; + @Nullable + private final StellarIrisUpgrade upgrade; + @SuppressWarnings("unused") + private final boolean isRespec; + + public StellarUpgradePacket(BlockPos machinePos, @Nullable StellarIrisUpgrade upgrade, boolean isRespec) { + this.machinePos = machinePos; + this.upgrade = upgrade; + this.isRespec = isRespec; + } + + public StellarUpgradePacket(FriendlyByteBuf buffer) { + this.machinePos = buffer.readBlockPos(); + this.isRespec = buffer.readBoolean(); + if (buffer.readBoolean()) { + this.upgrade = buffer.readEnum(StellarIrisUpgrade.class); + } else { + this.upgrade = null; + } + } + + public void encode(FriendlyByteBuf buffer) { + buffer.writeBlockPos(machinePos); + buffer.writeBoolean(false); + buffer.writeBoolean(upgrade != null); + if (upgrade != null) { + buffer.writeEnum(upgrade); + } + } + + public void execute(IPayloadContext context) { + if (!(context.player() instanceof ServerPlayer player)) return; + + if (!(MetaMachine.getMachine(player.level(), machinePos) instanceof IrisMultiblockMachine machine)) { + return; + } + + if (player.distanceToSqr(machinePos.getX() + 0.5, machinePos.getY() + 0.5, machinePos.getZ() + 0.5) > 64) { + return; + } + + if (upgrade != null) { + machine.tryUnlockUpgrade(upgrade); + } + } + + @Override + public @NotNull Type type() { + return TYPE; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/SyncOxygenBarPacket.java b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/SyncOxygenBarPacket.java new file mode 100644 index 000000000..47330b0f3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/SyncOxygenBarPacket.java @@ -0,0 +1,53 @@ +package com.ghostipedia.cosmiccore.common.network.packet; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.client.CosmicHudGuiOverlay; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.neoforged.neoforge.network.handling.IPayloadContext; + +import org.jetbrains.annotations.NotNull; + +public class SyncOxygenBarPacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("sync_oxygen_bar")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(SyncOxygenBarPacket::encode, SyncOxygenBarPacket::new); + + private final long left; + private final long max; + private final boolean show; + private final double ratePerSecond; + + public SyncOxygenBarPacket(long left, long max, boolean show, double ratePerSecond) { + this.left = left; + this.max = max; + this.show = show; + this.ratePerSecond = ratePerSecond; + } + + public SyncOxygenBarPacket(FriendlyByteBuf buf) { + this.left = buf.readVarLong(); + this.max = buf.readVarLong(); + this.show = buf.readBoolean(); + this.ratePerSecond = buf.readDouble(); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeVarLong(left); + buf.writeVarLong(max); + buf.writeBoolean(show); + buf.writeDouble(ratePerSecond); + } + + public void execute(IPayloadContext context) { + CosmicHudGuiOverlay.setOxygenBar(left, max, show, ratePerSecond); + } + + @Override + public @NotNull Type type() { + return TYPE; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/SyncPredictedVeinsPacket.java b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/SyncPredictedVeinsPacket.java new file mode 100644 index 000000000..f494d2f6c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/SyncPredictedVeinsPacket.java @@ -0,0 +1,109 @@ +package com.ghostipedia.cosmiccore.common.network.packet; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.worldgen.survey.VeinSurveyUtil.VeinConfidence; +import com.ghostipedia.cosmiccore.common.worldgen.survey.VeinSurveyUtil.VeinInfo; + +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.ChunkPos; +import net.neoforged.neoforge.network.handling.IPayloadContext; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class SyncPredictedVeinsPacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("sync_predicted_veins")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(SyncPredictedVeinsPacket::encode, SyncPredictedVeinsPacket::new); + + private final List veins; + private final boolean clearExisting; + + public SyncPredictedVeinsPacket(List veins, boolean clearExisting) { + this.veins = veins.stream() + .filter(v -> v.confidence() == VeinConfidence.PREDICTED) + .map(PredictedVeinData::fromVeinInfo) + .toList(); + this.clearExisting = clearExisting; + } + + public SyncPredictedVeinsPacket(FriendlyByteBuf buffer) { + this.clearExisting = buffer.readBoolean(); + int count = buffer.readVarInt(); + this.veins = new ArrayList<>(count); + for (int i = 0; i < count; i++) { + veins.add(PredictedVeinData.read(buffer)); + } + } + + public void encode(FriendlyByteBuf buffer) { + buffer.writeBoolean(clearExisting); + buffer.writeVarInt(veins.size()); + for (PredictedVeinData vein : veins) { + vein.write(buffer); + } + } + + public void execute(IPayloadContext context) { + var mc = Minecraft.getInstance(); + if (mc.level == null) return; + // TODO(cosmiccore-42.14): re-wire predicted-vein markers when the JourneyMap integration is ported. + } + + @Override + public @NotNull Type type() { + return TYPE; + } + + private record PredictedVeinData( + int x, + int z, + int chunkX, + int chunkZ, + String veinName) { + + public static PredictedVeinData fromVeinInfo(VeinInfo info) { + return new PredictedVeinData( + info.center().getX(), + info.center().getZ(), + info.originChunk().x, + info.originChunk().z, + info.getVeinName()); + } + + public VeinInfo toVeinInfo() { + return new VeinInfo( + new BlockPos(x, 0, z), + new ChunkPos(chunkX, chunkZ), + null, + ResourceLocation.tryParse("gtceu:" + veinName), + 0, + VeinConfidence.PREDICTED); + } + + public void write(FriendlyByteBuf buffer) { + buffer.writeVarInt(x); + buffer.writeVarInt(z); + buffer.writeVarInt(chunkX); + buffer.writeVarInt(chunkZ); + buffer.writeUtf(veinName); + } + + public static PredictedVeinData read(FriendlyByteBuf buffer) { + return new PredictedVeinData( + buffer.readVarInt(), + buffer.readVarInt(), + buffer.readVarInt(), + buffer.readVarInt(), + buffer.readUtf()); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/SyncTimeBarPacket.java b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/SyncTimeBarPacket.java new file mode 100644 index 000000000..38f0865d3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/network/packet/SyncTimeBarPacket.java @@ -0,0 +1,50 @@ +package com.ghostipedia.cosmiccore.common.network.packet; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.client.CosmicHudGuiOverlay; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.network.handling.IPayloadContext; + +import org.jetbrains.annotations.NotNull; + +public class SyncTimeBarPacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("sync_time_bar")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(SyncTimeBarPacket::encode, SyncTimeBarPacket::new); + + private final ResourceLocation dimension; + private final long ticksLeft; + private final long maxTicks; + + public SyncTimeBarPacket(ResourceLocation dimension, long ticksLeft, long maxTicks) { + this.dimension = dimension; + this.ticksLeft = ticksLeft; + this.maxTicks = maxTicks; + } + + public SyncTimeBarPacket(FriendlyByteBuf buffer) { + this.dimension = buffer.readResourceLocation(); + this.ticksLeft = buffer.readVarLong(); + this.maxTicks = buffer.readVarLong(); + } + + public void encode(FriendlyByteBuf buffer) { + buffer.writeResourceLocation(dimension); + buffer.writeVarLong(ticksLeft); + buffer.writeVarLong(maxTicks); + } + + public void execute(IPayloadContext context) { + CosmicHudGuiOverlay.setTimeBar(dimension, ticksLeft, maxTicks); + } + + @Override + public @NotNull Type type() { + return TYPE; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/CosmicConditions.java b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/CosmicConditions.java new file mode 100644 index 000000000..3e4de2610 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/CosmicConditions.java @@ -0,0 +1,12 @@ +package com.ghostipedia.cosmiccore.common.recipe.condition; + +public class CosmicConditions { + + public static void register() { + TitanCondition.register(); + LinkedPartnerCondition.register(); + LinkedPartnerDimensionCondition.register(); + LinkedPartnerDimensionItemCondition.register(); + LinkedPartnerDimensionFluidCondition.register(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerCondition.java b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerCondition.java new file mode 100644 index 000000000..c4790177d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerCondition.java @@ -0,0 +1,119 @@ +package com.ghostipedia.cosmiccore.common.recipe.condition; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.multiblock.LinkedWorkableElectricMultiblockMachine; + +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.api.registry.GTRegistries; + +import net.minecraft.network.chat.Component; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import org.jetbrains.annotations.NotNull; + +/** + * Recipe condition that requires the machine to have linked partners. + *

+ * Can be configured to require: + * - A minimum number of linked partners + * - At least one partner to be formed (structure valid) + * - At least one partner to be actively working (running a recipe) + */ +public class LinkedPartnerCondition extends RecipeCondition { + + /** Minimum number of linked partners required */ + public int minPartners; + /** If true, at least one partner must have a valid structure */ + public boolean requireFormed; + /** If true, at least one partner must be actively running a recipe */ + public boolean requireWorking; + + public static final MapCodec CODEC = RecordCodecBuilder + .mapCodec(instance -> RecipeCondition.isReverse(instance) + .and(Codec.INT.optionalFieldOf("min_partners", 1).forGetter(val -> val.minPartners)) + .and(Codec.BOOL.optionalFieldOf("require_formed", false).forGetter(val -> val.requireFormed)) + .and(Codec.BOOL.optionalFieldOf("require_working", false).forGetter(val -> val.requireWorking)) + .apply(instance, LinkedPartnerCondition::new)); + + public static RecipeConditionType TYPE; + + public LinkedPartnerCondition(boolean isReverse, int minPartners, boolean requireFormed, boolean requireWorking) { + this.isReverse = isReverse; + this.minPartners = minPartners; + this.requireFormed = requireFormed; + this.requireWorking = requireWorking; + } + + public LinkedPartnerCondition(int minPartners, boolean requireFormed, boolean requireWorking) { + this(false, minPartners, requireFormed, requireWorking); + } + + public LinkedPartnerCondition(int minPartners) { + this(false, minPartners, false, false); + } + + public LinkedPartnerCondition() { + this(1); + } + + public static void register() { + TYPE = GTRegistries.register(GTRegistries.RECIPE_CONDITIONS, + CosmicCore.id("linked_partner"), + new RecipeConditionType<>(LinkedPartnerCondition::new, LinkedPartnerCondition.CODEC)); + } + + @Override + public RecipeConditionType getType() { + return TYPE; + } + + @Override + public Component getTooltips() { + if (requireWorking) { + return Component.translatable("cosmiccore.recipe.condition.linked_partner.working", minPartners); + } else if (requireFormed) { + return Component.translatable("cosmiccore.recipe.condition.linked_partner.formed", minPartners); + } else { + return Component.translatable("cosmiccore.recipe.condition.linked_partner.tooltip", minPartners); + } + } + + @Override + protected boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { + if (!(recipeLogic.getMachine() instanceof LinkedWorkableElectricMultiblockMachine linkedMachine)) { + return false; + } + + // Check minimum partner count + int partnerCount = linkedMachine.getLinkedPartners().size(); + if (partnerCount < minPartners) { + return false; + } + + // Check if any partner needs to be formed + if (requireFormed) { + if (linkedMachine.countFormedPartners() < 1) { + return false; + } + } + + // Check if any partner needs to be working + if (requireWorking) { + if (!linkedMachine.anyPartnerWorking()) { + return false; + } + } + + return true; + } + + @Override + public LinkedPartnerCondition createTemplate() { + return new LinkedPartnerCondition(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerDimensionCondition.java b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerDimensionCondition.java new file mode 100644 index 000000000..b1e49e885 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerDimensionCondition.java @@ -0,0 +1,94 @@ +package com.ghostipedia.cosmiccore.common.recipe.condition; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.multiblock.LinkedWorkableElectricMultiblockMachine; + +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.api.registry.GTRegistries; + +import net.minecraft.core.GlobalPos; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import org.jetbrains.annotations.NotNull; + +/** + * Recipe condition that requires a linked partner to be in a specific dimension. + *

+ * Use cases: + * - "Requires partner in Sun Orbit" for solar plasma collection + * - "Requires partner in The Deep Below" for mining operations + * - "Requires partner in Moon" for low-gravity processing + */ +public class LinkedPartnerDimensionCondition extends RecipeCondition { + + /** The dimension the partner must be in */ + public ResourceLocation dimension; + + public static final MapCodec CODEC = RecordCodecBuilder + .mapCodec(instance -> RecipeCondition.isReverse(instance) + .and(ResourceLocation.CODEC.fieldOf("dimension").forGetter(val -> val.dimension)) + .apply(instance, LinkedPartnerDimensionCondition::new)); + + public static RecipeConditionType TYPE; + + public LinkedPartnerDimensionCondition(boolean isReverse, ResourceLocation dimension) { + this.isReverse = isReverse; + this.dimension = dimension; + } + + public LinkedPartnerDimensionCondition(ResourceLocation dimension) { + this(false, dimension); + } + + public LinkedPartnerDimensionCondition(String dimension) { + this(false, ResourceLocation.parse(dimension)); + } + + public LinkedPartnerDimensionCondition() { + this.dimension = ResourceLocation.parse("minecraft:overworld"); + } + + public static void register() { + TYPE = GTRegistries.register(GTRegistries.RECIPE_CONDITIONS, + CosmicCore.id("linked_partner_dimension"), + new RecipeConditionType<>(LinkedPartnerDimensionCondition::new, LinkedPartnerDimensionCondition.CODEC)); + } + + @Override + public RecipeConditionType getType() { + return TYPE; + } + + @Override + public Component getTooltips() { + return Component.translatable("cosmiccore.recipe.condition.linked_partner_dimension.tooltip", + dimension.toString()); + } + + @Override + protected boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { + if (!(recipeLogic.getMachine() instanceof LinkedWorkableElectricMultiblockMachine linkedMachine)) { + return false; + } + + // Check if any linked partner is in the required dimension + for (GlobalPos partner : linkedMachine.getLinkedPartners()) { + if (partner.dimension().location().equals(dimension)) { + return true; + } + } + + return false; + } + + @Override + public LinkedPartnerDimensionCondition createTemplate() { + return new LinkedPartnerDimensionCondition(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerDimensionFluidCondition.java b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerDimensionFluidCondition.java new file mode 100644 index 000000000..a422421d6 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerDimensionFluidCondition.java @@ -0,0 +1,139 @@ +package com.ghostipedia.cosmiccore.common.recipe.condition; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.multiblock.LinkedWorkableElectricMultiblockMachine; +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper; + +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.api.registry.GTRegistries; + +import net.minecraft.core.GlobalPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.material.Fluid; +import net.neoforged.neoforge.fluids.FluidStack; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +/** + * Recipe condition that requires a linked partner in a specific dimension + * to have a specific fluid in its input hatches. + *

+ * Use cases: + * - "Requires partner in Sun Orbit with Solar Plasma" + * - "Requires partner in Deep Below with Molten Core fluid" + */ +public class LinkedPartnerDimensionFluidCondition extends RecipeCondition { + + public ResourceLocation dimension; + public ResourceLocation fluidId; + public int minAmount; + + public static final MapCodec CODEC = RecordCodecBuilder + .mapCodec(instance -> RecipeCondition.isReverse(instance) + .and(ResourceLocation.CODEC.fieldOf("dimension").forGetter(val -> val.dimension)) + .and(ResourceLocation.CODEC.fieldOf("fluid").forGetter(val -> val.fluidId)) + .and(Codec.INT.optionalFieldOf("amount", 1000).forGetter(val -> val.minAmount)) + .apply(instance, LinkedPartnerDimensionFluidCondition::new)); + + public static RecipeConditionType TYPE; + + public LinkedPartnerDimensionFluidCondition(boolean isReverse, ResourceLocation dimension, ResourceLocation fluidId, + int minAmount) { + this.isReverse = isReverse; + this.dimension = dimension; + this.fluidId = fluidId; + this.minAmount = minAmount; + } + + public LinkedPartnerDimensionFluidCondition(ResourceLocation dimension, ResourceLocation fluidId, int minAmount) { + this(false, dimension, fluidId, minAmount); + } + + public LinkedPartnerDimensionFluidCondition(String dimension, Fluid fluid, int minAmount) { + this(false, ResourceLocation.parse(dimension), BuiltInRegistries.FLUID.getKey(fluid), minAmount); + } + + public LinkedPartnerDimensionFluidCondition(String dimension, Fluid fluid) { + this(dimension, fluid, 1000); + } + + public LinkedPartnerDimensionFluidCondition() { + this.dimension = ResourceLocation.parse("minecraft:overworld"); + this.fluidId = ResourceLocation.parse("minecraft:water"); + this.minAmount = 1000; + } + + public static void register() { + TYPE = GTRegistries.register(GTRegistries.RECIPE_CONDITIONS, + CosmicCore.id("linked_partner_dimension_fluid"), + new RecipeConditionType<>(LinkedPartnerDimensionFluidCondition::new, + LinkedPartnerDimensionFluidCondition.CODEC)); + } + + @Override + public RecipeConditionType getType() { + return TYPE; + } + + @Override + public Component getTooltips() { + Fluid fluid = BuiltInRegistries.FLUID.get(fluidId); + String fluidName = new FluidStack(fluid, 1000).getDisplayName().getString(); + return Component.translatable("cosmiccore.recipe.condition.linked_partner_dimension_fluid.tooltip", + minAmount, fluidName, dimension.toString()); + } + + @Override + protected boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { + if (!(recipeLogic.getMachine() instanceof LinkedWorkableElectricMultiblockMachine linkedMachine)) { + return false; + } + + if (!(linkedMachine.getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + + UUID owner = linkedMachine.getTeamUUID(); + if (owner == null) return false; + + GlobalPos myPos = linkedMachine.getGlobalPos(); + Fluid targetFluid = BuiltInRegistries.FLUID.get(fluidId); + + // Check each partner in the required dimension + for (GlobalPos partner : linkedMachine.getLinkedPartners()) { + if (!partner.dimension().location().equals(dimension)) { + continue; + } + + // Check if this partner has the required fluid + boolean hasFluid = LinkedMultiblockHelper.partnerHasFluid( + serverLevel.getServer(), + owner, + myPos, + partner, + (FluidStack stack) -> stack.getFluid().isSame(targetFluid) && stack.getAmount() >= minAmount); + + if (hasFluid) { + return true; + } + } + + return false; + } + + @Override + public LinkedPartnerDimensionFluidCondition createTemplate() { + return new LinkedPartnerDimensionFluidCondition(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerDimensionItemCondition.java b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerDimensionItemCondition.java new file mode 100644 index 000000000..aeb9b531a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/LinkedPartnerDimensionItemCondition.java @@ -0,0 +1,139 @@ +package com.ghostipedia.cosmiccore.common.recipe.condition; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.machine.multiblock.LinkedWorkableElectricMultiblockMachine; +import com.ghostipedia.cosmiccore.common.machine.multiblock.LinkedMultiblockHelper; + +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.api.registry.GTRegistries; + +import net.minecraft.core.GlobalPos; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import org.jetbrains.annotations.NotNull; + +import java.util.UUID; + +/** + * Recipe condition that requires a linked partner in a specific dimension + * to have a specific item in its input hatches. + *

+ * Use cases: + * - "Requires partner in Sun Orbit with Solar Collector item" + * - "Requires partner in Moon with Helium-3 canister" + */ +public class LinkedPartnerDimensionItemCondition extends RecipeCondition { + + public ResourceLocation dimension; + public ResourceLocation itemId; + public int minCount; + + public static final MapCodec CODEC = RecordCodecBuilder + .mapCodec(instance -> RecipeCondition.isReverse(instance) + .and(ResourceLocation.CODEC.fieldOf("dimension").forGetter(val -> val.dimension)) + .and(ResourceLocation.CODEC.fieldOf("item").forGetter(val -> val.itemId)) + .and(Codec.INT.optionalFieldOf("count", 1).forGetter(val -> val.minCount)) + .apply(instance, LinkedPartnerDimensionItemCondition::new)); + + public static RecipeConditionType TYPE; + + public LinkedPartnerDimensionItemCondition(boolean isReverse, ResourceLocation dimension, ResourceLocation itemId, + int minCount) { + this.isReverse = isReverse; + this.dimension = dimension; + this.itemId = itemId; + this.minCount = minCount; + } + + public LinkedPartnerDimensionItemCondition(ResourceLocation dimension, ResourceLocation itemId, int minCount) { + this(false, dimension, itemId, minCount); + } + + public LinkedPartnerDimensionItemCondition(String dimension, Item item, int minCount) { + this(false, ResourceLocation.parse(dimension), BuiltInRegistries.ITEM.getKey(item), minCount); + } + + public LinkedPartnerDimensionItemCondition(String dimension, Item item) { + this(dimension, item, 1); + } + + public LinkedPartnerDimensionItemCondition() { + this.dimension = ResourceLocation.parse("minecraft:overworld"); + this.itemId = ResourceLocation.parse("minecraft:stone"); + this.minCount = 1; + } + + public static void register() { + TYPE = GTRegistries.register(GTRegistries.RECIPE_CONDITIONS, + CosmicCore.id("linked_partner_dimension_item"), + new RecipeConditionType<>(LinkedPartnerDimensionItemCondition::new, + LinkedPartnerDimensionItemCondition.CODEC)); + } + + @Override + public RecipeConditionType getType() { + return TYPE; + } + + @Override + public Component getTooltips() { + Item item = BuiltInRegistries.ITEM.get(itemId); + String itemName = item.getDescription().getString(); + return Component.translatable("cosmiccore.recipe.condition.linked_partner_dimension_item.tooltip", + minCount, itemName, dimension.toString()); + } + + @Override + protected boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { + if (!(recipeLogic.getMachine() instanceof LinkedWorkableElectricMultiblockMachine linkedMachine)) { + return false; + } + + if (!(linkedMachine.getLevel() instanceof ServerLevel serverLevel)) { + return false; + } + + UUID owner = linkedMachine.getTeamUUID(); + if (owner == null) return false; + + GlobalPos myPos = linkedMachine.getGlobalPos(); + Item targetItem = BuiltInRegistries.ITEM.get(itemId); + + // Check each partner in the required dimension + for (GlobalPos partner : linkedMachine.getLinkedPartners()) { + if (!partner.dimension().location().equals(dimension)) { + continue; + } + + // Check if this partner has the required item + boolean hasItem = LinkedMultiblockHelper.partnerHasItem( + serverLevel.getServer(), + owner, + myPos, + partner, + (ItemStack stack) -> stack.is(targetItem) && stack.getCount() >= minCount); + + if (hasItem) { + return true; + } + } + + return false; + } + + @Override + public LinkedPartnerDimensionItemCondition createTemplate() { + return new LinkedPartnerDimensionItemCondition(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/TitanCondition.java b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/TitanCondition.java new file mode 100644 index 000000000..c9aadc614 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/recipe/condition/TitanCondition.java @@ -0,0 +1,68 @@ +package com.ghostipedia.cosmiccore.common.recipe.condition; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.TitanFusionReactorMachine; + +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.recipe.RecipeCondition; +import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; +import com.gregtechceu.gtceu.api.registry.GTRegistries; + +import net.minecraft.network.chat.Component; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import org.jetbrains.annotations.NotNull; + +public class TitanCondition extends RecipeCondition { + + public int tier; + + public static final MapCodec CODEC = RecordCodecBuilder + .mapCodec(instance -> RecipeCondition.isReverse(instance) + .and(Codec.INT.fieldOf("titan_tier").forGetter(val -> val.tier)) + .apply(instance, TitanCondition::new)); + + public static RecipeConditionType TYPE; + + public TitanCondition(boolean isReverse, int tier) { + this.isReverse = isReverse; + this.tier = tier; + } + + public TitanCondition(int tier) { + this(false, tier); + } + + public TitanCondition() { + this.tier = 0; + } + + public static void register() { + TYPE = GTRegistries.register(GTRegistries.RECIPE_CONDITIONS, CosmicCore.id("titan_condition"), + new RecipeConditionType<>(TitanCondition::new, TitanCondition.CODEC)); + } + + @Override + public RecipeConditionType getType() { + return TYPE; + } + + @Override + public Component getTooltips() { + return Component.translatable("cosmiccore.recipe.condition.titan.tooltip", tier); + } + + @Override + protected boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { + if (!(recipeLogic.getMachine() instanceof TitanFusionReactorMachine titanReactor)) return false; + return titanReactor.getReactorTier() >= tier; + } + + @Override + public TitanCondition createTemplate() { + return new TitanCondition(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/AffinityHelper.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/AffinityHelper.java new file mode 100644 index 000000000..8034593d5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/AffinityHelper.java @@ -0,0 +1,84 @@ +package com.ghostipedia.cosmiccore.common.reflection; + +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainCategory; +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulShape; + +import net.minecraft.world.entity.player.Player; + +/** + * Helper for applying Soul Shape affinity multipliers to bargain effects. + */ +public final class AffinityHelper { + + private AffinityHelper() {} + + /** + * Get the affinity multiplier for a player's bargain effect. + * + * @param player the player + * @param bargain the bargain being used + * @return 1.5 if empowered, 0.5 if cursed, 1.0 if neutral + */ + public static float getMultiplier(Player player, Bargain bargain) { + return getMultiplier(player, bargain.getCategory()); + } + + /** + * Get the affinity multiplier for a player and category. + * + * @param player the player + * @param category the bargain category + * @return 1.5 if empowered, 0.5 if cursed, 1.0 if neutral + */ + public static float getMultiplier(Player player, BargainCategory category) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.getSoulShape().getAffinityMultiplier(category)) + .orElse(1.0f); + } + + /** + * Check if a player's soul shape empowers a category. + */ + public static boolean isEmpowered(Player player, BargainCategory category) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.getSoulShape().empowers(category)) + .orElse(false); + } + + /** + * Check if a player's soul shape curses a category. + */ + public static boolean isCursed(Player player, BargainCategory category) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.getSoulShape().curses(category)) + .orElse(false); + } + + /** + * Get the player's soul shape. + */ + public static SoulShape getSoulShape(Player player) { + return ReflectionCapability.get(player) + .map(IReflection::getSoulShape) + .orElse(SoulShape.UNSHAPED); + } + + /** + * Apply affinity multiplier to a value. + * + * @param value base value + * @param multiplier the affinity multiplier + * @return modified value + */ + public static float apply(float value, float multiplier) { + return value * multiplier; + } + + /** + * Apply affinity multiplier to an int value (rounded). + */ + public static int apply(int value, float multiplier) { + return Math.round(value * multiplier); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/IReflection.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/IReflection.java new file mode 100644 index 000000000..7dec04267 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/IReflection.java @@ -0,0 +1,307 @@ +package com.ghostipedia.cosmiccore.common.reflection; + +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulShape; + +import net.minecraft.resources.ResourceLocation; + +import java.util.Map; +import java.util.Set; + +/** + * Interface for the Reflection capability - tracks player soul erosion and bargains. + * The Reflection is YOU - a fragment of self that remembers what you were before immortality. + */ +public interface IReflection { + + // ---- Shards (Currency) ---- + + /** + * @return current shard balance (Shards of Perpetuity consumed via right-click) + */ + int getShardBalance(); + + /** + * Sets shard balance. + */ + void setShardBalance(int shards); + + /** + * Adds shards to balance. + */ + void addShards(int amount); + + /** + * Attempts to spend shards. Returns true if successful. + */ + boolean spendShards(int amount); + + // ---- Soul Capacity ---- + + /** + * @return base soul capacity (default 100, can be expanded) + */ + int getBaseCapacity(); + + /** + * Sets base capacity (for permanent expansions). + */ + void setBaseCapacity(int capacity); + + /** + * @return bonus capacity from gear/temporary effects + */ + int getBonusCapacity(); + + /** + * Sets bonus capacity (from curios, armor, etc.). + */ + void setBonusCapacity(int bonus); + + /** + * @return total capacity (base + bonus) + */ + default int getTotalCapacity() { + return getBaseCapacity() + getBonusCapacity(); + } + + /** + * @return current weight used by active bargains + */ + int getUsedCapacity(); + + /** + * @return remaining capacity available + */ + default int getRemainingCapacity() { + return getTotalCapacity() - getUsedCapacity(); + } + + /** + * Check if a bargain can fit within current capacity. + */ + default boolean canFitBargain(int weight) { + return getRemainingCapacity() >= weight; + } + + // ---- Erosion ---- + + /** + * @return total erosion accumulated (1 death = 1 erosion, bargains add more) + */ + int getErosion(); + + /** + * Sets total erosion value. + */ + void setErosion(int erosion); + + /** + * Adds erosion. Use for deaths, bargains, power usage. + */ + void addErosion(int amount); + + /** + * @return total number of deaths tracked + */ + int getDeathCount(); + + /** + * Increment death counter and add 1 erosion. + */ + void recordDeath(); + + // ---- Bargains ---- + + /** + * @return set of bargain IDs the player has accepted + */ + Set getActiveBargains(); + + /** + * @return true if player has this bargain active + */ + boolean hasBargain(ResourceLocation bargainId); + + /** + * Accept a bargain. Does NOT add erosion - caller should handle cost. + */ + void acceptBargain(ResourceLocation bargainId); + + /** + * Defy (remove) a bargain. The scar remains tracked separately. + */ + void defy(ResourceLocation bargainId); + + /** + * @return set of bargain IDs that have been defied (scars) + */ + Set getDefianceScars(); + + /** + * @return true if this bargain was defied (scarred) + */ + boolean hasDefianceScar(ResourceLocation bargainId); + + /** + * Remove a defiance scar, allowing the bargain to be accepted again. + * Used by Clusters of Perpetuity. + */ + void removeScar(ResourceLocation bargainId); + + // ---- Threshold Tracking ---- + + /** + * @return the highest threshold index the player has seen (0-9) + */ + int getHighestThresholdSeen(); + + /** + * Mark a threshold as seen. + */ + void setHighestThresholdSeen(int threshold); + + // ---- First Encounter ---- + + /** + * @return true if the reflection has awakened (first deaths occurred) + */ + boolean hasAwakened(); + + /** + * Mark the reflection as awakened. + */ + void setAwakened(boolean awakened); + + /** + * @return true if the awakening sequence (first bargain offer) has been shown + */ + boolean hasCompletedAwakeningSequence(); + + /** + * Mark the awakening sequence as completed. + */ + void setAwakeningSequenceCompleted(boolean completed); + + // ---- Command Usage Tracking ---- + + /** + * Get recent usage count for a command (for cost escalation). + * + * @param commandId the command identifier (e.g., "home", "back") + * @return number of uses in the current escalation window + */ + int getCommandUsageCount(String commandId); + + /** + * Record a command use. + */ + void recordCommandUse(String commandId); + + /** + * Reset command usage (called when cooldown expires). + */ + void resetCommandUsage(String commandId); + + /** + * @return timestamp of last command use for cooldown tracking + */ + long getLastCommandUseTime(String commandId); + + // ---- Void Save Tracking ---- + + /** + * @return number of times void resistance has saved this player + */ + int getVoidSaveCount(); + + /** + * Increment void save count. + */ + void incrementVoidSaveCount(); + + /** + * Reset void save count (on bargain acceptance/defiance). + */ + void resetVoidSaveCount(); + + // ---- Memory / Context ---- + + /** + * Store arbitrary data for whisper/dialogue context. + * Examples: death causes, dimensions visited, etc. + */ + Map getMemory(); + + /** + * Increment a memory counter. + */ + void rememberEvent(String eventKey); + + /** + * Get count for a specific memory. + */ + int getMemoryCount(String eventKey); + + // ---- Soul Shape ---- + + /** + * @return the current soul shape (UNSHAPED if not yet mutilated) + */ + SoulShape getSoulShape(); + + /** + * Set the soul shape. This is a significant, permanent choice. + */ + void setSoulShape(SoulShape shape); + + /** + * @return true if the soul has been shaped (not UNSHAPED) + */ + default boolean hasSoulShape() { + return getSoulShape().isShaped(); + } + + // ---- Soul Super ---- + + /** + * @return game time when the super ability last started its cooldown + */ + long getSuperCooldownStart(); + + /** + * Set the super cooldown start time. + */ + void setSuperCooldownStart(long gameTime); + + /** + * @return remaining ticks until super is ready, or 0 if ready + */ + default long getSuperCooldownRemaining(long currentGameTime, int cooldownTicks) { + long elapsed = currentGameTime - getSuperCooldownStart(); + return Math.max(0, cooldownTicks - elapsed); + } + + /** + * @return true if super ability is off cooldown + */ + default boolean isSuperReady(long currentGameTime, int cooldownTicks) { + return getSuperCooldownRemaining(currentGameTime, cooldownTicks) <= 0; + } + + /** + * @return game time when the super effect ends, or 0 if not active + */ + long getSuperActiveUntil(); + + /** + * Set when the super effect ends. + */ + void setSuperActiveUntil(long gameTime); + + /** + * @return true if super effect is currently active + */ + default boolean isSuperActive(long currentGameTime) { + return getSuperActiveUntil() > currentGameTime; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionCapability.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionCapability.java new file mode 100644 index 000000000..eba3b3c6d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionCapability.java @@ -0,0 +1,24 @@ +package com.ghostipedia.cosmiccore.common.reflection; + +import com.ghostipedia.cosmiccore.common.data.CosmicAttachmentTypes; + +import net.minecraft.world.entity.player.Player; + +import java.util.Optional; + +/** + * Accessors for the Reflection system. Player reflection data lives in a NeoForge data + * attachment that persists across death and dimension changes, so it is always present. + */ +public class ReflectionCapability { + + private ReflectionCapability() {} + + public static Optional get(Player player) { + return Optional.of(player.getData(CosmicAttachmentTypes.REFLECTION)); + } + + public static IReflection getOrThrow(Player player) { + return player.getData(CosmicAttachmentTypes.REFLECTION); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionCommand.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionCommand.java new file mode 100644 index 000000000..c7f915cfb --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionCommand.java @@ -0,0 +1,353 @@ +package com.ghostipedia.cosmiccore.common.reflection; + +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainRegistry; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.QuakeMovementBargain; +import com.ghostipedia.cosmiccore.common.reflection.network.SyncQuakeMovementPacket; +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulShape; +import com.ghostipedia.cosmiccore.common.reflection.ui.VoidUIPackets; + +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; + +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.brigadier.arguments.StringArgumentType; + +/** + * Debug/test commands for the Reflection system. + * /reflection status - Show current erosion, deaths, bargains + * /reflection add_erosion - Add erosion + * /reflection accept - Accept a bargain + * /reflection defy - Defy a bargain + * /reflection awaken - Force awakening + * /reflection reset - Reset all reflection data + */ +public class ReflectionCommand { + + public static void register(CommandDispatcher dispatcher) { + dispatcher.register( + Commands.literal("reflection") + .requires(source -> source.hasPermission(2)) // Op level 2 + .then(Commands.literal("status") + .executes(ctx -> showStatus(ctx.getSource()))) + .then(Commands.literal("add_erosion") + .then(Commands.argument("amount", IntegerArgumentType.integer(1, 1000)) + .executes(ctx -> addErosion(ctx.getSource(), + IntegerArgumentType.getInteger(ctx, "amount"))))) + .then(Commands.literal("accept") + .then(Commands.argument("bargain", StringArgumentType.string()) + .executes(ctx -> acceptBargain(ctx.getSource(), + StringArgumentType.getString(ctx, "bargain"))))) + .then(Commands.literal("defy") + .then(Commands.argument("bargain", StringArgumentType.string()) + .executes(ctx -> defyBargain(ctx.getSource(), + StringArgumentType.getString(ctx, "bargain"))))) + .then(Commands.literal("awaken") + .executes(ctx -> forceAwaken(ctx.getSource()))) + .then(Commands.literal("reset") + .executes(ctx -> resetData(ctx.getSource()))) + .then(Commands.literal("list_bargains") + .executes(ctx -> listBargains(ctx.getSource()))) + .then(Commands.literal("mirror") + .executes(ctx -> openMirror(ctx.getSource())) + .then(Commands.argument("bargain", StringArgumentType.string()) + .executes(ctx -> openMirrorWithBargain(ctx.getSource(), + StringArgumentType.getString(ctx, "bargain"))))) + .then(Commands.literal("soulshape") + .then(Commands.literal("set") + .then(Commands.argument("shape", StringArgumentType.string()) + .executes(ctx -> setSoulShape(ctx.getSource(), + StringArgumentType.getString(ctx, "shape"))))) + .then(Commands.literal("reset") + .executes(ctx -> resetSoulShape(ctx.getSource()))))); + } + + private static int showStatus(CommandSourceStack source) { + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendFailure(Component.literal("Must be run by a player")); + return 0; + } + + ReflectionCapability.get(player).ifPresentOrElse(reflection -> { + source.sendSuccess(() -> Component.literal("=== Reflection Status ==="), false); + source.sendSuccess(() -> Component.literal("Erosion: " + reflection.getErosion()), false); + source.sendSuccess(() -> Component.literal("Deaths: " + reflection.getDeathCount()), false); + source.sendSuccess(() -> Component.literal("Awakened: " + reflection.hasAwakened()), false); + source.sendSuccess(() -> Component.literal("Threshold: " + reflection.getHighestThresholdSeen() + + " (current: " + ReflectionConstants.getThresholdIndex(reflection.getErosion()) + ")"), false); + source.sendSuccess( + () -> Component + .literal("Color Tier: " + ReflectionConstants.getSoulColorTier(reflection.getErosion())), + false); + SoulShape shape = reflection.getSoulShape(); + source.sendSuccess(() -> Component.literal("Soul Shape: ").append(shape.getFormattedName()), false); + + source.sendSuccess(() -> Component.literal("Active Bargains:"), false); + if (reflection.getActiveBargains().isEmpty()) { + source.sendSuccess(() -> Component.literal(" (none)"), false); + } else { + for (ResourceLocation id : reflection.getActiveBargains()) { + source.sendSuccess(() -> Component.literal(" - " + id), false); + } + } + + if (!reflection.getDefianceScars().isEmpty()) { + source.sendSuccess(() -> Component.literal("Defiance Scars:"), false); + for (ResourceLocation id : reflection.getDefianceScars()) { + source.sendSuccess(() -> Component.literal(" - " + id), false); + } + } + + // Command usage info + source.sendSuccess(() -> Component.literal("Command Costs:"), false); + int homeCost = ReflectionConstants.getCommandCost(reflection, "home"); + int backCost = ReflectionConstants.getCommandCost(reflection, "back"); + int homeUsage = reflection.getCommandUsageCount("home"); + int backUsage = reflection.getCommandUsageCount("back"); + source.sendSuccess(() -> Component.literal(" /home: " + homeCost + " erosion (used " + homeUsage + "x)"), + false); + source.sendSuccess(() -> Component.literal(" /back: " + backCost + " erosion (used " + backUsage + "x)"), + false); + }, () -> source.sendFailure(Component.literal("No reflection data found"))); + + return 1; + } + + private static int addErosion(CommandSourceStack source, int amount) { + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendFailure(Component.literal("Must be run by a player")); + return 0; + } + + ReflectionCapability.get(player).ifPresentOrElse(reflection -> { + int oldErosion = reflection.getErosion(); + reflection.addErosion(amount); + int newErosion = reflection.getErosion(); + + source.sendSuccess(() -> Component.literal("Added " + amount + " erosion. Total: " + newErosion), false); + + if (ReflectionConstants.crossedNewThreshold(oldErosion, newErosion)) { + int threshold = ReflectionConstants.getThresholdIndex(newErosion); + source.sendSuccess(() -> Component.literal("Crossed threshold " + threshold + "!"), false); + } + }, () -> source.sendFailure(Component.literal("No reflection data found"))); + + return 1; + } + + private static int acceptBargain(CommandSourceStack source, String bargainId) { + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendFailure(Component.literal("Must be run by a player")); + return 0; + } + + ResourceLocation id = ResourceLocation.fromNamespaceAndPath("cosmiccore", bargainId); + + return BargainRegistry.get(id).map(bargain -> { + ReflectionCapability.get(player).ifPresentOrElse(reflection -> { + if (reflection.hasBargain(id)) { + source.sendFailure(Component.literal("Already have this bargain")); + return; + } + + // Calculate and apply cost + int cost = BargainRegistry.calculateCost(player, bargain); + reflection.addErosion(cost); + reflection.acceptBargain(id); + + // Call the bargain's accept handler + bargain.onAccept(player, bargain.getAnswers().get(0)); // Use first answer for testing + + // Sync to client if this is the quake movement bargain + if (id.equals(QuakeMovementBargain.INSTANCE.getId())) { + CCoreNetwork.sendToPlayer(player, new SyncQuakeMovementPacket(true)); + } + + source.sendSuccess(() -> Component.literal("Accepted bargain: " + bargain.getName().getString() + + " (cost: " + cost + " erosion)"), false); + }, () -> source.sendFailure(Component.literal("No reflection data found"))); + return 1; + }).orElseGet(() -> { + source.sendFailure(Component.literal("Unknown bargain: " + id)); + return 0; + }); + } + + private static int defyBargain(CommandSourceStack source, String bargainId) { + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendFailure(Component.literal("Must be run by a player")); + return 0; + } + + ResourceLocation id = ResourceLocation.fromNamespaceAndPath("cosmiccore", bargainId); + + return BargainRegistry.get(id).map(bargain -> { + ReflectionCapability.get(player).ifPresentOrElse(reflection -> { + if (!reflection.hasBargain(id)) { + source.sendFailure(Component.literal("Don't have this bargain")); + return; + } + + // Calculate and apply defiance cost + int cost = BargainRegistry.calculateDefianceCost(player, bargain); + reflection.addErosion(cost); + reflection.defy(id); + + // Call the bargain's defy handler + bargain.onDefy(player); + + // Sync to client if this is the quake movement bargain + if (id.equals(QuakeMovementBargain.INSTANCE.getId())) { + CCoreNetwork.sendToPlayer(player, new SyncQuakeMovementPacket(false)); + } + + source.sendSuccess(() -> Component.literal("Defied bargain: " + bargain.getName().getString() + + " (cost: " + cost + " erosion, debuff remains)"), false); + }, () -> source.sendFailure(Component.literal("No reflection data found"))); + return 1; + }).orElseGet(() -> { + source.sendFailure(Component.literal("Unknown bargain: " + id)); + return 0; + }); + } + + private static int forceAwaken(CommandSourceStack source) { + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendFailure(Component.literal("Must be run by a player")); + return 0; + } + + ReflectionCapability.get(player).ifPresentOrElse(reflection -> { + reflection.setAwakened(true); + source.sendSuccess(() -> Component.literal("Reflection awakened."), false); + }, () -> source.sendFailure(Component.literal("No reflection data found"))); + + return 1; + } + + private static int resetData(CommandSourceStack source) { + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendFailure(Component.literal("Must be run by a player")); + return 0; + } + + ReflectionCapability.get(player).ifPresentOrElse(reflection -> { + // Reset by loading empty data + if (reflection instanceof ReflectionData data) { + data.loadTag(new net.minecraft.nbt.CompoundTag()); + } + + // Sync all bargain states to client (all should now be false) + CCoreNetwork.sendToPlayer(player, new SyncQuakeMovementPacket(false)); + // Add more bargain syncs here as they're implemented + + source.sendSuccess(() -> Component.literal("Reflection data reset."), false); + }, () -> source.sendFailure(Component.literal("No reflection data found"))); + + return 1; + } + + private static int listBargains(CommandSourceStack source) { + source.sendSuccess(() -> Component.literal("=== Available Bargains ==="), false); + + var allBargains = BargainRegistry.getAll(); + source.sendSuccess(() -> Component.literal("Total registered: " + allBargains.size()), false); + + for (Bargain bargain : allBargains) { + // Capture in final variable for lambda + final Bargain b = bargain; + source.sendSuccess(() -> Component.literal("- " + b.getId().getPath() + + " (" + b.getName().getString() + ") [" + b.getTier().name() + "]"), false); + } + + return 1; + } + + private static int openMirror(CommandSourceStack source) { + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendFailure(Component.literal("Must be run by a player")); + return 0; + } + + // Force awaken if not already + ReflectionCapability.get(player).ifPresent(reflection -> { + if (!reflection.hasAwakened()) { + reflection.setAwakened(true); + } + }); + + VoidUIPackets.sendOpenVoidScreen(player); + return 1; + } + + private static int openMirrorWithBargain(CommandSourceStack source, String bargainId) { + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendFailure(Component.literal("Must be run by a player")); + return 0; + } + + ResourceLocation id = ResourceLocation.fromNamespaceAndPath("cosmiccore", bargainId); + + return BargainRegistry.get(id).map(bargain -> { + // Force awaken if not already + ReflectionCapability.get(player).ifPresent(reflection -> { + if (!reflection.hasAwakened()) { + reflection.setAwakened(true); + } + }); + + VoidUIPackets.sendOpenVoidScreen(player, id); + source.sendSuccess(() -> Component.literal("Opened mirror with bargain: " + bargain.getName().getString()), + false); + return 1; + }).orElseGet(() -> { + source.sendFailure(Component.literal("Unknown bargain: " + id)); + return 0; + }); + } + + private static int setSoulShape(CommandSourceStack source, String shapeId) { + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendFailure(Component.literal("Must be run by a player")); + return 0; + } + + SoulShape shape = SoulShape.fromId(shapeId); + ReflectionCapability.get(player).ifPresentOrElse(reflection -> { + reflection.setSoulShape(shape); + source.sendSuccess(() -> Component.literal("Soul shape set to: ") + .append(shape.getFormattedName()), false); + }, () -> source.sendFailure(Component.literal("No reflection data found"))); + + return 1; + } + + private static int resetSoulShape(CommandSourceStack source) { + ServerPlayer player = source.getPlayer(); + if (player == null) { + source.sendFailure(Component.literal("Must be run by a player")); + return 0; + } + + ReflectionCapability.get(player).ifPresentOrElse(reflection -> { + reflection.setSoulShape(SoulShape.UNSHAPED); + source.sendSuccess(() -> Component.literal("Soul shape reset to Unshaped."), false); + }, () -> source.sendFailure(Component.literal("No reflection data found"))); + + return 1; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionCommands.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionCommands.java new file mode 100644 index 000000000..9360362a9 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionCommands.java @@ -0,0 +1,63 @@ +package com.ghostipedia.cosmiccore.common.reflection; + +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.BackBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.HomeBargain; + +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.commands.Commands; +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; + +import com.mojang.brigadier.CommandDispatcher; + +/** + * Registers the /home and /back commands that are unlocked via Reflection bargains. + */ +public class ReflectionCommands { + + public static void register(CommandDispatcher dispatcher) { + // /home command - teleport to spawn/bed + dispatcher.register( + Commands.literal("home") + .executes(ctx -> { + ServerPlayer player = ctx.getSource().getPlayer(); + if (player == null) return 0; + + // Check if they have the bargain + boolean hasBargain = ReflectionCapability.get(player) + .map(r -> r.hasBargain(HomeBargain.INSTANCE.getId())) + .orElse(false); + + if (!hasBargain) { + player.displayClientMessage( + Component.literal("§7§o*You haven't bargained for this power.*"), + false); + return 0; + } + + return HomeBargain.executeHome(player) ? 1 : 0; + })); + + // /back command - return to last death location + dispatcher.register( + Commands.literal("back") + .executes(ctx -> { + ServerPlayer player = ctx.getSource().getPlayer(); + if (player == null) return 0; + + // Check if they have the bargain + boolean hasBargain = ReflectionCapability.get(player) + .map(r -> r.hasBargain(BackBargain.INSTANCE.getId())) + .orElse(false); + + if (!hasBargain) { + player.displayClientMessage( + Component.literal("§7§o*You haven't bargained for this power.*"), + false); + return 0; + } + + return BackBargain.executeBack(player) ? 1 : 0; + })); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionConstants.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionConstants.java new file mode 100644 index 000000000..72769cb4f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionConstants.java @@ -0,0 +1,146 @@ +package com.ghostipedia.cosmiccore.common.reflection; + +/** + * Constants for the Reflection system - erosion thresholds, costs, etc. + */ +public final class ReflectionConstants { + + private ReflectionConstants() {} + + // ---- Erosion Thresholds ---- + // These trigger mandatory reflection encounters + + public static final int[] THRESHOLDS = { + 25, // Threshold 0: Curious - "You're starting to show wear." + 50, // Threshold 1: Observational - "We've died enough to notice now." + 100, // Threshold 2: Familiar - "This is becoming routine, isn't it?" + 200, // Threshold 3: Ambiguous - "You're changing faster than I expected." + 350, // Threshold 4: Philosophical - "Do you remember what we looked like before?" + 500, // Threshold 5: Heavy - "Halfway to... something." + 666, // Threshold 6: Ominous - Silence. Just stares. + 800, // Threshold 7: Unsettling - "I'm having trouble telling us apart." + 900, // Threshold 8: Quiet - "Almost there. Thank you for looking." + 1000 // Threshold 9: Unknown - "We're just... this now." + }; + + /** + * Get the threshold index for a given erosion value. + * Returns -1 if below first threshold. + */ + public static int getThresholdIndex(int erosion) { + for (int i = THRESHOLDS.length - 1; i >= 0; i--) { + if (erosion >= THRESHOLDS[i]) { + return i; + } + } + return -1; + } + + /** + * Check if a new threshold was crossed. + */ + public static boolean crossedNewThreshold(int oldErosion, int newErosion) { + return getThresholdIndex(newErosion) > getThresholdIndex(oldErosion); + } + + // ---- Bargain Cost Scaling ---- + // Bargains cost more at higher corruption + + public static final int[][] BARGAIN_COST_RANGES = { + { 0, 100, 25, 50 }, // 0-100 erosion: costs 25-50 + { 101, 300, 75, 150 }, // 101-300 erosion: costs 75-150 + { 301, 500, 150, 250 }, // 301-500 erosion: costs 150-250 + { 501, 750, 250, 400 }, // 501-750 erosion: costs 250-400 + { 751, Integer.MAX_VALUE, 400, 600 } // 751+: costs 400-600 + }; + + /** + * Get the base cost range for a bargain at the given erosion level. + * Returns [minCost, maxCost] + */ + public static int[] getBargainCostRange(int currentErosion) { + for (int[] range : BARGAIN_COST_RANGES) { + if (currentErosion >= range[0] && currentErosion <= range[1]) { + return new int[] { range[2], range[3] }; + } + } + // Fallback to highest tier + return new int[] { 400, 600 }; + } + + // ---- Command Cost Escalation ---- + // /home and /back costs double with repeated use + + public static final int HOME_BASE_COST = 1; + public static final int BACK_BASE_COST = 2; + public static final int HOME_COST_CEILING = 16; + public static final int BACK_COST_CEILING = 32; + public static final int HOME_UNLOCK_COST = 12; + public static final int BACK_UNLOCK_COST = 12; + + /** Cooldown before command usage count resets (15 minutes in milliseconds) */ + public static final long COMMAND_USAGE_RESET_TIME = 15 * 60 * 1000L; + + /** + * Calculate command cost based on usage count. + * Cost doubles each use until ceiling. + */ + public static int calculateCommandCost(int baseCost, int ceiling, int usageCount) { + if (usageCount <= 0) return baseCost; + int cost = baseCost * (1 << usageCount); // baseCost * 2^usageCount + return Math.min(cost, ceiling); + } + + /** + * Get the current cost for a command bargain, accounting for usage escalation. + */ + public static int getCommandCost(IReflection reflection, String command) { + int usageCount = reflection.getCommandUsageCount(command); + + return switch (command) { + case "home" -> calculateCommandCost(HOME_BASE_COST, HOME_COST_CEILING, usageCount); + case "back" -> calculateCommandCost(BACK_BASE_COST, BACK_COST_CEILING, usageCount); + default -> 1; + }; + } + + // ---- Soul Color Ranges ---- + // For visualization + + public static final int[][] SOUL_COLOR_RANGES = { + { 0, 50 }, // Pale white/silver + { 51, 150 }, // Faint blue tint + { 151, 300 }, // Deep blue/purple + { 301, 500 }, // Violet/crimson threads + { 501, 750 }, // Dark red/black veins + { 751, 1000 }, // Mostly black, faint glow + { 1001, Integer.MAX_VALUE } // Void-like, inverted + }; + + /** + * Get the soul color tier (0-6) for visualization. + */ + public static int getSoulColorTier(int erosion) { + for (int i = 0; i < SOUL_COLOR_RANGES.length; i++) { + if (erosion >= SOUL_COLOR_RANGES[i][0] && erosion <= SOUL_COLOR_RANGES[i][1]) { + return i; + } + } + return SOUL_COLOR_RANGES.length - 1; + } + + // ---- Defiance Costs ---- + + /** Multiplier for defiance erosion spike (applied to original bargain cost) */ + public static final float DEFIANCE_COST_MULTIPLIER = 2.5f; + + // ---- Awakening ---- + + /** Number of deaths before the reflection awakens */ + public static final int DEATHS_TO_AWAKEN = 3; + + // ---- Blink Power ---- + + /** Erosion cost per blink use */ + public static final float BLINK_EROSION_PER_USE = 0.5f; +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionData.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionData.java new file mode 100644 index 000000000..74c205b28 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionData.java @@ -0,0 +1,426 @@ +package com.ghostipedia.cosmiccore.common.reflection; + +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulShape; + +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.StringTag; +import net.minecraft.nbt.Tag; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.neoforge.common.util.INBTSerializable; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Implementation of IReflection - stores all soul/erosion/bargain data for a player. + */ +public class ReflectionData implements IReflection, INBTSerializable { + + // Currency and capacity + private int shardBalance = 0; + private int baseCapacity = 100; + private int bonusCapacity = 0; + + // Erosion and death tracking + private int erosion = 0; + private int deathCount = 0; + private int highestThresholdSeen = -1; + private boolean awakened = false; + private boolean awakeningSequenceCompleted = false; + + private final Set activeBargains = new HashSet<>(); + private final Set defianceScars = new HashSet<>(); + private final Map commandUsageCount = new HashMap<>(); + private final Map commandLastUseTime = new HashMap<>(); + private final Map memory = new HashMap<>(); + + // Void resistance tracking + private int voidSaveCount = 0; + + // Soul Shape + private SoulShape soulShape = SoulShape.UNSHAPED; + + // Soul Super state + private long superCooldownStart = 0; + private long superActiveUntil = 0; + + // ---- Shards (Currency) ---- + + @Override + public int getShardBalance() { + return shardBalance; + } + + @Override + public void setShardBalance(int shards) { + this.shardBalance = Math.max(0, shards); + } + + @Override + public void addShards(int amount) { + this.shardBalance = Math.max(0, this.shardBalance + amount); + } + + @Override + public boolean spendShards(int amount) { + if (shardBalance >= amount) { + shardBalance -= amount; + return true; + } + return false; + } + + // ---- Soul Capacity ---- + + @Override + public int getBaseCapacity() { + return baseCapacity; + } + + @Override + public void setBaseCapacity(int capacity) { + this.baseCapacity = Math.max(0, capacity); + } + + @Override + public int getBonusCapacity() { + return bonusCapacity; + } + + @Override + public void setBonusCapacity(int bonus) { + this.bonusCapacity = Math.max(0, bonus); + } + + @Override + public int getUsedCapacity() { + // Calculate weight from all active bargains + int totalWeight = 0; + for (ResourceLocation bargainId : activeBargains) { + var bargainOpt = com.ghostipedia.cosmiccore.common.reflection.bargain.BargainRegistry.get(bargainId); + if (bargainOpt.isPresent()) { + totalWeight += bargainOpt.get().getWeight(); + } + } + return totalWeight; + } + + // ---- Erosion ---- + + @Override + public int getErosion() { + return erosion; + } + + @Override + public void setErosion(int erosion) { + this.erosion = Math.max(0, erosion); + } + + @Override + public void addErosion(int amount) { + this.erosion = Math.max(0, this.erosion + amount); + } + + @Override + public int getDeathCount() { + return deathCount; + } + + @Override + public void recordDeath() { + deathCount++; + addErosion(1); + } + + // ---- Bargains ---- + + @Override + public Set getActiveBargains() { + return new HashSet<>(activeBargains); + } + + @Override + public boolean hasBargain(ResourceLocation bargainId) { + return activeBargains.contains(bargainId); + } + + @Override + public void acceptBargain(ResourceLocation bargainId) { + activeBargains.add(bargainId); + } + + @Override + public void defy(ResourceLocation bargainId) { + if (activeBargains.remove(bargainId)) { + defianceScars.add(bargainId); + } + } + + @Override + public Set getDefianceScars() { + return new HashSet<>(defianceScars); + } + + @Override + public boolean hasDefianceScar(ResourceLocation bargainId) { + return defianceScars.contains(bargainId); + } + + @Override + public void removeScar(ResourceLocation bargainId) { + defianceScars.remove(bargainId); + } + + // ---- Threshold Tracking ---- + + @Override + public int getHighestThresholdSeen() { + return highestThresholdSeen; + } + + @Override + public void setHighestThresholdSeen(int threshold) { + this.highestThresholdSeen = Math.max(this.highestThresholdSeen, threshold); + } + + // ---- First Encounter ---- + + @Override + public boolean hasAwakened() { + return awakened; + } + + @Override + public void setAwakened(boolean awakened) { + this.awakened = awakened; + } + + @Override + public boolean hasCompletedAwakeningSequence() { + return awakeningSequenceCompleted; + } + + @Override + public void setAwakeningSequenceCompleted(boolean completed) { + this.awakeningSequenceCompleted = completed; + } + + // ---- Command Usage Tracking ---- + + @Override + public int getCommandUsageCount(String commandId) { + return commandUsageCount.getOrDefault(commandId, 0); + } + + @Override + public void recordCommandUse(String commandId) { + commandUsageCount.merge(commandId, 1, Integer::sum); + commandLastUseTime.put(commandId, System.currentTimeMillis()); + } + + @Override + public void resetCommandUsage(String commandId) { + commandUsageCount.remove(commandId); + } + + @Override + public long getLastCommandUseTime(String commandId) { + return commandLastUseTime.getOrDefault(commandId, 0L); + } + + // ---- Void Save Tracking ---- + + @Override + public int getVoidSaveCount() { + return voidSaveCount; + } + + @Override + public void incrementVoidSaveCount() { + voidSaveCount++; + } + + @Override + public void resetVoidSaveCount() { + voidSaveCount = 0; + } + + // ---- Memory / Context ---- + + @Override + public Map getMemory() { + return new HashMap<>(memory); + } + + @Override + public void rememberEvent(String eventKey) { + memory.merge(eventKey, 1, Integer::sum); + } + + @Override + public int getMemoryCount(String eventKey) { + return memory.getOrDefault(eventKey, 0); + } + + // ---- Soul Shape ---- + + @Override + public SoulShape getSoulShape() { + return soulShape; + } + + @Override + public void setSoulShape(SoulShape shape) { + this.soulShape = shape != null ? shape : SoulShape.UNSHAPED; + } + + // ---- Soul Super ---- + + @Override + public long getSuperCooldownStart() { + return superCooldownStart; + } + + @Override + public void setSuperCooldownStart(long gameTime) { + this.superCooldownStart = gameTime; + } + + @Override + public long getSuperActiveUntil() { + return superActiveUntil; + } + + @Override + public void setSuperActiveUntil(long gameTime) { + this.superActiveUntil = gameTime; + } + + // ---- NBT Persistence ---- + + public CompoundTag saveTag() { + CompoundTag root = new CompoundTag(); + + // Currency and capacity + root.putInt("shardBalance", shardBalance); + root.putInt("baseCapacity", baseCapacity); + root.putInt("bonusCapacity", bonusCapacity); + + // Core stats + root.putInt("erosion", erosion); + root.putInt("deathCount", deathCount); + root.putInt("highestThresholdSeen", highestThresholdSeen); + root.putBoolean("awakened", awakened); + root.putBoolean("awakeningSequenceCompleted", awakeningSequenceCompleted); + root.putInt("voidSaveCount", voidSaveCount); + root.putString("soulShape", soulShape.getId()); + root.putLong("superCooldownStart", superCooldownStart); + root.putLong("superActiveUntil", superActiveUntil); + + // Active bargains + ListTag bargainList = new ListTag(); + for (ResourceLocation bargain : activeBargains) { + bargainList.add(StringTag.valueOf(bargain.toString())); + } + root.put("activeBargains", bargainList); + + // Defiance scars + ListTag scarList = new ListTag(); + for (ResourceLocation scar : defianceScars) { + scarList.add(StringTag.valueOf(scar.toString())); + } + root.put("defianceScars", scarList); + + // Command usage + CompoundTag cmdUsage = new CompoundTag(); + for (Map.Entry entry : commandUsageCount.entrySet()) { + cmdUsage.putInt(entry.getKey(), entry.getValue()); + } + root.put("commandUsageCount", cmdUsage); + + CompoundTag cmdTime = new CompoundTag(); + for (Map.Entry entry : commandLastUseTime.entrySet()) { + cmdTime.putLong(entry.getKey(), entry.getValue()); + } + root.put("commandLastUseTime", cmdTime); + + // Memory + CompoundTag memoryTag = new CompoundTag(); + for (Map.Entry entry : memory.entrySet()) { + memoryTag.putInt(entry.getKey(), entry.getValue()); + } + root.put("memory", memoryTag); + + return root; + } + + @Override + public CompoundTag serializeNBT(HolderLookup.Provider provider) { + CompoundTag tag = saveTag(); + return tag != null ? tag : new CompoundTag(); + } + + @Override + public void deserializeNBT(HolderLookup.Provider provider, CompoundTag nbt) { + if (nbt != null) { + loadTag(nbt); + } + } + + public void loadTag(CompoundTag root) { + // Currency and capacity (with defaults for backwards compatibility) + shardBalance = root.getInt("shardBalance"); + baseCapacity = root.contains("baseCapacity") ? root.getInt("baseCapacity") : 100; + bonusCapacity = root.getInt("bonusCapacity"); + + // Core stats + erosion = root.getInt("erosion"); + deathCount = root.getInt("deathCount"); + highestThresholdSeen = root.getInt("highestThresholdSeen"); + awakened = root.getBoolean("awakened"); + awakeningSequenceCompleted = root.getBoolean("awakeningSequenceCompleted"); + voidSaveCount = root.getInt("voidSaveCount"); + soulShape = root.contains("soulShape") ? SoulShape.fromId(root.getString("soulShape")) : SoulShape.UNSHAPED; + superCooldownStart = root.getLong("superCooldownStart"); + superActiveUntil = root.getLong("superActiveUntil"); + + // Active bargains + activeBargains.clear(); + ListTag bargainList = root.getList("activeBargains", Tag.TAG_STRING); + for (Tag tag : bargainList) { + activeBargains.add(ResourceLocation.parse(tag.getAsString())); + } + + // Defiance scars + defianceScars.clear(); + ListTag scarList = root.getList("defianceScars", Tag.TAG_STRING); + for (Tag tag : scarList) { + defianceScars.add(ResourceLocation.parse(tag.getAsString())); + } + + // Command usage + commandUsageCount.clear(); + CompoundTag cmdUsage = root.getCompound("commandUsageCount"); + for (String key : cmdUsage.getAllKeys()) { + commandUsageCount.put(key, cmdUsage.getInt(key)); + } + + commandLastUseTime.clear(); + CompoundTag cmdTime = root.getCompound("commandLastUseTime"); + for (String key : cmdTime.getAllKeys()) { + commandLastUseTime.put(key, cmdTime.getLong(key)); + } + + // Memory + memory.clear(); + CompoundTag memoryTag = root.getCompound("memory"); + for (String key : memoryTag.getAllKeys()) { + memory.put(key, memoryTag.getInt(key)); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionEventHandler.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionEventHandler.java new file mode 100644 index 000000000..dd4b7bdf2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionEventHandler.java @@ -0,0 +1,291 @@ +package com.ghostipedia.cosmiccore.common.reflection; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainRegistry; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.*; +import com.ghostipedia.cosmiccore.common.reflection.network.SyncQuakeMovementPacket; +import com.ghostipedia.cosmiccore.common.reflection.ui.VoidUIPackets; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.neoforged.neoforge.event.entity.living.LivingDeathEvent; +import net.neoforged.neoforge.event.entity.living.LivingIncomingDamageEvent; +import net.neoforged.neoforge.event.entity.living.LivingHealEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; +import net.neoforged.neoforge.event.tick.PlayerTickEvent; +import net.neoforged.bus.api.EventPriority; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +@EventBusSubscriber(modid = CosmicCore.MOD_ID) +public class ReflectionEventHandler { + + private static final Map pendingRespawnEvents = new HashMap<>(); + + private enum RespawnEventType { + TUTORIAL_BARGAIN, + THRESHOLD, + CONTEXTUAL_BARGAIN + } + + private record RespawnEvent(RespawnEventType type, ResourceLocation bargainId, int data) { + + static RespawnEvent tutorialBargain(ResourceLocation bargainId) { + return new RespawnEvent(RespawnEventType.TUTORIAL_BARGAIN, bargainId, 0); + } + + static RespawnEvent threshold(int index) { + return new RespawnEvent(RespawnEventType.THRESHOLD, null, index); + } + + static RespawnEvent contextualBargain(ResourceLocation bargainId) { + return new RespawnEvent(RespawnEventType.CONTEXTUAL_BARGAIN, bargainId, 0); + } + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public static void onPlayerDeath(LivingDeathEvent event) { + if (!(event.getEntity() instanceof ServerPlayer player)) return; + + BackBargain.recordDeath(player); + + ReflectionCapability.get(player).ifPresent(reflection -> { + int oldErosion = reflection.getErosion(); + + reflection.recordDeath(); + int deathCount = reflection.getDeathCount(); + + String deathCause = categorizeDeathCause(event.getSource().getMsgId()); + reflection.rememberEvent("death." + deathCause); + reflection.rememberEvent("death.total"); + + // Tutorial deaths (1-3) offer specific bargains + ResourceLocation tutorialBargain = getTutorialBargain(deathCount, reflection); + if (tutorialBargain != null) { + pendingRespawnEvents.put(player.getUUID(), RespawnEvent.tutorialBargain(tutorialBargain)); + CosmicCore.LOGGER.info("Queued tutorial bargain {} for {} (death #{})", + tutorialBargain, player.getName().getString(), deathCount); + } else { + // Normal bargain flow after tutorial + int newErosion = reflection.getErosion(); + if (ReflectionConstants.crossedNewThreshold(oldErosion, newErosion)) { + int newThreshold = ReflectionConstants.getThresholdIndex(newErosion); + if (newThreshold > reflection.getHighestThresholdSeen()) { + pendingRespawnEvents.put(player.getUUID(), RespawnEvent.threshold(newThreshold)); + } + } + } + + CosmicCore.LOGGER.debug("Player {} died. Deaths: {}, Erosion: {}", + player.getName().getString(), reflection.getDeathCount(), reflection.getErosion()); + }); + } + + private static ResourceLocation getTutorialBargain(int deathCount, IReflection reflection) { + return switch (deathCount) { + case 1 -> { + if (!reflection.hasBargain(QuakeMovementBargain.INSTANCE.getId())) { + yield QuakeMovementBargain.INSTANCE.getId(); + } + yield null; + } + case 2 -> { + if (!reflection.hasBargain(BackBargain.INSTANCE.getId())) { + yield BackBargain.INSTANCE.getId(); + } + yield null; + } + case 3 -> { + if (!reflection.hasBargain(HomeBargain.INSTANCE.getId())) { + yield HomeBargain.INSTANCE.getId(); + } + yield null; + } + default -> null; + }; + } + + @SubscribeEvent + public static void onPlayerRespawn(PlayerEvent.PlayerRespawnEvent event) { + if (!(event.getEntity() instanceof ServerPlayer player)) return; + + ReflectionCapability.get(player).ifPresent(reflection -> { + reapplyBargainEffects(player, reflection); + syncBargainStates(player, reflection); + + RespawnEvent pendingEvent = pendingRespawnEvents.remove(player.getUUID()); + if (pendingEvent != null) { + player.getServer().execute(() -> processRespawnEvent(player, reflection, pendingEvent)); + } + }); + } + + private static void processRespawnEvent(ServerPlayer player, IReflection reflection, RespawnEvent event) { + switch (event.type()) { + case TUTORIAL_BARGAIN -> { + CosmicCore.LOGGER.info("Offering tutorial bargain {} to {}", + event.bargainId(), player.getName().getString()); + VoidUIPackets.sendOpenVoidScreen(player, event.bargainId()); + } + case THRESHOLD -> { + int thresholdIndex = event.data(); + CosmicCore.LOGGER.info("Triggering threshold {} encounter for {}", + thresholdIndex, player.getName().getString()); + VoidUIPackets.sendThresholdEncounter(player, thresholdIndex); + reflection.setHighestThresholdSeen(thresholdIndex); + } + case CONTEXTUAL_BARGAIN -> { + if (event.bargainId() != null && !reflection.hasBargain(event.bargainId())) { + CosmicCore.LOGGER.info("Offering contextual bargain {} to {}", + event.bargainId(), player.getName().getString()); + VoidUIPackets.sendOpenVoidScreen(player, event.bargainId()); + } + } + } + } + + @SubscribeEvent + public static void onPlayerTick(PlayerTickEvent.Post event) { + if (!(event.getEntity() instanceof ServerPlayer player)) return; + + for (Bargain bargain : BargainRegistry.getActive(player)) { + bargain.tick(player); + } + + ReflectionCapability.get(player).ifPresent(reflection -> { + long now = System.currentTimeMillis(); + + for (String cmd : new String[] { "home", "back" }) { + long lastUse = reflection.getLastCommandUseTime(cmd); + if (lastUse > 0 && (now - lastUse) > ReflectionConstants.COMMAND_USAGE_RESET_TIME) { + reflection.resetCommandUsage(cmd); + } + } + }); + } + + @SubscribeEvent + public static void onPlayerLogin(PlayerEvent.PlayerLoggedInEvent event) { + if (!(event.getEntity() instanceof ServerPlayer player)) return; + + ReflectionCapability.get(player).ifPresent(reflection -> { + if (!reflection.hasAwakened()) { + reflection.setAwakened(true); + } + + CosmicCore.LOGGER.debug("Player {} logged in. Erosion: {}, Deaths: {}", + player.getName().getString(), + reflection.getErosion(), + reflection.getDeathCount()); + + reapplyBargainEffects(player, reflection); + syncBargainStates(player, reflection); + }); + } + + private static void reapplyBargainEffects(ServerPlayer player, IReflection reflection) { + if (reflection.hasBargain(SwiftnessBargain.ID)) { + SwiftnessBargain.applySpeedBoost(player); + } + if (reflection.hasBargain(StepAssistBargain.ID)) { + StepAssistBargain.applyStepAssist(player); + } + if (reflection.hasBargain(HealthBargain.ID)) { + HealthBargain.applyHealthBoost(player); + } + if (reflection.hasBargain(StrengthBargain.ID)) { + StrengthBargain.applyStrengthBoost(player); + } + if (reflection.hasBargain(ReachBargain.ID)) { + ReachBargain.applyReachBoost(player); + } + if (reflection.hasBargain(ArmorBargain.ID)) { + ArmorBargain.applyArmorBoost(player); + ArmorBargain.applySpeedPenalty(player); + } + } + + private static void syncBargainStates(ServerPlayer player, IReflection reflection) { + boolean hasQuake = reflection.hasBargain(QuakeMovementBargain.INSTANCE.getId()); + CCoreNetwork.sendToPlayer(player, new SyncQuakeMovementPacket(hasQuake)); + } + + @SubscribeEvent + public static void onLivingDamage(LivingIncomingDamageEvent event) { + if (!(event.getEntity() instanceof ServerPlayer player)) return; + + float damage = event.getAmount(); + + // FallImmunityBargain: 80% fall damage reduction + if (FallImmunityBargain.isFallDamage(event.getSource())) { + damage = FallImmunityBargain.modifyFallDamage(player, damage); + } + + // FallImmunityBargain: 50% more damage from combat + if (FallImmunityBargain.isCombatDamage(event.getSource())) { + damage = FallImmunityBargain.modifyCombatDamage(player, damage); + } + + // StrengthBargain: 25% more damage from mobs + if (StrengthBargain.isMobDamage(event.getSource())) { + damage = StrengthBargain.modifyMobDamage(player, damage); + } + + // FireImmunityBargain: 75% less fire damage, 2x freeze damage + if (FireImmunityBargain.isFireDamage(event.getSource())) { + damage = FireImmunityBargain.modifyFireDamage(player, damage); + } + if (FireImmunityBargain.isColdDamage(event.getSource())) { + damage = FireImmunityBargain.modifyColdDamage(player, damage); + } + + event.setAmount(damage); + } + + @SubscribeEvent + public static void onLivingHeal(LivingHealEvent event) { + if (!(event.getEntity() instanceof ServerPlayer player)) return; + + float healing = event.getAmount(); + + // HealthBargain: 50% less healing from potions + healing = HealthBargain.modifyHealing(player, healing); + + // HungerBargain: Block natural regeneration (food-based healing) + // Natural regen gives 1 HP when food >= 18 and saturation > 0 + // We detect this by checking if it's a small heal amount and player is well-fed + if (HungerBargain.shouldBlockNaturalRegen(player)) { + if (healing <= 1.0f && player.getFoodData().getFoodLevel() >= 18) { + event.setCanceled(true); + return; + } + } + + event.setAmount(healing); + } + + private static String categorizeDeathCause(String msgId) { + if (msgId == null) return "unknown"; + + if (msgId.contains("fall") || msgId.contains("stalagmite")) return "fall"; + if (msgId.contains("fire") || msgId.contains("lava") || msgId.contains("burn") || + msgId.contains("inFire") || msgId.contains("onFire")) + return "fire"; + if (msgId.contains("drown") || msgId.contains("suffocate") || msgId.contains("inWall")) return "suffocation"; + if (msgId.contains("void") || msgId.contains("outOfWorld")) return "void"; + if (msgId.contains("freeze") || msgId.contains("cold")) return "freeze"; + if (msgId.contains("starve")) return "starve"; + if (msgId.contains("mob") || msgId.contains("player") || msgId.contains("arrow") || + msgId.contains("thrown") || msgId.contains("explosion")) + return "combat"; + if (msgId.contains("magic") || msgId.contains("wither") || msgId.contains("indirectMagic")) return "magic"; + + return "other"; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionLang.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionLang.java new file mode 100644 index 000000000..6e94cd4c5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ReflectionLang.java @@ -0,0 +1,308 @@ +package com.ghostipedia.cosmiccore.common.reflection; + +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; + +/** + * Translation key helper for the Reflection system. + * All translatable strings should go through this class. + * + * Key structure: + * - reflection.cosmiccore.bargain.[id].name - Bargain display name + * - reflection.cosmiccore.bargain.[id].description - Bargain description + * - reflection.cosmiccore.bargain.[id].dialogue.[n] - Offer dialogue lines + * - reflection.cosmiccore.bargain.[id].question - The philosophical question + * - reflection.cosmiccore.bargain.[id].answer.[answerId].text - Answer button text + * - reflection.cosmiccore.bargain.[id].answer.[answerId].response - Reflection's response + * - reflection.cosmiccore.bargain.[id].answer.[answerId].power.[n] - Power description lines + * - reflection.cosmiccore.bargain.[id].answer.[answerId].drawback.[n] - Drawback description lines + * - reflection.cosmiccore.bargain.[id].accept.[n] - Post-accept dialogue + * - reflection.cosmiccore.bargain.[id].refuse.[n] - Refuse dialogue + * - reflection.cosmiccore.bargain.[id].defy - Message when defying + * - reflection.cosmiccore.bargain.[id].visual - Soul visual description + * + * - reflection.cosmiccore.threshold.[n].dialogue.[m] - Threshold dialogue lines + * - reflection.cosmiccore.threshold.[n].question - Threshold question + * - reflection.cosmiccore.threshold.[n].response - Acknowledge response + * + * - reflection.cosmiccore.ui.[key] - UI strings + */ +public class ReflectionLang { + + private static final String PREFIX = "reflection.cosmiccore."; + + // ========================================================================= + // Bargain Keys + // ========================================================================= + + public static MutableComponent bargainName(String bargainId) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".name"); + } + + public static MutableComponent bargainDescription(String bargainId) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".description"); + } + + public static MutableComponent bargainDialogue(String bargainId, int index) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".dialogue." + index); + } + + public static MutableComponent bargainQuestion(String bargainId) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".question"); + } + + public static MutableComponent answerText(String bargainId, String answerId) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".answer." + answerId + ".text"); + } + + public static MutableComponent answerResponse(String bargainId, String answerId) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".answer." + answerId + ".response"); + } + + public static MutableComponent answerPower(String bargainId, String answerId, int index) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".answer." + answerId + ".power." + index); + } + + public static MutableComponent answerDrawback(String bargainId, String answerId, int index) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".answer." + answerId + ".drawback." + index); + } + + public static MutableComponent bargainAccept(String bargainId, int index) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".accept." + index); + } + + public static MutableComponent bargainRefuse(String bargainId, int index) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".refuse." + index); + } + + public static MutableComponent bargainOnAccept(String bargainId) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".on_accept"); + } + + public static MutableComponent bargainOnDefy(String bargainId) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".on_defy"); + } + + public static MutableComponent bargainSuffocation(String bargainId) { + return Component.translatable(PREFIX + "bargain." + bargainId + ".suffocation"); + } + + // ========================================================================= + // Threshold Encounter Keys + // ========================================================================= + + public static MutableComponent thresholdDialogue(int thresholdIndex, int lineIndex) { + return Component.translatable(PREFIX + "threshold." + thresholdIndex + ".dialogue." + lineIndex); + } + + public static MutableComponent thresholdQuestion(int thresholdIndex) { + return Component.translatable(PREFIX + "threshold." + thresholdIndex + ".question"); + } + + public static MutableComponent thresholdResponse(int thresholdIndex) { + return Component.translatable(PREFIX + "threshold." + thresholdIndex + ".response"); + } + + // ========================================================================= + // UI Keys + // ========================================================================= + + public static MutableComponent ui(String key) { + return Component.translatable(PREFIX + "ui." + key); + } + + public static MutableComponent ui(String key, Object... args) { + return Component.translatable(PREFIX + "ui." + key, args); + } + + // Common UI strings + public static MutableComponent uiYourBargains() { + return ui("your_bargains"); + } + + public static MutableComponent uiAvailableBargains() { + return ui("available_bargains"); + } + + public static MutableComponent uiDefiance() { + return ui("defiance"); + } + + public static MutableComponent uiScrollUp() { + return ui("scroll_up"); + } + + public static MutableComponent uiScrollDown() { + return ui("scroll_down"); + } + + public static MutableComponent uiSoulErosion() { + return ui("soul_erosion"); + } + + public static MutableComponent uiUnlockCost(int cost) { + return Component.translatable(PREFIX + "ui.unlock_cost", cost); + } + + public static MutableComponent uiDefianceCost(int cost) { + return Component.translatable(PREFIX + "ui.defiance_cost", cost); + } + + public static MutableComponent uiBack() { + return ui("back"); + } + + public static MutableComponent uiContinue() { + return ui("continue"); + } + + public static MutableComponent uiAcknowledge() { + return ui("acknowledge"); + } + + public static MutableComponent uiReviewBargains(int count) { + return Component.translatable(PREFIX + "ui.review_bargains", count); + } + + public static MutableComponent uiBrowseBargains(int count) { + return Component.translatable(PREFIX + "ui.browse_bargains", count); + } + + public static MutableComponent uiGazeConstellation() { + return ui("gaze_constellation"); + } + + public static MutableComponent uiJustLook() { + return ui("just_look"); + } + + public static MutableComponent uiLeave() { + return ui("leave"); + } + + public static MutableComponent uiForeverScarred() { + return ui("forever_scarred"); + } + + public static MutableComponent uiClickToBargain() { + return ui("click_to_bargain"); + } + + public static MutableComponent uiClickToDefy(int cost) { + return Component.translatable(PREFIX + "ui.click_to_defy", cost); + } + + public static MutableComponent uiPower() { + return ui("power"); + } + + public static MutableComponent uiDrawback() { + return ui("drawback"); + } + + public static MutableComponent uiCost() { + return ui("cost"); + } + + // Hub dialogue responses + public static MutableComponent hubReviewResponse() { + return ui("hub.review_response"); + } + + public static MutableComponent hubBrowseResponse() { + return ui("hub.browse_response"); + } + + public static MutableComponent hubReflectResponse() { + return ui("hub.reflect_response"); + } + + public static MutableComponent hubLeaveResponse() { + return ui("hub.leave_response"); + } + + // Defiance confirmation + public static MutableComponent defianceConfirm() { + return ui("defiance.confirm"); + } + + public static MutableComponent defianceCancel() { + return ui("defiance.cancel"); + } + + public static MutableComponent defianceWarning1(String bargainName) { + return Component.translatable(PREFIX + "ui.defiance.warning1", bargainName); + } + + public static MutableComponent defianceWarning2(int cost) { + return Component.translatable(PREFIX + "ui.defiance.warning2", cost); + } + + public static MutableComponent defianceWarning3() { + return ui("defiance.warning3"); + } + + public static MutableComponent defianceWarning4() { + return ui("defiance.warning4"); + } + + // ========================================================================= + // Reflection Dialogue (Hub mode contextual greetings) + // ========================================================================= + + public static MutableComponent hubGreeting(String key) { + return Component.translatable(PREFIX + "hub.greeting." + key); + } + + // ========================================================================= + // Key generators for lang file generation + // ========================================================================= + + public static String keyBargainName(String bargainId) { + return PREFIX + "bargain." + bargainId + ".name"; + } + + public static String keyBargainDescription(String bargainId) { + return PREFIX + "bargain." + bargainId + ".description"; + } + + public static String keyBargainDialogue(String bargainId, int index) { + return PREFIX + "bargain." + bargainId + ".dialogue." + index; + } + + public static String keyBargainQuestion(String bargainId) { + return PREFIX + "bargain." + bargainId + ".question"; + } + + public static String keyAnswerText(String bargainId, String answerId) { + return PREFIX + "bargain." + bargainId + ".answer." + answerId + ".text"; + } + + public static String keyAnswerResponse(String bargainId, String answerId) { + return PREFIX + "bargain." + bargainId + ".answer." + answerId + ".response"; + } + + public static String keyAnswerPower(String bargainId, String answerId, int index) { + return PREFIX + "bargain." + bargainId + ".answer." + answerId + ".power." + index; + } + + public static String keyAnswerDrawback(String bargainId, String answerId, int index) { + return PREFIX + "bargain." + bargainId + ".answer." + answerId + ".drawback." + index; + } + + public static String keyThresholdDialogue(int thresholdIndex, int lineIndex) { + return PREFIX + "threshold." + thresholdIndex + ".dialogue." + lineIndex; + } + + public static String keyThresholdQuestion(int thresholdIndex) { + return PREFIX + "threshold." + thresholdIndex + ".question"; + } + + public static String keyThresholdResponse(int thresholdIndex) { + return PREFIX + "threshold." + thresholdIndex + ".response"; + } + + public static String keyUi(String key) { + return PREFIX + "ui." + key; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ThresholdEncounter.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ThresholdEncounter.java new file mode 100644 index 000000000..659775a5e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ThresholdEncounter.java @@ -0,0 +1,49 @@ +package com.ghostipedia.cosmiccore.common.reflection; + +import net.minecraft.network.chat.Component; + +import java.util.ArrayList; +import java.util.List; + +/** + * Threshold encounters - mandatory reflection dialogues at erosion milestones. + * No bargain is offered - just the Reflection observing the player's degradation. + */ +public class ThresholdEncounter { + + // Number of dialogue lines per threshold (for building the list) + private static final int[] DIALOGUE_COUNTS = { 4, 4, 4, 4, 4, 4, 3, 4, 4, 4 }; + + /** + * Get the dialogue for a specific erosion threshold. + * + * @param thresholdIndex 0-9 matching ReflectionConstants.THRESHOLDS + */ + public static List getDialogue(int thresholdIndex) { + if (thresholdIndex < 0 || thresholdIndex >= DIALOGUE_COUNTS.length) { + return List.of(ReflectionLang.thresholdDialogue(0, 0)); // Fallback + } + + List dialogue = new ArrayList<>(); + int count = DIALOGUE_COUNTS[thresholdIndex]; + for (int i = 0; i < count; i++) { + dialogue.add(ReflectionLang.thresholdDialogue(thresholdIndex, i)); + } + return dialogue; + } + + /** + * Get the question/prompt for a specific threshold. + * These are rhetorical - player can only acknowledge. + */ + public static Component getQuestion(int thresholdIndex) { + return ReflectionLang.thresholdQuestion(thresholdIndex); + } + + /** + * Get the response to the player's acknowledgment. + */ + public static Component getAcknowledgeResponse(int thresholdIndex) { + return ReflectionLang.thresholdResponse(thresholdIndex); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/Bargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/Bargain.java new file mode 100644 index 000000000..11abc2de9 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/Bargain.java @@ -0,0 +1,346 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; + +import java.util.List; +import java.util.Optional; + +/** + * Base class for all bargains in the Reflection system. + * A bargain represents a deal with your reflection - power for erosion. + * + * Economy: + * - Shards of Perpetuity: Currency to accept bargains (quest-gated) + * - Weight: How much soul capacity this bargain consumes (0-100 base capacity) + * - Erosion: Consequence of accepting (accumulates, drives visuals/whispers) + */ +public abstract class Bargain { + + private final ResourceLocation id; + private final BargainTier tier; + private final BargainCategory category; + private final int shardCost; + private final int weight; + private final int erosionCost; + + protected Bargain(ResourceLocation id, BargainTier tier, BargainCategory category, int shardCost, int weight, + int erosionCost) { + this.id = id; + this.tier = tier; + this.category = category; + this.shardCost = shardCost; + this.weight = weight; + this.erosionCost = erosionCost; + } + + /** + * Legacy constructor for backwards compatibility during migration. + * + * @deprecated Use the new constructor with category, shardCost, weight, and erosionCost + */ + @Deprecated + protected Bargain(ResourceLocation id, BargainTier tier, int baseCost) { + this(id, tier, BargainCategory.UTILITY, 0, 0, baseCost); + } + + /** + * Legacy constructor without category - defaults to UTILITY. + * + * @deprecated Use the new constructor with category + */ + @Deprecated + protected Bargain(ResourceLocation id, BargainTier tier, int shardCost, int weight, int erosionCost) { + this(id, tier, BargainCategory.UTILITY, shardCost, weight, erosionCost); + } + + /** + * @return unique identifier for this bargain + */ + public ResourceLocation getId() { + return id; + } + + /** + * @return what corruption range this bargain is available in + */ + public BargainTier getTier() { + return tier; + } + + /** + * @return what category this bargain belongs to (for affinity system) + */ + public BargainCategory getCategory() { + return category; + } + + /** + * @return shard cost to accept this bargain (Shards of Perpetuity currency) + */ + public int getShardCost() { + return shardCost; + } + + /** + * @return weight against soul capacity (base 100 capacity) + */ + public int getWeight() { + return weight; + } + + /** + * @return erosion gained when accepting this bargain + */ + public int getErosionCost() { + return erosionCost; + } + + /** + * @return base erosion cost (modified by current corruption level) + * @deprecated Use getErosionCost() instead + */ + @Deprecated + public int getBaseCost() { + return erosionCost; + } + + /** + * @return the display name of this bargain + */ + public abstract Component getName(); + + /** + * @return description shown in the mirror interface + */ + public abstract Component getDescription(); + + /** + * @return the reflection's dialogue when offering this bargain + */ + public abstract List getOfferDialogue(Player player); + + /** + * @return the philosophical question posed by the reflection + */ + public abstract Component getQuestion(); + + /** + * @return possible answers to the question + */ + public abstract List getAnswers(); + + /** + * Check if this bargain can be offered to the player. + * Override for custom conditions beyond tier requirements. + */ + public boolean canOffer(Player player, int currentErosion) { + return tier.isAvailableAt(currentErosion); + } + + /** + * Check if context makes this bargain relevant (for curated offers). + * Examples: hunger bargain offered when player is starving, + * fall damage bargain offered after dying to fall damage. + */ + public boolean isContextuallyRelevant(Player player, BargainContext context) { + return true; // Override in subclasses + } + + /** + * Called when the player accepts this bargain with a specific answer. + * Apply the power/effects here. + */ + public abstract void onAccept(Player player, BargainAnswer answer); + + /** + * Called when the player defies (removes) this bargain. + * Remove the power but NOT the debuff (scar). + */ + public abstract void onDefy(Player player); + + /** + * Called every tick while this bargain is active. + * Override for passive effects, erosion-per-use, etc. + */ + public void tick(Player player) { + // Default: no tick behavior + } + + /** + * @return the soul visual transformation for this bargain + */ + public abstract BargainVisual getSoulVisual(); + + /** + * @return display name for UI purposes + */ + public Component getDisplayName() { + return getName(); + } + + /** + * @return power description lines for tooltips/hub + */ + public List getPowerDescriptions() { + // Default: derive from description + return List.of(Component.literal("\u00A7a" + getDescription().getString())); + } + + /** + * @return drawback description lines for tooltips/hub + */ + public List getDrawbackDescriptions() { + // Default: generic drawback showing all costs + List drawbacks = new java.util.ArrayList<>(); + if (shardCost > 0) { + drawbacks.add(Component.literal("\u00A7b" + shardCost + " shards")); + } + if (weight > 0) { + drawbacks.add(Component.literal("\u00A7d" + weight + " weight")); + } + if (erosionCost > 0) { + drawbacks.add(Component.literal("\u00A7c+" + erosionCost + " erosion")); + } + return drawbacks.isEmpty() ? List.of(Component.literal("\u00A7aFree")) : drawbacks; + } + + /** + * @return dialogue the reflection says after accepting + */ + public List getAcceptDialogue(Player player, BargainAnswer answer) { + return List.of(Component.literal("Something shifted.")); + } + + /** + * @return dialogue shown if the player refuses + */ + public List getRefuseDialogue(Player player) { + return List.of(Component.literal("The thread settles back.")); + } + + /** + * Tiers determine when bargains become available. + */ + public enum BargainTier { + + /** Available at low corruption (0-100). Early game traps. */ + EARLY(0, 100), + /** Available at low-mid corruption (0-300). */ + EARLY_MID(0, 300), + /** Only available at mid corruption (100-500). */ + MID(100, 500), + /** Only available at high corruption (300-750). */ + LATE(300, 750), + /** Only available at very high corruption (500+). The dangerous stuff. */ + EXTREME(500, Integer.MAX_VALUE), + /** Always available, cost scales. */ + ANY(0, Integer.MAX_VALUE); + + private final int minErosion; + private final int maxErosion; + + BargainTier(int minErosion, int maxErosion) { + this.minErosion = minErosion; + this.maxErosion = maxErosion; + } + + public boolean isAvailableAt(int erosion) { + return erosion >= minErosion && erosion <= maxErosion; + } + + public int getMinErosion() { + return minErosion; + } + + public int getMaxErosion() { + return maxErosion; + } + } + + /** + * Represents an answer choice in a bargain dialogue. + */ + public record BargainAnswer( + String id, + Component text, + Optional reflectionResponse, + boolean grantsFullPower, + float costModifier, + List powerDescription, + List drawbacks) { + + public BargainAnswer(String id, Component text) { + this(id, text, Optional.empty(), true, 1.0f, List.of(), List.of()); + } + + public BargainAnswer(String id, Component text, Component response) { + this(id, text, Optional.of(response), true, 1.0f, List.of(), List.of()); + } + + public BargainAnswer withCostModifier(float modifier) { + return new BargainAnswer(id, text, reflectionResponse, grantsFullPower, modifier, powerDescription, + drawbacks); + } + + public BargainAnswer withReducedPower() { + return new BargainAnswer(id, text, reflectionResponse, false, costModifier, powerDescription, drawbacks); + } + + /** + * Add power description lines that show on hover. + */ + public BargainAnswer withPower(Component... powers) { + return new BargainAnswer(id, text, reflectionResponse, grantsFullPower, costModifier, List.of(powers), + drawbacks); + } + + /** + * Add drawback/curse description lines that show on hover. + */ + public BargainAnswer withDrawbacks(Component... curses) { + return new BargainAnswer(id, text, reflectionResponse, grantsFullPower, costModifier, powerDescription, + List.of(curses)); + } + + /** + * Add both power and drawback descriptions. + */ + public BargainAnswer withDetails(List powers, List curses) { + return new BargainAnswer(id, text, reflectionResponse, grantsFullPower, costModifier, powers, curses); + } + } + + /** + * Visual transformation data for the soul portrait. + */ + public record BargainVisual( + String visualType, + String description) { + + public static BargainVisual of(String type, String desc) { + return new BargainVisual(type, desc); + } + } + + /** + * Context for determining if a bargain is relevant to offer. + */ + public record BargainContext( + Optional lastDeathCause, + Optional currentDimension, + boolean isLowHealth, + boolean isHungry, + boolean isSuffocating, + boolean isBurning, + boolean isFreezing) { + + public static BargainContext empty() { + return new BargainContext( + Optional.empty(), + Optional.empty(), + false, false, false, false, false); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/BargainCategory.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/BargainCategory.java new file mode 100644 index 000000000..a61fcc34e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/BargainCategory.java @@ -0,0 +1,52 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; + +/** + * Categories for bargains - used by Soul Shape affinity system. + * Each Soul Shape empowers certain categories and curses others. + */ +public enum BargainCategory { + + MOBILITY("mobility", ChatFormatting.AQUA), + DEFENSE("defense", ChatFormatting.GRAY), + OFFENSE("offense", ChatFormatting.RED), + UTILITY("utility", ChatFormatting.YELLOW), + SUSTENANCE("sustenance", ChatFormatting.GREEN), + DEATH("death", ChatFormatting.DARK_RED); + + private final String id; + private final ChatFormatting color; + + BargainCategory(String id, ChatFormatting color) { + this.id = id; + this.color = color; + } + + public String getId() { + return id; + } + + public ChatFormatting getColor() { + return color; + } + + public String getNameKey() { + return "cosmiccore.bargain_category." + id; + } + + public MutableComponent getFormattedName() { + return Component.translatable(getNameKey()).withStyle(color); + } + + public static BargainCategory fromId(String id) { + for (BargainCategory cat : values()) { + if (cat.id.equals(id)) { + return cat; + } + } + return UTILITY; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/BargainRegistry.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/BargainRegistry.java new file mode 100644 index 000000000..f721cba29 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/BargainRegistry.java @@ -0,0 +1,179 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * Registry for all bargains in the Reflection system. + * Bargains are registered here and can be looked up by ID or filtered by context. + */ +public final class BargainRegistry { + + private BargainRegistry() {} + + private static final Map BARGAINS = new LinkedHashMap<>(); + + /** + * Register a bargain. Called during mod initialization. + */ + public static void register(Bargain bargain) { + if (BARGAINS.containsKey(bargain.getId())) { + CosmicCore.LOGGER.warn("Duplicate bargain registration: {}", bargain.getId()); + } + BARGAINS.put(bargain.getId(), bargain); + CosmicCore.LOGGER.debug("Registered bargain: {}", bargain.getId()); + } + + /** + * Get a bargain by ID. + */ + public static Optional get(ResourceLocation id) { + return Optional.ofNullable(BARGAINS.get(id)); + } + + /** + * Get all registered bargains. + */ + public static Collection getAll() { + return Collections.unmodifiableCollection(BARGAINS.values()); + } + + /** + * Get all bargains available to a player at their current erosion level. + */ + public static List getAvailable(Player player) { + return ReflectionCapability.get(player).map(reflection -> { + int erosion = reflection.getErosion(); + return BARGAINS.values().stream() + .filter(b -> b.canOffer(player, erosion)) + .filter(b -> !reflection.hasBargain(b.getId())) + .collect(Collectors.toList()); + }).orElse(Collections.emptyList()); + } + + /** + * Get bargains that are contextually relevant to offer. + * Used for curated offers in the mirror interface. + */ + public static List getContextualOffers(Player player, Bargain.BargainContext context, int maxOffers) { + return ReflectionCapability.get(player).map(reflection -> { + int erosion = reflection.getErosion(); + + // Get all available bargains + List available = BARGAINS.values().stream() + .filter(b -> b.canOffer(player, erosion)) + .filter(b -> !reflection.hasBargain(b.getId())) + .collect(Collectors.toList()); + + // Prioritize contextually relevant ones + List relevant = available.stream() + .filter(b -> b.isContextuallyRelevant(player, context)) + .limit(maxOffers) + .collect(Collectors.toList()); + + // If we don't have enough relevant ones, fill with others + if (relevant.size() < maxOffers) { + available.stream() + .filter(b -> !relevant.contains(b)) + .limit(maxOffers - relevant.size()) + .forEach(relevant::add); + } + + return relevant; + }).orElse(Collections.emptyList()); + } + + /** + * Get all active bargains for a player. + */ + public static List getActive(Player player) { + return ReflectionCapability.get(player).map(reflection -> reflection.getActiveBargains().stream() + .map(BargainRegistry::get) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toList())).orElse(Collections.emptyList()); + } + + /** + * Get all bargains the player has defied (for showing scars). + */ + public static List getDefied(Player player) { + return ReflectionCapability.get(player).map(reflection -> reflection.getDefianceScars().stream() + .map(BargainRegistry::get) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toList())).orElse(Collections.emptyList()); + } + + /** + * Check if the player can defy a specific bargain. + */ + public static boolean canDefy(Player player, ResourceLocation bargainId) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(bargainId)) + .orElse(false); + } + + /** + * Calculate the cost of a bargain for the player. + * Takes into account current erosion level and bargain base cost. + */ + public static int calculateCost(Player player, Bargain bargain) { + return ReflectionCapability.get(player).map(reflection -> { + int erosion = reflection.getErosion(); + int baseCost = bargain.getBaseCost(); + + // Scale cost based on current erosion + float multiplier = 1.0f; + if (erosion > 750) multiplier = 2.0f; + else if (erosion > 500) multiplier = 1.75f; + else if (erosion > 300) multiplier = 1.5f; + else if (erosion > 100) multiplier = 1.25f; + + return Math.round(baseCost * multiplier); + }).orElse(bargain.getBaseCost()); + } + + /** + * Calculate the defiance cost for removing a bargain. + */ + public static int calculateDefianceCost(Player player, Bargain bargain) { + int originalCost = calculateCost(player, bargain); + return Math.round(originalCost * 2.5f); // Defiance costs 2.5x the original + } + + /** + * Calculate the defiance cost without player context (client-side). + * Uses base cost * 2.5 + */ + public static int calculateDefianceCost(Bargain bargain) { + return Math.round(bargain.getBaseCost() * 2.5f); + } + + /** + * Get available bargains based on pre-synced active and scar sets (client-side). + */ + public static List getAvailable(Set activeBargains, Set scars) { + return BARGAINS.values().stream() + .filter(b -> !activeBargains.contains(b.getId())) + .filter(b -> !scars.contains(b.getId())) + .collect(Collectors.toList()); + } + + /** + * Get active bargains based on pre-synced set (client-side). + */ + public static List getActive(Set activeBargains) { + return activeBargains.stream() + .map(BargainRegistry::get) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/CosmicBargains.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/CosmicBargains.java new file mode 100644 index 000000000..6337d75dc --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/CosmicBargains.java @@ -0,0 +1,64 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.ArmorBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.BackBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.DepthsBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.FallImmunityBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.FireImmunityBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.HealthBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.HomeBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.HungerBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.NightVisionBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.QuakeMovementBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.ReachBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.StepAssistBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.StrengthBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.SwiftnessBargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.VoidResistanceBargain; + +/** + * Registers all bargains for the Reflection system. + * Called during mod initialization. + */ +public final class CosmicBargains { + + private CosmicBargains() {} + + public static void init() { + CosmicCore.LOGGER.info("Registering Reflection bargains..."); + + // EARLY TIER - Gateway bargains (0-100 erosion) + safeRegister("QuakeMovementBargain", () -> BargainRegistry.register(QuakeMovementBargain.INSTANCE)); + safeRegister("StepAssistBargain", () -> BargainRegistry.register(StepAssistBargain.INSTANCE)); + safeRegister("NightVisionBargain", () -> BargainRegistry.register(NightVisionBargain.INSTANCE)); + safeRegister("SwiftnessBargain", () -> BargainRegistry.register(SwiftnessBargain.INSTANCE)); + + // EARLY_MID TIER - Building addiction (0-300) + safeRegister("HomeBargain", () -> BargainRegistry.register(HomeBargain.INSTANCE)); + safeRegister("BackBargain", () -> BargainRegistry.register(BackBargain.INSTANCE)); + safeRegister("HealthBargain", () -> BargainRegistry.register(HealthBargain.INSTANCE)); + safeRegister("StrengthBargain", () -> BargainRegistry.register(StrengthBargain.INSTANCE)); + safeRegister("DepthsBargain", () -> BargainRegistry.register(DepthsBargain.INSTANCE)); + + // MID TIER - Significant commitment (100-500) + safeRegister("ReachBargain", () -> BargainRegistry.register(ReachBargain.INSTANCE)); + safeRegister("FallImmunityBargain", () -> BargainRegistry.register(FallImmunityBargain.INSTANCE)); + safeRegister("HungerBargain", () -> BargainRegistry.register(HungerBargain.INSTANCE)); + safeRegister("ArmorBargain", () -> BargainRegistry.register(ArmorBargain.INSTANCE)); + safeRegister("FireImmunityBargain", () -> BargainRegistry.register(FireImmunityBargain.INSTANCE)); + + // LATE TIER - Deep corruption (300-750) + safeRegister("VoidResistanceBargain", () -> BargainRegistry.register(VoidResistanceBargain.INSTANCE)); + + CosmicCore.LOGGER.info("Registered {} bargains", BargainRegistry.getAll().size()); + } + + private static void safeRegister(String name, Runnable registrar) { + try { + registrar.run(); + } catch (Throwable t) { + CosmicCore.LOGGER.error("Failed to register bargain: {}", name, t); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/ArmorBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/ArmorBargain.java new file mode 100644 index 000000000..8a3fafd8c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/ArmorBargain.java @@ -0,0 +1,138 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainCategory; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.player.Player; + +import java.util.List; + +public class ArmorBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("carapace"); + public static final ArmorBargain INSTANCE = new ArmorBargain(); + private static final String BARGAIN_ID = "carapace"; + private static final ResourceLocation ARMOR_MODIFIER_ID = CosmicCore.id("reflection_armor"); + private static final ResourceLocation SPEED_MODIFIER_ID = CosmicCore.id("reflection_speed_penalty"); + + public static final float SPEED_PENALTY = -0.15f; + + private ArmorBargain() { + super( + ID, + BargainTier.MID, + BargainCategory.DEFENSE, + 64, // shardCost + 25, // weight + 100 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3), + ReflectionLang.bargainDialogue(BARGAIN_ID, 4)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("survive", ReflectionLang.answerText(BARGAIN_ID, "survive"), + ReflectionLang.answerResponse(BARGAIN_ID, "survive")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "survive", 0), + ReflectionLang.answerPower(BARGAIN_ID, "survive", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "survive", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "survive", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (answer.id().equals("survive")) { + applyArmorBoost(player); + applySpeedPenalty(player); + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + removeArmorBoost(player); + removeSpeedPenalty(player); + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("shell", "The soul's surface appears calcified, plated, moving slowly"); + } + + public static void applyArmorBoost(Player player) { + var attribute = player.getAttribute(Attributes.ARMOR); + if (attribute != null) { + attribute.removeModifier(ARMOR_MODIFIER_ID); + attribute.addPermanentModifier(new AttributeModifier( + ARMOR_MODIFIER_ID, 8.0, AttributeModifier.Operation.ADD_VALUE)); + } + } + + public static void removeArmorBoost(Player player) { + var attribute = player.getAttribute(Attributes.ARMOR); + if (attribute != null) { + attribute.removeModifier(ARMOR_MODIFIER_ID); + } + } + + public static void applySpeedPenalty(Player player) { + var attribute = player.getAttribute(Attributes.MOVEMENT_SPEED); + if (attribute != null) { + attribute.removeModifier(SPEED_MODIFIER_ID); + attribute.addPermanentModifier(new AttributeModifier( + SPEED_MODIFIER_ID, SPEED_PENALTY, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); + } + } + + public static void removeSpeedPenalty(Player player) { + var attribute = player.getAttribute(Attributes.MOVEMENT_SPEED); + if (attribute != null) { + attribute.removeModifier(SPEED_MODIFIER_ID); + } + } + + public static boolean hasBargain(Player player) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(ID)) + .orElse(false); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/BackBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/BackBargain.java new file mode 100644 index 000000000..3db027953 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/BackBargain.java @@ -0,0 +1,182 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionConstants; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainCategory; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class BackBargain extends Bargain { + + private static final ResourceLocation ID = CosmicCore.id("back"); + public static final BackBargain INSTANCE = new BackBargain(); + private static final String BARGAIN_ID = "back"; + + private static final Map lastDeathLocations = new HashMap<>(); + + private BackBargain() { + super(ID, BargainTier.EARLY, BargainCategory.UTILITY, 0, 0, 100); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("accept", ReflectionLang.answerText(BARGAIN_ID, "accept"), + ReflectionLang.answerResponse(BARGAIN_ID, "accept")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "accept", 0), + ReflectionLang.answerPower(BARGAIN_ID, "accept", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (answer.id().equals("accept")) { + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("echo", "A faint afterimage follows you, showing where death last found you"); + } + + @Override + public void tick(Player player) {} + + public static void recordDeath(ServerPlayer player) { + lastDeathLocations.put(player.getUUID(), new DeathLocation( + player.level().dimension(), + player.position())); + } + + public static boolean executeBack(ServerPlayer player) { + return ReflectionCapability.get(player).map(reflection -> { + if (!reflection.hasBargain(ID)) { + player.displayClientMessage( + Component.literal("\u00A7cYou haven't made this bargain."), + false); + return false; + } + + DeathLocation deathLoc = lastDeathLocations.get(player.getUUID()); + if (deathLoc == null) { + player.displayClientMessage( + Component.literal("\u00A7cYou have no death to return to."), + false); + return false; + } + + ServerLevel targetLevel = player.server.getLevel(deathLoc.dimension); + if (targetLevel == null) { + player.displayClientMessage( + Component.literal("\u00A7cThat place no longer exists."), + false); + return false; + } + + int cost = ReflectionConstants.getCommandCost(reflection, "back"); + reflection.addErosion(cost); + reflection.recordCommandUse("back"); + + Vec3 pos = deathLoc.position; + if (player.level().dimension() != deathLoc.dimension) { + player.teleportTo(targetLevel, pos.x, pos.y, pos.z, player.getYRot(), player.getXRot()); + } else { + player.teleportTo(pos.x, pos.y, pos.z); + } + + player.level().playSound(null, player.blockPosition(), + SoundEvents.ENDERMAN_TELEPORT, SoundSource.PLAYERS, 1.0f, 0.5f); + + if (cost <= 4) { + player.displayClientMessage( + Component.literal("\u00A77\u00A7o*You return to where you fell.*"), + true); + } else if (cost <= 12) { + player.displayClientMessage( + Component.literal("\u00A77\u00A7o*Again you return. The ground remembers your blood.*"), + true); + } else if (cost <= 24) { + player.displayClientMessage( + Component.literal("\u00A77\u00A7o*How many times have you died here? Does it matter anymore?*"), + true); + } else { + player.displayClientMessage( + Component.literal("\u00A77\u00A7o*Death. Return. Death. Return. You've made this a ritual.*"), + true); + } + + player.displayClientMessage( + Component.literal("\u00A78[Erosion +" + cost + "]"), + false); + + lastDeathLocations.remove(player.getUUID()); + + return true; + }).orElse(false); + } + + public static boolean hasDeathLocation(UUID playerId) { + return lastDeathLocations.containsKey(playerId); + } + + public static void clearDeathLocation(UUID playerId) { + lastDeathLocations.remove(playerId); + } + + private record DeathLocation( + ResourceKey dimension, + Vec3 position) {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/CelesteDashHandler.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/CelesteDashHandler.java new file mode 100644 index 000000000..172e8cf22 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/CelesteDashHandler.java @@ -0,0 +1,374 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +public class CelesteDashHandler { + + // Constants + private static final double DASH_SPEED = 0.6; + private static final int DASH_DURATION = 4; + private static final int DASH_COOLDOWN = 10; + private static final int MAX_CHARGES = 1; + private static final int COYOTE_TIME = 6; + private static final int INPUT_BUFFER = 6; + private static final double WAVEDASH_SPEED_BOOST = 0.25; + private static final double SUPER_DASH_BONUS = 0.15; + private static final int SUPER_DASH_WINDOW = 15; + private static final double MIN_PRESERVE_SPEED = 0.20; + private static final double MAX_VERTICAL_RATIO = 0.7; + private static final double HARD_CAP = 1.25; + + private static final Map playerStates = new HashMap<>(); + + public static class DashState { + + public int dashCharges = MAX_CHARGES; + public int dashCooldown = 0; + public int dashDuration = 0; + public Vec3 dashDirection = Vec3.ZERO; + public boolean isDashing = false; + + public int ticksSinceGrounded = 0; + public boolean wasGrounded = true; + public int groundedTicks = 0; + + public int bufferedDashTicks = 0; + public float bufferedXRot = 0; + public float bufferedYRot = 0; + public float bufferedForward = 0; + public float bufferedStrafe = 0; + + public Vec3 preDashVelocity = Vec3.ZERO; + public double preDashSpeed = 0; + public int ticksSinceDashEnd = 999; + + public boolean canSuperDash = false; + public int superDashWindow = 0; + + public boolean canWavedash = false; + public int wavedashWindow = 0; + public double wavedashStoredSpeed = 0; + + public int groundDashStreak = 0; + public boolean jumpedSinceLastDash = false; + public int groundedWithoutJumpTicks = 0; + } + + public static DashState getState(Player player) { + return playerStates.computeIfAbsent(player.getUUID(), k -> new DashState()); + } + + @OnlyIn(Dist.CLIENT) + public static boolean tryDash(Player player) { + DashState state = getState(player); + + if (canDash(player, state)) { + performDash(player, state, player.getXRot(), player.getYRot(), player.zza, player.xxa); + return true; + } + + if (state.dashCooldown > 0 && state.dashCooldown <= INPUT_BUFFER) { + state.bufferedDashTicks = INPUT_BUFFER; + state.bufferedXRot = player.getXRot(); + state.bufferedYRot = player.getYRot(); + state.bufferedForward = player.zza; + state.bufferedStrafe = player.xxa; + } + + return false; + } + + @OnlyIn(Dist.CLIENT) + public static void clientTick(Player player) { + DashState state = getState(player); + + boolean justJumped = !player.onGround() && state.wasGrounded && player.getDeltaMovement().y > 0.1; + + if (player.onGround()) { + state.ticksSinceGrounded = 0; + state.wasGrounded = true; + state.groundedWithoutJumpTicks++; + + if (state.dashCharges < MAX_CHARGES && !state.isDashing) { + state.dashCharges = MAX_CHARGES; + } + state.groundedTicks++; + } else { + if (state.wasGrounded && player.getDeltaMovement().y > 0.1) { + state.jumpedSinceLastDash = true; + state.groundDashStreak = 0; + state.groundedWithoutJumpTicks = 0; + } + if (state.wasGrounded) { + state.wasGrounded = false; + } + state.ticksSinceGrounded++; + state.groundedTicks = 0; + state.groundedWithoutJumpTicks = 0; + } + + if (state.dashCooldown > 0) state.dashCooldown--; + + if (state.dashDuration > 0) { + state.dashDuration--; + if (state.dashDuration == 0) { + onDashEnd(player, state); + } + } + + if (state.superDashWindow > 0) { + state.superDashWindow--; + if (state.superDashWindow == 0) { + state.canSuperDash = false; + } + } + + if (state.wavedashWindow > 0) { + state.wavedashWindow--; + if (justJumped) { + triggerWavedash(player, state); + } + if (state.wavedashWindow == 0) { + state.canWavedash = false; + } + } + + if (!state.isDashing) state.ticksSinceDashEnd++; + + if (state.bufferedDashTicks > 0) { + if (canDash(player, state)) { + performDash(player, state, state.bufferedXRot, state.bufferedYRot, + state.bufferedForward, state.bufferedStrafe); + state.bufferedDashTicks = 0; + } else { + state.bufferedDashTicks--; + } + } + + if (state.isDashing && state.dashDuration > 0) { + applyDashMovement(player, state); + } + } + + public static void executeDashServer(ServerPlayer player, float xRot, float yRot, float forwardInput, + float strafeInput) { + if (player.isInWater() || player.isInLava()) return; + if (player.getAbilities().flying || player.isFallFlying()) return; + + Vec3 dashDir = calculateDashDirection(player, xRot, yRot); + + player.level().playSound(null, player.getX(), player.getY(), player.getZ(), + SoundEvents.PHANTOM_FLAP, SoundSource.PLAYERS, 0.5f, 1.8f); + + if (player.level() instanceof ServerLevel serverLevel) { + for (int i = 0; i < 8; i++) { + double progress = i / 8.0; + double x = player.getX() - dashDir.x * progress * 2; + double y = player.getY() + 0.5 - dashDir.y * progress * 2; + double z = player.getZ() - dashDir.z * progress * 2; + serverLevel.sendParticles(ParticleTypes.END_ROD, x, y, z, 1, 0.1, 0.1, 0.1, 0.02); + } + } + } + + private static boolean canDash(Player player, DashState state) { + if (state.isDashing) return false; + if (state.dashCharges <= 0) return false; + if (state.dashCooldown > 0) return false; + if (player.isInWater() || player.isInLava()) return false; + if (player.getAbilities().flying || player.isFallFlying()) return false; + return true; + } + + private static void performDash(Player player, DashState state, float xRot, float yRot, float forwardInput, + float strafeInput) { + state.preDashVelocity = player.getDeltaMovement(); + state.preDashSpeed = Math.sqrt(state.preDashVelocity.x * state.preDashVelocity.x + + state.preDashVelocity.z * state.preDashVelocity.z); + + Vec3 dashDir = calculateDashDirection(player, xRot, yRot); + boolean isSuperDash = state.canSuperDash && state.preDashSpeed > MIN_PRESERVE_SPEED; + + // Ground spam penalty + boolean isGroundSpam = player.onGround() && !state.jumpedSinceLastDash; + boolean prolongedGrounding = state.groundedWithoutJumpTicks > 10; + double groundPenalty = 1.0; + + if (isGroundSpam || prolongedGrounding) { + state.groundDashStreak++; + if (state.groundDashStreak == 1) { + groundPenalty = 0.8; + } else if (state.groundDashStreak == 2) { + groundPenalty = 0.5; + } else { + groundPenalty = 0.3; + } + } else if (state.jumpedSinceLastDash) { + state.groundDashStreak = 0; + } + + state.jumpedSinceLastDash = false; + state.groundedWithoutJumpTicks = 0; + + double speed = DASH_SPEED; + if (isSuperDash) { + speed += SUPER_DASH_BONUS; + } + speed *= groundPenalty; + speed = Math.min(speed, DASH_SPEED + SUPER_DASH_BONUS); + + Vec3 dashVelocity = dashDir.scale(speed); + + double yVel = dashVelocity.y; + if (state.preDashVelocity.y > 0 && dashDir.y >= -0.1) { + yVel = Math.max(yVel, state.preDashVelocity.y * 0.6); + } + + player.setDeltaMovement(dashVelocity.x, yVel, dashVelocity.z); + + state.dashDirection = dashDir; + state.isDashing = true; + state.dashDuration = DASH_DURATION; + state.dashCooldown = DASH_COOLDOWN; + state.dashCharges--; + state.canSuperDash = false; + state.ticksSinceDashEnd = 0; + + player.resetFallDistance(); + } + + private static Vec3 calculateDashDirection(Player player, float xRot, float yRot) { + double yawRad = Math.toRadians(yRot); + double pitchRad = Math.toRadians(xRot); + + double sinYaw = Math.sin(yawRad); + double cosYaw = Math.cos(yawRad); + double sinPitch = Math.sin(pitchRad); + double cosPitch = Math.cos(pitchRad); + + double lookX = -sinYaw * cosPitch; + double lookY = -sinPitch; + double lookZ = cosYaw * cosPitch; + + if (Math.abs(lookY) > MAX_VERTICAL_RATIO) { + double sign = lookY > 0 ? 1 : -1; + lookY = sign * MAX_VERTICAL_RATIO; + double horizontalScale = Math.sqrt(1 - lookY * lookY) / + Math.sqrt(lookX * lookX + lookZ * lookZ + 0.0001); + lookX *= horizontalScale; + lookZ *= horizontalScale; + } + + Vec3 dir = new Vec3(lookX, lookY, lookZ); + double length = dir.length(); + if (length > 0.01) { + return dir.scale(1.0 / length); + } + return new Vec3(-sinYaw, 0, cosYaw).normalize(); + } + + private static void applyDashMovement(Player player, DashState state) { + Vec3 current = player.getDeltaMovement(); + Vec3 dashVel = state.dashDirection.scale(DASH_SPEED); + + double blend = 0.8; + double newX = current.x * (1 - blend) + dashVel.x * blend; + double newZ = current.z * (1 - blend) + dashVel.z * blend; + + double newY = current.y; + if (state.dashDirection.y != 0) { + newY = current.y * 0.5 + dashVel.y * 0.5; + } + + player.setDeltaMovement(newX, newY, newZ); + } + + private static void onDashEnd(Player player, DashState state) { + state.isDashing = false; + + Vec3 velocity = player.getDeltaMovement(); + double currentHorizontalSpeed = Math.sqrt(velocity.x * velocity.x + velocity.z * velocity.z); + + boolean onGroundNow = player.onGround(); + boolean dashedDownward = state.dashDirection.y < -0.1; + boolean wasAirborne = state.preDashVelocity.y < -0.05 || state.preDashVelocity.y > 0.1; + + if (onGroundNow && (dashedDownward || wasAirborne) && currentHorizontalSpeed > 0.2) { + state.canWavedash = true; + state.wavedashWindow = 8; + state.wavedashStoredSpeed = currentHorizontalSpeed; + } else { + double preserveSpeed = Math.max(currentHorizontalSpeed, state.preDashSpeed * 0.8); + + if (preserveSpeed > currentHorizontalSpeed && preserveSpeed > MIN_PRESERVE_SPEED) { + Vec3 dir = velocity.lengthSqr() > 0.01 ? velocity.normalize() : state.dashDirection; + Vec3 horizontalDir = new Vec3(dir.x, 0, dir.z); + if (horizontalDir.lengthSqr() > 0.01) { + horizontalDir = horizontalDir.normalize(); + player.setDeltaMovement( + horizontalDir.x * preserveSpeed, + velocity.y, + horizontalDir.z * preserveSpeed); + } + } + } + } + + private static void triggerWavedash(Player player, DashState state) { + state.canWavedash = false; + state.wavedashWindow = 0; + + Vec3 velocity = player.getDeltaMovement(); + double currentHorizontalSpeed = Math.sqrt(velocity.x * velocity.x + velocity.z * velocity.z); + + double baseSpeed = Math.max(currentHorizontalSpeed, state.wavedashStoredSpeed); + double wavedashSpeed = baseSpeed + WAVEDASH_SPEED_BOOST; + + if (state.preDashSpeed > MIN_PRESERVE_SPEED) { + double chainBonus = state.preDashSpeed + WAVEDASH_SPEED_BOOST * 0.7; + wavedashSpeed = Math.max(wavedashSpeed, chainBonus); + } + + wavedashSpeed = Math.min(wavedashSpeed, HARD_CAP); + + Vec3 horizontalDir = new Vec3(velocity.x, 0, velocity.z); + if (horizontalDir.lengthSqr() > 0.01) { + horizontalDir = horizontalDir.normalize(); + player.setDeltaMovement( + horizontalDir.x * wavedashSpeed, + velocity.y, + horizontalDir.z * wavedashSpeed); + } + + state.canSuperDash = true; + state.superDashWindow = SUPER_DASH_WINDOW; + } + + public static void removePlayer(UUID uuid) { + playerStates.remove(uuid); + } + + public static boolean isDashing(Player player) { + return getState(player).isDashing; + } + + public static int getDashCharges(Player player) { + return getState(player).dashCharges; + } + + public static boolean canDashNow(Player player) { + return canDash(player, getState(player)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/DepthsBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/DepthsBargain.java new file mode 100644 index 000000000..47c36213a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/DepthsBargain.java @@ -0,0 +1,115 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainCategory; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; + +import java.util.List; + +public class DepthsBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("depths"); + public static final DepthsBargain INSTANCE = new DepthsBargain(); + private static final String BARGAIN_ID = "depths"; + + public static final float OXYGEN_CAPACITY_MULTIPLIER = 1.5f; + + private DepthsBargain() { + super( + ID, + BargainTier.EARLY_MID, + BargainCategory.DEFENSE, + 64, // shardCost + 15, // weight + 75 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3), + ReflectionLang.bargainDialogue(BARGAIN_ID, 4), + ReflectionLang.bargainDialogue(BARGAIN_ID, 5)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("embrace", + ReflectionLang.answerText(BARGAIN_ID, "embrace"), + ReflectionLang.answerResponse(BARGAIN_ID, "embrace")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "embrace", 0), + ReflectionLang.answerPower(BARGAIN_ID, "embrace", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "embrace", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "embrace", 1))), + new BargainAnswer("refuse", + ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (!answer.id().equals("refuse")) { + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("gills", "depths_visual"); + } + + public static boolean hasBargain(Player player) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(ID)) + .orElse(false); + } + + public static float getCapacityMultiplier(Player player) { + return hasBargain(player) ? OXYGEN_CAPACITY_MULTIPLIER : 1.0f; + } + + public static boolean shouldInstantKillOnSuffocation(Player player) { + return hasBargain(player); + } + + public static void executeInstantSuffocation(ServerPlayer player) { + player.displayClientMessage(ReflectionLang.bargainSuffocation(BARGAIN_ID), false); + player.hurt(player.damageSources().drown(), Float.MAX_VALUE); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/FallImmunityBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/FallImmunityBargain.java new file mode 100644 index 000000000..d851a6258 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/FallImmunityBargain.java @@ -0,0 +1,132 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainCategory; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.entity.player.Player; + +import java.util.List; + +public class FallImmunityBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("soft_landing"); + public static final FallImmunityBargain INSTANCE = new FallImmunityBargain(); + private static final String BARGAIN_ID = "soft_landing"; + + public static final float FALL_DAMAGE_MULTIPLIER = 0.2f; + public static final float COMBAT_DAMAGE_MULTIPLIER = 1.5f; + + private FallImmunityBargain() { + super( + ID, + BargainTier.MID, + BargainCategory.MOBILITY, + 64, // shardCost + 25, // weight + 100 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3), + ReflectionLang.bargainDialogue(BARGAIN_ID, 4)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("yes", ReflectionLang.answerText(BARGAIN_ID, "yes"), + ReflectionLang.answerResponse(BARGAIN_ID, "yes")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "yes", 0), + ReflectionLang.answerPower(BARGAIN_ID, "yes", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "yes", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "yes", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public boolean isContextuallyRelevant(Player player, BargainContext context) { + return context.lastDeathCause().map(cause -> cause.contains("fall")).orElse(false); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (answer.id().equals("yes")) { + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("floating", "The soul hovers slightly, its form diffuse and yielding"); + } + + public static boolean hasBargain(Player player) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(ID)) + .orElse(false); + } + + public static float modifyFallDamage(Player player, float originalDamage) { + if (hasBargain(player)) { + return originalDamage * FALL_DAMAGE_MULTIPLIER; + } + return originalDamage; + } + + public static float modifyCombatDamage(Player player, float originalDamage) { + if (hasBargain(player)) { + return originalDamage * COMBAT_DAMAGE_MULTIPLIER; + } + return originalDamage; + } + + public static boolean isFallDamage(DamageSource source) { + return source.is(DamageTypes.FALL) || + source.is(DamageTypes.FLY_INTO_WALL); + } + + public static boolean isCombatDamage(DamageSource source) { + return source.is(DamageTypes.PLAYER_ATTACK) || + source.is(DamageTypes.EXPLOSION) || + source.is(DamageTypes.PLAYER_EXPLOSION) || + source.getEntity() instanceof Player; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/FireImmunityBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/FireImmunityBargain.java new file mode 100644 index 000000000..9d2380516 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/FireImmunityBargain.java @@ -0,0 +1,138 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainCategory; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.damagesource.DamageTypes; +import net.minecraft.world.entity.player.Player; + +import java.util.List; + +public class FireImmunityBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("cinder"); + public static final FireImmunityBargain INSTANCE = new FireImmunityBargain(); + private static final String BARGAIN_ID = "cinder"; + + public static final float FIRE_DAMAGE_MULTIPLIER = 0.25f; + public static final float COLD_DAMAGE_MULTIPLIER = 2.0f; + + private FireImmunityBargain() { + super( + ID, + BargainTier.MID, + BargainCategory.DEFENSE, + 64, // shardCost + 25, // weight + 100 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3), + ReflectionLang.bargainDialogue(BARGAIN_ID, 4)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("burn", ReflectionLang.answerText(BARGAIN_ID, "burn"), + ReflectionLang.answerResponse(BARGAIN_ID, "burn")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "burn", 0), + ReflectionLang.answerPower(BARGAIN_ID, "burn", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "burn", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "burn", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public boolean isContextuallyRelevant(Player player, BargainContext context) { + return context.isBurning(); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (!answer.id().equals("refuse")) { + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public void tick(Player player) { + if (player.getRemainingFireTicks() > 20) { + player.setRemainingFireTicks(20); + } + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("ember", "Faint embers drift from the soul's form, it radiates warmth but shivers"); + } + + public static boolean hasBargain(Player player) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(ID)) + .orElse(false); + } + + public static float modifyFireDamage(Player player, float originalDamage) { + if (hasBargain(player)) { + return originalDamage * FIRE_DAMAGE_MULTIPLIER; + } + return originalDamage; + } + + public static float modifyColdDamage(Player player, float originalDamage) { + if (hasBargain(player)) { + return originalDamage * COLD_DAMAGE_MULTIPLIER; + } + return originalDamage; + } + + public static boolean isFireDamage(DamageSource source) { + return source.is(DamageTypes.IN_FIRE) || + source.is(DamageTypes.ON_FIRE) || + source.is(DamageTypes.LAVA) || + source.is(DamageTypes.HOT_FLOOR); + } + + public static boolean isColdDamage(DamageSource source) { + return source.is(DamageTypes.FREEZE); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/HealthBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/HealthBargain.java new file mode 100644 index 000000000..89010e13f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/HealthBargain.java @@ -0,0 +1,126 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainCategory; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.player.Player; + +import java.util.List; + +public class HealthBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("vitality"); + public static final HealthBargain INSTANCE = new HealthBargain(); + private static final String BARGAIN_ID = "vitality"; + private static final ResourceLocation MODIFIER_ID = CosmicCore.id("reflection_vitality"); + + public static final float HEALING_REDUCTION = 0.5f; + + private HealthBargain() { + super( + ID, + BargainTier.EARLY_MID, + BargainCategory.DEFENSE, + 64, // shardCost + 25, // weight + 100 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3), + ReflectionLang.bargainDialogue(BARGAIN_ID, 4)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("accept", ReflectionLang.answerText(BARGAIN_ID, "accept"), + ReflectionLang.answerResponse(BARGAIN_ID, "accept")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "accept", 0), + ReflectionLang.answerPower(BARGAIN_ID, "accept", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (answer.id().equals("accept")) { + applyHealthBoost(player); + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + removeHealthBoost(player); + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("swollen", "The soul appears bloated, stretched, rejecting attempts to mend it"); + } + + public static void applyHealthBoost(Player player) { + var attribute = player.getAttribute(Attributes.MAX_HEALTH); + if (attribute != null) { + attribute.removeModifier(MODIFIER_ID); + attribute.addPermanentModifier(new AttributeModifier( + MODIFIER_ID, 10.0, AttributeModifier.Operation.ADD_VALUE)); + } + } + + public static void removeHealthBoost(Player player) { + var attribute = player.getAttribute(Attributes.MAX_HEALTH); + if (attribute != null) { + attribute.removeModifier(MODIFIER_ID); + } + } + + public static boolean hasBargain(Player player) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(ID)) + .orElse(false); + } + + public static float modifyHealing(Player player, float originalHealing) { + if (hasBargain(player)) { + return originalHealing * HEALING_REDUCTION; + } + return originalHealing; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/HomeBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/HomeBargain.java new file mode 100644 index 000000000..bc4d4a1dc --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/HomeBargain.java @@ -0,0 +1,184 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionConstants; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainCategory; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.Vec3; + +import java.util.List; +import java.util.Optional; + +public class HomeBargain extends Bargain { + + private static final ResourceLocation ID = CosmicCore.id("home"); + public static final HomeBargain INSTANCE = new HomeBargain(); + private static final String BARGAIN_ID = "home"; + + private HomeBargain() { + super(ID, BargainTier.EARLY, BargainCategory.UTILITY, 0, 0, 100); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("accept", ReflectionLang.answerText(BARGAIN_ID, "accept"), + ReflectionLang.answerResponse(BARGAIN_ID, "accept")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "accept", 0), + ReflectionLang.answerPower(BARGAIN_ID, "accept", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (answer.id().equals("accept")) { + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("threads", "Faint silver threads extending outward, always pointing home"); + } + + @Override + public void tick(Player player) {} + + public static boolean executeHome(ServerPlayer player) { + return ReflectionCapability.get(player).map(reflection -> { + if (!reflection.hasBargain(ID)) { + player.displayClientMessage( + Component.literal("\u00A7cYou haven't made this bargain."), + false); + return false; + } + + int cost = ReflectionConstants.getCommandCost(reflection, "home"); + Optional homeLoc = findHomePosition(player); + if (homeLoc.isEmpty()) { + player.displayClientMessage( + Component.literal("\u00A7cYou have no home to return to."), + false); + return false; + } + + HomeLocation home = homeLoc.get(); + ServerLevel targetLevel = player.server.getLevel(home.dimension); + if (targetLevel == null) { + player.displayClientMessage( + Component.literal("\u00A7cThat place no longer exists."), + false); + return false; + } + + reflection.addErosion(cost); + reflection.recordCommandUse("home"); + + Vec3 pos = home.position; + if (player.level().dimension() != home.dimension) { + player.teleportTo(targetLevel, pos.x, pos.y, pos.z, player.getYRot(), player.getXRot()); + } else { + player.teleportTo(pos.x, pos.y, pos.z); + } + + player.level().playSound(null, player.blockPosition(), + SoundEvents.ENDERMAN_TELEPORT, SoundSource.PLAYERS, 1.0f, 0.8f); + + if (cost <= 2) { + player.displayClientMessage( + Component.literal("\u00A77\u00A7o*You feel the familiar pull of home.*"), + true); + } else if (cost <= 8) { + player.displayClientMessage( + Component.literal("\u00A77\u00A7o*The path feels... worn. Familiar. Too familiar.*"), + true); + } else { + player.displayClientMessage( + Component.literal( + "\u00A77\u00A7o*Home. Again. Always home. Do you even remember the world outside?*"), + true); + } + + player.displayClientMessage(Component.literal("\u00A78[Erosion +" + cost + "]"), false); + return true; + }).orElse(false); + } + + private static Optional findHomePosition(ServerPlayer player) { + BlockPos bedPos = player.getRespawnPosition(); + if (bedPos != null) { + ResourceKey respawnDim = player.getRespawnDimension(); + ServerLevel respawnLevel = player.server.getLevel(respawnDim); + if (respawnLevel != null) { + BlockState respawnState = respawnLevel.getBlockState(bedPos); + Optional bedSpawn = respawnState + .getRespawnPosition(EntityType.PLAYER, respawnLevel, bedPos, player.getRespawnAngle()) + .map(ServerPlayer.RespawnPosAngle::position); + if (bedSpawn.isPresent()) { + return Optional.of(new HomeLocation(respawnDim, bedSpawn.get())); + } + } + } + + ServerLevel overworld = player.server.getLevel(Level.OVERWORLD); + if (overworld != null) { + BlockPos spawnPos = overworld.getSharedSpawnPos(); + return Optional.of(new HomeLocation(Level.OVERWORLD, + new Vec3(spawnPos.getX() + 0.5, spawnPos.getY(), spawnPos.getZ() + 0.5))); + } + + return Optional.empty(); + } + + private record HomeLocation(ResourceKey dimension, Vec3 position) {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/HungerBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/HungerBargain.java new file mode 100644 index 000000000..98b2ca394 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/HungerBargain.java @@ -0,0 +1,118 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainCategory; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.food.FoodData; + +import java.util.List; + +public class HungerBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("satiated"); + public static final HungerBargain INSTANCE = new HungerBargain(); + private static final String BARGAIN_ID = "satiated"; + + public static final float EXHAUSTION_REDUCTION = 0.75f; + + private HungerBargain() { + super( + ID, + BargainTier.MID, + BargainCategory.SUSTENANCE, + 256, // shardCost - premium + 50, // weight - expensive commitment + 250 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3), + ReflectionLang.bargainDialogue(BARGAIN_ID, 4)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("empty", ReflectionLang.answerText(BARGAIN_ID, "empty"), + ReflectionLang.answerResponse(BARGAIN_ID, "empty")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "empty", 0), + ReflectionLang.answerPower(BARGAIN_ID, "empty", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "empty", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "empty", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public boolean isContextuallyRelevant(Player player, BargainContext context) { + return context.isHungry(); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (answer.id().equals("empty")) { + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public void tick(Player player) { + FoodData food = player.getFoodData(); + float exhaustion = food.getExhaustionLevel(); + if (exhaustion > 0) { + food.setExhaustion(exhaustion * (1.0f - EXHAUSTION_REDUCTION)); + } + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("hollow", + "The soul's midsection is translucent, food passes through without nourishing"); + } + + public static boolean hasBargain(Player player) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(ID)) + .orElse(false); + } + + public static boolean shouldBlockNaturalRegen(Player player) { + return hasBargain(player); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/NightVisionBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/NightVisionBargain.java new file mode 100644 index 000000000..e2ce2b40e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/NightVisionBargain.java @@ -0,0 +1,149 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainCategory; + +import net.minecraft.core.BlockPos; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.player.Player; + +import java.util.List; + +public class NightVisionBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("darksight"); + public static final NightVisionBargain INSTANCE = new NightVisionBargain(); + private static final String BARGAIN_ID = "darksight"; + + public static final int BRIGHT_LIGHT_THRESHOLD = 14; + public static final float BRIGHT_LIGHT_DAMAGE = 0.5f; + public static final int LIGHT_DAMAGE_INTERVAL = 20; + + private NightVisionBargain() { + super( + ID, + BargainTier.EARLY, + BargainCategory.UTILITY, + 256, // shardCost - premium + 25, // weight + 150 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3), + ReflectionLang.bargainDialogue(BARGAIN_ID, 4)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("yes", ReflectionLang.answerText(BARGAIN_ID, "yes"), + ReflectionLang.answerResponse(BARGAIN_ID, "yes")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "yes", 0), + ReflectionLang.answerPower(BARGAIN_ID, "yes", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "yes", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "yes", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (!answer.id().equals("refuse")) { + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + player.removeEffect(MobEffects.NIGHT_VISION); + player.removeEffect(MobEffects.BLINDNESS); + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public void tick(Player player) { + if (!player.hasEffect(MobEffects.NIGHT_VISION) || + player.getEffect(MobEffects.NIGHT_VISION).getDuration() < 400) { + player.addEffect(new MobEffectInstance(MobEffects.NIGHT_VISION, 600, 0, true, false, false)); + } + + BlockPos pos = player.blockPosition(); + int skyLight = player.level().getBrightness(net.minecraft.world.level.LightLayer.SKY, pos); + + boolean inBrightSunlight = skyLight >= BRIGHT_LIGHT_THRESHOLD && + player.level().isDay() && + player.level().canSeeSky(pos); + + if (inBrightSunlight) { + if (!player.hasEffect(MobEffects.BLINDNESS) || + player.getEffect(MobEffects.BLINDNESS).getDuration() < 40) { + player.addEffect(new MobEffectInstance(MobEffects.BLINDNESS, 60, 0, true, false, true)); + } + + if (player.level().getGameTime() % LIGHT_DAMAGE_INTERVAL == 0) { + player.hurt(player.damageSources().magic(), BRIGHT_LIGHT_DAMAGE); + + if (player.level().getGameTime() % 100 == 0) { + player.displayClientMessage( + Component.literal("\u00A7c\u00A7o*The light burns! Seek shadow!*"), + true); + } + } + } + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("voidEyes", + "The soul's eyes are empty voids that somehow still see, flinching from light"); + } + + public static boolean hasBargain(Player player) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(ID)) + .orElse(false); + } + + public static boolean isBeingHurtByLight(Player player) { + if (!hasBargain(player)) return false; + + BlockPos pos = player.blockPosition(); + int skyLight = player.level().getBrightness(net.minecraft.world.level.LightLayer.SKY, pos); + + return skyLight >= BRIGHT_LIGHT_THRESHOLD && + player.level().isDay() && + player.level().canSeeSky(pos); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/QuakeMovementBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/QuakeMovementBargain.java new file mode 100644 index 000000000..972c89a00 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/QuakeMovementBargain.java @@ -0,0 +1,106 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainCategory; + +import net.minecraft.network.chat.Component; +import net.minecraft.world.entity.player.Player; + +import java.util.List; + +public class QuakeMovementBargain extends Bargain { + + public static final QuakeMovementBargain INSTANCE = new QuakeMovementBargain(); + private static final String BARGAIN_ID = "quake_movement"; + + private QuakeMovementBargain() { + super( + CosmicCore.id("quake_movement"), + BargainTier.EARLY, + BargainCategory.MOBILITY, + 0, 0, 0); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer( + "yes", + ReflectionLang.answerText(BARGAIN_ID, "yes"), + ReflectionLang.answerResponse(BARGAIN_ID, "yes")).withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "yes", 0), + ReflectionLang.answerPower(BARGAIN_ID, "yes", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "yes", 0))), + new BargainAnswer( + "refuse", + ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")).withReducedPower()); + } + + @Override + public boolean isContextuallyRelevant(Player player, BargainContext context) { + return true; + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + CosmicCore.LOGGER.info("Player {} accepted Quake Movement bargain with answer: {}", + player.getName().getString(), answer.id()); + } + + @Override + public void onDefy(Player player) { + CosmicCore.LOGGER.info("Player {} defied Quake Movement bargain", player.getName().getString()); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of( + "quake_legs", + "Legs elongated, joints bent wrong, always slightly blurred"); + } + + @Override + public List getAcceptDialogue(Player player, BargainAnswer answer) { + return List.of( + ReflectionLang.bargainAccept(BARGAIN_ID, 0), + ReflectionLang.bargainAccept(BARGAIN_ID, 1), + ReflectionLang.bargainAccept(BARGAIN_ID, 2)); + } + + @Override + public List getRefuseDialogue(Player player) { + return List.of( + ReflectionLang.bargainRefuse(BARGAIN_ID, 0), + ReflectionLang.bargainRefuse(BARGAIN_ID, 1), + ReflectionLang.bargainRefuse(BARGAIN_ID, 2)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/QuakeMovementHandler.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/QuakeMovementHandler.java new file mode 100644 index 000000000..c35a4cb76 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/QuakeMovementHandler.java @@ -0,0 +1,371 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.item.armor.boots.ICosmicBoots; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; + +import com.gregtechceu.gtceu.api.item.armor.ArmorComponentItem; + +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import net.minecraft.core.particles.BlockParticleOption; +import net.minecraft.core.particles.ParticleTypes; +import net.minecraft.network.chat.Component; +import net.minecraft.util.Mth; +import net.minecraft.world.entity.EquipmentSlot; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.RenderShape; +import net.minecraft.world.phys.Vec3; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; +import net.neoforged.neoforge.event.tick.PlayerTickEvent; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; + +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +@EventBusSubscriber(modid = CosmicCore.MOD_ID) +public class QuakeMovementHandler { + + private static final Map wasOnGround = new HashMap<>(); + private static final Map airTime = new HashMap<>(); + private static final Map wasJumping = new HashMap<>(); + + private static boolean clientHasQuakeMovement = false; + + // Movement constants + private static final double GROUND_ACCELERATE = 15.0; + private static final double AIR_ACCELERATE = 200.0; + private static final double AIR_WISH_SPEED = 0.25; + private static final double BHOP_BOOST = 1.12; + private static final double HARD_CAP_SPEED = 1.25; // 25 b/s + private static final double BHOP_SOFT_CAP = 0.5; // 10 b/s - pure bhop caps here + private static final double SOFT_CAP_SPEED = 1.0; // 20 b/s + private static final double SOFT_CAP_DEGEN = 0.7; + private static final double MIN_BHOP_SPEED = 0.10; + private static final int MIN_BHOP_AIRTIME = 5; + private static final double TRIMP_MULTIPLIER = 1.6; + + // Debug + private static final boolean DEBUG_MODE = false; + private static final double VANILLA_SPRINT_SPEED = 0.28; + private static final double VANILLA_SPRINT_JUMP_SPEED = 0.36; + + private static int lastBhopTick = 0; + private static int lastStrafeTick = 0; + private static int lastTrimpTick = 0; + private static double sessionMaxSpeed = 0; + + @OnlyIn(Dist.CLIENT) + public static void setClientHasQuakeMovement(boolean has) { + clientHasQuakeMovement = has; + } + + @OnlyIn(Dist.CLIENT) + public static boolean getClientHasQuakeMovement() { + return clientHasQuakeMovement; + } + + public static double getHardCapSpeed() { + return HARD_CAP_SPEED; + } + + public static double getBhopSoftCap() { + return BHOP_SOFT_CAP; + } + + @SubscribeEvent + public static void onPlayerTick(PlayerTickEvent.Pre event) { + Player player = event.getEntity(); + if (!player.level().isClientSide()) return; + if (!clientHasQuakeMovement) return; + if (player != Minecraft.getInstance().player) return; + + CelesteDashHandler.clientTick(player); + + if (player.isInWater() || player.isInLava() || player.isInFluidType((fluidType, height) -> height > 0.0)) + return; + if (player.getAbilities().flying || player.isFallFlying()) + return; + if (CelesteDashHandler.isDashing(player)) + return; + + UUID uuid = player.getUUID(); + boolean onGround = player.onGround(); + boolean wasGrounded = wasOnGround.getOrDefault(uuid, true); + + Vec3 motion = player.getDeltaMovement(); + double horizontalSpeed = getHorizontalSpeed(motion); + + if (!onGround) { + airTime.merge(uuid, 1, Integer::sum); + } else { + airTime.put(uuid, 0); + } + + boolean justJumped = !onGround && wasGrounded && motion.y > 0; + if (justJumped) { + wasJumping.put(uuid, true); + + if (player.isCrouching() && horizontalSpeed > VANILLA_SPRINT_SPEED) { + motion = applyTrimp(player, motion, horizontalSpeed); + player.setDeltaMovement(motion); + horizontalSpeed = getHorizontalSpeed(motion); + if (DEBUG_MODE) lastTrimpTick = player.tickCount; + } + } + + if (onGround && !wasGrounded) { + wasJumping.put(uuid, false); + } + + // Bhop on landing (requires minimum airtime to filter stair/step spam) + if (onGround && !wasGrounded && horizontalSpeed > MIN_BHOP_SPEED) { + int air = airTime.getOrDefault(uuid, 0); + if (air >= MIN_BHOP_AIRTIME) { + double oldSpeed = horizontalSpeed; + motion = applyBunnyHop(player, motion, horizontalSpeed); + player.setDeltaMovement(motion); + double newSpeed = getHorizontalSpeed(motion); + horizontalSpeed = newSpeed; + + if (newSpeed > oldSpeed) { + spawnBhopParticles(player, 4); + if (DEBUG_MODE) lastBhopTick = player.tickCount; + } + } + } + + // Air strafe + if (!onGround) { + double oldSpeed = horizontalSpeed; + motion = applyAirAcceleration(player, motion); + player.setDeltaMovement(motion); + double newSpeed = getHorizontalSpeed(motion); + + if (DEBUG_MODE && newSpeed > oldSpeed + 0.002) { + lastStrafeTick = player.tickCount; + } + } + + // Hard cap + motion = player.getDeltaMovement(); + horizontalSpeed = getHorizontalSpeed(motion); + if (horizontalSpeed > HARD_CAP_SPEED) { + motion = applyHardCap(motion, horizontalSpeed); + player.setDeltaMovement(motion); + } + + // Debug HUD + if (DEBUG_MODE) { + displayDebugHud(player, onGround); + } + + wasOnGround.put(uuid, onGround); + } + + public static boolean hasQuakeMovement(Player player) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(QuakeMovementBargain.INSTANCE.getId())) + .orElse(false); + } + + private static Vec3 applyBunnyHop(Player player, Vec3 motion, double currentSpeed) { + double targetSpeed = currentSpeed; + + if (currentSpeed < SOFT_CAP_SPEED) { + double speedRatio = Math.min(currentSpeed / BHOP_SOFT_CAP, 1.0); + double dynamicMultiplier = 1.0 + (BHOP_BOOST - 1.0) * (1.0 - speedRatio * speedRatio); + double boostedSpeed = currentSpeed * dynamicMultiplier; + if (boostedSpeed > SOFT_CAP_SPEED) { + double excess = boostedSpeed - SOFT_CAP_SPEED; + boostedSpeed = SOFT_CAP_SPEED + excess * SOFT_CAP_DEGEN; + } + targetSpeed = boostedSpeed; + } + + double maxSpeed = Math.min(getEffectiveMaxSpeed(player), HARD_CAP_SPEED); + targetSpeed = Math.min(targetSpeed, maxSpeed); + targetSpeed = Math.max(targetSpeed, Math.min(currentSpeed, maxSpeed)); + + if (Math.abs(targetSpeed - currentSpeed) > 0.001 && currentSpeed > 0) { + double scale = targetSpeed / currentSpeed; + return new Vec3(motion.x * scale, motion.y, motion.z * scale); + } + return motion; + } + + private static Vec3 applyAirAcceleration(Player player, Vec3 motion) { + float forward = player.zza; + float strafe = player.xxa; + + if (Math.abs(forward) < 0.01 && Math.abs(strafe) < 0.01) { + return motion; + } + + float yaw = player.getYRot() * ((float) Math.PI / 180f); + + double wishX = -Math.sin(yaw) * forward + Math.cos(yaw) * strafe; + double wishZ = Math.cos(yaw) * forward + Math.sin(yaw) * strafe; + + double wishLength = Math.sqrt(wishX * wishX + wishZ * wishZ); + if (wishLength > 0.01) { + wishX /= wishLength; + wishZ /= wishLength; + } else { + return motion; + } + + double currentWishSpeed = motion.x * wishX + motion.z * wishZ; + double addSpeed = AIR_WISH_SPEED - currentWishSpeed; + + if (addSpeed <= 0) { + return motion; + } + + double accelSpeed = AIR_ACCELERATE * 0.05 * AIR_WISH_SPEED; + accelSpeed = Math.min(accelSpeed, addSpeed); + + double currentSpeed = Math.sqrt(motion.x * motion.x + motion.z * motion.z); + if (currentSpeed > SOFT_CAP_SPEED) { + accelSpeed *= SOFT_CAP_DEGEN; + } + + double newX = motion.x + accelSpeed * wishX; + double newZ = motion.z + accelSpeed * wishZ; + + double newSpeed = Math.sqrt(newX * newX + newZ * newZ); + if (newSpeed > HARD_CAP_SPEED) { + double scale = HARD_CAP_SPEED / newSpeed; + newX *= scale; + newZ *= scale; + } + + return new Vec3(newX, motion.y, newZ); + } + + private static Vec3 applyTrimp(Player player, Vec3 motion, double currentSpeed) { + if (currentSpeed <= VANILLA_SPRINT_SPEED) { + return motion; + } + + double speedBonus = Math.min((currentSpeed / VANILLA_SPRINT_SPEED - 1.0) * 0.5, 1.0); + double horizontalReduction = 1.0 / TRIMP_MULTIPLIER; + double verticalBoost = speedBonus * currentSpeed * TRIMP_MULTIPLIER; + + spawnBhopParticles(player, 8); + + return new Vec3( + motion.x * horizontalReduction, + motion.y + verticalBoost, + motion.z * horizontalReduction); + } + + private static Vec3 applyHardCap(Vec3 motion, double currentSpeed) { + double scale = HARD_CAP_SPEED / currentSpeed; + return new Vec3(motion.x * scale, motion.y, motion.z * scale); + } + + private static double getHorizontalSpeed(Vec3 motion) { + return Math.sqrt(motion.x * motion.x + motion.z * motion.z); + } + + private static double getEffectiveMaxSpeed(Player player) { + ItemStack boots = player.getItemBySlot(EquipmentSlot.FEET); + if (!boots.isEmpty() && boots.getItem() instanceof ArmorComponentItem armorItem) { + if (armorItem.getArmorLogic() instanceof ICosmicBoots cosmicBoots) { + double bootSpeed = cosmicBoots.getEffectiveMaxSpeed(boots); + if (bootSpeed > 0) { + return Math.min(bootSpeed, HARD_CAP_SPEED); + } + } + } + return HARD_CAP_SPEED; + } + + @OnlyIn(Dist.CLIENT) + private static void spawnBhopParticles(Player player, int count) { + if (count < 1) return; + + int x = Mth.floor(player.getX()); + int y = Mth.floor(player.getY() - 0.2); + int z = Mth.floor(player.getZ()); + + var blockState = player.level().getBlockState(new BlockPos(x, y, z)); + if (blockState.getRenderShape() != RenderShape.INVISIBLE) { + for (int i = 0; i < count; i++) { + double px = player.getX() + (player.getRandom().nextFloat() - 0.5) * player.getBbWidth(); + double pz = player.getZ() + (player.getRandom().nextFloat() - 0.5) * player.getBbWidth(); + double py = player.getBoundingBox().minY + 0.1; + + Vec3 vel = player.getDeltaMovement(); + player.level().addParticle( + new BlockParticleOption(ParticleTypes.BLOCK, blockState), + px, py, pz, -vel.x * 4.0, 1.5, -vel.z); + } + } + } + + private static void displayDebugHud(Player player, boolean onGround) { + double speed = getHorizontalSpeed(player.getDeltaMovement()); + if (speed > sessionMaxSpeed) { + sessionMaxSpeed = speed; + } + + StringBuilder status = new StringBuilder(); + ChatFormatting speedColor = getSpeedColor(speed); + String speedMultiple = String.format("%.1fx", speed / VANILLA_SPRINT_SPEED); + + boolean recentBhop = (player.tickCount - lastBhopTick) < 20; + boolean recentStrafe = (player.tickCount - lastStrafeTick) < 10; + boolean recentTrimp = (player.tickCount - lastTrimpTick) < 20; + + if (recentTrimp) status.append("§d[TRIMP!] "); + if (recentBhop) status.append("§a[BHOP!] "); + if (recentStrafe && !onGround) status.append("§b[STRAFE] "); + + if (CelesteDashHandler.isDashing(player)) { + status.append("§c[DASHING] "); + } else if (CelesteDashHandler.canDashNow(player)) { + status.append("§e[DASH OK] "); + } else { + status.append("§7[DASH CD] "); + } + + status.append(speedColor.toString()); + status.append(String.format("%.2f b/t (%s)", speed, speedMultiple)); + + if (sessionMaxSpeed > VANILLA_SPRINT_JUMP_SPEED) { + status.append(String.format(" §7| Max: §d%.2f", sessionMaxSpeed)); + } + + status.append(onGround ? " §7[G]" : " §e[AIR]"); + + float fwd = player.zza; + float strafe = player.xxa; + if (Math.abs(fwd) > 0.01 || Math.abs(strafe) > 0.01) { + status.append(String.format(" §8[%.1f/%.1f]", fwd, strafe)); + } + + player.displayClientMessage(Component.literal(status.toString()), true); + } + + public static void removePlayer(UUID uuid) { + wasOnGround.remove(uuid); + airTime.remove(uuid); + wasJumping.remove(uuid); + CelesteDashHandler.removePlayer(uuid); + } + + private static ChatFormatting getSpeedColor(double speed) { + if (speed >= 1.5) return ChatFormatting.LIGHT_PURPLE; + if (speed >= 1.0) return ChatFormatting.RED; + if (speed >= 0.6) return ChatFormatting.YELLOW; + if (speed >= VANILLA_SPRINT_SPEED) return ChatFormatting.GREEN; + return ChatFormatting.GRAY; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/ReachBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/ReachBargain.java new file mode 100644 index 000000000..b2acf1b0c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/ReachBargain.java @@ -0,0 +1,120 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainCategory; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.ai.attributes.Attributes; + +import java.util.List; + +public class ReachBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("reach"); + public static final ReachBargain INSTANCE = new ReachBargain(); + private static final String BARGAIN_ID = "reach"; + private static final ResourceLocation REACH_MODIFIER_ID = CosmicCore.id("reflection_block_reach"); + private static final ResourceLocation ATTACK_MODIFIER_ID = CosmicCore.id("reflection_entity_reach"); + + private ReachBargain() { + super( + ID, + BargainTier.MID, + BargainCategory.OFFENSE, + 64, // shardCost + 25, // weight + 100 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("further", ReflectionLang.answerText(BARGAIN_ID, "further"), + ReflectionLang.answerResponse(BARGAIN_ID, "further")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "further", 0), + ReflectionLang.answerPower(BARGAIN_ID, "further", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "further", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "further", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (!answer.id().equals("refuse")) { + applyReachBoost(player); + } + } + + @Override + public void onDefy(Player player) { + removeReachBoost(player); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("longArms", "The soul's arms extend slightly too far, joints in wrong places"); + } + + public static void applyReachBoost(Player player) { + var reachAttr = player.getAttribute(Attributes.BLOCK_INTERACTION_RANGE); + if (reachAttr != null) { + reachAttr.removeModifier(REACH_MODIFIER_ID); + reachAttr.addPermanentModifier(new AttributeModifier( + REACH_MODIFIER_ID, 2.0, AttributeModifier.Operation.ADD_VALUE)); + } + + var attackAttr = player.getAttribute(Attributes.ENTITY_INTERACTION_RANGE); + if (attackAttr != null) { + attackAttr.removeModifier(ATTACK_MODIFIER_ID); + attackAttr.addPermanentModifier(new AttributeModifier( + ATTACK_MODIFIER_ID, 2.0, AttributeModifier.Operation.ADD_VALUE)); + } + } + + public static void removeReachBoost(Player player) { + var reachAttr = player.getAttribute(Attributes.BLOCK_INTERACTION_RANGE); + if (reachAttr != null) { + reachAttr.removeModifier(REACH_MODIFIER_ID); + } + + var attackAttr = player.getAttribute(Attributes.ENTITY_INTERACTION_RANGE); + if (attackAttr != null) { + attackAttr.removeModifier(ATTACK_MODIFIER_ID); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/StepAssistBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/StepAssistBargain.java new file mode 100644 index 000000000..bb4df64f4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/StepAssistBargain.java @@ -0,0 +1,106 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainCategory; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.entity.ai.attributes.Attributes; + +import java.util.List; + +public class StepAssistBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("stride"); + public static final StepAssistBargain INSTANCE = new StepAssistBargain(); + private static final String BARGAIN_ID = "stride"; + private static final ResourceLocation MODIFIER_ID = CosmicCore.id("reflection_stride"); + + private StepAssistBargain() { + super( + ID, + BargainTier.EARLY, + BargainCategory.MOBILITY, + 16, // shardCost - cheap starter + 10, // weight + 50 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("accept", ReflectionLang.answerText(BARGAIN_ID, "accept"), + ReflectionLang.answerResponse(BARGAIN_ID, "accept")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "accept", 0), + ReflectionLang.answerPower(BARGAIN_ID, "accept", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 0))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (!answer.id().equals("refuse")) { + applyStepAssist(player); + } + } + + @Override + public void onDefy(Player player) { + removeStepAssist(player); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("tallLegs", "The soul's legs appear slightly elongated"); + } + + public static void applyStepAssist(Player player) { + var attribute = player.getAttribute(Attributes.STEP_HEIGHT); + if (attribute != null) { + attribute.removeModifier(MODIFIER_ID); + attribute.addPermanentModifier(new AttributeModifier( + MODIFIER_ID, 1.0, AttributeModifier.Operation.ADD_VALUE)); + } + } + + public static void removeStepAssist(Player player) { + var attribute = player.getAttribute(Attributes.STEP_HEIGHT); + if (attribute != null) { + attribute.removeModifier(MODIFIER_ID); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/StrengthBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/StrengthBargain.java new file mode 100644 index 000000000..368f64590 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/StrengthBargain.java @@ -0,0 +1,132 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainCategory; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.damagesource.DamageSource; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.monster.Monster; +import net.minecraft.world.entity.player.Player; + +import java.util.List; + +public class StrengthBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("violence"); + public static final StrengthBargain INSTANCE = new StrengthBargain(); + private static final String BARGAIN_ID = "violence"; + private static final ResourceLocation MODIFIER_ID = CosmicCore.id("reflection_strength"); + + public static final float MOB_DAMAGE_MULTIPLIER = 1.25f; + + private StrengthBargain() { + super( + ID, + BargainTier.EARLY_MID, + BargainCategory.OFFENSE, + 64, // shardCost + 25, // weight + 100 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3), + ReflectionLang.bargainDialogue(BARGAIN_ID, 4)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("accept", ReflectionLang.answerText(BARGAIN_ID, "accept"), + ReflectionLang.answerResponse(BARGAIN_ID, "accept")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "accept", 0), + ReflectionLang.answerPower(BARGAIN_ID, "accept", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (!answer.id().equals("refuse")) { + applyStrengthBoost(player); + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + removeStrengthBoost(player); + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("claws", "The soul's hands end in dark, sharp points, surrounded by hostile energy"); + } + + public static void applyStrengthBoost(Player player) { + var attribute = player.getAttribute(Attributes.ATTACK_DAMAGE); + if (attribute != null) { + attribute.removeModifier(MODIFIER_ID); + attribute.addPermanentModifier(new AttributeModifier( + MODIFIER_ID, 4.0, AttributeModifier.Operation.ADD_VALUE)); + } + } + + public static void removeStrengthBoost(Player player) { + var attribute = player.getAttribute(Attributes.ATTACK_DAMAGE); + if (attribute != null) { + attribute.removeModifier(MODIFIER_ID); + } + } + + public static boolean hasBargain(Player player) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.hasBargain(ID)) + .orElse(false); + } + + public static float modifyMobDamage(Player player, float originalDamage) { + if (hasBargain(player)) { + return originalDamage * MOB_DAMAGE_MULTIPLIER; + } + return originalDamage; + } + + public static boolean isMobDamage(DamageSource source) { + return source.getEntity() instanceof Monster; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/SwiftnessBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/SwiftnessBargain.java new file mode 100644 index 000000000..98b118db8 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/SwiftnessBargain.java @@ -0,0 +1,110 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.AffinityHelper; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainCategory; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.ai.attributes.AttributeModifier; +import net.minecraft.world.entity.ai.attributes.Attributes; +import net.minecraft.world.entity.player.Player; + +import java.util.List; + +public class SwiftnessBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("swiftness"); + public static final SwiftnessBargain INSTANCE = new SwiftnessBargain(); + private static final String BARGAIN_ID = "swiftness"; + private static final ResourceLocation MODIFIER_ID = CosmicCore.id("reflection_swiftness"); + + private SwiftnessBargain() { + super( + ID, + BargainTier.EARLY, + BargainCategory.MOBILITY, + 16, // shardCost - cheap starter + 10, // weight + 50 // erosion + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("accept", ReflectionLang.answerText(BARGAIN_ID, "accept"), + ReflectionLang.answerResponse(BARGAIN_ID, "accept")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "accept", 0), + ReflectionLang.answerPower(BARGAIN_ID, "accept", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "accept", 0))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (!answer.id().equals("refuse")) { + applySpeedBoost(player); + } + } + + @Override + public void onDefy(Player player) { + removeSpeedBoost(player); + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("blur", "The soul's legs appear slightly blurred, always in motion"); + } + + public static void applySpeedBoost(Player player) { + var attribute = player.getAttribute(Attributes.MOVEMENT_SPEED); + if (attribute != null) { + attribute.removeModifier(MODIFIER_ID); + // Base: 20% speed boost, modified by soul shape affinity + float baseBoost = 0.2f; + float affinity = AffinityHelper.getMultiplier(player, BargainCategory.MOBILITY); + float actualBoost = baseBoost * affinity; + attribute.addPermanentModifier(new AttributeModifier( + MODIFIER_ID, actualBoost, AttributeModifier.Operation.ADD_MULTIPLIED_TOTAL)); + } + } + + public static void removeSpeedBoost(Player player) { + var attribute = player.getAttribute(Attributes.MOVEMENT_SPEED); + if (attribute != null) { + attribute.removeModifier(MODIFIER_ID); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/VoidResistanceBargain.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/VoidResistanceBargain.java new file mode 100644 index 000000000..fbd421c55 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/bargain/impl/VoidResistanceBargain.java @@ -0,0 +1,152 @@ +package com.ghostipedia.cosmiccore.common.reflection.bargain.impl; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainCategory; + +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; + +import java.util.List; + +public class VoidResistanceBargain extends Bargain { + + public static final ResourceLocation ID = CosmicCore.id("void_anchor"); + public static final VoidResistanceBargain INSTANCE = new VoidResistanceBargain(); + private static final String BARGAIN_ID = "void_anchor"; + + public static final int BASE_VOID_SAVE_COST = 10; + public static final int MAX_VOID_SAVE_COST = 160; + + private VoidResistanceBargain() { + super( + ID, + BargainTier.LATE, + BargainCategory.DEATH, + 0, // shardCost - FREE in shards, but massive commitment + 75, // weight - takes up most of your soul capacity + 500 // erosion - huge transformation + ); + } + + @Override + public Component getName() { + return ReflectionLang.bargainName(BARGAIN_ID); + } + + @Override + public Component getDescription() { + return ReflectionLang.bargainDescription(BARGAIN_ID); + } + + @Override + public List getOfferDialogue(Player player) { + return List.of( + ReflectionLang.bargainDialogue(BARGAIN_ID, 0), + ReflectionLang.bargainDialogue(BARGAIN_ID, 1), + ReflectionLang.bargainDialogue(BARGAIN_ID, 2), + ReflectionLang.bargainDialogue(BARGAIN_ID, 3), + ReflectionLang.bargainDialogue(BARGAIN_ID, 4), + ReflectionLang.bargainDialogue(BARGAIN_ID, 5)); + } + + @Override + public Component getQuestion() { + return ReflectionLang.bargainQuestion(BARGAIN_ID); + } + + @Override + public List getAnswers() { + return List.of( + new BargainAnswer("anchor", ReflectionLang.answerText(BARGAIN_ID, "anchor"), + ReflectionLang.answerResponse(BARGAIN_ID, "anchor")) + .withDetails( + List.of( + ReflectionLang.answerPower(BARGAIN_ID, "anchor", 0), + ReflectionLang.answerPower(BARGAIN_ID, "anchor", 1)), + List.of( + ReflectionLang.answerDrawback(BARGAIN_ID, "anchor", 0), + ReflectionLang.answerDrawback(BARGAIN_ID, "anchor", 1))), + new BargainAnswer("refuse", ReflectionLang.answerText(BARGAIN_ID, "refuse"), + ReflectionLang.answerResponse(BARGAIN_ID, "refuse")) + .withReducedPower()); + } + + @Override + public void onAccept(Player player, BargainAnswer answer) { + if (!answer.id().equals("refuse")) { + ReflectionCapability.get(player).ifPresent(reflection -> reflection.resetVoidSaveCount()); + player.displayClientMessage(ReflectionLang.bargainOnAccept(BARGAIN_ID), false); + } + } + + @Override + public void onDefy(Player player) { + ReflectionCapability.get(player).ifPresent(reflection -> reflection.resetVoidSaveCount()); + player.displayClientMessage(ReflectionLang.bargainOnDefy(BARGAIN_ID), false); + } + + @Override + public void tick(Player player) { + if (player.getY() < -128 && !player.isCreative() && !player.isSpectator()) { + if (!(player instanceof ServerPlayer)) return; + + ReflectionCapability.get(player).ifPresent(reflection -> { + int saveCount = reflection.getVoidSaveCount(); + int cost = Math.min(MAX_VOID_SAVE_COST, BASE_VOID_SAVE_COST * (1 << saveCount)); + + double x = player.getX(); + double z = player.getZ(); + double y = player.level().getHeight(net.minecraft.world.level.levelgen.Heightmap.Types.MOTION_BLOCKING, + (int) x, (int) z) + 1; + + player.teleportTo(x, y, z); + reflection.addErosion(cost); + reflection.incrementVoidSaveCount(); + + if (cost <= 20) { + player.displayClientMessage( + Component.literal( + "\u00A75\u00A7o*The void rejects you. Not yet, it whispers. [Erosion +" + cost + + "]*"), + true); + } else if (cost <= 80) { + player.displayClientMessage( + Component + .literal("\u00A75\u00A7o*The anchor strains. The void's grip tightens. [Erosion +" + + cost + "]*"), + true); + } else { + player.displayClientMessage( + Component.literal( + "\u00A74\u00A7o*The price is almost too high. The void is patient. It will have you eventually. [Erosion +" + + cost + "]*"), + true); + } + }); + } + } + + @Override + public BargainVisual getSoulVisual() { + return BargainVisual.of("anchored", + "A dark chain extends from the soul downward, links multiplying with each save"); + } + + public static int getCurrentCost(Player player) { + return ReflectionCapability.get(player).map(reflection -> { + int saveCount = reflection.getVoidSaveCount(); + return Math.min(MAX_VOID_SAVE_COST, BASE_VOID_SAVE_COST * (1 << saveCount)); + }).orElse(BASE_VOID_SAVE_COST); + } + + public static int getSaveCount(Player player) { + return ReflectionCapability.get(player) + .map(reflection -> reflection.getVoidSaveCount()) + .orElse(0); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/CapacityShardBehavior.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/CapacityShardBehavior.java new file mode 100644 index 000000000..f69678bc9 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/CapacityShardBehavior.java @@ -0,0 +1,81 @@ +package com.ghostipedia.cosmiccore.common.reflection.item; + +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; + +import com.gregtechceu.gtceu.api.item.component.IAddInformation; +import com.gregtechceu.gtceu.api.item.component.IInteractionItem; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; + +import java.util.List; + +/** + * Behavior for Large Shards of Perpetuity - consume to expand soul capacity. + */ +public class CapacityShardBehavior implements IInteractionItem, IAddInformation { + + private final int capacityGain; + + public CapacityShardBehavior(int capacityGain) { + this.capacityGain = capacityGain; + } + + @Override + public InteractionResultHolder use(ItemStack item, Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (level.isClientSide()) { + return InteractionResultHolder.success(stack); + } + + return ReflectionCapability.get(player).map(reflection -> { + if (!reflection.hasAwakened()) { + player.displayClientMessage( + Component + .literal( + "The shard feels... dormant. Perhaps after you've seen yourself in the mirror.") + .withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC), + true); + return InteractionResultHolder.fail(stack); + } + + int count = player.isCrouching() ? stack.getCount() : 1; + int gained = count * capacityGain; + int oldCapacity = reflection.getBaseCapacity(); + + reflection.setBaseCapacity(oldCapacity + gained); + stack.shrink(count); + + player.displayClientMessage( + Component.literal("Soul expanded: " + oldCapacity + " \u2192 " + (oldCapacity + gained)) + .withStyle(ChatFormatting.LIGHT_PURPLE), + true); + + level.playSound(null, player.blockPosition(), + SoundEvents.BEACON_POWER_SELECT, SoundSource.PLAYERS, 0.6f, 0.9f); + + return InteractionResultHolder.consume(stack); + }).orElse(InteractionResultHolder.fail(stack)); + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltip, + TooltipFlag flag) { + tooltip.add(Component.literal("Right-click to expand soul capacity") + .withStyle(ChatFormatting.GRAY)); + tooltip.add(Component.literal("Shift+Right-click to consume entire stack") + .withStyle(ChatFormatting.DARK_GRAY)); + tooltip.add(Component.literal("+" + capacityGain + " capacity each") + .withStyle(ChatFormatting.LIGHT_PURPLE)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/MirrorItem.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/MirrorItem.java new file mode 100644 index 000000000..138a7d433 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/MirrorItem.java @@ -0,0 +1,82 @@ +package com.ghostipedia.cosmiccore.common.reflection.item; + +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ui.VoidUIPackets; + +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; + +import java.util.List; + +/** + * The Mirror - a handheld item that lets you face your Reflection. + * + * Right-click to gaze into the void and commune with your soul. + * The Reflection will offer bargains, show your erosion state, + * and speak to you about your journey. + * + * "It's just a mirror. Why does it feel like it's looking back?" + */ +public class MirrorItem extends Item { + + public MirrorItem(Properties properties) { + super(properties.stacksTo(1).rarity(Rarity.UNCOMMON)); + } + + @Override + public InteractionResultHolder use(Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (!level.isClientSide() && player instanceof ServerPlayer serverPlayer) { + // Check if the reflection has awakened + boolean awakened = ReflectionCapability.get(serverPlayer) + .map(r -> r.hasAwakened()) + .orElse(false); + + if (!awakened) { + // The mirror shows nothing yet + serverPlayer.displayClientMessage( + Component.literal("§7§oYou see only yourself. Nothing stirs within."), + true); + // Play subtle sound + level.playSound(null, player.blockPosition(), + SoundEvents.GLASS_HIT, SoundSource.PLAYERS, 0.5f, 0.8f); + } else { + // Open the mirror hub UI + VoidUIPackets.sendOpenHub(serverPlayer); + + // Play ominous sound + level.playSound(null, player.blockPosition(), + SoundEvents.AMBIENT_CAVE.value(), SoundSource.PLAYERS, 0.3f, 0.5f); + } + } + + // Cooldown to prevent spam + player.getCooldowns().addCooldown(this, 20); // 1 second + + return InteractionResultHolder.sidedSuccess(stack, level.isClientSide()); + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltip, + TooltipFlag flag) { + tooltip.add(Component.literal("§7A polished surface that reflects more than light.")); + tooltip.add(Component.literal("§8§oRight-click to gaze into the void.")); + } + + @Override + public boolean isFoil(ItemStack stack) { + // Enchanted glint when holding - looks mysterious + return true; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/ScarRemovalBehavior.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/ScarRemovalBehavior.java new file mode 100644 index 000000000..a03e12625 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/ScarRemovalBehavior.java @@ -0,0 +1,89 @@ +package com.ghostipedia.cosmiccore.common.reflection.item; + +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ui.ScarSelectionPackets; + +import com.gregtechceu.gtceu.api.item.component.IAddInformation; +import com.gregtechceu.gtceu.api.item.component.IInteractionItem; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; + +import java.util.List; +import java.util.Set; + +/** + * Behavior for Clusters of Perpetuity - used to remove defiance scars. + * When a bargain is defied, it leaves a scar preventing re-acceptance. + * Clusters can heal these scars, allowing the bargain to be taken again. + * + * Usage: Right-click opens a selection UI to choose which scar to mend. + */ +public class ScarRemovalBehavior implements IInteractionItem, IAddInformation { + + public ScarRemovalBehavior() {} + + @Override + public InteractionResultHolder use(ItemStack item, Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (level.isClientSide()) { + return InteractionResultHolder.success(stack); + } + + // Server-side only + if (!(player instanceof ServerPlayer serverPlayer)) { + return InteractionResultHolder.fail(stack); + } + + return ReflectionCapability.get(player).map(reflection -> { + if (!reflection.hasAwakened()) { + player.displayClientMessage( + Component.literal( + "The cluster feels... dormant. Perhaps after you've seen yourself in the mirror.") + .withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC), + true); + return InteractionResultHolder.fail(stack); + } + + Set scars = reflection.getDefianceScars(); + + if (scars.isEmpty()) { + player.displayClientMessage( + Component.literal("Your soul bears no scars to mend.") + .withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC), + true); + return InteractionResultHolder.fail(stack); + } + + // Open the scar selection UI + // The actual cluster consumption happens when the player selects a scar + ScarSelectionPackets.sendOpenScarSelection(serverPlayer, scars); + + return InteractionResultHolder.success(stack); + }).orElse(InteractionResultHolder.fail(stack)); + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltip, + TooltipFlag flag) { + tooltip.add(Component.literal("Right-click to mend a defiance scar") + .withStyle(ChatFormatting.GRAY)); + tooltip.add(Component.empty()); + tooltip.add(Component.literal("Scars mark bargains you've defied.") + .withStyle(ChatFormatting.DARK_PURPLE, ChatFormatting.ITALIC)); + tooltip.add(Component.literal("This cluster can heal one, letting you") + .withStyle(ChatFormatting.DARK_PURPLE, ChatFormatting.ITALIC)); + tooltip.add(Component.literal("accept that bargain once more.") + .withStyle(ChatFormatting.DARK_PURPLE, ChatFormatting.ITALIC)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/ShardConsumeBehavior.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/ShardConsumeBehavior.java new file mode 100644 index 000000000..d9e119db4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/ShardConsumeBehavior.java @@ -0,0 +1,94 @@ +package com.ghostipedia.cosmiccore.common.reflection.item; + +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; + +import com.gregtechceu.gtceu.api.item.component.IAddInformation; +import com.gregtechceu.gtceu.api.item.component.IInteractionItem; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResultHolder; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; + +import java.util.List; + +/** + * Behavior for Shards of Perpetuity - right-click to consume and add to soul shard balance. + * Used as currency for bargains in the Reflection system. + */ +public class ShardConsumeBehavior implements IInteractionItem, IAddInformation { + + private final int shardValue; + + /** + * @param shardValue How many shards this item is worth when consumed + */ + public ShardConsumeBehavior(int shardValue) { + this.shardValue = shardValue; + } + + @Override + public InteractionResultHolder use(ItemStack item, Level level, Player player, InteractionHand hand) { + ItemStack stack = player.getItemInHand(hand); + + if (level.isClientSide()) { + return InteractionResultHolder.success(stack); + } + + // Check if player has awakened (has the reflection capability active) + return ReflectionCapability.get(player).map(reflection -> { + if (!reflection.hasAwakened()) { + player.displayClientMessage( + Component + .literal( + "The shard feels... dormant. Perhaps after you've seen yourself in the mirror.") + .withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC), + true); + return InteractionResultHolder.fail(stack); + } + + // Calculate total shards to add (stack size * value) + int count = player.isCrouching() ? stack.getCount() : 1; + int totalShards = count * shardValue; + + // Add shards to balance + reflection.addShards(totalShards); + + // Consume items + stack.shrink(count); + + // Feedback + player.displayClientMessage( + Component.literal("+" + totalShards + " shards absorbed") + .withStyle(ChatFormatting.AQUA), + true); + + // Sound effect + level.playSound(null, player.blockPosition(), + SoundEvents.EXPERIENCE_ORB_PICKUP, SoundSource.PLAYERS, 0.5f, + 1.2f + (level.random.nextFloat() * 0.2f)); + + // Particle effect could be added here via packet + + return InteractionResultHolder.consume(stack); + }).orElse(InteractionResultHolder.fail(stack)); + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltip, + TooltipFlag flag) { + tooltip.add(Component.literal("Right-click to absorb into your soul") + .withStyle(ChatFormatting.GRAY)); + tooltip.add(Component.literal("Shift+Right-click to absorb entire stack") + .withStyle(ChatFormatting.DARK_GRAY)); + tooltip.add(Component.literal("Value: " + shardValue + " shard" + (shardValue > 1 ? "s" : "") + " each") + .withStyle(ChatFormatting.AQUA)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/SoulMutilatorItem.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/SoulMutilatorItem.java new file mode 100644 index 000000000..3f10fa294 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/item/SoulMutilatorItem.java @@ -0,0 +1,36 @@ +package com.ghostipedia.cosmiccore.common.reflection.item; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Rarity; +import net.minecraft.world.item.TooltipFlag; + +import java.util.List; + +/** + * Soul Mutilator - an item that allows players to shape their soul. + * Simply having this in your inventory enables soul shape selection in the Mirror of Erosion. + * Consumed when a soul shape is chosen. + */ +public class SoulMutilatorItem extends Item { + + public SoulMutilatorItem(Properties properties) { + super(properties.stacksTo(1).rarity(Rarity.EPIC)); + } + + @Override + public void appendHoverText(ItemStack stack, Item.TooltipContext context, List tooltip, + TooltipFlag flag) { + tooltip.add(Component.translatable("item.cosmiccore.soul_mutilator.tooltip") + .withStyle(ChatFormatting.GRAY)); + tooltip.add(Component.translatable("item.cosmiccore.soul_mutilator.tooltip.warning") + .withStyle(ChatFormatting.RED, ChatFormatting.ITALIC)); + } + + @Override + public boolean isFoil(ItemStack stack) { + return true; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/network/DashPacket.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/network/DashPacket.java new file mode 100644 index 000000000..2679b9b70 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/network/DashPacket.java @@ -0,0 +1,58 @@ +package com.ghostipedia.cosmiccore.common.reflection.network; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.CelesteDashHandler; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.QuakeMovementHandler; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.level.ServerPlayer; +import net.neoforged.neoforge.network.handling.IPayloadContext; + +import org.jetbrains.annotations.NotNull; + +public class DashPacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("dash")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(DashPacket::encode, DashPacket::new); + + private final float xRot; + private final float yRot; + private final float forwardInput; + private final float strafeInput; + + public DashPacket(float xRot, float yRot, float forwardInput, float strafeInput) { + this.xRot = xRot; + this.yRot = yRot; + this.forwardInput = forwardInput; + this.strafeInput = strafeInput; + } + + public DashPacket(FriendlyByteBuf buffer) { + this.xRot = buffer.readFloat(); + this.yRot = buffer.readFloat(); + this.forwardInput = buffer.readFloat(); + this.strafeInput = buffer.readFloat(); + } + + public void encode(FriendlyByteBuf buffer) { + buffer.writeFloat(xRot); + buffer.writeFloat(yRot); + buffer.writeFloat(forwardInput); + buffer.writeFloat(strafeInput); + } + + public void execute(IPayloadContext context) { + if (!(context.player() instanceof ServerPlayer player)) return; + if (!QuakeMovementHandler.hasQuakeMovement(player)) return; + + CelesteDashHandler.executeDashServer(player, xRot, yRot, forwardInput, strafeInput); + } + + @Override + public @NotNull Type type() { + return TYPE; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/network/SoulSuperPacket.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/network/SoulSuperPacket.java new file mode 100644 index 000000000..7e984ccfa --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/network/SoulSuperPacket.java @@ -0,0 +1,86 @@ +package com.ghostipedia.cosmiccore.common.reflection.network; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulShape; +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulSuper; +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulSuperRegistry; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.server.level.ServerPlayer; +import net.neoforged.neoforge.network.handling.IPayloadContext; + +import org.jetbrains.annotations.NotNull; + +public class SoulSuperPacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("soul_super")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(SoulSuperPacket::encode, SoulSuperPacket::new); + + public SoulSuperPacket() {} + + public SoulSuperPacket(FriendlyByteBuf buffer) {} + + public void encode(FriendlyByteBuf buffer) {} + + public void execute(IPayloadContext context) { + if (!(context.player() instanceof ServerPlayer player)) return; + + ReflectionCapability.get(player).ifPresent(reflection -> { + SoulShape shape = reflection.getSoulShape(); + + if (!shape.isShaped()) { + player.displayClientMessage( + Component.literal("§7§o*Your soul is unshaped. There is no power to call upon.*"), + true); + return; + } + + SoulSuper soulSuper = SoulSuperRegistry.get(shape).orElse(null); + if (soulSuper == null) { + CosmicCore.LOGGER.warn("No super registered for soul shape: {}", shape.getId()); + return; + } + + long currentTime = player.level().getGameTime(); + + if (reflection.isSuperActive(currentTime)) { + player.displayClientMessage( + Component.literal("§7§o*The power already courses through you.*"), + true); + return; + } + + if (!reflection.isSuperReady(currentTime, soulSuper.getCooldownTicks())) { + long remaining = reflection.getSuperCooldownRemaining(currentTime, soulSuper.getCooldownTicks()); + int secondsRemaining = (int) (remaining / 20); + player.displayClientMessage( + Component.literal("§7§o*" + secondsRemaining + "s until power returns.*"), + true); + return; + } + + if (!soulSuper.canActivate(player)) { + player.displayClientMessage( + Component.literal("§7§o*The conditions are not right.*"), + true); + return; + } + + soulSuper.activate(player); + reflection.setSuperCooldownStart(currentTime); + if (soulSuper.getDurationTicks() > 0) { + reflection.setSuperActiveUntil(currentTime + soulSuper.getDurationTicks()); + } + }); + } + + @Override + public @NotNull Type type() { + return TYPE; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/network/SyncQuakeMovementPacket.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/network/SyncQuakeMovementPacket.java new file mode 100644 index 000000000..7abba6a4a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/network/SyncQuakeMovementPacket.java @@ -0,0 +1,41 @@ +package com.ghostipedia.cosmiccore.common.reflection.network; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.QuakeMovementHandler; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.neoforged.neoforge.network.handling.IPayloadContext; + +import org.jetbrains.annotations.NotNull; + +public class SyncQuakeMovementPacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("sync_quake_movement")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(SyncQuakeMovementPacket::encode, SyncQuakeMovementPacket::new); + + private final boolean hasQuakeMovement; + + public SyncQuakeMovementPacket(boolean hasQuakeMovement) { + this.hasQuakeMovement = hasQuakeMovement; + } + + public SyncQuakeMovementPacket(FriendlyByteBuf buffer) { + this.hasQuakeMovement = buffer.readBoolean(); + } + + public void encode(FriendlyByteBuf buffer) { + buffer.writeBoolean(hasQuakeMovement); + } + + public void execute(IPayloadContext context) { + QuakeMovementHandler.setClientHasQuakeMovement(hasQuakeMovement); + } + + @Override + public @NotNull Type type() { + return TYPE; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/SoulShape.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/SoulShape.java new file mode 100644 index 000000000..8edef8083 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/SoulShape.java @@ -0,0 +1,159 @@ +package com.ghostipedia.cosmiccore.common.reflection.soul; + +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainCategory; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; + +import java.util.Set; + +/** + * Soul Shapes - fundamental forms your soul can take. + * Each shape defines playstyle identity with a Super, affinities, and curses. + * + * Affinity system: + * - Empowered categories get 50% bonus effect + * - Cursed categories get 50% penalty + * - Neutral categories get no modifier + */ +public enum SoulShape { + + UNSHAPED("unshaped", ChatFormatting.GRAY, + Set.of(), + Set.of()), + REVENANT("revenant", ChatFormatting.DARK_RED, + Set.of(BargainCategory.DEATH), + Set.of()), + HOLLOW("hollow", ChatFormatting.DARK_PURPLE, + Set.of(BargainCategory.SUSTENANCE), + Set.of()), + ENGINE("engine", ChatFormatting.GOLD, + Set.of(BargainCategory.UTILITY), + Set.of()), + GLOBEDANCER("globedancer", ChatFormatting.AQUA, + Set.of(BargainCategory.MOBILITY), + Set.of(BargainCategory.DEFENSE)), + BULWARK("bulwark", ChatFormatting.DARK_GRAY, + Set.of(BargainCategory.DEFENSE), + Set.of(BargainCategory.MOBILITY)), + BLOODTHIRST("bloodthirst", ChatFormatting.RED, + Set.of(BargainCategory.OFFENSE), + Set.of(BargainCategory.DEFENSE)); + + private final String id; + private final ChatFormatting color; + private final Set empoweredCategories; + private final Set cursedCategories; + + SoulShape(String id, ChatFormatting color, Set empowered, Set cursed) { + this.id = id; + this.color = color; + this.empoweredCategories = empowered; + this.cursedCategories = cursed; + } + + public String getId() { + return id; + } + + public ChatFormatting getColor() { + return color; + } + + public String getNameKey() { + return "cosmiccore.soul_shape." + id + ".name"; + } + + public String getTaglineKey() { + return "cosmiccore.soul_shape." + id + ".tagline"; + } + + public String getDescriptionKey() { + return "cosmiccore.soul_shape." + id + ".description"; + } + + public String getSuperNameKey() { + return "cosmiccore.soul_shape." + id + ".super.name"; + } + + public String getSuperDescriptionKey() { + return "cosmiccore.soul_shape." + id + ".super.description"; + } + + public MutableComponent getFormattedName() { + return Component.translatable(getNameKey()).withStyle(color); + } + + public MutableComponent getFormattedTagline() { + return Component.translatable(getTaglineKey()).withStyle(ChatFormatting.ITALIC, ChatFormatting.GRAY); + } + + public MutableComponent getDescription() { + return Component.translatable(getDescriptionKey()); + } + + public MutableComponent getSuperName() { + return Component.translatable(getSuperNameKey()).withStyle(color); + } + + public MutableComponent getSuperDescription() { + return Component.translatable(getSuperDescriptionKey()); + } + + public static SoulShape fromId(String id) { + for (SoulShape shape : values()) { + if (shape.id.equals(id)) { + return shape; + } + } + return UNSHAPED; + } + + public boolean isShaped() { + return this != UNSHAPED; + } + + /** + * @return categories this shape empowers (50% bonus) + */ + public Set getEmpoweredCategories() { + return empoweredCategories; + } + + /** + * @return categories this shape curses (50% penalty) + */ + public Set getCursedCategories() { + return cursedCategories; + } + + /** + * Check if this shape empowers a category. + */ + public boolean empowers(BargainCategory category) { + return empoweredCategories.contains(category); + } + + /** + * Check if this shape curses a category. + */ + public boolean curses(BargainCategory category) { + return cursedCategories.contains(category); + } + + /** + * Get the affinity multiplier for a bargain category. + * + * @return 1.5 if empowered, 0.5 if cursed, 1.0 otherwise + */ + public float getAffinityMultiplier(BargainCategory category) { + if (empoweredCategories.contains(category)) { + return 1.5f; + } + if (cursedCategories.contains(category)) { + return 0.5f; + } + return 1.0f; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/SoulSuper.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/SoulSuper.java new file mode 100644 index 000000000..a9e1cef31 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/SoulSuper.java @@ -0,0 +1,91 @@ +package com.ghostipedia.cosmiccore.common.reflection.soul; + +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; + +/** + * Base class for Soul Shape super abilities. + * Each Soul Shape has one powerful active ability with a long cooldown. + */ +public abstract class SoulSuper { + + private final SoulShape shape; + private final int cooldownTicks; + + protected SoulSuper(SoulShape shape, int cooldownTicks) { + this.shape = shape; + this.cooldownTicks = cooldownTicks; + } + + /** + * @return the soul shape this super belongs to + */ + public SoulShape getShape() { + return shape; + } + + /** + * @return cooldown in ticks + */ + public int getCooldownTicks() { + return cooldownTicks; + } + + /** + * @return cooldown in seconds for display + */ + public int getCooldownSeconds() { + return cooldownTicks / 20; + } + + /** + * @return translated name of this super ability + */ + public Component getName() { + return shape.getSuperName(); + } + + /** + * @return translated description of this super ability + */ + public Component getDescription() { + return shape.getSuperDescription(); + } + + /** + * Check if this super can be activated. + * Override for custom conditions beyond cooldown. + */ + public boolean canActivate(ServerPlayer player) { + return true; + } + + /** + * Activate the super ability. + * Called when player presses the super key and cooldown is ready. + */ + public abstract void activate(ServerPlayer player); + + /** + * Called every tick while the super effect is active. + * Override for supers with duration-based effects. + */ + public void tick(ServerPlayer player) { + // Default: no tick behavior + } + + /** + * Called when the super effect ends. + * Override for cleanup when duration expires. + */ + public void onEnd(ServerPlayer player) { + // Default: no cleanup + } + + /** + * @return duration of the super effect in ticks, or 0 if instant + */ + public int getDurationTicks() { + return 0; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/SoulSuperRegistry.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/SoulSuperRegistry.java new file mode 100644 index 000000000..4bff06a4f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/SoulSuperRegistry.java @@ -0,0 +1,37 @@ +package com.ghostipedia.cosmiccore.common.reflection.soul; + +import com.ghostipedia.cosmiccore.common.reflection.soul.impl.*; + +import java.util.EnumMap; +import java.util.Map; +import java.util.Optional; + +/** + * Registry for Soul Shape super abilities. + */ +public final class SoulSuperRegistry { + + private SoulSuperRegistry() {} + + private static final Map SUPERS = new EnumMap<>(SoulShape.class); + + static { + register(new DefySuper()); + register(new DevourSuper()); + register(new OverclockSuper()); + register(new SlipstreamSuper()); + register(new LastStandSuper()); + register(new RipAndTearSuper()); + } + + private static void register(SoulSuper soulSuper) { + SUPERS.put(soulSuper.getShape(), soulSuper); + } + + /** + * Get the super ability for a soul shape. + */ + public static Optional get(SoulShape shape) { + return Optional.ofNullable(SUPERS.get(shape)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/impl/DefySuper.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/impl/DefySuper.java new file mode 100644 index 000000000..1c9254854 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/impl/DefySuper.java @@ -0,0 +1,66 @@ +package com.ghostipedia.cosmiccore.common.reflection.soul.impl; + +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulShape; +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulSuper; + +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; + +/** + * REVENANT Super: Defy + * When you would die, you don't. Enter a fury state with massive lifesteal. + * Must heal to full HP or die for real when the window expires. + */ +public class DefySuper extends SoulSuper { + + private static final int COOLDOWN = 20 * 60 * 10; // 10 minutes + private static final int DURATION = 20 * 20; // 20 seconds + private static final float LIFESTEAL = 0.5f; + + public DefySuper() { + super(SoulShape.REVENANT, COOLDOWN); + } + + @Override + public int getDurationTicks() { + return DURATION; + } + + @Override + public void activate(ServerPlayer player) { + // Fury state: strength, speed, resistance + player.addEffect(new MobEffectInstance(MobEffects.DAMAGE_BOOST, DURATION, 2, true, true, true)); + player.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SPEED, DURATION, 1, true, true, true)); + player.addEffect(new MobEffectInstance(MobEffects.DAMAGE_RESISTANCE, DURATION, 1, true, true, true)); + + player.displayClientMessage( + Component.literal("\u00A74\u00A7l*NOT YET.*"), + true); + } + + @Override + public void tick(ServerPlayer player) { + // Lifesteal is handled in damage event handler + } + + @Override + public void onEnd(ServerPlayer player) { + // If not at full health when fury ends, die + if (player.getHealth() < player.getMaxHealth()) { + player.displayClientMessage( + Component.literal("\u00A74\u00A7o*The borrowed time runs out...*"), + true); + player.hurt(player.damageSources().magic(), Float.MAX_VALUE); + } else { + player.displayClientMessage( + Component.literal("\u00A77\u00A7o*You have earned your second chance.*"), + true); + } + } + + public static float getLifesteal() { + return LIFESTEAL; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/impl/DevourSuper.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/impl/DevourSuper.java new file mode 100644 index 000000000..9d8dbe8f7 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/impl/DevourSuper.java @@ -0,0 +1,75 @@ +package com.ghostipedia.cosmiccore.common.reflection.soul.impl; + +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulShape; +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulSuper; + +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.phys.AABB; + +import java.util.List; + +/** + * HOLLOW Super: Devour + * Consume an entity whole. Gain permanent Nourishment buff and leech a stat. + */ +public class DevourSuper extends SoulSuper { + + private static final int COOLDOWN = 20 * 60 * 3; // 3 minutes + private static final double DEVOUR_RANGE = 5.0; + + public DevourSuper() { + super(SoulShape.HOLLOW, COOLDOWN); + } + + @Override + public void activate(ServerPlayer player) { + // Find nearest non-player entity + AABB range = player.getBoundingBox().inflate(DEVOUR_RANGE); + List targets = player.level().getEntitiesOfClass( + LivingEntity.class, + range, + e -> e != player && e.isAlive() && !e.isInvulnerable()); + + if (targets.isEmpty()) { + player.displayClientMessage( + Component.literal("\u00A75\u00A7o*There is nothing to devour...*"), + true); + return; + } + + // Devour the nearest + LivingEntity target = targets.get(0); + double closestDist = player.distanceToSqr(target); + for (LivingEntity e : targets) { + double dist = player.distanceToSqr(e); + if (dist < closestDist) { + closestDist = dist; + target = e; + } + } + + // Kill target instantly + String victimName = target.getName().getString(); + target.kill(); + + // Grant permanent saturation effect (Farmer's Delight Nourishment equivalent) + // Since we may not have Farmer's Delight, use saturation + regeneration + player.addEffect(new MobEffectInstance(MobEffects.SATURATION, 20 * 60, 0, true, false, true)); + + // Grant a temporary stat boost based on target max health + float targetHealth = target.getMaxHealth(); + if (targetHealth > 40) { + player.addEffect(new MobEffectInstance(MobEffects.DAMAGE_BOOST, 20 * 120, 1, true, true, true)); + } else if (targetHealth > 20) { + player.addEffect(new MobEffectInstance(MobEffects.DAMAGE_BOOST, 20 * 60, 0, true, true, true)); + } + + player.displayClientMessage( + Component.literal("\u00A75\u00A7l*You consume " + victimName + " whole.*"), + true); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/impl/LastStandSuper.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/impl/LastStandSuper.java new file mode 100644 index 000000000..289dd5a9a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/impl/LastStandSuper.java @@ -0,0 +1,75 @@ +package com.ghostipedia.cosmiccore.common.reflection.soul.impl; + +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulShape; +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulSuper; + +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.phys.AABB; + +import java.util.List; + +/** + * BULWARK Super: Last Stand + * Plant yourself - you cannot move. Emit a damaging aura. + * Take massively reduced damage. Enemies that hit you take reflect damage. + * YOU are the hazard. + */ +public class LastStandSuper extends SoulSuper { + + private static final int COOLDOWN = 20 * 60 * 5; // 5 minutes + private static final int DURATION = 20 * 30; // 30 seconds + private static final double AURA_RADIUS = 4.0; + private static final float AURA_DAMAGE = 2.0f; + + public LastStandSuper() { + super(SoulShape.BULWARK, COOLDOWN); + } + + @Override + public int getDurationTicks() { + return DURATION; + } + + @Override + public void activate(ServerPlayer player) { + // Massive resistance, slowness to lock in place + player.addEffect(new MobEffectInstance(MobEffects.DAMAGE_RESISTANCE, DURATION, 3, true, true, true)); + player.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, DURATION, 10, true, true, true)); + player.addEffect(new MobEffectInstance(MobEffects.FIRE_RESISTANCE, DURATION, 0, true, true, true)); + + player.displayClientMessage( + Component.literal("\u00A78\u00A7l*I. WILL. NOT. MOVE.*"), + true); + } + + @Override + public void tick(ServerPlayer player) { + // Damage aura + if (player.level().getGameTime() % 20 == 0) { + AABB aura = player.getBoundingBox().inflate(AURA_RADIUS); + List nearby = player.level().getEntitiesOfClass( + LivingEntity.class, + aura, + e -> e != player && e.isAlive()); + + for (LivingEntity entity : nearby) { + entity.hurt(player.damageSources().magic(), AURA_DAMAGE); + } + } + } + + @Override + public void onEnd(ServerPlayer player) { + player.displayClientMessage( + Component.literal("\u00A77\u00A7o*The ground remembers your stand.*"), + true); + } + + public static float getReflectDamageMultiplier() { + return 0.5f; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/impl/OverclockSuper.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/impl/OverclockSuper.java new file mode 100644 index 000000000..f8a6d4492 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/impl/OverclockSuper.java @@ -0,0 +1,56 @@ +package com.ghostipedia.cosmiccore.common.reflection.soul.impl; + +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulShape; +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulSuper; + +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; + +/** + * ENGINE Super: Overclock + * Enter hyperdrive state. Attack speed, move speed, mining speed all massively boosted. + * Burns through resources/durability/hunger rapidly. + */ +public class OverclockSuper extends SoulSuper { + + private static final int COOLDOWN = 20 * 60 * 5; // 5 minutes + private static final int DURATION = 20 * 60 * 2; // 2 minutes + + public OverclockSuper() { + super(SoulShape.ENGINE, COOLDOWN); + } + + @Override + public int getDurationTicks() { + return DURATION; + } + + @Override + public void activate(ServerPlayer player) { + // Hyperdrive: speed, haste, jump boost + player.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SPEED, DURATION, 3, true, true, true)); + player.addEffect(new MobEffectInstance(MobEffects.DIG_SPEED, DURATION, 3, true, true, true)); + player.addEffect(new MobEffectInstance(MobEffects.JUMP, DURATION, 1, true, true, true)); + + player.displayClientMessage( + Component.literal("\u00A76\u00A7l*OVERCLOCK ENGAGED*"), + true); + } + + @Override + public void tick(ServerPlayer player) { + // Burn hunger rapidly + if (player.level().getGameTime() % 10 == 0) { + player.getFoodData().addExhaustion(1.0f); + } + } + + @Override + public void onEnd(ServerPlayer player) { + player.displayClientMessage( + Component.literal("\u00A77\u00A7o*Systems returning to normal operating parameters.*"), + true); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/impl/RipAndTearSuper.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/impl/RipAndTearSuper.java new file mode 100644 index 000000000..7477f7e3b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/impl/RipAndTearSuper.java @@ -0,0 +1,56 @@ +package com.ghostipedia.cosmiccore.common.reflection.soul.impl; + +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulShape; +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulSuper; + +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; + +/** + * BLOODTHIRST Super: Rip and Tear + * Enter a frenzy state. Killing a mob lets you instantly dash to the next nearby mob. + * Execute enemies below a health threshold. + * Chains until nothing's left or you miss a kill. + */ +public class RipAndTearSuper extends SoulSuper { + + private static final int COOLDOWN = 20 * 60 * 5; // 5 minutes + private static final int DURATION = 20 * 30; // 30 seconds + private static final float EXECUTE_THRESHOLD = 0.3f; // 30% HP + + public RipAndTearSuper() { + super(SoulShape.BLOODTHIRST, COOLDOWN); + } + + @Override + public int getDurationTicks() { + return DURATION; + } + + @Override + public void activate(ServerPlayer player) { + // Frenzy: strength, speed, no knockback taken + player.addEffect(new MobEffectInstance(MobEffects.DAMAGE_BOOST, DURATION, 2, true, true, true)); + player.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SPEED, DURATION, 2, true, true, true)); + + player.displayClientMessage( + Component.literal("\u00A7c\u00A7l*RIP AND TEAR*"), + true); + } + + @Override + public void onEnd(ServerPlayer player) { + player.displayClientMessage( + Component.literal("\u00A77\u00A7o*The frenzy subsides... for now.*"), + true); + } + + /** + * @return health percentage threshold for execute + */ + public static float getExecuteThreshold() { + return EXECUTE_THRESHOLD; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/impl/SlipstreamSuper.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/impl/SlipstreamSuper.java new file mode 100644 index 000000000..7a065047f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/soul/impl/SlipstreamSuper.java @@ -0,0 +1,56 @@ +package com.ghostipedia.cosmiccore.common.reflection.soul.impl; + +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulShape; +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulSuper; + +import net.minecraft.network.chat.Component; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; + +/** + * GLOBEDANCER Super: Slipstream + * Become untouchable. No fall damage, no collision damage, phase through entities. + * Step height maxed, speed boosted. Pure fluid motion. + */ +public class SlipstreamSuper extends SoulSuper { + + private static final int COOLDOWN = 20 * 60 * 5; // 5 minutes + private static final int DURATION = 20 * 60; // 1 minute + + public SlipstreamSuper() { + super(SoulShape.GLOBEDANCER, COOLDOWN); + } + + @Override + public int getDurationTicks() { + return DURATION; + } + + @Override + public void activate(ServerPlayer player) { + // Speed + jump boost (fall damage handled in tick) + player.addEffect(new MobEffectInstance(MobEffects.MOVEMENT_SPEED, DURATION, 2, true, true, true)); + player.addEffect(new MobEffectInstance(MobEffects.JUMP, DURATION, 2, true, true, true)); + + // Mark player as in slipstream for damage immunity + // This is checked in damage event handler + + player.displayClientMessage( + Component.literal("\u00A7b\u00A7l*You slip between moments.*"), + true); + } + + @Override + public void tick(ServerPlayer player) { + // Nullify fall distance continuously + player.fallDistance = 0; + } + + @Override + public void onEnd(ServerPlayer player) { + player.displayClientMessage( + Component.literal("\u00A77\u00A7o*The world catches up.*"), + true); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/BargainConstellationScreen.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/BargainConstellationScreen.java new file mode 100644 index 000000000..2460ed48f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/BargainConstellationScreen.java @@ -0,0 +1,1104 @@ +package com.ghostipedia.cosmiccore.common.reflection.ui; + +import com.ghostipedia.cosmiccore.client.renderer.BackgroundRenderer; +import com.ghostipedia.cosmiccore.client.renderer.ChainRenderer; +import com.ghostipedia.cosmiccore.client.renderer.SoulAuraRenderer; +import com.ghostipedia.cosmiccore.client.renderer.SoulCoreRenderer; +import com.ghostipedia.cosmiccore.client.renderer.SoulThreadsRenderer; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainRegistry; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.systems.RenderSystem; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.Set; + +import javax.annotation.Nullable; + +/** + * A constellation-style visual browser for bargains. + * + * Bargains appear as glowing nodes orbiting the player's soul. + * - Active bargains: Bright, pulsing with their signature color + * - Available bargains: Dim, waiting to be claimed + * - Scarred bargains: Cracked, dark, forever marked + * + * Click a node to see its details in a Thaumonomicon-style panel. + * From there, accept or (if active) defy the bargain. + */ +@OnlyIn(Dist.CLIENT) +public class BargainConstellationScreen extends Screen { + + // Player state + private final int erosion; + private final Set activeBargains; + private final Set defianceScars; + + // Economy state + private int shardBalance = 0; + private int usedCapacity = 0; + private int totalCapacity = 100; + + // All bargains organized into nodes + private final List nodes = new ArrayList<>(); + + // Visual state + private float fadeAlpha = 0f; + private int totalTicks = 0; + private float soulPulse = 0f; + private float soulBreath = 0f; + + // Interaction state + @Nullable + private BargainNode hoveredNode = null; + @Nullable + private BargainNode selectedNode = null; + private float selectionAnimation = 0f; + + // Detail panel animation - track previous for interpolation + private float panelSlide = 0f; // 0 = hidden, 1 = fully visible + private float panelSlidePrev = 0f; + private float selectionAnimationPrev = 0f; + + // Action button bounds for click detection + private int actionButtonX, actionButtonY, actionButtonWidth, actionButtonHeight; + private boolean actionButtonVisible = false; + + // Particles for atmosphere + private final List stars = new ArrayList<>(); + private final Random random = new Random(); + + // Chain connections + private final ChainRenderer chainRenderer = new ChainRenderer(); + private float lastMouseX, lastMouseY; + + // Pan and zoom state + private float viewOffsetX = 0f; + private float viewOffsetY = 0f; + private float zoom = 1.0f; + private boolean isDragging = false; + private double lastDragX, lastDragY; + + // Constants + private static final int FADE_TICKS = 30; + private static final int STAR_COUNT = 50; // Restored for better atmosphere + private static final float ORBIT_BASE_RADIUS = 120f; + private static final float ORBIT_RING_SPACING = 45f; + private static final float MIN_ZOOM = 0.5f; + private static final float MAX_ZOOM = 2.0f; + + // If true, skip fade-in (already coming from dark screen) + private boolean skipFadeIn = false; + + public BargainConstellationScreen(int erosion, Set activeBargains, + Set defianceScars) { + super(ReflectionLang.ui("constellation_title")); + this.erosion = erosion; + this.activeBargains = activeBargains; + this.defianceScars = defianceScars; + } + + public static void open(int erosion, Set activeBargains, Set defianceScars, + int shardBalance, int usedCapacity, int totalCapacity) { + openFromVoid(erosion, activeBargains, defianceScars, shardBalance, usedCapacity, totalCapacity); + } + + public static void openFromVoid(int erosion, Set activeBargains, + Set defianceScars, + int shardBalance, int usedCapacity, int totalCapacity) { + BargainConstellationScreen screen = new BargainConstellationScreen(erosion, activeBargains, defianceScars); + screen.skipFadeIn = true; + screen.fadeAlpha = 1f; + screen.shardBalance = shardBalance; + screen.usedCapacity = usedCapacity; + screen.totalCapacity = totalCapacity; + Minecraft.getInstance().setScreen(screen); + } + + public void setEconomyData(int shardBalance, int usedCapacity, int totalCapacity) { + this.shardBalance = shardBalance; + this.usedCapacity = usedCapacity; + this.totalCapacity = totalCapacity; + } + + @Override + protected void init() { + super.init(); + + // Initialize star particles + stars.clear(); + for (int i = 0; i < STAR_COUNT; i++) { + stars.add(new StarParticle(width, height, random)); + } + + // Build bargain nodes + buildConstellationNodes(); + + // Build chains from soul to each node + initChains(); + } + + private static final int[] CHAIN_NEUTRAL_COLOR = { 140, 145, 160 }; + + private void initChains() { + chainRenderer.clear(); + int centerX = width / 2; + int centerY = height / 2; + + for (BargainNode node : nodes) { + float scaledRadius = node.orbitRadius * zoom; + float nodeX = centerX + viewOffsetX + (float) Math.cos(node.baseAngle) * scaledRadius; + float nodeY = centerY + viewOffsetY + (float) Math.sin(node.baseAngle) * scaledRadius; + + int[] color = node.state == BargainNode.NodeState.ACTIVE ? node.getColor() : CHAIN_NEUTRAL_COLOR; + chainRenderer.addChain(centerX + viewOffsetX, centerY + viewOffsetY, nodeX, nodeY, color); + } + } + + private void buildConstellationNodes() { + nodes.clear(); + + List allBargains = new ArrayList<>(BargainRegistry.getAll()); + + // Organize by tier into orbital rings + // Ring 0 (closest): EARLY, ANY + // Ring 1: EARLY_MID + // Ring 2: MID + // Ring 3: LATE + // Ring 4 (farthest): EXTREME + + int centerX = width / 2; + int centerY = height / 2; + + // Count bargains per ring for spacing + int[] ringCounts = new int[5]; + int[] ringIndices = new int[5]; + + for (Bargain bargain : allBargains) { + int ring = getTierRing(bargain.getTier()); + ringCounts[ring]++; + } + + // Place each bargain + for (Bargain bargain : allBargains) { + int ring = getTierRing(bargain.getTier()); + float radius = ORBIT_BASE_RADIUS + (ring * ORBIT_RING_SPACING); + + // Distribute evenly around the ring + int count = ringCounts[ring]; + int index = ringIndices[ring]++; + + // Offset each ring slightly so they don't all align + float ringOffset = ring * 0.3f; + float angle = (float) (2 * Math.PI * index / count) + ringOffset; + + // Determine node state + BargainNode.NodeState state; + if (activeBargains.contains(bargain.getId())) { + state = BargainNode.NodeState.ACTIVE; + } else if (defianceScars.contains(bargain.getId())) { + state = BargainNode.NodeState.SCARRED; + } else { + state = BargainNode.NodeState.AVAILABLE; + } + + nodes.add(new BargainNode(bargain, centerX, centerY, radius, angle, state)); + } + } + + private int getTierRing(Bargain.BargainTier tier) { + return switch (tier) { + case EARLY, ANY -> 0; + case EARLY_MID -> 1; + case MID -> 2; + case LATE -> 3; + case EXTREME -> 4; + }; + } + + @Override + public void tick() { + super.tick(); + totalTicks++; + + // Fade in + if (fadeAlpha < 1f) { + fadeAlpha = Math.min(1f, fadeAlpha + (1f / FADE_TICKS)); + } + + // Soul animations + soulPulse += 0.08f; + soulBreath += 0.03f; + + // Note: No constellation rotation - keeps nodes stationary for better UX + + // Update stars + for (StarParticle star : stars) { + star.tick(); + if (star.isDead()) { + star.reset(width, height, random); + } + } + + // Update node animations (pulse effects only) + for (BargainNode node : nodes) { + node.tick(); + } + + // Tick chain physics and update anchor positions + updateChainAnchors(); + chainRenderer.tick(lastMouseX, lastMouseY); + + // Panel slide animation - save previous for interpolation + panelSlidePrev = panelSlide; + selectionAnimationPrev = selectionAnimation; + + if (selectedNode != null) { + panelSlide = Math.min(1f, panelSlide + 0.1f); + selectionAnimation += 0.15f; + } else { + panelSlide = Math.max(0f, panelSlide - 0.15f); + } + } + + private void updateChainAnchors() { + int centerX = width / 2; + int centerY = height / 2; + float cx = centerX + viewOffsetX; + float cy = centerY + viewOffsetY; + + for (int i = 0; i < nodes.size() && i < chainRenderer.getChainCount(); i++) { + BargainNode node = nodes.get(i); + float scaledRadius = node.orbitRadius * zoom; + float nodeX = centerX + viewOffsetX + (float) Math.cos(node.baseAngle) * scaledRadius; + float nodeY = centerY + viewOffsetY + (float) Math.sin(node.baseAngle) * scaledRadius; + chainRenderer.updateAnchors(i, cx, cy, nodeX, nodeY); + } + } + + @Override + public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) { + lastMouseX = mouseX; + lastMouseY = mouseY; + + // Deep space galaxy background shader + BackgroundRenderer.render(graphics.pose(), BackgroundRenderer.BackgroundType.GALAXY, fadeAlpha, width, height); + + if (fadeAlpha < 0.1f) return; + + // Render additional star particles on top of shader background + for (StarParticle star : stars) { + star.render(graphics, fadeAlpha, partialTick); + } + + // Render vignette + renderVignette(graphics); + + // Render orbital rings (faint guide lines) + renderOrbitalRings(graphics); + + // Render connecting lines between nodes + renderConnections(graphics, partialTick); + + // Update and render all nodes + // Update screen positions every frame for smooth dragging + int centerX = width / 2; + int centerY = height / 2; + hoveredNode = null; + for (BargainNode node : nodes) { + node.updateScreenPosition(centerX, centerY, viewOffsetX, viewOffsetY, zoom); + boolean hovered = node.isMouseOver(mouseX, mouseY); + if (hovered) { + hoveredNode = node; + } + node.render(graphics, font, fadeAlpha, hovered, node == selectedNode, totalTicks, zoom, partialTick); + } + + // Render central soul + renderSoulOrb(graphics, partialTick); + + // Render detail panel if node selected - interpolate for smooth animation + float smoothPanelSlide = panelSlidePrev + (panelSlide - panelSlidePrev) * partialTick; + if (smoothPanelSlide > 0.01f) { + renderDetailPanel(graphics, mouseX, mouseY, smoothPanelSlide); + } + + // Render hover tooltip for non-selected nodes + if (hoveredNode != null && hoveredNode != selectedNode) { + renderNodeTooltip(graphics, hoveredNode, mouseX, mouseY); + } + + // Render erosion indicator + renderErosionIndicator(graphics); + + // Render back hint + renderBackHint(graphics); + } + + private void renderVignette(GuiGraphics graphics) { + int vignetteStrength = (int) (fadeAlpha * 150); + int bandSize = 2; // 2px bands for smooth gradients + + for (int i = 0; i < 50; i += bandSize) { + int alpha = (int) (vignetteStrength * (1f - (float) i / 50f)); + int color = (alpha << 24); + graphics.fill(0, i, width, i + bandSize, color); + graphics.fill(0, height - i - bandSize, width, height - i, color); + } + + for (int i = 0; i < 70; i += bandSize) { + int alpha = (int) (vignetteStrength * (1f - (float) i / 70f) * 0.6f); + int color = (alpha << 24); + graphics.fill(i, 0, i + bandSize, height, color); + graphics.fill(width - i - bandSize, 0, width - i, height, color); + } + } + + private void renderOrbitalRings(GuiGraphics graphics) { + int centerX = width / 2 + (int) viewOffsetX; + int centerY = height / 2 + (int) viewOffsetY; + int alpha = (int) (fadeAlpha * 25); + + for (int ring = 0; ring < 5; ring++) { + float radius = (ORBIT_BASE_RADIUS + (ring * ORBIT_RING_SPACING)) * zoom; + int color = (alpha << 24) | 0x404060; + + // Draw ring as series of dashed segments (fewer draws) + int segments = 24; // Fixed low segment count for performance + for (int i = 0; i < segments; i += 2) { // Skip every other for dashed effect + float angle = (float) (2 * Math.PI * i / segments); + int x = centerX + (int) (Math.cos(angle) * radius); + int y = centerY + (int) (Math.sin(angle) * radius); + graphics.fill(x - 1, y - 1, x + 2, y + 2, color); + } + } + } + + private void renderConnections(GuiGraphics graphics, float partialTick) { + chainRenderer.render(graphics, fadeAlpha, lastMouseX, lastMouseY, partialTick); + } + + private void renderSoulOrb(GuiGraphics graphics, float partialTick) { + int centerX = width / 2 + (int) viewOffsetX; + int centerY = height / 2 + (int) viewOffsetY; + + float smoothBreath = soulBreath + (0.03f * partialTick); + float smoothPulse = soulPulse + (0.08f * partialTick); + float breath = (float) Math.sin(smoothBreath) * 0.05f + 1f; + float pulse = (float) Math.sin(smoothPulse) * 0.08f + 1f; + int baseRadius = (int) (30 * zoom); + int radius = (int) (baseRadius * breath * pulse); + + int auraRadius = (int) (baseRadius * 1.8f * zoom); + SoulAuraRenderer.render( + graphics.pose(), + centerX, centerY, + auraRadius, + erosion, + fadeAlpha * 0.8f, + width, height); + + graphics.flush(); + SoulCoreRenderer.render( + graphics.pose(), + centerX, centerY, + radius, + erosion, + fadeAlpha, + width, height); + SoulThreadsRenderer.render( + graphics.pose(), + centerX, centerY, + radius, + erosion, + fadeAlpha, + width, height); + } + + private void renderDetailPanel(GuiGraphics graphics, int mouseX, int mouseY, float smoothPanelSlide) { + if (selectedNode == null) return; + + Bargain bargain = selectedNode.bargain; + + // Panel dimensions - wider to fit text better + int panelWidth = 240; + int maxTextWidth = panelWidth - 20; // 10px padding on each side + + // Calculate dynamic height based on content + int contentHeight = 36; // Header space (title + tier) + + // Cost section height (variable based on what costs exist) + // These are reused later for rendering and affordability checks + int shardCost = bargain.getShardCost(); + int weightCost = bargain.getWeight(); + int erosionCost = bargain.getErosionCost(); + int remainingCapacity = totalCapacity - usedCapacity; + int costLines = 0; + if (shardCost > 0) costLines++; + if (weightCost > 0) costLines++; + if (erosionCost > 0) costLines++; + if (costLines == 0) costLines = 1; // "Free" line + contentHeight += costLines * 11 + 12; // costs + divider spacing + + for (Component line : bargain.getPowerDescriptions()) { + contentHeight += wrapText(line.getString(), maxTextWidth).size() * 11; + } + contentHeight += 30; // Action hint space + + int panelHeight = Math.max(180, contentHeight); + + // Slide in from right - use interpolated value for smooth animation + int panelX = width - (int) (smoothPanelSlide * (panelWidth + 20)); + int panelY = (height - panelHeight) / 2; + + int bgAlpha = (int) (fadeAlpha * smoothPanelSlide * 230); + int borderAlpha = (int) (fadeAlpha * smoothPanelSlide * 255); + + // Background + int bgColor = (bgAlpha << 24) | 0x101018; + graphics.fill(panelX, panelY, panelX + panelWidth, panelY + panelHeight, bgColor); + + // Border + int borderColor = (borderAlpha << 24) | 0x404080; + graphics.fill(panelX, panelY, panelX + panelWidth, panelY + 1, borderColor); + graphics.fill(panelX, panelY + panelHeight - 1, panelX + panelWidth, panelY + panelHeight, borderColor); + graphics.fill(panelX, panelY, panelX + 1, panelY + panelHeight, borderColor); + graphics.fill(panelX + panelWidth - 1, panelY, panelX + panelWidth, panelY + panelHeight, borderColor); + + int textAlpha = (int) (fadeAlpha * smoothPanelSlide * 255); + + // Title + String title = bargain.getDisplayName().getString(); + int[] nodeColor = selectedNode.getColor(); + int titleColor = (textAlpha << 24) | (nodeColor[0] << 16) | (nodeColor[1] << 8) | nodeColor[2]; + graphics.drawString(font, title, panelX + 10, panelY + 10, titleColor, false); + + // Tier + String tierStr = bargain.getTier().name(); + int subtitleColor = (textAlpha << 24) | 0x888888; + graphics.drawString(font, tierStr, panelX + 10, panelY + 24, subtitleColor, false); + + // Costs with affordability coloring (reusing variables from height calculation) + int costY = panelY + 36; + + if (shardCost > 0) { + boolean canAfford = shardBalance >= shardCost; + int shardTextColor = (textAlpha << 24) | (canAfford ? 0x55FFFF : 0xFF5555); + graphics.drawString(font, "\u2726 " + shardCost + " shards", panelX + 10, costY, shardTextColor, false); + costY += 11; + } + if (weightCost > 0) { + boolean canFit = remainingCapacity >= weightCost; + int weightTextColor = (textAlpha << 24) | (canFit ? 0xAA55FF : 0xFF5555); + graphics.drawString(font, "\u25C6 " + weightCost + " weight", panelX + 10, costY, weightTextColor, false); + costY += 11; + } + if (erosionCost > 0) { + int erosionTextColor = (textAlpha << 24) | 0xAA6666; + graphics.drawString(font, "+" + erosionCost + " erosion", panelX + 10, costY, erosionTextColor, false); + costY += 11; + } + if (shardCost == 0 && weightCost == 0 && erosionCost == 0) { + int freeColor = (textAlpha << 24) | 0x55FF55; + graphics.drawString(font, "Free", panelX + 10, costY, freeColor, false); + costY += 11; + } + + // Divider (dynamic position based on cost content) + int dividerY = costY + 4; + int dividerColor = ((textAlpha / 2) << 24) | 0x606080; + graphics.fill(panelX + 10, dividerY, panelX + panelWidth - 10, dividerY + 1, dividerColor); + + // Description / power with word wrapping + int descY = dividerY + 8; + int descColor = (textAlpha << 24) | 0xBBBBBB; + for (Component line : bargain.getPowerDescriptions()) { + for (String wrappedLine : wrapText(line.getString(), maxTextWidth)) { + graphics.drawString(font, wrappedLine, panelX + 10, descY, descColor, false); + descY += 11; + } + } + // Note: We don't render drawbacks here since cost is already shown at top + + // Action button based on state + String actionHint; + int hintColor; + boolean isClickable = false; + switch (selectedNode.state) { + case AVAILABLE -> { + // Check affordability (reuse variables from cost section above) + if (shardCost > shardBalance) { + actionHint = "Not enough shards (" + shardBalance + "/" + shardCost + ")"; + hintColor = 0x888888; + isClickable = false; + } else if (weightCost > remainingCapacity) { + actionHint = "Not enough soul capacity (" + remainingCapacity + "/" + weightCost + ")"; + hintColor = 0x888888; + isClickable = false; + } else { + actionHint = "[Click to make bargain]"; + hintColor = 0x80FF80; + isClickable = true; + } + } + case ACTIVE -> { + actionHint = "[Click to defy - costs " + BargainRegistry.calculateDefianceCost(bargain) + "]"; + hintColor = 0xFF8080; + isClickable = true; + } + case SCARRED -> { + actionHint = "Forever scarred"; + hintColor = 0x555555; + isClickable = false; + } + default -> { + actionHint = ""; + hintColor = 0; + isClickable = false; + } + } + + // Store action button bounds for click detection + actionButtonX = panelX + 10; + actionButtonY = panelY + panelHeight - 28; + actionButtonWidth = font.width(actionHint) + 16; + actionButtonHeight = 20; + actionButtonVisible = isClickable && smoothPanelSlide > 0.9f; + + if (isClickable) { + // Draw button background + int btnBgAlpha = (int) (fadeAlpha * smoothPanelSlide * 60); + int btnBgColor = (btnBgAlpha << 24) | (hintColor & 0xFFFFFF); + graphics.fill(actionButtonX - 4, actionButtonY, actionButtonX + actionButtonWidth, + actionButtonY + actionButtonHeight, btnBgColor); + + // Draw button border + int btnBorderAlpha = (int) (fadeAlpha * smoothPanelSlide * 150); + int btnBorderColor = (btnBorderAlpha << 24) | (hintColor & 0xFFFFFF); + graphics.fill(actionButtonX - 4, actionButtonY, actionButtonX + actionButtonWidth, actionButtonY + 1, + btnBorderColor); + graphics.fill(actionButtonX - 4, actionButtonY + actionButtonHeight - 1, actionButtonX + actionButtonWidth, + actionButtonY + actionButtonHeight, btnBorderColor); + graphics.fill(actionButtonX - 4, actionButtonY, actionButtonX - 3, actionButtonY + actionButtonHeight, + btnBorderColor); + graphics.fill(actionButtonX + actionButtonWidth - 1, actionButtonY, actionButtonX + actionButtonWidth, + actionButtonY + actionButtonHeight, btnBorderColor); + } + + int textColor = (textAlpha << 24) | (hintColor & 0xFFFFFF); + graphics.drawString(font, actionHint, actionButtonX, actionButtonY + 6, textColor, false); + } + + private List wrapText(String text, int maxWidth) { + List lines = new ArrayList<>(); + if (text == null || text.isEmpty()) { + return lines; + } + + // Handle color codes - preserve them across lines + String colorPrefix = ""; + if (text.startsWith("\u00A7") && text.length() >= 2) { + colorPrefix = text.substring(0, 2); + } + + String[] words = text.split(" "); + StringBuilder currentLine = new StringBuilder(); + + for (String word : words) { + String testLine = currentLine.length() == 0 ? word : currentLine + " " + word; + if (font.width(testLine) <= maxWidth) { + if (currentLine.length() > 0) currentLine.append(" "); + currentLine.append(word); + } else { + if (currentLine.length() > 0) { + lines.add(currentLine.toString()); + currentLine = new StringBuilder(colorPrefix + word); + } else { + // Single word too long, just add it + lines.add(word); + } + } + } + + if (currentLine.length() > 0) { + lines.add(currentLine.toString()); + } + + return lines; + } + + private void renderNodeTooltip(GuiGraphics graphics, BargainNode node, int mouseX, int mouseY) { + String name = node.bargain.getDisplayName().getString(); + int tooltipWidth = font.width(name) + 10; + int tooltipHeight = 16; + + int x = mouseX + 10; + int y = mouseY - tooltipHeight - 5; + + // Keep on screen + if (x + tooltipWidth > width - 10) x = width - tooltipWidth - 10; + if (y < 10) y = 10; + + int bgAlpha = (int) (fadeAlpha * 200); + int bgColor = (bgAlpha << 24) | 0x101018; + graphics.fill(x - 2, y - 2, x + tooltipWidth + 2, y + tooltipHeight + 2, bgColor); + + int[] nodeColor = node.getColor(); + int textColor = (255 << 24) | (nodeColor[0] << 16) | (nodeColor[1] << 8) | nodeColor[2]; + graphics.drawString(font, name, x + 3, y + 3, textColor, false); + } + + private void renderErosionIndicator(GuiGraphics graphics) { + int alpha = (int) (fadeAlpha * 100); + int color = (alpha << 24) | 0x555555; + + String text = "Soul Erosion: " + erosion; + graphics.drawString(font, text, 15, height - 25, color, false); + + // Render economy display in top right + renderEconomyDisplay(graphics); + } + + private void renderEconomyDisplay(GuiGraphics graphics) { + int alpha = (int) (fadeAlpha * 200); + if (alpha < 20) return; + + int rightMargin = width - 15; + int topY = 15; + + // Shard balance (aqua color) + int shardColor = (alpha << 24) | 0x55FFFF; + String shardText = "\u2726 " + shardBalance; + int shardWidth = font.width(shardText); + graphics.drawString(font, shardText, rightMargin - shardWidth, topY, shardColor, false); + + // Capacity display (purple color) + int capacityColor = (alpha << 24) | 0xAA55FF; + String capacityText = usedCapacity + "/" + totalCapacity + " soul"; + int capacityWidth = font.width(capacityText); + graphics.drawString(font, capacityText, rightMargin - capacityWidth, topY + 12, capacityColor, false); + + // Capacity bar + int barWidth = 60; + int barHeight = 4; + int barX = rightMargin - barWidth; + int barY = topY + 24; + + // Background + int bgColor = (alpha << 24) | 0x222222; + graphics.fill(barX, barY, barX + barWidth, barY + barHeight, bgColor); + + // Filled portion + float fillPercent = totalCapacity > 0 ? (float) usedCapacity / totalCapacity : 0f; + int fillWidth = (int) (barWidth * fillPercent); + int fillColor = fillPercent > 0.9f ? ((alpha << 24) | 0xFF5555) : + fillPercent > 0.7f ? ((alpha << 24) | 0xFFAA55) : + ((alpha << 24) | 0xAA55FF); + if (fillWidth > 0) { + graphics.fill(barX, barY, barX + fillWidth, barY + barHeight, fillColor); + } + } + + private void renderBackHint(GuiGraphics graphics) { + int alpha = (int) (fadeAlpha * 120); + int color = (alpha << 24) | 0x888888; + + String hint = "[ESC] Back"; + graphics.drawString(font, hint, 15, 15, color, false); + + // Zoom level indicator + String zoomHint = String.format("Zoom: %.0f%%", zoom * 100); + graphics.drawString(font, zoomHint, 15, 28, color, false); + + // Control hints - positioned below economy display (which takes ~40px) + String controlHint = "Scroll: Zoom | Right-click drag: Pan"; + int controlWidth = font.width(controlHint); + graphics.drawString(font, controlHint, width - controlWidth - 15, 55, color, false); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + int mx = (int) mouseX; + int my = (int) mouseY; + + // Left click - select nodes or action buttons + if (button == 0) { + // Check if clicking on the action button in the detail panel + if (actionButtonVisible && selectedNode != null) { + if (mx >= actionButtonX - 4 && mx <= actionButtonX + actionButtonWidth && + my >= actionButtonY && my <= actionButtonY + actionButtonHeight) { + performNodeAction(selectedNode); + return true; + } + } + + // Check if clicking on a node + for (BargainNode node : nodes) { + if (node.isMouseOver(mx, my)) { + if (selectedNode == node) { + // Already selected - perform action + performNodeAction(node); + } else { + // Select this node + selectedNode = node; + selectionAnimation = 0f; + } + return true; + } + } + + // Clicking elsewhere deselects + selectedNode = null; + return true; + } + + // Middle or right click - start dragging + if (button == 1 || button == 2) { + isDragging = true; + lastDragX = mouseX; + lastDragY = mouseY; + return true; + } + + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (button == 1 || button == 2) { + isDragging = false; + return true; + } + return super.mouseReleased(mouseX, mouseY, button); + } + + @Override + public boolean mouseDragged(double mouseX, double mouseY, int button, double dragX, double dragY) { + if (isDragging) { + viewOffsetX += (float) (mouseX - lastDragX); + viewOffsetY += (float) (mouseY - lastDragY); + lastDragX = mouseX; + lastDragY = mouseY; + return true; + } + return super.mouseDragged(mouseX, mouseY, button, dragX, dragY); + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double scrollX, double scrollY) { + // Zoom in/out with scroll wheel + float oldZoom = zoom; + zoom += (float) scrollY * 0.1f; + zoom = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, zoom)); + + // Adjust offset to zoom toward mouse position + if (oldZoom != zoom) { + float zoomRatio = zoom / oldZoom; + float mx = (float) mouseX - width / 2f; + float my = (float) mouseY - height / 2f; + viewOffsetX = (viewOffsetX - mx) * zoomRatio + mx; + viewOffsetY = (viewOffsetY - my) * zoomRatio + my; + } + + return true; + } + + private void performNodeAction(BargainNode node) { + switch (node.state) { + case AVAILABLE -> { + // Check if player can afford this bargain + int shardCost = node.bargain.getShardCost(); + int weight = node.bargain.getWeight(); + int remainingCapacity = totalCapacity - usedCapacity; + + if (shardCost > shardBalance) { + // Can't afford - not enough shards + return; + } + if (weight > remainingCapacity) { + // Can't fit - not enough soul capacity + return; + } + + // Open bargain offer dialogue in VoidScreen with economy data + VoidScreen.openWithBargain(node.bargain, erosion, activeBargains, + shardBalance, usedCapacity, totalCapacity); + } + case ACTIVE -> { + // TODO: Implement defiance from here + // For now, go back to hub which has defiance + onClose(); + } + case SCARRED -> { + // Can't do anything with scarred bargains + } + } + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (keyCode == 256) { // ESC + if (selectedNode != null) { + selectedNode = null; + return true; + } + onClose(); + return true; + } + return super.keyPressed(keyCode, scanCode, modifiers); + } + + @Override + public boolean isPauseScreen() { + return false; + } + + private static class BargainNode { + + private static final ResourceLocation NODE_TEXTURE = ResourceLocation.fromNamespaceAndPath("cosmiccore", + "textures/item/reflection_mirror.png"); + + final Bargain bargain; + final int centerX, centerY; + final float orbitRadius; + final float baseAngle; + final NodeState state; + + float screenX, screenY; + float pulsePhase; + + enum NodeState { + AVAILABLE, // Can be acquired + ACTIVE, // Currently owned + SCARRED // Defied - forever marked + } + + BargainNode(Bargain bargain, int centerX, int centerY, float orbitRadius, float baseAngle, NodeState state) { + this.bargain = bargain; + this.centerX = centerX; + this.centerY = centerY; + this.orbitRadius = orbitRadius; + this.baseAngle = baseAngle; + this.state = state; + this.pulsePhase = (float) (Math.random() * Math.PI * 2); + } + + void tick() { + // Only update animation phase - position is calculated in render for smooth dragging + pulsePhase += 0.1f; + } + + void updateScreenPosition(int viewCenterX, int viewCenterY, float offsetX, float offsetY, float zoom) { + float scaledRadius = orbitRadius * zoom; + screenX = viewCenterX + offsetX + (float) (Math.cos(baseAngle) * scaledRadius); + screenY = viewCenterY + offsetY + (float) (Math.sin(baseAngle) * scaledRadius); + } + + boolean isMouseOver(int mouseX, int mouseY) { + float dx = mouseX - screenX; + float dy = mouseY - screenY; + float radius = getRadius(); + return dx * dx + dy * dy <= radius * radius * 1.5f; // Slightly generous hitbox + } + + float getRadius(float zoom) { + float baseRadius = switch (state) { + case ACTIVE -> 10f; + case AVAILABLE -> 7f; + case SCARRED -> 6f; + }; + return baseRadius * zoom; + } + + float getRadius() { + // For mouse hit detection, use a generous radius + return switch (state) { + case ACTIVE -> 12f; + case AVAILABLE -> 10f; + case SCARRED -> 8f; + }; + } + + int[] getColor() { + if (state == NodeState.SCARRED) { + return new int[] { 60, 40, 50 }; // Dark, cracked + } + + // Unique color for each bargain type + String path = bargain.getId().getPath(); + return switch (path) { + // EARLY tier - cool/inviting colors + case "quake_movement" -> new int[] { 100, 200, 255 }; // Cyan - movement + case "stride" -> new int[] { 120, 220, 180 }; // Seafoam - step assist + case "darksight" -> new int[] { 160, 120, 255 }; // Violet - night vision + case "swiftness" -> new int[] { 255, 200, 100 }; // Amber - speed + + // EARLY_MID tier - warmer colors + case "home" -> new int[] { 255, 220, 100 }; // Gold - hearth + case "back" -> new int[] { 180, 100, 220 }; // Purple - death echo + case "vitality" -> new int[] { 255, 120, 120 }; // Coral - health + case "violence" -> new int[] { 220, 80, 80 }; // Crimson - strength + case "depths" -> new int[] { 80, 180, 220 }; // Ocean blue - water breathing + + // MID tier - more intense colors + case "reach" -> new int[] { 200, 160, 255 }; // Lavender - elongated grasp + case "soft_landing" -> new int[] { 180, 255, 180 }; // Mint - fall immunity + case "satiated" -> new int[] { 200, 180, 120 }; // Tan - no hunger + case "carapace" -> new int[] { 160, 160, 180 }; // Steel - armor + case "cinder" -> new int[] { 255, 140, 60 }; // Flame orange - fire immunity + + // LATE tier - darker/ominous + case "void_anchor" -> new int[] { 120, 60, 180 }; // Deep purple - void resistance + + default -> { + // Hash-based unique color as ultimate fallback + int hash = path.hashCode(); + int r = 100 + Math.abs(hash % 100); + int g = 100 + Math.abs((hash >> 8) % 100); + int b = 100 + Math.abs((hash >> 16) % 100); + yield new int[] { r, g, b }; + } + }; + } + + void render(GuiGraphics graphics, net.minecraft.client.gui.Font font, float fadeAlpha, + boolean hovered, boolean selected, int ticks, float zoom, float partialTick) { + int[] rgb = getColor(); + + float pulse = 1f; + if (state == NodeState.ACTIVE || hovered || selected) { + float smoothPulse = pulsePhase + (0.1f * partialTick); + pulse = 1f + (float) Math.sin(smoothPulse) * 0.15f; + } + + float stateAlpha = switch (state) { + case ACTIVE -> 1f; + case AVAILABLE -> hovered ? 0.9f : 0.5f; + case SCARRED -> 0.3f; + }; + + int sx = (int) screenX; + int sy = (int) screenY; + + // Colored glow halo behind the texture + float glowIntensity = (state == NodeState.ACTIVE || hovered || selected) ? 0.4f : 0.15f; + int glowRadius = (int) (12 * zoom * pulse); + for (int r = glowRadius; r > 0; r -= 2) { + float t = (float) r / glowRadius; + int glowAlpha = (int) (fadeAlpha * stateAlpha * glowIntensity * (1f - t * t) * 255); + if (glowAlpha <= 0) continue; + int color = (glowAlpha << 24) | (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + for (int y = -r; y <= r; y += 2) { + int halfW = (int) Math.sqrt(r * r - y * y); + int bandEnd = Math.min(y + 2, r + 1); + graphics.fill(sx - halfW, sy + y, sx + halfW + 1, sy + bandEnd, color); + } + } + + // Mirror texture, tinted to bargain color + int texSize = (int) (16 * zoom * pulse); + int halfTex = texSize / 2; + float tintR = rgb[0] / 255f; + float tintG = rgb[1] / 255f; + float tintB = rgb[2] / 255f; + float tintA = fadeAlpha * stateAlpha; + + // Brighten the tint so the texture isn't too dark + float brighten = (state == NodeState.ACTIVE || hovered) ? 0.5f : 0.3f; + tintR = Math.min(1f, tintR + brighten); + tintG = Math.min(1f, tintG + brighten); + tintB = Math.min(1f, tintB + brighten); + + RenderSystem.setShaderColor(tintR, tintG, tintB, tintA); + graphics.blit(NODE_TEXTURE, sx - halfTex, sy - halfTex, 0, 0, texSize, texSize, texSize, texSize); + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + + // Selection ring + if (selected) { + int ringAlpha = (int) (fadeAlpha * 200); + int ringColor = (ringAlpha << 24) | 0xFFFFFF; + float smoothTicks = ticks + partialTick; + for (int i = 0; i < 8; i++) { + float angle = (float) (2 * Math.PI * i / 8) + smoothTicks * 0.05f; + int ringDist = halfTex + 4; + int rx = (int) (screenX + Math.cos(angle) * ringDist); + int ry = (int) (screenY + Math.sin(angle) * ringDist); + graphics.fill(rx, ry, rx + 2, ry + 2, ringColor); + } + } + + // Scar cracks for defied bargains + if (state == NodeState.SCARRED) { + int crackAlpha = (int) (fadeAlpha * 150); + int crackColor = (crackAlpha << 24) | 0x200010; + Random crackRandom = new Random(bargain.getId().hashCode()); + for (int i = 0; i < 3; i++) { + float crackAngle = crackRandom.nextFloat() * (float) Math.PI * 2; + int cx = (int) (screenX + Math.cos(crackAngle) * halfTex * 0.6f); + int cy = (int) (screenY + Math.sin(crackAngle) * halfTex * 0.6f); + graphics.fill(cx - 1, cy - 1, cx + 2, cy + 2, crackColor); + } + } + } + } + + private static class StarParticle { + + float x, y; + float twinklePhase; + float maxAlpha; + int lifetime; + int age; + + StarParticle(int screenWidth, int screenHeight, Random random) { + reset(screenWidth, screenHeight, random); + } + + void reset(int screenWidth, int screenHeight, Random random) { + x = random.nextFloat() * screenWidth; + y = random.nextFloat() * screenHeight; + twinklePhase = random.nextFloat() * (float) Math.PI * 2; + maxAlpha = 0.2f + random.nextFloat() * 0.4f; + lifetime = 200 + random.nextInt(300); + age = 0; + } + + void tick() { + age++; + twinklePhase += 0.08f; + } + + boolean isDead() { + return age >= lifetime; + } + + void render(GuiGraphics graphics, float screenAlpha, float partialTick) { + // Smooth twinkle with partialTick for 60fps animation + float smoothTwinkle = twinklePhase + (0.08f * partialTick); + float twinkle = (float) (Math.sin(smoothTwinkle) * 0.3f + 0.7f); + + // Fade in/out + float lifeFade = 1f; + float progress = (float) age / lifetime; + if (progress < 0.1f) lifeFade = progress / 0.1f; + else if (progress > 0.9f) lifeFade = (1f - progress) / 0.1f; + + int alpha = (int) (maxAlpha * twinkle * lifeFade * screenAlpha * 255); + if (alpha <= 0) return; + + int color = (alpha << 24) | 0xCCCCDD; + graphics.fill((int) x, (int) y, (int) x + 1, (int) y + 1, color); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/ScarSelectionPackets.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/ScarSelectionPackets.java new file mode 100644 index 000000000..636d47d72 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/ScarSelectionPackets.java @@ -0,0 +1,150 @@ +package com.ghostipedia.cosmiccore.common.reflection.ui; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.utils.StringUtil; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.network.handling.IPayloadContext; + +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; +import java.util.Set; + +/** + * Network packets for Cluster of Perpetuity scar removal. + */ +public class ScarSelectionPackets { + + public static void sendOpenScarSelection(ServerPlayer player, Set scars) { + CCoreNetwork.sendToPlayer(player, new OpenScarSelectionPacket(scars)); + } + + public static void sendScarRemoval(ResourceLocation scarId) { + CCoreNetwork.sendToServer(new ScarRemovalPacket(scarId)); + } + + public static class OpenScarSelectionPacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("scar_open_selection")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(OpenScarSelectionPacket::encode, OpenScarSelectionPacket::new); + + private final Set scars; + + public OpenScarSelectionPacket(Set scars) { + this.scars = scars != null ? scars : Set.of(); + } + + public OpenScarSelectionPacket(FriendlyByteBuf buf) { + int count = buf.readVarInt(); + Set readScars = new HashSet<>(); + for (int i = 0; i < count; i++) { + readScars.add(buf.readResourceLocation()); + } + this.scars = readScars; + } + + public void encode(FriendlyByteBuf buf) { + buf.writeVarInt(scars.size()); + for (ResourceLocation id : scars) { + buf.writeResourceLocation(id); + } + } + + public void execute(IPayloadContext ctx) { + ScarSelectionScreen.open(scars); + } + + @Override + public @NotNull Type type() { + return TYPE; + } + } + + public static class ScarRemovalPacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("scar_removal")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(ScarRemovalPacket::encode, ScarRemovalPacket::new); + + private final ResourceLocation scarId; + + public ScarRemovalPacket(ResourceLocation scarId) { + this.scarId = scarId; + } + + public ScarRemovalPacket(FriendlyByteBuf buf) { + this.scarId = buf.readResourceLocation(); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeResourceLocation(scarId); + } + + public void execute(IPayloadContext ctx) { + if (!(ctx.player() instanceof ServerPlayer player)) return; + + ReflectionCapability.get(player).ifPresent(reflection -> { + if (!reflection.hasDefianceScar(scarId)) { + player.displayClientMessage( + Component.literal("You don't have that scar.").withStyle(ChatFormatting.RED), + true); + return; + } + + ItemStack cluster = findCluster(player); + if (cluster.isEmpty()) { + player.displayClientMessage( + Component.literal("You need a Cluster of Perpetuity.").withStyle(ChatFormatting.RED), + true); + return; + } + + cluster.shrink(1); + reflection.removeScar(scarId); + + String name = StringUtil.toTitleCase(scarId.getPath()); + player.displayClientMessage( + Component.literal("The scar of '" + name + "' fades from your soul.") + .withStyle(ChatFormatting.LIGHT_PURPLE), + true); + + player.level().playSound(null, player.blockPosition(), + SoundEvents.BEACON_DEACTIVATE, SoundSource.PLAYERS, 0.6f, 1.2f); + }); + } + + private ItemStack findCluster(ServerPlayer player) { + if (isCluster(player.getMainHandItem())) return player.getMainHandItem(); + if (isCluster(player.getOffhandItem())) return player.getOffhandItem(); + + for (int i = 0; i < player.getInventory().getContainerSize(); i++) { + ItemStack stack = player.getInventory().getItem(i); + if (isCluster(stack)) return stack; + } + return ItemStack.EMPTY; + } + + private boolean isCluster(ItemStack stack) { + return !stack.isEmpty() && stack.is(CosmicItems.PERPETUITY_SHARD_MASSIVE.get()); + } + + @Override + public @NotNull Type type() { + return TYPE; + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/ScarSelectionScreen.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/ScarSelectionScreen.java new file mode 100644 index 000000000..8ce1429a6 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/ScarSelectionScreen.java @@ -0,0 +1,175 @@ +package com.ghostipedia.cosmiccore.common.reflection.ui; + +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainRegistry; +import com.ghostipedia.cosmiccore.utils.StringUtil; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.Set; + +/** + * Simple selection screen for choosing which defiance scar to mend with a Cluster of Perpetuity. + */ +@OnlyIn(Dist.CLIENT) +public class ScarSelectionScreen extends Screen { + + private static final int ENTRY_WIDTH = 280; + private static final int ENTRY_HEIGHT = 32; + private static final int ENTRY_SPACING = 4; + private static final int MAX_VISIBLE = 6; + private static final int FADE_TICKS = 15; + + private final List entries = new ArrayList<>(); + private int hoveredIndex = -1; + private int scrollOffset = 0; + private int listStartY; + private int ticks = 0; + + public ScarSelectionScreen(Set scars) { + super(Component.literal("Mend a Scar")); + + for (ResourceLocation scarId : scars) { + Optional bargain = BargainRegistry.get(scarId); + String name = bargain.map(b -> b.getDisplayName().getString()) + .orElseGet(() -> StringUtil.toTitleCase(scarId.getPath())); + String desc = bargain.map(b -> b.getDescription().getString()) + .orElse("A forgotten bargain"); + entries.add(new ScarEntry(scarId, name, desc)); + } + } + + public static void open(Set scars) { + Minecraft.getInstance().setScreen(new ScarSelectionScreen(scars)); + } + + @Override + protected void init() { + super.init(); + int visibleCount = Math.min(entries.size(), MAX_VISIBLE); + listStartY = height / 2 - (visibleCount * (ENTRY_HEIGHT + ENTRY_SPACING)) / 2; + } + + @Override + public void tick() { + super.tick(); + if (ticks < FADE_TICKS) ticks++; + } + + private float getFade() { + return Math.min(1f, (float) ticks / FADE_TICKS); + } + + private int withAlpha(int color, float alpha) { + int a = (int) (((color >> 24) & 0xFF) * alpha * getFade()); + return (a << 24) | (color & 0x00FFFFFF); + } + + @Override + public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) { + renderBackground(graphics, mouseX, mouseY, partialTick); + graphics.fill(0, 0, width, height, withAlpha(0xCC0a0a12, 1f)); + + // Title + Component title = Component.literal("Mend a Defiance Scar"); + graphics.drawCenteredString(font, title, width / 2, listStartY - 30, withAlpha(0xFFBB99DD, 1f)); + + // Subtitle + graphics.drawCenteredString(font, "Choose which scar to heal", width / 2, listStartY - 16, + withAlpha(0xFF888888, 1f)); + + // Entries + hoveredIndex = -1; + int visibleCount = Math.min(MAX_VISIBLE, entries.size()); + + for (int i = 0; i < visibleCount; i++) { + int entryIndex = i + scrollOffset; + if (entryIndex >= entries.size()) break; + + ScarEntry entry = entries.get(entryIndex); + int x = (width - ENTRY_WIDTH) / 2; + int y = listStartY + i * (ENTRY_HEIGHT + ENTRY_SPACING); + + boolean hovered = mouseX >= x && mouseX < x + ENTRY_WIDTH && mouseY >= y && mouseY < y + ENTRY_HEIGHT; + if (hovered) hoveredIndex = entryIndex; + + renderEntry(graphics, entry, x, y, hovered); + } + + // Scroll hints + if (scrollOffset > 0) { + graphics.drawCenteredString(font, "\u25B2", width / 2, listStartY - 8, withAlpha(0xFF666666, 1f)); + } + if (scrollOffset + MAX_VISIBLE < entries.size()) { + int bottomY = listStartY + visibleCount * (ENTRY_HEIGHT + ENTRY_SPACING); + graphics.drawCenteredString(font, "\u25BC", width / 2, bottomY, withAlpha(0xFF666666, 1f)); + } + + // Cancel hint + graphics.drawCenteredString(font, "ESC to cancel", width / 2, height - 20, withAlpha(0xFF555555, 1f)); + } + + private void renderEntry(GuiGraphics graphics, ScarEntry entry, int x, int y, boolean hovered) { + // Background + int bg = withAlpha(hovered ? 0xDD2a2a3a : 0xAA1a1a24, 1f); + graphics.fill(x, y, x + ENTRY_WIDTH, y + ENTRY_HEIGHT, bg); + + // Border + int border = withAlpha(hovered ? 0xFF8866AA : 0x88443355, 1f); + graphics.fill(x, y, x + ENTRY_WIDTH, y + 1, border); + graphics.fill(x, y + ENTRY_HEIGHT - 1, x + ENTRY_WIDTH, y + ENTRY_HEIGHT, border); + graphics.fill(x, y, x + 1, y + ENTRY_HEIGHT, border); + graphics.fill(x + ENTRY_WIDTH - 1, y, x + ENTRY_WIDTH, y + ENTRY_HEIGHT, border); + + // Icon + graphics.drawString(font, "\u2620", x + 8, y + (ENTRY_HEIGHT - font.lineHeight) / 2, + withAlpha(0xFFAA6688, 1f), false); + + // Name + int nameColor = withAlpha(hovered ? 0xFFDDCCEE : 0xFFAA99BB, 1f); + graphics.drawString(font, entry.name, x + 24, y + 6, nameColor, false); + + // Description (truncate if needed) + String desc = entry.description; + if (font.width(desc) > ENTRY_WIDTH - 32) { + desc = font.plainSubstrByWidth(desc, ENTRY_WIDTH - 40) + "..."; + } + graphics.drawString(font, desc, x + 24, y + 18, withAlpha(0xFF666677, 1f), false); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button == 0 && hoveredIndex >= 0 && hoveredIndex < entries.size()) { + ScarSelectionPackets.sendScarRemoval(entries.get(hoveredIndex).id); + onClose(); + return true; + } + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double scrollX, double scrollY) { + if (entries.size() > MAX_VISIBLE) { + int maxScroll = entries.size() - MAX_VISIBLE; + scrollOffset = Math.max(0, Math.min(maxScroll, scrollOffset - (int) Math.signum(scrollY))); + return true; + } + return super.mouseScrolled(mouseX, mouseY, scrollX, scrollY); + } + + @Override + public boolean isPauseScreen() { + return false; + } + + private record ScarEntry(ResourceLocation id, String name, String description) {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/VoidScreen.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/VoidScreen.java new file mode 100644 index 000000000..d17f9c0ab --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/VoidScreen.java @@ -0,0 +1,2083 @@ +package com.ghostipedia.cosmiccore.common.reflection.ui; + +import com.ghostipedia.cosmiccore.client.renderer.BackgroundRenderer; +import com.ghostipedia.cosmiccore.client.renderer.ChainRenderer; +import com.ghostipedia.cosmiccore.client.renderer.SoulAuraRenderer; +import com.ghostipedia.cosmiccore.client.renderer.SoulCoreRenderer; +import com.ghostipedia.cosmiccore.client.renderer.SoulThreadsRenderer; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionConstants; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionLang; +import com.ghostipedia.cosmiccore.common.reflection.ThresholdEncounter; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain.BargainAnswer; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainRegistry; +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulShape; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.neoforged.api.distmarker.Dist; +import net.neoforged.api.distmarker.OnlyIn; + +import com.mojang.blaze3d.systems.RenderSystem; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.Random; +import java.util.Set; + +import javax.annotation.Nullable; + +/** + * The Void UI - where you face your Reflection. + * + * A full-screen dark environment with: + * - Animated void background with floating particles + * - Soul orb visualization (color based on erosion, marks from bargains) + * - Dialogue text with typewriter effect and word wrapping + * - Stylized choice buttons for bargains + * - Vignette effect for atmosphere + */ +@OnlyIn(Dist.CLIENT) +public class VoidScreen extends Screen { + + // State machine + private VoidState state = VoidState.FADE_IN; + private int ticksInState = 0; + private int totalTicks = 0; + + // Mode determines what the screen does after dialogue + private VoidMode mode = VoidMode.REFLECTION; + + // Dialogue system + private final List dialogueQueue = new ArrayList<>(); + private int currentDialogueIndex = 0; + private String displayedText = ""; + private int charIndex = 0; + private int textTickCounter = 0; + + // Current bargain being offered (if any) + @Nullable + private Bargain currentBargain; + private List currentAnswers; + + // Threshold encounter mode (no bargain, just dialogue with acknowledgment) + private int thresholdIndex = -1; + private boolean isThresholdEncounter = false; + + // Hub mode - browsing bargains + private List availableBargains = new ArrayList<>(); + private List playerActiveBargains = new ArrayList<>(); + private int selectedBargainIndex = 0; + private int bargainListScrollOffset = 0; + @Nullable + private Bargain viewingBargain = null; // Currently viewing details of this bargain + + // Defiance scars for display + private Set defianceScars = Set.of(); + + // Soul shape state + private SoulShape currentSoulShape = SoulShape.UNSHAPED; + private boolean hasMutilator = false; + @Nullable + private SoulShape selectedShape = null; + private int shapeTransformTicks = 0; + private boolean isTransforming = false; + + // Flag to open constellation after dialogue + private boolean pendingConstellationOpen = false; + + // Player's active bargains (for soul marks) + private Set activeBargains = Set.of(); + + // Visual state + private float fadeAlpha = 0f; + private float soulPulse = 0f; + private float soulBreath = 0f; + private int erosion = 0; + + // Economy state + private int shardBalance = 0; + private int usedCapacity = 0; + private int totalCapacity = 100; + + private final Random random = new Random(); + + // Chain physics + private final ChainRenderer chainRenderer = new ChainRenderer(); + + private float lastMouseX, lastMouseY; + + // Answer button state (custom rendering) + private final List answerButtons = new ArrayList<>(); + private int hoveredButton = -1; + + // Constants + private static final int FADE_TICKS = 40; + private static final int CHARS_PER_TICK = 2; + private static final int TICKS_BETWEEN_CHARS = 1; + private static final int MAX_LINE_WIDTH = 350; + + // Soul shape textures - using GTCEU item textures for distinct silhouettes + private static final ResourceLocation TEXTURE_REVENANT = ResourceLocation.fromNamespaceAndPath("gtceu", + "textures/item/material_sets/dull/dust.png"); + private static final ResourceLocation TEXTURE_HOLLOW = ResourceLocation.fromNamespaceAndPath("gtceu", + "textures/item/material_sets/dull/ring.png"); + private static final ResourceLocation TEXTURE_ENGINE = ResourceLocation.fromNamespaceAndPath("gtceu", + "textures/item/material_sets/dull/gear.png"); + private static final ResourceLocation TEXTURE_GLOBEDANCER = ResourceLocation.fromNamespaceAndPath("gtceu", + "textures/item/material_sets/dull/lens.png"); + private static final ResourceLocation TEXTURE_BULWARK = ResourceLocation.fromNamespaceAndPath("gtceu", + "textures/item/material_sets/dull/plate.png"); + private static final ResourceLocation TEXTURE_BLOODTHIRST = ResourceLocation.fromNamespaceAndPath("gtceu", + "textures/item/material_sets/dull/crushed.png"); + + public VoidScreen(int erosion) { + super(ReflectionLang.ui("void_title")); + this.erosion = erosion; + } + + public VoidScreen(int erosion, Set activeBargains) { + this(erosion); + this.activeBargains = activeBargains; + } + + public static void openWithBargain(Bargain bargain, int erosion) { + VoidScreen screen = new VoidScreen(erosion); + screen.currentBargain = bargain; + screen.setupBargainDialogue(); + Minecraft.getInstance().setScreen(screen); + } + + public static void openWithBargain(Bargain bargain, int erosion, Set activeBargains) { + VoidScreen screen = new VoidScreen(erosion, activeBargains); + screen.currentBargain = bargain; + screen.setupBargainDialogue(); + Minecraft.getInstance().setScreen(screen); + } + + public static void openWithBargain(Bargain bargain, int erosion, Set activeBargains, + int shardBalance, int usedCapacity, int totalCapacity) { + VoidScreen screen = new VoidScreen(erosion, activeBargains); + screen.currentBargain = bargain; + screen.shardBalance = shardBalance; + screen.usedCapacity = usedCapacity; + screen.totalCapacity = totalCapacity; + screen.setupBargainDialogue(); + Minecraft.getInstance().setScreen(screen); + } + + public static void openForReflection(int erosion) { + VoidScreen screen = new VoidScreen(erosion); + screen.setupReflectionDialogue(); + Minecraft.getInstance().setScreen(screen); + } + + public static void openForReflection(int erosion, Set activeBargains) { + VoidScreen screen = new VoidScreen(erosion, activeBargains); + screen.setupReflectionDialogue(); + Minecraft.getInstance().setScreen(screen); + } + + public static void openForReflection(int erosion, Set activeBargains, + int shardBalance, int usedCapacity, int totalCapacity) { + VoidScreen screen = new VoidScreen(erosion, activeBargains); + screen.shardBalance = shardBalance; + screen.usedCapacity = usedCapacity; + screen.totalCapacity = totalCapacity; + screen.setupReflectionDialogue(); + Minecraft.getInstance().setScreen(screen); + } + + public static void openForThreshold(int thresholdIndex, int erosion, Set activeBargains) { + VoidScreen screen = new VoidScreen(erosion, activeBargains); + screen.thresholdIndex = thresholdIndex; + screen.isThresholdEncounter = true; + screen.setupThresholdDialogue(); + Minecraft.getInstance().setScreen(screen); + } + + public static void openForHub(int erosion, Set activeBargains, + Set defianceScars) { + VoidScreen screen = new VoidScreen(erosion, activeBargains); + screen.mode = VoidMode.HUB; + screen.defianceScars = defianceScars != null ? defianceScars : Set.of(); + screen.setupHubDialogue(); + Minecraft.getInstance().setScreen(screen); + } + + public static void openForHub(int erosion, Set activeBargains, + Set defianceScars, + int shardBalance, int usedCapacity, int totalCapacity) { + openForHub(erosion, activeBargains, defianceScars, shardBalance, usedCapacity, totalCapacity, + SoulShape.UNSHAPED, false); + } + + public static void openForHub(int erosion, Set activeBargains, + Set defianceScars, + int shardBalance, int usedCapacity, int totalCapacity, + SoulShape soulShape, boolean hasMutilator) { + VoidScreen screen = new VoidScreen(erosion, activeBargains); + screen.mode = VoidMode.HUB; + screen.defianceScars = defianceScars != null ? defianceScars : Set.of(); + screen.shardBalance = shardBalance; + screen.usedCapacity = usedCapacity; + screen.totalCapacity = totalCapacity; + screen.currentSoulShape = soulShape != null ? soulShape : SoulShape.UNSHAPED; + screen.hasMutilator = hasMutilator; + screen.setupHubDialogue(); + Minecraft.getInstance().setScreen(screen); + } + + public void setEconomyData(int shardBalance, int usedCapacity, int totalCapacity) { + this.shardBalance = shardBalance; + this.usedCapacity = usedCapacity; + this.totalCapacity = totalCapacity; + } + + @Override + protected void init() { + super.init(); + initChains(); + } + + private static final int PIN_SCREEN_BUFFER = 30; + + private float[] getPinPosition(ResourceLocation bargainId, int centerX, int centerY) { + int hash = bargainId.hashCode(); + + // Restrict pins to left and right zones — avoid directly above/below the orb + // Map hash to angle within two side arcs: left (-120° to -60°) or right (60° to 120°) + // Expressed in radians: left = π±60°, right = 0±60° + boolean leftSide = (hash & 1) == 0; + float spread = ((hash & 0xFF) / 255.0f - 0.5f) * (float) (Math.PI * 0.65f); + float pinAngle = leftSide ? (float) Math.PI + spread : spread; + + float pinDist = 120 + ((hash >> 8) & 0x7F); + float pinX = centerX + (float) Math.cos(pinAngle) * pinDist; + float pinY = centerY + (float) Math.sin(pinAngle) * pinDist; + + pinX = Math.max(PIN_SCREEN_BUFFER, Math.min(width - PIN_SCREEN_BUFFER, pinX)); + pinY = Math.max(PIN_SCREEN_BUFFER, Math.min(height - PIN_SCREEN_BUFFER, pinY)); + return new float[] { pinX, pinY }; + } + + private void initChains() { + chainRenderer.clear(); + if (activeBargains.isEmpty()) return; + + int centerX = width / 2; + int centerY = height / 2 - 40; + + for (ResourceLocation bargainId : activeBargains) { + float[] pin = getPinPosition(bargainId, centerX, centerY); + int[] color = getBargainMarkColor(bargainId); + chainRenderer.addChain(centerX, centerY, pin[0], pin[1], color); + } + } + + private void setupBargainDialogue() { + if (currentBargain == null) return; + + dialogueQueue.clear(); + + // Add the bargain's offer dialogue + if (minecraft != null && minecraft.player != null) { + for (Component line : currentBargain.getOfferDialogue(minecraft.player)) { + dialogueQueue.add(line.getString()); + } + } + + // Add the question + dialogueQueue.add(currentBargain.getQuestion().getString()); + + // Store answers for later + currentAnswers = currentBargain.getAnswers(); + } + + private void setupReflectionDialogue() { + dialogueQueue.clear(); + + // Contextual greeting based on erosion + int colorTier = ReflectionConstants.getSoulColorTier(erosion); + + if (erosion == 0) { + dialogueQueue.add(ReflectionLang.ui("reflection.no_erosion.0").getString()); + dialogueQueue.add(ReflectionLang.ui("reflection.no_erosion.1").getString()); + dialogueQueue.add(ReflectionLang.ui("reflection.no_erosion.2").getString()); + } else if (colorTier <= 1) { + dialogueQueue.add(ReflectionLang.ui("reflection.low_erosion.0").getString()); + dialogueQueue.add(ReflectionLang.ui("reflection.low_erosion.1").getString()); + } else if (colorTier <= 3) { + dialogueQueue.add(ReflectionLang.ui("reflection.mid_erosion.0").getString()); + dialogueQueue.add(ReflectionLang.ui("reflection.mid_erosion.1").getString()); + } else if (colorTier <= 5) { + dialogueQueue.add(ReflectionLang.ui("reflection.high_erosion.0").getString()); + dialogueQueue.add(ReflectionLang.ui("reflection.high_erosion.1").getString()); + } else { + dialogueQueue.add(ReflectionLang.ui("reflection.extreme_erosion.0").getString()); + dialogueQueue.add(ReflectionLang.ui("reflection.extreme_erosion.1").getString()); + } + + // If they have bargains, comment on them + if (!activeBargains.isEmpty()) { + dialogueQueue.add(ReflectionLang.ui("reflection.has_bargains.0").getString()); + dialogueQueue.add(ReflectionLang.ui("reflection.has_bargains.1").getString()); + } + } + + private void setupThresholdDialogue() { + dialogueQueue.clear(); + + // Get the threshold-specific dialogue + for (Component line : ThresholdEncounter.getDialogue(thresholdIndex)) { + dialogueQueue.add(line.getString()); + } + + // Add the rhetorical question/prompt + String question = ThresholdEncounter.getQuestion(thresholdIndex).getString(); + if (!question.isEmpty()) { + dialogueQueue.add(question); + } + } + + private void setupHubDialogue() { + dialogueQueue.clear(); + + // Contextual greeting based on player's state + int colorTier = ReflectionConstants.getSoulColorTier(erosion); + + if (!activeBargains.isEmpty()) { + // Has bargains - comment on them + if (colorTier >= 4) { + dialogueQueue.add(ReflectionLang.ui("hub.greeting.many_bargains_high.0").getString()); + dialogueQueue.add(ReflectionLang.ui("hub.greeting.many_bargains_high.1").getString()); + } else if (activeBargains.size() >= 3) { + dialogueQueue.add(ReflectionLang.ui("hub.greeting.many_bargains.0").getString()); + dialogueQueue.add(ReflectionLang.ui("hub.greeting.many_bargains.1").getString()); + } else { + dialogueQueue.add(ReflectionLang.ui("hub.greeting.has_bargains.0").getString()); + dialogueQueue.add(ReflectionLang.ui("hub.greeting.has_bargains.1").getString()); + } + } else if (!defianceScars.isEmpty()) { + // Has defied before - acknowledge the scars + dialogueQueue.add(ReflectionLang.ui("hub.greeting.has_scars.0").getString()); + dialogueQueue.add(ReflectionLang.ui("hub.greeting.has_scars.1").getString()); + dialogueQueue.add(ReflectionLang.ui("hub.greeting.has_scars.2").getString()); + } else if (erosion > 0) { + // Has erosion but no bargains - curious + dialogueQueue.add(ReflectionLang.ui("hub.greeting.erosion_no_bargains.0").getString()); + dialogueQueue.add(ReflectionLang.ui("hub.greeting.erosion_no_bargains.1").getString()); + dialogueQueue.add(ReflectionLang.ui("hub.greeting.erosion_no_bargains.2").getString()); + } else { + // Fresh - rare to hit hub with no erosion + dialogueQueue.add(ReflectionLang.ui("hub.greeting.fresh.0").getString()); + dialogueQueue.add(ReflectionLang.ui("hub.greeting.fresh.1").getString()); + } + + dialogueQueue.add(ReflectionLang.ui("hub.greeting.question").getString()); + } + + private void setupHubMenu() { + answerButtons.clear(); + + int buttonWidth = 280; + int buttonHeight = 28; + int startY = height / 2 + 40; + int spacing = 35; + + // Populate bargain lists for later + availableBargains = BargainRegistry.getAvailable(activeBargains, defianceScars); + playerActiveBargains = BargainRegistry.getActive(activeBargains); + + // Menu options + List menuOptions = new ArrayList<>(); + + // Option 1: View active bargains (if any) + if (!playerActiveBargains.isEmpty()) { + menuOptions.add(new BargainAnswer( + "view_active", + ReflectionLang.uiReviewBargains(playerActiveBargains.size()))); + } + + // Option 2: Browse the constellation (always show - displays all bargain states) + Component browseText = availableBargains.isEmpty() ? ReflectionLang.uiGazeConstellation() : + ReflectionLang.uiBrowseBargains(availableBargains.size()); + menuOptions.add(new BargainAnswer( + "browse_bargains", + browseText)); + + // Option 3: Soul mutation (only if has mutilator and not yet shaped) + if (hasMutilator && !currentSoulShape.isShaped()) { + menuOptions.add(new BargainAnswer( + "mutilate_soul", + ReflectionLang.ui("hub.mutilate_soul"))); + } + + // Option 4: Just reflect (always available) + menuOptions.add(new BargainAnswer( + "just_reflect", + ReflectionLang.uiJustLook())); + + // Option 5: Leave + menuOptions.add(new BargainAnswer( + "leave", + ReflectionLang.uiLeave())); + + for (int i = 0; i < menuOptions.size(); i++) { + BargainAnswer option = menuOptions.get(i); + int x = (width - buttonWidth) / 2; + int y = startY + (i * spacing); + answerButtons.add(new AnswerButton(x, y, buttonWidth, buttonHeight, option, i)); + } + } + + private void setupBrowseBargains() { + answerButtons.clear(); + + int buttonWidth = 280; + int buttonHeight = 28; + int startY = height / 2 + 20; + int spacing = 35; + + List options = new ArrayList<>(); + + // List available bargains + for (Bargain bargain : availableBargains) { + String tierStr = getTierString(bargain.getTier()); + int cost = bargain.getBaseCost(); + + options.add(new BargainAnswer( + "view_" + bargain.getId().getPath(), + Component.literal(tierStr + bargain.getDisplayName().getString() + " \u00A78[" + cost + " " + + ReflectionLang.ui("erosion").getString() + "]"), + Optional.of(ReflectionLang.ui("browse.interesting_choice")), + false, 0, + bargain.getPowerDescriptions(), + bargain.getDrawbackDescriptions())); + } + + // Back option + options.add(new BargainAnswer( + "back", + ReflectionLang.uiBack())); + + for (int i = 0; i < options.size(); i++) { + BargainAnswer option = options.get(i); + int x = (width - buttonWidth) / 2; + int y = startY + (i * spacing); + answerButtons.add(new AnswerButton(x, y, buttonWidth, buttonHeight, option, i)); + } + } + + private void setupViewActiveBargains() { + answerButtons.clear(); + + int buttonWidth = 280; + int buttonHeight = 28; + int startY = height / 2 + 60; // Below the soul orb and orbiting marks + int spacing = 35; + + // Calculate max visible items based on screen height + int maxVisibleItems = Math.max(3, (height - startY - 80) / spacing); + + List allOptions = new ArrayList<>(); + + // List active bargains with defiance option + for (Bargain bargain : playerActiveBargains) { + int defianceCost = BargainRegistry.calculateDefianceCost(bargain); + + allOptions.add(new BargainAnswer( + "defy_" + bargain.getId().getPath(), + Component.literal("\u00A7c\u2717 " + bargain.getDisplayName().getString() + " \u00A78[" + + ReflectionLang.ui("defy").getString() + ": " + defianceCost + "]"), + Optional.of(ReflectionLang.ui("defiance.question")), + false, 0, + bargain.getPowerDescriptions(), + List.of( + ReflectionLang.uiDefianceCost(defianceCost), + ReflectionLang.ui("defiance.lose_power"), + ReflectionLang.ui("defiance.scar_remains")))); + } + + // Back option (always at the end) + allOptions.add(new BargainAnswer( + "back", + ReflectionLang.uiBack())); + + // Store total options for scroll calculation + viewActiveAllOptions = allOptions; + viewActiveMaxVisible = maxVisibleItems; + + // Clamp scroll offset + int maxScroll = Math.max(0, allOptions.size() - maxVisibleItems); + bargainListScrollOffset = Math.max(0, Math.min(bargainListScrollOffset, maxScroll)); + + // Create visible buttons with scroll offset applied + int visibleCount = Math.min(maxVisibleItems, allOptions.size() - bargainListScrollOffset); + for (int i = 0; i < visibleCount; i++) { + int optionIndex = i + bargainListScrollOffset; + BargainAnswer option = allOptions.get(optionIndex); + int x = (width - buttonWidth) / 2; + int y = startY + (i * spacing); + answerButtons.add(new AnswerButton(x, y, buttonWidth, buttonHeight, option, optionIndex)); + } + } + + // Track all options for scrolling + private List viewActiveAllOptions = new ArrayList<>(); + private int viewActiveMaxVisible = 5; + + private void setupDefianceConfirm(Bargain bargain) { + answerButtons.clear(); + + int buttonWidth = 280; + int buttonHeight = 28; + int startY = height / 2 + 60; + int spacing = 35; + + int defianceCost = BargainRegistry.calculateDefianceCost(bargain); + + // Add warning dialogue + dialogueQueue.clear(); + dialogueQueue.add(ReflectionLang.defianceWarning1(bargain.getDisplayName().getString()).getString()); + dialogueQueue.add(ReflectionLang.defianceWarning2(defianceCost).getString()); + dialogueQueue.add(ReflectionLang.defianceWarning3().getString()); + dialogueQueue.add(ReflectionLang.defianceWarning4().getString()); + currentDialogueIndex = 0; + charIndex = 0; + displayedText = ""; + + List options = new ArrayList<>(); + + // Confirm defiance - simple button, dialogue already explains consequences + options.add(new BargainAnswer( + "confirm_defiance", + ReflectionLang.defianceConfirm())); + + // Cancel + options.add(new BargainAnswer( + "cancel", + ReflectionLang.defianceCancel())); + + for (int i = 0; i < options.size(); i++) { + BargainAnswer option = options.get(i); + int x = (width - buttonWidth) / 2; + int y = startY + (i * spacing); + answerButtons.add(new AnswerButton(x, y, buttonWidth, buttonHeight, option, i)); + } + } + + private void setupSoulShapeSelection() { + answerButtons.clear(); + + int buttonWidth = 140; + int buttonHeight = 28; + int startY = height / 2 + 50; // Push down to avoid header overlap + int spacingX = 10; + int spacingY = 35; + int columns = 2; + + List shapeOptions = new ArrayList<>(); + + // Create a button for each soul shape (excluding UNSHAPED) + for (SoulShape shape : SoulShape.values()) { + if (shape == SoulShape.UNSHAPED) continue; + + // Get the shape's color code + String colorCode = getShapeColorCode(shape); + + shapeOptions.add(new BargainAnswer( + "shape_" + shape.getId(), + Component.literal(colorCode + shape.getFormattedName().getString()), + Optional.of(Component.translatable("cosmiccore.soul_shape." + shape.getId() + ".tagline")), + false, 0, + List.of(shape.getDescription(), + Component.literal("\u00A76Super: ").append(shape.getSuperName()), + shape.getSuperDescription()), + List.of(ReflectionLang.ui("soul_shape.warning_permanent")))); + } + + // Layout shape options in 2x3 grid + int totalWidth = (buttonWidth * columns) + (spacingX * (columns - 1)); + int startX = (width - totalWidth) / 2; + + for (int i = 0; i < shapeOptions.size(); i++) { + BargainAnswer option = shapeOptions.get(i); + int col = i % columns; + int row = i / columns; + int x = startX + (col * (buttonWidth + spacingX)); + int y = startY + (row * spacingY); + answerButtons.add(new AnswerButton(x, y, buttonWidth, buttonHeight, option, i)); + } + + // Back button centered below the grid + int rows = (shapeOptions.size() + columns - 1) / columns; + int backY = startY + (rows * spacingY) - 5; // Tighter spacing to fit on screen + int backWidth = 120; + BargainAnswer backOption = new BargainAnswer("back", ReflectionLang.uiBack()); + answerButtons.add(new AnswerButton((width - backWidth) / 2, backY, backWidth, buttonHeight, + backOption, shapeOptions.size())); + } + + private void handleSoulShapeChoice(BargainAnswer answer) { + answerButtons.clear(); + + if (answer.id().equals("back")) { + transitionTo(VoidState.HUB_MENU); + setupHubMenu(); + return; + } + + if (answer.id().startsWith("shape_")) { + String shapeId = answer.id().substring(6); // Remove "shape_" + SoulShape shape = SoulShape.fromId(shapeId); + + if (shape != SoulShape.UNSHAPED) { + selectedShape = shape; + + // Send the choice to the server + VoidUIPackets.sendSoulShapeChoice(shape); + + // DON'T update currentSoulShape yet - wait until transformation completes + + // Show transformation dialogue then animate + dialogueQueue.clear(); + dialogueQueue.add(ReflectionLang.ui("soul_shape.transforming.0").getString()); + dialogueQueue.add(ReflectionLang.ui("soul_shape.transforming.1", + shape.getFormattedName().getString()).getString()); + currentDialogueIndex = 0; + charIndex = 0; + displayedText = ""; + + pendingNextState = VoidState.SOUL_TRANSFORMING; + pendingSetup = () -> { + isTransforming = true; + shapeTransformTicks = 0; + }; + transitionTo(VoidState.DIALOGUE); + } + } + } + + private String getShapeColorCode(SoulShape shape) { + return switch (shape.getColor()) { + case DARK_RED -> "\u00A74"; + case DARK_PURPLE -> "\u00A75"; + case GOLD -> "\u00A76"; + case AQUA -> "\u00A7b"; + case DARK_GRAY -> "\u00A78"; + case RED -> "\u00A7c"; + default -> "\u00A7f"; + }; + } + + private String getTierString(Bargain.BargainTier tier) { + return switch (tier) { + case EARLY -> "\u00A77"; // Gray - early game + case EARLY_MID -> "\u00A7f"; // White + case MID -> "\u00A7b"; // Aqua + case LATE -> "\u00A75"; // Purple + case EXTREME -> "\u00A74"; // Dark red - dangerous + case ANY -> "\u00A7e"; // Yellow - always available + }; + } + + @Override + public void tick() { + super.tick(); + ticksInState++; + totalTicks++; + + // Soul animations + soulPulse += 0.08f; + soulBreath += 0.03f; + + // Tick chain physics + chainRenderer.tick(lastMouseX, lastMouseY); + + switch (state) { + case FADE_IN -> { + fadeAlpha = Math.min(1f, (float) ticksInState / FADE_TICKS); + if (ticksInState >= FADE_TICKS) { + transitionTo(VoidState.DIALOGUE); + } + } + case DIALOGUE -> { + tickDialogue(); + } + case AWAITING_CHOICE, HUB_MENU, BROWSE_BARGAINS, VIEW_ACTIVE, DEFIANCE_CONFIRM, SOUL_SHAPE_SELECT -> { + // Just wait for button interaction + } + case SOUL_TRANSFORMING -> { + shapeTransformTicks++; + // Animation duration: 100 ticks (5 seconds) - longer for smoother transition + // Phase 1 (0-30): Breaking apart + // Phase 2 (30-60): Chaos/morphing + // Phase 3 (60-90): Reforming + // Phase 4 (90-100): Settling/stabilizing + if (shapeTransformTicks >= 100) { + isTransforming = false; + + // NOW update the visual shape after animation completes + if (selectedShape != null) { + currentSoulShape = selectedShape; + } + + // Show completion dialogue then fade out + dialogueQueue.clear(); + if (selectedShape != null) { + dialogueQueue.add(ReflectionLang.ui("soul_shape.complete.0", + selectedShape.getFormattedName().getString()).getString()); + dialogueQueue.add(ReflectionLang.ui("soul_shape.complete.1").getString()); + } + currentDialogueIndex = 0; + charIndex = 0; + displayedText = ""; + mode = VoidMode.REFLECTION; + transitionTo(VoidState.DIALOGUE); + } + } + case FADE_OUT -> { + fadeAlpha = Math.max(0f, 1f - (float) ticksInState / FADE_TICKS); + if (ticksInState >= FADE_TICKS) { + onClose(); + } + } + } + } + + private void tickDialogue() { + if (currentDialogueIndex >= dialogueQueue.size()) { + // Done with dialogue - what comes next depends on mode + + // Check for pending state transition first + if (pendingNextState != null) { + VoidState nextState = pendingNextState; + Runnable setup = pendingSetup; + pendingNextState = null; + pendingSetup = null; + transitionTo(nextState); + if (setup != null) { + setup.run(); + } + return; + } + + // Check if we should open the constellation browser + if (pendingConstellationOpen) { + pendingConstellationOpen = false; + BargainConstellationScreen.openFromVoid(erosion, activeBargains, defianceScars, + shardBalance, usedCapacity, totalCapacity); + return; + } + + if (currentBargain != null && currentAnswers != null) { + transitionTo(VoidState.AWAITING_CHOICE); + setupAnswerButtons(); + } else if (isThresholdEncounter) { + // Threshold encounter - show acknowledge button + transitionTo(VoidState.AWAITING_CHOICE); + setupThresholdAcknowledge(); + } else if (mode == VoidMode.HUB) { + // Hub mode - show menu + transitionTo(VoidState.HUB_MENU); + setupHubMenu(); + } else { + transitionTo(VoidState.FADE_OUT); + } + return; + } + + String fullText = dialogueQueue.get(currentDialogueIndex); + + textTickCounter++; + if (textTickCounter >= TICKS_BETWEEN_CHARS) { + textTickCounter = 0; + charIndex = Math.min(charIndex + CHARS_PER_TICK, fullText.length()); + displayedText = fullText.substring(0, charIndex); + } + } + + private void setupThresholdAcknowledge() { + answerButtons.clear(); + + int buttonWidth = 200; + int buttonHeight = 28; + int x = (width - buttonWidth) / 2; + int y = height / 2 + 60; + + // Single "acknowledge" button for threshold encounters + BargainAnswer acknowledge = new BargainAnswer( + "acknowledge", + ReflectionLang.uiAcknowledge()); + + answerButtons.add(new AnswerButton(x, y, buttonWidth, buttonHeight, acknowledge, 0)); + } + + private void setupAnswerButtons() { + answerButtons.clear(); + + if (currentAnswers == null) return; + + int buttonWidth = 280; + int buttonHeight = 28; + int startY = height / 2 + 60; + int spacing = 35; + + for (int i = 0; i < currentAnswers.size(); i++) { + BargainAnswer answer = currentAnswers.get(i); + int x = (width - buttonWidth) / 2; + int y = startY + (i * spacing); + + answerButtons.add(new AnswerButton(x, y, buttonWidth, buttonHeight, answer, i)); + } + } + + private void onAnswerSelected(BargainAnswer answer) { + // Handle threshold acknowledgment + if (isThresholdEncounter && answer.id().equals("acknowledge")) { + dialogueQueue.clear(); + String response = ThresholdEncounter.getAcknowledgeResponse(thresholdIndex).getString(); + if (!response.isEmpty()) { + dialogueQueue.add(response); + } + currentDialogueIndex = 0; + charIndex = 0; + displayedText = ""; + answerButtons.clear(); + isThresholdEncounter = false; + + if (response.isEmpty()) { + // Silent response, just fade out + transitionTo(VoidState.FADE_OUT); + } else { + transitionTo(VoidState.DIALOGUE); + } + return; + } + + // Handle hub menu choices + if (state == VoidState.HUB_MENU) { + handleHubMenuChoice(answer); + return; + } + + // Handle browse bargains choices + if (state == VoidState.BROWSE_BARGAINS) { + handleBrowseBargainsChoice(answer); + return; + } + + // Handle view active choices + if (state == VoidState.VIEW_ACTIVE) { + handleViewActiveChoice(answer); + return; + } + + // Handle defiance confirmation + if (state == VoidState.DEFIANCE_CONFIRM) { + handleDefianceConfirmChoice(answer); + return; + } + + // Handle soul shape selection + if (state == VoidState.SOUL_SHAPE_SELECT) { + handleSoulShapeChoice(answer); + return; + } + + if (currentBargain == null) return; + + // Send packet to server to process the choice + VoidUIPackets.sendBargainChoice(currentBargain.getId(), answer.id()); + + // Show response dialogue + dialogueQueue.clear(); + String response = answer.reflectionResponse() + .map(Component::getString) + .orElse("..."); + dialogueQueue.add(response); + currentDialogueIndex = 0; + charIndex = 0; + displayedText = ""; + + // Clear buttons and transition back to dialogue, then fade out + answerButtons.clear(); + currentBargain = null; + currentAnswers = null; + + transitionTo(VoidState.DIALOGUE); + } + + private void handleHubMenuChoice(BargainAnswer answer) { + answerButtons.clear(); + + switch (answer.id()) { + case "view_active" -> { + // Transition directly to VIEW_ACTIVE + transitionTo(VoidState.VIEW_ACTIVE); + setupViewActiveBargains(); + } + case "browse_bargains" -> { + // Open the constellation browser with economy data + BargainConstellationScreen.openFromVoid(erosion, activeBargains, defianceScars, + shardBalance, usedCapacity, totalCapacity); + } + case "mutilate_soul" -> { + // Show soul shape selection dialogue then menu + dialogueQueue.clear(); + dialogueQueue.add(ReflectionLang.ui("soul_shape.intro.0").getString()); + dialogueQueue.add(ReflectionLang.ui("soul_shape.intro.1").getString()); + dialogueQueue.add(ReflectionLang.ui("soul_shape.intro.2").getString()); + currentDialogueIndex = 0; + charIndex = 0; + displayedText = ""; + pendingNextState = VoidState.SOUL_SHAPE_SELECT; + pendingSetup = this::setupSoulShapeSelection; + transitionTo(VoidState.DIALOGUE); + } + case "just_reflect" -> { + // Just fade out + transitionTo(VoidState.FADE_OUT); + } + case "leave" -> { + transitionTo(VoidState.FADE_OUT); + } + } + } + + private void handleBrowseBargainsChoice(BargainAnswer answer) { + answerButtons.clear(); + + if (answer.id().equals("back")) { + // Return to hub menu + viewingBargain = null; + transitionTo(VoidState.HUB_MENU); + setupHubMenu(); + return; + } + + if (answer.id().startsWith("view_")) { + // View a specific bargain's details + String bargainPath = answer.id().substring(5); // Remove "view_" + for (Bargain bargain : availableBargains) { + if (bargain.getId().getPath().equals(bargainPath)) { + viewingBargain = bargain; + currentBargain = bargain; + currentAnswers = bargain.getAnswers(); + // Show the bargain's offer dialogue + setupBargainDialogue(); + transitionTo(VoidState.DIALOGUE); + return; + } + } + } + } + + private void handleViewActiveChoice(BargainAnswer answer) { + answerButtons.clear(); + + if (answer.id().equals("back")) { + viewingBargain = null; + transitionTo(VoidState.HUB_MENU); + setupHubMenu(); + return; + } + + if (answer.id().startsWith("defy_")) { + // Initiate defiance for a bargain + String bargainPath = answer.id().substring(5); + for (Bargain bargain : playerActiveBargains) { + if (bargain.getId().getPath().equals(bargainPath)) { + viewingBargain = bargain; + transitionTo(VoidState.DEFIANCE_CONFIRM); + setupDefianceConfirm(bargain); + return; + } + } + } + } + + private void handleDefianceConfirmChoice(BargainAnswer answer) { + answerButtons.clear(); + + if (answer.id().equals("cancel")) { + viewingBargain = null; + transitionTo(VoidState.VIEW_ACTIVE); + setupViewActiveBargains(); + return; + } + + if (answer.id().equals("confirm_defiance") && viewingBargain != null) { + // Send defiance packet to server + VoidUIPackets.sendDefianceChoice(viewingBargain.getId()); + + // Show dramatic response + dialogueQueue.clear(); + dialogueQueue.add("So be it."); + dialogueQueue.add("The power leaves you..."); + dialogueQueue.add("But the scar remains."); + currentDialogueIndex = 0; + charIndex = 0; + displayedText = ""; + + // Update local state + activeBargains.remove(viewingBargain.getId()); + defianceScars = new java.util.HashSet<>(defianceScars); + ((java.util.HashSet) defianceScars).add(viewingBargain.getId()); + playerActiveBargains = BargainRegistry.getActive(activeBargains); + + viewingBargain = null; + mode = VoidMode.REFLECTION; // Return to simple reflection mode + transitionTo(VoidState.DIALOGUE); + } + } + + private void showResponseThenState(String response, VoidState nextState, Runnable setupNext) { + dialogueQueue.clear(); + dialogueQueue.add(response); + currentDialogueIndex = 0; + charIndex = 0; + displayedText = ""; + + // Store what to do after dialogue + this.pendingNextState = nextState; + this.pendingSetup = setupNext; + mode = VoidMode.REFLECTION; // Temporarily switch mode so dialogue finishes normally + transitionTo(VoidState.DIALOGUE); + } + + private void showResponseThenFadeOut(String response) { + dialogueQueue.clear(); + dialogueQueue.add(response); + currentDialogueIndex = 0; + charIndex = 0; + displayedText = ""; + mode = VoidMode.REFLECTION; + transitionTo(VoidState.DIALOGUE); + } + + // Pending state for after response dialogue + @Nullable + private VoidState pendingNextState = null; + @Nullable + private Runnable pendingSetup = null; + + private void transitionTo(VoidState newState) { + state = newState; + ticksInState = 0; + } + + @Override + public void render(GuiGraphics graphics, int mouseX, int mouseY, float partialTick) { + // Mystical void background shader + BackgroundRenderer.render(graphics.pose(), BackgroundRenderer.BackgroundType.VOID, fadeAlpha, width, height); + + if (fadeAlpha < 0.1f) { + return; + } + + renderVignette(graphics); + + // Track mouse for chain physics + lastMouseX = mouseX; + lastMouseY = mouseY; + + chainRenderer.render(graphics, fadeAlpha, mouseX, mouseY, partialTick); + renderBargainPins(graphics); + + // Render soul orb in center + renderSoulOrb(graphics, partialTick); + + // Render dialogue text + if (state == VoidState.DIALOGUE || state == VoidState.AWAITING_CHOICE || + state == VoidState.HUB_MENU || state == VoidState.DEFIANCE_CONFIRM || + state == VoidState.SOUL_SHAPE_SELECT) { + renderDialogue(graphics); + } + + // Render transformation effect + if (state == VoidState.SOUL_TRANSFORMING && isTransforming) { + renderTransformationEffect(graphics); + } + + // Render state-specific headers + renderStateHeader(graphics); + + // Render click to continue hint + if (state == VoidState.DIALOGUE && currentDialogueIndex < dialogueQueue.size()) { + String fullText = dialogueQueue.get(currentDialogueIndex); + if (charIndex >= fullText.length()) { + renderContinueHint(graphics); + } + } + + // Render bargain cost preview (before buttons so tooltip can cover it) + if (state == VoidState.AWAITING_CHOICE && currentBargain != null) { + renderCostPreview(graphics); + } + + // Render answer buttons for all interactive states + if (state == VoidState.AWAITING_CHOICE || state == VoidState.HUB_MENU || + state == VoidState.BROWSE_BARGAINS || state == VoidState.VIEW_ACTIVE || + state == VoidState.DEFIANCE_CONFIRM || state == VoidState.SOUL_SHAPE_SELECT) { + renderAnswerButtons(graphics, mouseX, mouseY); + } + + // Render erosion indicator (subtle) + renderErosionIndicator(graphics); + } + + private void renderVignette(GuiGraphics graphics) { + // Create a vignette effect using gradient bands (2px bands for smooth gradients) + int vignetteStrength = (int) (fadeAlpha * 180); + int bandSize = 2; + + // Top and bottom gradients + for (int i = 0; i < 60; i += bandSize) { + int alpha = (int) (vignetteStrength * (1f - (float) i / 60f)); + int color = (alpha << 24); + graphics.fill(0, i, width, i + bandSize, color); + graphics.fill(0, height - i - bandSize, width, height - i, color); + } + + // Left and right gradients + for (int i = 0; i < 80; i += bandSize) { + int alpha = (int) (vignetteStrength * (1f - (float) i / 80f) * 0.7f); + int color = (alpha << 24); + graphics.fill(i, 0, i + bandSize, height, color); + graphics.fill(width - i - bandSize, 0, width - i, height, color); + } + } + + private void renderSoulOrb(GuiGraphics graphics, float partialTick) { + int centerX = width / 2; + int centerY = height / 2 - 40; + + // Breathing + pulsing animation - interpolate with partialTick for smooth 60fps animation + float smoothBreath = soulBreath + (0.03f * partialTick); + float smoothPulse = soulPulse + (0.08f * partialTick); + float breath = (float) Math.sin(smoothBreath) * 0.05f + 1f; + float pulse = (float) Math.sin(smoothPulse) * 0.08f + 1f; + int baseRadius = 35; + int radius = (int) (baseRadius * breath * pulse); + + int auraRadius = (int) (baseRadius * 1.8f); + SoulAuraRenderer.render( + graphics.pose(), + centerX, centerY, + auraRadius, + erosion, + fadeAlpha * 0.8f, + width, height); + + // Render shape-specific soul + if (currentSoulShape.isShaped()) { + renderShapedSoul(graphics, centerX, centerY, radius, currentSoulShape, 1.0f); + } else { + renderUnshapedSoul(graphics, centerX, centerY, radius); + } + } + + private void renderUnshapedSoul(GuiGraphics graphics, int centerX, int centerY, int radius) { + graphics.flush(); + SoulCoreRenderer.render( + graphics.pose(), + centerX, centerY, + radius, + erosion, + fadeAlpha, + width, height); + SoulThreadsRenderer.render( + graphics.pose(), + centerX, centerY, + radius, + erosion, + fadeAlpha, + width, height); + } + + private void renderShapedSoul(GuiGraphics graphics, int centerX, int centerY, int radius, + SoulShape shape, float shapeProgress) { + int[] rgb = getShapeRGB(shape); + float alpha = fadeAlpha * shapeProgress; + + // Get the texture for this shape + ResourceLocation texture = getShapeTexture(shape); + if (texture == null) { + renderUnshapedSoul(graphics, centerX, centerY, radius); + return; + } + + // Outer glow effect (color-tinted circles) + for (int r = radius + 30; r > radius; r -= 5) { + float progress = (float) (r - radius) / 30f; + int gAlpha = (int) ((1f - progress) * 40 * alpha); + int gColor = (gAlpha << 24) | (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + drawCircleFast(graphics, centerX, centerY, r, gColor); + } + + // Shape-specific animations + float scale = 1.0f; + switch (shape) { + case BLOODTHIRST -> scale = 1.0f + (float) Math.sin(ticksInState * 0.15f) * 0.05f; // Pulse + default -> {} + } + + // Render the texture with color tinting + int size = (int) (radius * 2.2f * scale); + int x = centerX - size / 2; + int y = centerY - size / 2; + + // Set color tint + RenderSystem.enableBlend(); + RenderSystem.setShaderColor(rgb[0] / 255f, rgb[1] / 255f, rgb[2] / 255f, alpha); + graphics.blit(texture, x, y, 0, 0, size, size, size, size); + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + + // Inner core glow for depth + int coreAlpha = (int) (alpha * 150); + int coreColor = (coreAlpha << 24) | (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + drawCircleFast(graphics, centerX, centerY, radius / 3, coreColor); + } + + private ResourceLocation getShapeTexture(SoulShape shape) { + return switch (shape) { + case REVENANT -> TEXTURE_REVENANT; + case HOLLOW -> TEXTURE_HOLLOW; + case ENGINE -> TEXTURE_ENGINE; + case GLOBEDANCER -> TEXTURE_GLOBEDANCER; + case BULWARK -> TEXTURE_BULWARK; + case BLOODTHIRST -> TEXTURE_BLOODTHIRST; + default -> null; + }; + } + + private void renderBargainPins(GuiGraphics graphics) { + if (activeBargains.isEmpty()) return; + + int centerX = width / 2; + int centerY = height / 2 - 40; + + int index = 0; + for (ResourceLocation bargainId : activeBargains) { + float[] pin = getPinPosition(bargainId, centerX, centerY); + float pinX = pin[0]; + float pinY = pin[1]; + + int[] markColor = getBargainMarkColor(bargainId); + int alpha = (int) (fadeAlpha * 180); + + // Check if this chain is hovered + boolean hovered = index < chainRenderer.getChainCount() && + chainRenderer.getChain(index).isHovered(); + + // Outer glow + int glowRadius = hovered ? 8 : 5; + int glowAlpha = (int) (fadeAlpha * (hovered ? 80 : 40)); + int glowColor = (glowAlpha << 24) | (markColor[0] << 16) | (markColor[1] << 8) | markColor[2]; + drawCircle(graphics, (int) pinX, (int) pinY, glowRadius, glowColor); + + // Core pin + int coreAlpha = (int) (fadeAlpha * (hovered ? 255 : 200)); + int coreColor = (coreAlpha << 24) | (markColor[0] << 16) | (markColor[1] << 8) | markColor[2]; + drawCircle(graphics, (int) pinX, (int) pinY, 3, coreColor); + + // Bright center + int brightAlpha = (int) (fadeAlpha * (hovered ? 255 : 180)); + int brightR = Math.min(255, markColor[0] + 80); + int brightG = Math.min(255, markColor[1] + 80); + int brightB = Math.min(255, markColor[2] + 80); + int brightColor = (brightAlpha << 24) | (brightR << 16) | (brightG << 8) | brightB; + graphics.fill((int) pinX - 1, (int) pinY - 1, (int) pinX + 2, (int) pinY + 2, brightColor); + + index++; + } + } + + private int[] getBargainMarkColor(ResourceLocation id) { + String path = id.getPath(); + return switch (path) { + // EARLY tier - cool/inviting colors + case "quake_movement" -> new int[] { 100, 200, 255 }; // Cyan - movement + case "stride" -> new int[] { 120, 220, 180 }; // Seafoam - step assist + case "darksight" -> new int[] { 160, 120, 255 }; // Violet - night vision + case "swiftness" -> new int[] { 255, 200, 100 }; // Amber - speed + + // EARLY_MID tier - warmer colors + case "home" -> new int[] { 255, 220, 100 }; // Gold - hearth + case "back" -> new int[] { 180, 100, 220 }; // Purple - death echo + case "vitality" -> new int[] { 255, 120, 120 }; // Coral - health + case "violence" -> new int[] { 220, 80, 80 }; // Crimson - strength + case "depths" -> new int[] { 80, 180, 220 }; // Ocean blue - water breathing + + // MID tier - more intense colors + case "reach" -> new int[] { 200, 160, 255 }; // Lavender - elongated grasp + case "soft_landing" -> new int[] { 180, 255, 180 }; // Mint - fall immunity + case "satiated" -> new int[] { 200, 180, 120 }; // Tan - no hunger + case "carapace" -> new int[] { 160, 160, 180 }; // Steel - armor + case "cinder" -> new int[] { 255, 140, 60 }; // Flame orange - fire immunity + + // LATE tier - darker/ominous + case "void_anchor" -> new int[] { 120, 60, 180 }; // Deep purple - void resistance + + default -> { + // Hash-based unique color as fallback + int hash = path.hashCode(); + int r = 100 + Math.abs(hash % 100); + int g = 100 + Math.abs((hash >> 8) % 100); + int b = 100 + Math.abs((hash >> 16) % 100); + yield new int[] { r, g, b }; + } + }; + } + + private void drawCircle(GuiGraphics graphics, int cx, int cy, int radius, int color) { + for (int y = -radius; y <= radius; y++) { + int halfWidth = (int) Math.sqrt(radius * radius - y * y); + graphics.fill(cx - halfWidth, cy + y, cx + halfWidth + 1, cy + y + 1, color); + } + } + + private void drawCircleFast(GuiGraphics graphics, int cx, int cy, int radius, int color) { + if (radius <= 0) return; + + // For small radii, use precise 1px drawing + if (radius <= 6) { + drawCircle(graphics, cx, cy, radius, color); + return; + } + + // Use 2px bands for good quality + int bandSize = 2; + + for (int y = -radius; y <= radius; y += bandSize) { + int halfWidth = (int) Math.sqrt(radius * radius - y * y); + int bandEnd = Math.min(y + bandSize, radius + 1); + graphics.fill(cx - halfWidth, cy + y, cx + halfWidth + 1, cy + bandEnd, color); + } + } + + private int[] getSoulColor() { + int tier = ReflectionConstants.getSoulColorTier(erosion); + + return switch (tier) { + case 0 -> new int[] { 220, 220, 235 }; // Pale white/silver + case 1 -> new int[] { 180, 200, 255 }; // Faint blue + case 2 -> new int[] { 140, 120, 220 }; // Deep blue/purple + case 3 -> new int[] { 180, 80, 160 }; // Violet/crimson + case 4 -> new int[] { 160, 50, 50 }; // Dark red + case 5 -> new int[] { 80, 30, 30 }; // Almost black, faint red + default -> new int[] { 20, 10, 30 }; // Void-like + }; + } + + private void renderDialogue(GuiGraphics graphics) { + if (displayedText.isEmpty() && state != VoidState.AWAITING_CHOICE) return; + + int textY = height / 2 + 30; + int alpha = (int) (fadeAlpha * 255); + int textColor = (alpha << 24) | 0xBBBBBB; + + // Word wrap the text + List lines = wrapText(displayedText, MAX_LINE_WIDTH); + + // Render each line centered + int lineHeight = font.lineHeight + 2; + for (int i = 0; i < lines.size(); i++) { + String line = lines.get(i); + int lineWidth = font.width(line); + int textX = (width - lineWidth) / 2; + int y = textY + (i * lineHeight); + + // Italic style for reflection's voice + graphics.drawString(font, "\u00A7o" + line, textX, y, textColor, false); + } + } + + private List wrapText(String text, int maxWidth) { + List lines = new ArrayList<>(); + if (text.isEmpty()) return lines; + + String[] words = text.split(" "); + StringBuilder currentLine = new StringBuilder(); + + for (String word : words) { + String testLine = currentLine.isEmpty() ? word : currentLine + " " + word; + if (font.width(testLine) <= maxWidth) { + if (!currentLine.isEmpty()) currentLine.append(" "); + currentLine.append(word); + } else { + if (!currentLine.isEmpty()) { + lines.add(currentLine.toString()); + currentLine = new StringBuilder(); + } + // Handle words longer than max width + if (font.width(word) > maxWidth) { + lines.add(word); + } else { + currentLine.append(word); + } + } + } + + if (!currentLine.isEmpty()) { + lines.add(currentLine.toString()); + } + + return lines; + } + + private void renderContinueHint(GuiGraphics graphics) { + // Pulsing "click to continue" hint + float pulse = (float) Math.sin(totalTicks * 0.15) * 0.3f + 0.7f; + int alpha = (int) (fadeAlpha * pulse * 150); + int color = (alpha << 24) | 0x888888; + + String hint = "[ Click or press Space to continue ]"; + int hintWidth = font.width(hint); + int x = (width - hintWidth) / 2; + int y = height / 2 + 80; + + graphics.drawString(font, hint, x, y, color, false); + } + + private void renderAnswerButtons(GuiGraphics graphics, int mouseX, int mouseY) { + hoveredButton = -1; + AnswerButton hoveredBtn = null; + + for (int i = 0; i < answerButtons.size(); i++) { + AnswerButton button = answerButtons.get(i); + boolean hovered = button.isMouseOver(mouseX, mouseY); + if (hovered) { + hoveredButton = i; + hoveredBtn = button; + } + button.render(graphics, font, fadeAlpha, hovered, totalTicks); + } + + // Render tooltip for hovered button (rendered last so it's on top) + if (hoveredBtn != null) { + renderAnswerTooltip(graphics, hoveredBtn, mouseX, mouseY); + } + } + + private void renderAnswerTooltip(GuiGraphics graphics, AnswerButton button, int mouseX, int mouseY) { + BargainAnswer answer = button.answer; + + // Skip tooltips for simple menu items with no details + if (answer.powerDescription().isEmpty() && answer.drawbacks().isEmpty()) { + return; + } + + // Collect tooltip lines + List tooltipLines = new ArrayList<>(); + + // Context-aware headers based on current state + boolean isDefianceContext = (state == VoidState.VIEW_ACTIVE); + + // Add power description with header + if (!answer.powerDescription().isEmpty()) { + if (isDefianceContext) { + tooltipLines.add(Component.literal("\u00A7a\u00A7lCURRENT POWER:\u00A7r")); + } else { + tooltipLines.add(Component.literal("\u00A7a\u00A7lPOWERS:\u00A7r")); + } + for (Component power : answer.powerDescription()) { + tooltipLines.add(Component.literal("\u00A7a+ \u00A7f" + power.getString())); + } + } + + // Add spacing between power and drawbacks + if (!answer.powerDescription().isEmpty() && !answer.drawbacks().isEmpty()) { + tooltipLines.add(Component.literal("")); + } + + // Add drawbacks with header + if (!answer.drawbacks().isEmpty()) { + if (isDefianceContext) { + tooltipLines.add(Component.literal("\u00A7c\u00A7lDEFIANCE COST:\u00A7r")); + } else { + tooltipLines.add(Component.literal("\u00A7c\u00A7lDRAWBACKS:\u00A7r")); + } + for (Component drawback : answer.drawbacks()) { + tooltipLines.add(Component.literal("\u00A7c- \u00A77" + drawback.getString())); + } + } + + // Calculate tooltip dimensions + int tooltipWidth = 0; + for (Component line : tooltipLines) { + tooltipWidth = Math.max(tooltipWidth, font.width(line)); + } + tooltipWidth += 16; // Padding + + int lineHeight = font.lineHeight + 2; + int tooltipHeight = tooltipLines.size() * lineHeight + 8; + + // Find the topmost button to position tooltip above ALL buttons + int topmostButtonY = button.y; + for (AnswerButton btn : answerButtons) { + if (btn.y < topmostButtonY) { + topmostButtonY = btn.y; + } + } + + // Position tooltip above ALL buttons with some margin + int tooltipX = (width - tooltipWidth) / 2; // Center horizontally on screen + int tooltipY = topmostButtonY - tooltipHeight - 15; // Above the topmost button + + // Keep tooltip on screen + if (tooltipX < 10) tooltipX = 10; + if (tooltipX + tooltipWidth > width - 10) tooltipX = width - tooltipWidth - 10; + if (tooltipY < 10) tooltipY = 10; + + // Render tooltip background (solid, no transparency for readability) + int bgColor = (0xFF << 24) | 0x101018; + int borderColor = (0xFF << 24) | 0x505080; + int innerBorderColor = (0xFF << 24) | 0x303050; + + // Outer border + graphics.fill(tooltipX - 6, tooltipY - 6, tooltipX + tooltipWidth + 6, tooltipY + tooltipHeight + 6, + borderColor); + // Inner border + graphics.fill(tooltipX - 5, tooltipY - 5, tooltipX + tooltipWidth + 5, tooltipY + tooltipHeight + 5, + innerBorderColor); + // Background + graphics.fill(tooltipX - 4, tooltipY - 4, tooltipX + tooltipWidth + 4, tooltipY + tooltipHeight + 4, bgColor); + + // Render text lines + int lineY = tooltipY; + for (Component line : tooltipLines) { + String text = line.getString(); + if (text.isEmpty()) { + lineY += lineHeight / 2; // Half spacing for empty lines + } else { + graphics.drawString(font, line, tooltipX, lineY, 0xFFFFFFFF, false); + lineY += lineHeight; + } + } + } + + private void renderCostPreview(GuiGraphics graphics) { + if (currentBargain == null) return; + + int alpha = (int) (fadeAlpha * 180); + + // Build cost display lines first to know how much space we need + List costLines = new ArrayList<>(); + List costColors = new ArrayList<>(); + + int shardCost = currentBargain.getShardCost(); + int weight = currentBargain.getWeight(); + int erosionCost = currentBargain.getErosionCost(); + + if (shardCost > 0) { + boolean canAfford = shardBalance >= shardCost; + costLines.add("\u2726 " + shardCost + " shards"); + costColors.add((alpha << 24) | (canAfford ? 0x55FFFF : 0xFF5555)); + } + + if (weight > 0) { + int remaining = totalCapacity - usedCapacity; + boolean canFit = remaining >= weight; + costLines.add("\u25C6 " + weight + " weight"); + costColors.add((alpha << 24) | (canFit ? 0xAA55FF : 0xFF5555)); + } + + if (erosionCost > 0) { + costLines.add("+" + erosionCost + " erosion"); + costColors.add((alpha << 24) | 0xAA6666); + } + + if (costLines.isEmpty()) { + costLines.add("Free"); + costColors.add((alpha << 24) | 0x55FF55); + } + + // Calculate total height needed for cost lines + int lineHeight = 12; + int totalCostHeight = costLines.size() * lineHeight; + + // Position: prefer below buttons, but clamp to stay on screen + int buttonsEndY = height / 2 + 60 + (answerButtons.size() * 35) + 10; + int idealY = buttonsEndY + 10; + + // Ensure we stay at least 10px from bottom of screen + int maxY = height - totalCostHeight - 10; + int y = Math.min(idealY, maxY); + + int centerX = width / 2; + + // Render all cost lines + for (int i = 0; i < costLines.size(); i++) { + String line = costLines.get(i); + int lineWidth = font.width(line); + graphics.drawString(font, line, centerX - lineWidth / 2, y + (i * lineHeight), costColors.get(i), false); + } + } + + private void renderErosionIndicator(GuiGraphics graphics) { + // Subtle erosion display in bottom left + int alpha = (int) (fadeAlpha * 100); + int color = (alpha << 24) | 0x555555; + + Component text = Component.translatable("reflection.cosmiccore.ui.soul_erosion_display", erosion); + graphics.drawString(font, text, 15, height - 25, color, false); + + // Small colored indicator + int[] soulColor = getSoulColor(); + int indicatorColor = (alpha << 24) | (soulColor[0] << 16) | (soulColor[1] << 8) | soulColor[2]; + graphics.fill(15, height - 35, 25, height - 28, indicatorColor); + + // Render shards and capacity in top right corner + renderEconomyDisplay(graphics); + } + + private void renderEconomyDisplay(GuiGraphics graphics) { + int alpha = (int) (fadeAlpha * 200); + if (alpha < 20) return; + + int rightMargin = width - 15; + int topY = 15; + + // Shard balance (aqua color) + int shardColor = (alpha << 24) | 0x55FFFF; + String shardText = "\u2726 " + shardBalance; // Unicode diamond + int shardWidth = font.width(shardText); + graphics.drawString(font, shardText, rightMargin - shardWidth, topY, shardColor, false); + + // Capacity display (purple color) below shards + int capacityColor = (alpha << 24) | 0xAA55FF; + String capacityText = usedCapacity + "/" + totalCapacity + " soul"; + int capacityWidth = font.width(capacityText); + graphics.drawString(font, capacityText, rightMargin - capacityWidth, topY + 12, capacityColor, false); + + // Capacity bar + int barWidth = 60; + int barHeight = 4; + int barX = rightMargin - barWidth; + int barY = topY + 24; + + // Background + int bgColor = (alpha << 24) | 0x222222; + graphics.fill(barX, barY, barX + barWidth, barY + barHeight, bgColor); + + // Filled portion + float fillPercent = totalCapacity > 0 ? (float) usedCapacity / totalCapacity : 0f; + int fillWidth = (int) (barWidth * fillPercent); + int fillColor = fillPercent > 0.9f ? ((alpha << 24) | 0xFF5555) : // Red when almost full + fillPercent > 0.7f ? ((alpha << 24) | 0xFFAA55) : // Orange when high + ((alpha << 24) | 0xAA55FF); // Purple normally + if (fillWidth > 0) { + graphics.fill(barX, barY, barX + fillWidth, barY + barHeight, fillColor); + } + } + + private void renderTransformationEffect(GuiGraphics graphics) { + if (selectedShape == null) return; + + int centerX = width / 2; + int centerY = height / 2 - 40; + + // Progress through transformation (0.0 to 1.0) over 100 ticks + float progress = Math.min(1.0f, shapeTransformTicks / 100.0f); + + // Get the shape's color + int[] shapeColor = getShapeRGB(selectedShape); + int baseRadius = 35; + + // Phase 1 (0-0.25): Soul starts to distort and crack - old shape breaking apart + // Phase 2 (0.25-0.5): Soul warps and shifts color - chaotic transition + // Phase 3 (0.5-0.85): Soul reforms in new shape - new shape emerges + // Phase 4 (0.85-1.0): Settling - soul stabilizes with gentle pulse + + if (progress < 0.25f) { + // Phase 1: Distortion - old soul breaking apart + float phase1Progress = progress / 0.25f; + int shake = (int) (Math.sin(shapeTransformTicks * 0.8) * 5 * phase1Progress); + + // Render fading old soul (unshaped circle) with shake + float oldSoulFade = 1.0f - phase1Progress * 0.5f; + int[] oldRgb = getSoulColor(); + int oldAlpha = (int) (fadeAlpha * 255 * oldSoulFade); + for (int r = baseRadius; r > 0; r -= 3) { + float coreProgress = (float) r / baseRadius; + int cAlpha = (int) (oldAlpha * (0.6f + 0.4f * coreProgress)); + int color = (cAlpha << 24) | (oldRgb[0] << 16) | (oldRgb[1] << 8) | oldRgb[2]; + drawCircleFast(graphics, centerX + shake, centerY, r, color); + } + + // Draw distortion cracks radiating from center + int crackAlpha = (int) (fadeAlpha * 200 * phase1Progress); + int crackColor = (crackAlpha << 24) | 0x200010; + + Random crackRandom = new Random(42); + for (int i = 0; i < 8; i++) { + double angle = crackRandom.nextDouble() * Math.PI * 2; + int length = (int) (50 * phase1Progress); + int x1 = centerX + shake; + int y1 = centerY; + + for (int j = 0; j < length; j += 4) { + angle += (crackRandom.nextDouble() - 0.5) * 0.6; + int x2 = x1 + (int) (Math.cos(angle) * 4); + int y2 = y1 + (int) (Math.sin(angle) * 4); + graphics.fill(x1, y1, x2 + 2, y2 + 2, crackColor); + x1 = x2; + y1 = y2; + } + } + + } else if (progress < 0.5f) { + // Phase 2: Warp - chaotic transition, colors shifting + float phase2Progress = (progress - 0.25f) / 0.25f; + + // Warping waves emanating from center + for (int wave = 0; wave < 3; wave++) { + float waveProgress = (phase2Progress + wave * 0.3f) % 1.0f; + int radius = (int) (30 + 100 * waveProgress); + int waveAlpha = (int) (fadeAlpha * 150 * (1.0f - waveProgress)); + + // Blend between old soul color and new shape color + int[] oldColor = getSoulColor(); + int r = (int) (oldColor[0] + (shapeColor[0] - oldColor[0]) * phase2Progress); + int g = (int) (oldColor[1] + (shapeColor[1] - oldColor[1]) * phase2Progress); + int b = (int) (oldColor[2] + (shapeColor[2] - oldColor[2]) * phase2Progress); + + int color = (waveAlpha << 24) | (r << 16) | (g << 8) | b; + drawCircleFast(graphics, centerX, centerY, radius, color); + } + + // Central chaotic vortex - flickering between shapes + int vortexRadius = (int) (baseRadius * (1.0f - Math.abs(phase2Progress - 0.5f) * 0.5f)); + float shapeFlicker = (float) Math.sin(shapeTransformTicks * 0.5f) * 0.5f + 0.5f; + + if (shapeFlicker > 0.5f) { + // Brief glimpse of new shape + renderShapedSoul(graphics, centerX, centerY, vortexRadius, selectedShape, + (shapeFlicker - 0.5f) * 2 * phase2Progress); + } else { + // Old shape fading + int vortexAlpha = (int) (fadeAlpha * 200 * (1f - phase2Progress)); + int[] oldRgb = getSoulColor(); + int vortexColor = (vortexAlpha << 24) | (oldRgb[0] << 16) | (oldRgb[1] << 8) | oldRgb[2]; + drawCircleFast(graphics, centerX, centerY, vortexRadius, vortexColor); + } + + } else if (progress < 0.85f) { + // Phase 3: Reform - new shape emerges and solidifies + float phase3Progress = (progress - 0.5f) / 0.35f; + + // Glowing outer aura fading in with shape's color + int auraRadius = (int) (60 * (2.0f - phase3Progress)); + int auraAlpha = (int) (fadeAlpha * 100 * (1.0f - phase3Progress * 0.7f)); + int auraColor = (auraAlpha << 24) | (shapeColor[0] << 16) | (shapeColor[1] << 8) | shapeColor[2]; + drawCircleFast(graphics, centerX, centerY, auraRadius, auraColor); + + // Render the new shape forming + int formingRadius = (int) (baseRadius * phase3Progress); + if (formingRadius > 5) { + renderShapedSoul(graphics, centerX, centerY, formingRadius, selectedShape, phase3Progress); + } + + // Particle burst at peak formation + if (phase3Progress > 0.3f && phase3Progress < 0.7f) { + float burstProgress = (phase3Progress - 0.3f) / 0.4f; + int particleCount = 12; + for (int i = 0; i < particleCount; i++) { + double angle = (i * Math.PI * 2 / particleCount) + shapeTransformTicks * 0.1f; + int dist = (int) (baseRadius + 30 * burstProgress); + int px = centerX + (int) (Math.cos(angle) * dist); + int py = centerY + (int) (Math.sin(angle) * dist); + int pAlpha = (int) (fadeAlpha * 150 * (1.0f - burstProgress)); + int pColor = (pAlpha << 24) | (shapeColor[0] << 16) | (shapeColor[1] << 8) | shapeColor[2]; + drawCircleFast(graphics, px, py, 3, pColor); + } + } + } else { + // Phase 4: Settling - soul stabilizes with gentle pulse, graceful fade to final state + float phase4Progress = (progress - 0.85f) / 0.15f; + + // Render fully formed shape at full size + renderShapedSoul(graphics, centerX, centerY, baseRadius, selectedShape, 1.0f); + + // Gentle pulsing aura that fades out + float pulse = (float) Math.sin(shapeTransformTicks * 0.3f) * 0.5f + 0.5f; + int auraRadius = (int) (baseRadius + 10 + 5 * pulse * (1.0f - phase4Progress)); + int auraAlpha = (int) (fadeAlpha * 80 * (1.0f - phase4Progress)); + int auraColor = (auraAlpha << 24) | (shapeColor[0] << 16) | (shapeColor[1] << 8) | shapeColor[2]; + drawCircleFast(graphics, centerX, centerY, auraRadius, auraColor); + + // Fading sparkle particles settling around the shape + if (phase4Progress < 0.7f) { + int particleCount = 6; + float sparkleProgress = phase4Progress / 0.7f; + for (int i = 0; i < particleCount; i++) { + double angle = (i * Math.PI * 2 / particleCount) + shapeTransformTicks * 0.05f; + int dist = (int) (baseRadius + 20 * (1.0f - sparkleProgress)); + int px = centerX + (int) (Math.cos(angle) * dist); + int py = centerY + (int) (Math.sin(angle) * dist); + int pAlpha = (int) (fadeAlpha * 100 * (1.0f - sparkleProgress)); + int pColor = (pAlpha << 24) | (shapeColor[0] << 16) | (shapeColor[1] << 8) | shapeColor[2]; + drawCircleFast(graphics, px, py, 2, pColor); + } + } + } + + // Render the shape name fading in during phase 3-4 + if (progress > 0.6f) { + float textProgress = Math.min(1.0f, (progress - 0.6f) / 0.25f); + int textAlpha = (int) (fadeAlpha * 255 * textProgress); + Component shapeName = selectedShape.getFormattedName(); + int textWidth = font.width(shapeName); + int textColor = (textAlpha << 24) | (shapeColor[0] << 16) | (shapeColor[1] << 8) | shapeColor[2]; + graphics.drawString(font, shapeName, centerX - textWidth / 2, centerY + 60, textColor, false); + } + } + + private int[] getShapeRGB(SoulShape shape) { + return switch (shape) { + case REVENANT -> new int[] { 170, 0, 0 }; // Dark red + case HOLLOW -> new int[] { 170, 0, 170 }; // Dark purple + case ENGINE -> new int[] { 255, 170, 0 }; // Gold + case GLOBEDANCER -> new int[] { 85, 255, 255 }; // Aqua + case BULWARK -> new int[] { 85, 85, 85 }; // Dark gray + case BLOODTHIRST -> new int[] { 255, 85, 85 }; // Red + default -> new int[] { 180, 180, 200 }; // Pale + }; + } + + private void renderStateHeader(GuiGraphics graphics) { + Component header = switch (state) { + case BROWSE_BARGAINS -> ReflectionLang.uiAvailableBargains(); + case VIEW_ACTIVE -> ReflectionLang.uiYourBargains(); + case DEFIANCE_CONFIRM -> ReflectionLang.uiDefiance(); + case SOUL_SHAPE_SELECT -> ReflectionLang.ui("soul_shape.select_header"); + default -> null; + }; + + if (header == null) return; + + int alpha = (int) (fadeAlpha * 200); + int color = (alpha << 24) | 0xAAAAAA; + + int headerWidth = font.width(header); + int x = (width - headerWidth) / 2; + // Position header based on state - soul shape select needs more room for 2x3 grid + int y = (state == VoidState.SOUL_SHAPE_SELECT) ? height / 2 + 35 : height / 2 + 40; + + graphics.drawString(font, header, x, y, color, false); + + // Render scroll indicators for VIEW_ACTIVE state + if (state == VoidState.VIEW_ACTIVE && !viewActiveAllOptions.isEmpty()) { + int maxScroll = Math.max(0, viewActiveAllOptions.size() - viewActiveMaxVisible); + int scrollAlpha = (int) (fadeAlpha * 150); + + // Show "scroll up" indicator if not at top + if (bargainListScrollOffset > 0) { + Component upHint = ReflectionLang.uiScrollUp(); + int upWidth = font.width(upHint); + int upColor = (scrollAlpha << 24) | 0x888888; + graphics.drawString(font, upHint, (width - upWidth) / 2, height / 2 + 52, upColor, false); + } + + // Show "scroll down" indicator if not at bottom + if (bargainListScrollOffset < maxScroll) { + Component downHint = ReflectionLang.uiScrollDown(); + int downWidth = font.width(downHint); + int downColor = (scrollAlpha << 24) | 0x888888; + // Position below the last visible button + int lastButtonY = height / 2 + 60 + (viewActiveMaxVisible * 35); + graphics.drawString(font, downHint, (width - downWidth) / 2, lastButtonY + 5, downColor, false); + } + + // Show scroll position indicator + String posHint = (bargainListScrollOffset + 1) + "-" + + Math.min(bargainListScrollOffset + viewActiveMaxVisible, viewActiveAllOptions.size()) + + " " + ReflectionLang.ui("of").getString() + " " + viewActiveAllOptions.size(); + int posWidth = font.width(posHint); + int posColor = ((scrollAlpha / 2) << 24) | 0x666666; + graphics.drawString(font, posHint, (width - posWidth) / 2, y + 12, posColor, false); + } + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (button != 0) return super.mouseClicked(mouseX, mouseY, button); + + // Check answer buttons for all interactive states + if (state == VoidState.AWAITING_CHOICE || state == VoidState.HUB_MENU || + state == VoidState.BROWSE_BARGAINS || state == VoidState.VIEW_ACTIVE || + state == VoidState.DEFIANCE_CONFIRM || state == VoidState.SOUL_SHAPE_SELECT) { + for (AnswerButton answerButton : answerButtons) { + if (answerButton.isMouseOver((int) mouseX, (int) mouseY)) { + onAnswerSelected(answerButton.answer); + return true; + } + } + } + + // Click to advance dialogue + if (state == VoidState.DIALOGUE) { + if (currentDialogueIndex < dialogueQueue.size()) { + String fullText = dialogueQueue.get(currentDialogueIndex); + + if (charIndex < fullText.length()) { + // Skip to end of current line + charIndex = fullText.length(); + displayedText = fullText; + } else { + // Advance to next line + currentDialogueIndex++; + charIndex = 0; + displayedText = ""; + } + return true; + } + } + + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + // ESC to close (with fade) + if (keyCode == 256) { // ESCAPE + if (state != VoidState.FADE_OUT) { + transitionTo(VoidState.FADE_OUT); + } + return true; + } + + // Space/Enter to advance dialogue + if ((keyCode == 32 || keyCode == 257) && state == VoidState.DIALOGUE) { + mouseClicked(0, 0, 0); + return true; + } + + // Number keys for quick answer selection + if (state == VoidState.AWAITING_CHOICE && keyCode >= 49 && keyCode <= 57) { + int index = keyCode - 49; // 1 = 0, 2 = 1, etc. + if (index < answerButtons.size()) { + onAnswerSelected(answerButtons.get(index).answer); + return true; + } + } + + return super.keyPressed(keyCode, scanCode, modifiers); + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double scrollX, double scrollY) { + // Scroll bargain list in VIEW_ACTIVE state + if (state == VoidState.VIEW_ACTIVE && !viewActiveAllOptions.isEmpty()) { + int maxScroll = Math.max(0, viewActiveAllOptions.size() - viewActiveMaxVisible); + if (scrollY > 0) { + // Scroll up + bargainListScrollOffset = Math.max(0, bargainListScrollOffset - 1); + } else if (scrollY < 0) { + // Scroll down + bargainListScrollOffset = Math.min(maxScroll, bargainListScrollOffset + 1); + } + // Rebuild buttons with new scroll position + setupViewActiveBargains(); + return true; + } + return super.mouseScrolled(mouseX, mouseY, scrollX, scrollY); + } + + @Override + public boolean isPauseScreen() { + return false; + } + + private enum VoidState { + FADE_IN, + DIALOGUE, + AWAITING_CHOICE, + HUB_MENU, // Hub menu with options + BROWSE_BARGAINS, // Browsing available bargains + VIEW_ACTIVE, // Viewing player's active bargains + DEFIANCE_CONFIRM, // Confirming defiance of a bargain + SOUL_SHAPE_SELECT, // Selecting a soul shape + SOUL_TRANSFORMING, // Playing transformation animation + FADE_OUT + } + + private enum VoidMode { + REFLECTION, // General reflection (no bargain) + BARGAIN_OFFER, // Offering a specific bargain + THRESHOLD, // Erosion threshold encounter + HUB // Mirror hub - browse/manage bargains + } + + private class AnswerButton { + + final int x, y, width, height; + final BargainAnswer answer; + final int index; + + AnswerButton(int x, int y, int width, int height, BargainAnswer answer, int index) { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + this.answer = answer; + this.index = index; + } + + boolean isMouseOver(int mouseX, int mouseY) { + return mouseX >= x && mouseX < x + width && mouseY >= y && mouseY < y + height; + } + + void render(GuiGraphics graphics, net.minecraft.client.gui.Font font, float fadeAlpha, boolean hovered, + int ticks) { + int baseAlpha = (int) (fadeAlpha * (hovered ? 200 : 140)); + + // Background + int bgColor = hovered ? (baseAlpha << 24) | 0x303040 : (baseAlpha << 24) | 0x1a1a24; + graphics.fill(x, y, x + width, y + height, bgColor); + + // Border + int borderAlpha = (int) (fadeAlpha * (hovered ? 255 : 150)); + int borderColor = hovered ? (borderAlpha << 24) | 0x6080AA : (borderAlpha << 24) | 0x404060; + + // Top and bottom borders + graphics.fill(x, y, x + width, y + 1, borderColor); + graphics.fill(x, y + height - 1, x + width, y + height, borderColor); + // Left and right borders + graphics.fill(x, y, x + 1, y + height, borderColor); + graphics.fill(x + width - 1, y, x + width, y + height, borderColor); + + // Text + String text = answer.text().getString(); + int textAlpha = (int) (fadeAlpha * 255); + int textColor = hovered ? (textAlpha << 24) | 0xDDDDEE : (textAlpha << 24) | 0x999999; + + int textWidth = font.width(text); + int textX = x + (width - textWidth) / 2; + int textY = y + (height - font.lineHeight) / 2; + + graphics.drawString(font, text, textX, textY, textColor, false); + + // Keyboard hint + String hint = "[" + (index + 1) + "]"; + int hintAlpha = (int) (fadeAlpha * 100); + int hintColor = (hintAlpha << 24) | 0x666666; + graphics.drawString(font, hint, x + 8, textY, hintColor, false); + + // Hover glow effect + if (hovered) { + float glowPulse = (float) Math.sin(ticks * 0.2) * 0.3f + 0.7f; + int glowAlpha = (int) (fadeAlpha * glowPulse * 30); + int glowColor = (glowAlpha << 24) | 0x6080AA; + graphics.fill(x + 2, y + 2, x + width - 2, y + height - 2, glowColor); + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/VoidUIPackets.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/VoidUIPackets.java new file mode 100644 index 000000000..d65436c0d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/ui/VoidUIPackets.java @@ -0,0 +1,494 @@ +package com.ghostipedia.cosmiccore.common.reflection.ui; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; +import com.ghostipedia.cosmiccore.common.network.CCoreNetwork; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain; +import com.ghostipedia.cosmiccore.common.reflection.bargain.Bargain.BargainAnswer; +import com.ghostipedia.cosmiccore.common.reflection.bargain.BargainRegistry; +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.QuakeMovementBargain; +import com.ghostipedia.cosmiccore.common.reflection.network.SyncQuakeMovementPacket; +import com.ghostipedia.cosmiccore.common.reflection.soul.SoulShape; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.Component; +import net.minecraft.network.codec.StreamCodec; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.sounds.SoundSource; +import net.neoforged.neoforge.network.handling.IPayloadContext; + +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; +import java.util.Set; + +public class VoidUIPackets { + + public static void sendOpenVoidScreen(ServerPlayer player, ResourceLocation bargainId) { + ReflectionCapability.get(player).ifPresent(reflection -> { + int erosion = reflection.getErosion(); + Set activeBargains = reflection.getActiveBargains(); + int shardBalance = reflection.getShardBalance(); + int usedCapacity = reflection.getUsedCapacity(); + int totalCapacity = reflection.getTotalCapacity(); + CCoreNetwork.sendToPlayer(player, new OpenVoidScreenPacket(bargainId, erosion, activeBargains, + shardBalance, usedCapacity, totalCapacity)); + }); + } + + public static void sendOpenVoidScreen(ServerPlayer player) { + ReflectionCapability.get(player).ifPresent(reflection -> { + int erosion = reflection.getErosion(); + Set activeBargains = reflection.getActiveBargains(); + int shardBalance = reflection.getShardBalance(); + int usedCapacity = reflection.getUsedCapacity(); + int totalCapacity = reflection.getTotalCapacity(); + CCoreNetwork.sendToPlayer(player, new OpenVoidScreenPacket(null, erosion, activeBargains, + shardBalance, usedCapacity, totalCapacity)); + }); + } + + public static void sendBargainChoice(ResourceLocation bargainId, String answerId) { + CCoreNetwork.sendToServer(new BargainChoicePacket(bargainId, answerId)); + } + + public static void sendThresholdEncounter(ServerPlayer player, int thresholdIndex) { + ReflectionCapability.get(player).ifPresent(reflection -> { + int erosion = reflection.getErosion(); + Set activeBargains = reflection.getActiveBargains(); + CCoreNetwork.sendToPlayer(player, new ThresholdEncounterPacket(thresholdIndex, erosion, activeBargains)); + }); + } + + public static void sendOpenHub(ServerPlayer player) { + ReflectionCapability.get(player).ifPresent(reflection -> { + int erosion = reflection.getErosion(); + Set activeBargains = reflection.getActiveBargains(); + Set defianceScars = reflection.getDefianceScars(); + int shardBalance = reflection.getShardBalance(); + int usedCapacity = reflection.getUsedCapacity(); + int totalCapacity = reflection.getTotalCapacity(); + SoulShape soulShape = reflection.getSoulShape(); + boolean hasMutilator = player.getInventory().contains(CosmicItems.SOUL_MUTILATOR.asStack()); + CCoreNetwork.sendToPlayer(player, new OpenHubPacket(erosion, activeBargains, defianceScars, + shardBalance, usedCapacity, totalCapacity, soulShape, hasMutilator)); + }); + } + + public static void sendSoulShapeChoice(SoulShape shape) { + CCoreNetwork.sendToServer(new SoulShapeChoicePacket(shape)); + } + + public static void sendDefianceChoice(ResourceLocation bargainId) { + CCoreNetwork.sendToServer(new DefianceChoicePacket(bargainId)); + } + + public static class OpenVoidScreenPacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("void_open_screen")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(OpenVoidScreenPacket::encode, OpenVoidScreenPacket::new); + + private final ResourceLocation bargainId; + private final int erosion; + private final Set activeBargains; + private final int shardBalance; + private final int usedCapacity; + private final int totalCapacity; + + public OpenVoidScreenPacket(ResourceLocation bargainId, int erosion, Set activeBargains, + int shardBalance, int usedCapacity, int totalCapacity) { + this.bargainId = bargainId; + this.erosion = erosion; + this.activeBargains = activeBargains != null ? activeBargains : Set.of(); + this.shardBalance = shardBalance; + this.usedCapacity = usedCapacity; + this.totalCapacity = totalCapacity; + } + + public OpenVoidScreenPacket(FriendlyByteBuf buf) { + if (buf.readBoolean()) { + this.bargainId = buf.readResourceLocation(); + } else { + this.bargainId = null; + } + this.erosion = buf.readVarInt(); + + int count = buf.readVarInt(); + Set bargains = new HashSet<>(); + for (int i = 0; i < count; i++) { + bargains.add(buf.readResourceLocation()); + } + this.activeBargains = bargains; + + this.shardBalance = buf.readVarInt(); + this.usedCapacity = buf.readVarInt(); + this.totalCapacity = buf.readVarInt(); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeBoolean(bargainId != null); + if (bargainId != null) { + buf.writeResourceLocation(bargainId); + } + buf.writeVarInt(erosion); + buf.writeVarInt(activeBargains.size()); + for (ResourceLocation id : activeBargains) { + buf.writeResourceLocation(id); + } + + buf.writeVarInt(shardBalance); + buf.writeVarInt(usedCapacity); + buf.writeVarInt(totalCapacity); + } + + public void execute(IPayloadContext ctx) { + if (bargainId != null) { + BargainRegistry.get(bargainId) + .ifPresent(bargain -> VoidScreen.openWithBargain(bargain, erosion, activeBargains, + shardBalance, usedCapacity, totalCapacity)); + } else { + VoidScreen.openForReflection(erosion, activeBargains, + shardBalance, usedCapacity, totalCapacity); + } + } + + @Override + public @NotNull Type type() { + return TYPE; + } + } + + public static class BargainChoicePacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("void_bargain_choice")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(BargainChoicePacket::encode, BargainChoicePacket::new); + + private final ResourceLocation bargainId; + private final String answerId; + + public BargainChoicePacket(ResourceLocation bargainId, String answerId) { + this.bargainId = bargainId; + this.answerId = answerId; + } + + public BargainChoicePacket(FriendlyByteBuf buf) { + this.bargainId = buf.readResourceLocation(); + this.answerId = buf.readUtf(); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeResourceLocation(bargainId); + buf.writeUtf(answerId); + } + + public void execute(IPayloadContext ctx) { + if (!(ctx.player() instanceof ServerPlayer player)) return; + + BargainRegistry.get(bargainId).ifPresent(bargain -> { + processBargainChoice(player, bargain, answerId); + }); + } + + private void processBargainChoice(ServerPlayer player, Bargain bargain, String answerId) { + BargainAnswer foundAnswer = null; + for (BargainAnswer answer : bargain.getAnswers()) { + if (answer.id().equals(answerId)) { + foundAnswer = answer; + break; + } + } + + if (foundAnswer == null) return; + + final BargainAnswer selectedAnswer = foundAnswer; + + ReflectionCapability.get(player).ifPresent(reflection -> { + boolean isAccept = answerId.equals("accept") || + (!answerId.equals("refuse") && selectedAnswer.grantsFullPower()); + + if (isAccept) { + if (!reflection.hasBargain(bargainId)) { + int shardCost = bargain.getShardCost(); + int weight = bargain.getWeight(); + + if (shardCost > 0 && reflection.getShardBalance() < shardCost) { + player.displayClientMessage( + Component.literal("§cInsufficient shards. You need " + shardCost + " shards."), + false); + return; + } + + if (weight > 0 && !reflection.canFitBargain(weight)) { + player.displayClientMessage( + Component.literal( + "§cInsufficient soul capacity. Need " + weight + " weight, have " + + reflection.getRemainingCapacity() + " remaining."), + false); + return; + } + + if (shardCost > 0) { + reflection.spendShards(shardCost); + } + + int erosionCost = bargain.getErosionCost(); + if (erosionCost > 0) { + reflection.addErosion(erosionCost); + } + + reflection.acceptBargain(bargainId); + bargain.onAccept(player, selectedAnswer); + syncBargainState(player, bargain, true); + } + } + }); + } + + private void syncBargainState(ServerPlayer player, Bargain bargain, boolean active) { + if (bargain.getId().equals(QuakeMovementBargain.INSTANCE.getId())) { + CCoreNetwork.sendToPlayer(player, new SyncQuakeMovementPacket(active)); + } + } + + @Override + public @NotNull Type type() { + return TYPE; + } + } + + public static class ThresholdEncounterPacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("void_threshold_encounter")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(ThresholdEncounterPacket::encode, ThresholdEncounterPacket::new); + + private final int thresholdIndex; + private final int erosion; + private final Set activeBargains; + + public ThresholdEncounterPacket(int thresholdIndex, int erosion, Set activeBargains) { + this.thresholdIndex = thresholdIndex; + this.erosion = erosion; + this.activeBargains = activeBargains != null ? activeBargains : Set.of(); + } + + public ThresholdEncounterPacket(FriendlyByteBuf buf) { + this.thresholdIndex = buf.readVarInt(); + this.erosion = buf.readVarInt(); + + int count = buf.readVarInt(); + Set bargains = new HashSet<>(); + for (int i = 0; i < count; i++) { + bargains.add(buf.readResourceLocation()); + } + this.activeBargains = bargains; + } + + public void encode(FriendlyByteBuf buf) { + buf.writeVarInt(thresholdIndex); + buf.writeVarInt(erosion); + + buf.writeVarInt(activeBargains.size()); + for (ResourceLocation id : activeBargains) { + buf.writeResourceLocation(id); + } + } + + public void execute(IPayloadContext ctx) { + VoidScreen.openForThreshold(thresholdIndex, erosion, activeBargains); + } + + @Override + public @NotNull Type type() { + return TYPE; + } + } + + public static class OpenHubPacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("void_open_hub")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(OpenHubPacket::encode, OpenHubPacket::new); + + private final int erosion; + private final Set activeBargains; + private final Set defianceScars; + private final int shardBalance; + private final int usedCapacity; + private final int totalCapacity; + private final SoulShape soulShape; + private final boolean hasMutilator; + + public OpenHubPacket(int erosion, Set activeBargains, Set defianceScars, + int shardBalance, int usedCapacity, int totalCapacity, + SoulShape soulShape, boolean hasMutilator) { + this.erosion = erosion; + this.activeBargains = activeBargains != null ? activeBargains : Set.of(); + this.defianceScars = defianceScars != null ? defianceScars : Set.of(); + this.shardBalance = shardBalance; + this.usedCapacity = usedCapacity; + this.totalCapacity = totalCapacity; + this.soulShape = soulShape != null ? soulShape : SoulShape.UNSHAPED; + this.hasMutilator = hasMutilator; + } + + public OpenHubPacket(FriendlyByteBuf buf) { + this.erosion = buf.readVarInt(); + + int activeCount = buf.readVarInt(); + Set active = new HashSet<>(); + for (int i = 0; i < activeCount; i++) { + active.add(buf.readResourceLocation()); + } + this.activeBargains = active; + + int scarCount = buf.readVarInt(); + Set scars = new HashSet<>(); + for (int i = 0; i < scarCount; i++) { + scars.add(buf.readResourceLocation()); + } + this.defianceScars = scars; + + this.shardBalance = buf.readVarInt(); + this.usedCapacity = buf.readVarInt(); + this.totalCapacity = buf.readVarInt(); + this.soulShape = SoulShape.fromId(buf.readUtf()); + this.hasMutilator = buf.readBoolean(); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeVarInt(erosion); + + buf.writeVarInt(activeBargains.size()); + for (ResourceLocation id : activeBargains) { + buf.writeResourceLocation(id); + } + + buf.writeVarInt(defianceScars.size()); + for (ResourceLocation id : defianceScars) { + buf.writeResourceLocation(id); + } + + buf.writeVarInt(shardBalance); + buf.writeVarInt(usedCapacity); + buf.writeVarInt(totalCapacity); + buf.writeUtf(soulShape.getId()); + buf.writeBoolean(hasMutilator); + } + + public void execute(IPayloadContext ctx) { + VoidScreen.openForHub(erosion, activeBargains, defianceScars, + shardBalance, usedCapacity, totalCapacity, soulShape, hasMutilator); + } + + @Override + public @NotNull Type type() { + return TYPE; + } + } + + public static class DefianceChoicePacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("void_defiance_choice")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(DefianceChoicePacket::encode, DefianceChoicePacket::new); + + private final ResourceLocation bargainId; + + public DefianceChoicePacket(ResourceLocation bargainId) { + this.bargainId = bargainId; + } + + public DefianceChoicePacket(FriendlyByteBuf buf) { + this.bargainId = buf.readResourceLocation(); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeResourceLocation(bargainId); + } + + public void execute(IPayloadContext ctx) { + if (!(ctx.player() instanceof ServerPlayer player)) return; + + BargainRegistry.get(bargainId).ifPresent(bargain -> { + ReflectionCapability.get(player).ifPresent(reflection -> { + if (!reflection.hasBargain(bargainId)) return; + + int cost = BargainRegistry.calculateDefianceCost(player, bargain); + reflection.addErosion(cost); + reflection.defy(bargainId); + bargain.onDefy(player); + + if (bargainId.equals(QuakeMovementBargain.INSTANCE.getId())) { + CCoreNetwork.sendToPlayer(player, new SyncQuakeMovementPacket(false)); + } + }); + }); + } + + @Override + public @NotNull Type type() { + return TYPE; + } + } + + public static class SoulShapeChoicePacket implements CustomPacketPayload { + + public static final Type TYPE = new Type<>(CosmicCore.id("void_soul_shape_choice")); + public static final StreamCodec CODEC = + StreamCodec.ofMember(SoulShapeChoicePacket::encode, SoulShapeChoicePacket::new); + + private final SoulShape shape; + + public SoulShapeChoicePacket(SoulShape shape) { + this.shape = shape; + } + + public SoulShapeChoicePacket(FriendlyByteBuf buf) { + this.shape = SoulShape.fromId(buf.readUtf()); + } + + public void encode(FriendlyByteBuf buf) { + buf.writeUtf(shape.getId()); + } + + public void execute(IPayloadContext ctx) { + if (!(ctx.player() instanceof ServerPlayer player)) return; + + if (shape == SoulShape.UNSHAPED) return; + + ReflectionCapability.get(player).ifPresent(reflection -> { + if (!reflection.hasAwakened()) return; + if (reflection.hasSoulShape()) return; + + var inventory = player.getInventory(); + int mutilatorSlot = -1; + for (int i = 0; i < inventory.getContainerSize(); i++) { + if (inventory.getItem(i).is(CosmicItems.SOUL_MUTILATOR.get())) { + mutilatorSlot = i; + break; + } + } + if (mutilatorSlot == -1) return; + + inventory.removeItem(mutilatorSlot, 1); + + reflection.setSoulShape(shape); + + player.level().playSound(null, player.blockPosition(), + SoundEvents.TOTEM_USE, SoundSource.PLAYERS, 0.8f, 0.6f); + }); + } + + @Override + public @NotNull Type type() { + return TYPE; + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/reflection/whisper/WhisperSystem.java b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/whisper/WhisperSystem.java new file mode 100644 index 000000000..97aaedf9a --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/reflection/whisper/WhisperSystem.java @@ -0,0 +1,291 @@ +package com.ghostipedia.cosmiccore.common.reflection.whisper; + +import com.ghostipedia.cosmiccore.common.reflection.IReflection; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCapability; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionConstants; + +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.entity.player.Player; + +import java.util.*; + +/** + * The Whisper System - ambient comments from the reflection. + * Event-based, contextual, scales with corruption. + */ +public final class WhisperSystem { + + private WhisperSystem() {} + + private static final Random RANDOM = new Random(); + + // Cooldown tracking to prevent spam + private static final Map lastWhisperTime = new HashMap<>(); + private static final long WHISPER_COOLDOWN = 30000L; // 30 seconds minimum between whispers + + // Style for whispers — trailing thoughts, not a voice + private static final Style WHISPER_STYLE = Style.EMPTY.withItalic(true).withColor(0x9966CC); + + /** + * Called periodically to check for ambient whispers. + */ + public static void tick(ServerPlayer player) { + ReflectionCapability.get(player).ifPresent(reflection -> { + if (!reflection.hasAwakened()) return; + + // Check various conditions for contextual whispers + checkHealthWhisper(player, reflection); + checkIdleWhisper(player, reflection); + checkDimensionWhisper(player, reflection); + }); + } + + /** + * Trigger a whisper for a specific event. + */ + public static void triggerEvent(ServerPlayer player, WhisperEvent event) { + ReflectionCapability.get(player).ifPresent(reflection -> { + if (!reflection.hasAwakened()) return; + if (isOnCooldown(player)) return; + + List lines = getEventLines(event, reflection); + if (lines.isEmpty()) return; + + String line = lines.get(RANDOM.nextInt(lines.size())); + sendWhisper(player, line); + }); + } + + /** + * Send a whisper to the player. + */ + public static void sendWhisper(ServerPlayer player, String text) { + if (isOnCooldown(player)) return; + + Component message = Component.literal("..." + text).withStyle(WHISPER_STYLE); + player.sendSystemMessage(message); + lastWhisperTime.put(player.getUUID(), System.currentTimeMillis()); + } + + /** + * Send a whisper with custom formatting. + */ + public static void sendWhisper(ServerPlayer player, Component text) { + if (isOnCooldown(player)) return; + + player.sendSystemMessage(text); + lastWhisperTime.put(player.getUUID(), System.currentTimeMillis()); + } + + private static boolean isOnCooldown(Player player) { + Long lastTime = lastWhisperTime.get(player.getUUID()); + if (lastTime == null) return false; + return (System.currentTimeMillis() - lastTime) < WHISPER_COOLDOWN; + } + + // ---- Condition Checks ---- + + private static void checkHealthWhisper(ServerPlayer player, IReflection reflection) { + if (player.getHealth() < player.getMaxHealth() * 0.25f) { + if (RANDOM.nextFloat() < 0.05f) { // 5% chance per tick check + triggerEvent(player, WhisperEvent.LOW_HEALTH); + } + } + } + + private static void checkIdleWhisper(ServerPlayer player, IReflection reflection) { + // Check if player has been standing still + if (player.getDeltaMovement().lengthSqr() < 0.001) { + if (RANDOM.nextFloat() < 0.01f) { // 1% chance per tick check + triggerEvent(player, WhisperEvent.IDLE); + } + } + } + + private static void checkDimensionWhisper(ServerPlayer player, IReflection reflection) { + // Random ambient whispers based on dimension + if (RANDOM.nextFloat() < 0.005f) { // 0.5% chance per tick check + triggerEvent(player, WhisperEvent.AMBIENT); + } + } + + // ---- Line Pools ---- + + private static List getEventLines(WhisperEvent event, IReflection reflection) { + int erosion = reflection.getErosion(); + int colorTier = ReflectionConstants.getSoulColorTier(erosion); + + return switch (event) { + case DEATH -> getDeathLines(reflection, colorTier); + case LOW_HEALTH -> getLowHealthLines(colorTier); + case LOW_OXYGEN -> getLowOxygenLines(colorTier); + case IDLE -> getIdleLines(colorTier); + case ENTERED_DIMENSION -> getDimensionLines(colorTier); + case POST_BARGAIN -> getPostBargainLines(colorTier); + case AMBIENT -> getAmbientLines(colorTier); + case COMBAT_KILL -> getCombatKillLines(colorTier); + }; + } + + private static List getDeathLines(IReflection reflection, int tier) { + List lines = new ArrayList<>(); + + if (tier <= 1) { + lines.add("cold"); + lines.add("that ached"); + lines.add("the ground felt wrong"); + lines.add("something lingers"); + } + + if (tier >= 2 && tier <= 4) { + lines.add("again"); + lines.add("familiar"); + lines.add("barely felt it"); + lines.add("the coming back is the hard part"); + } + + if (tier >= 5) { + lines.add("nothing"); + lines.add("just punctuation"); + lines.add("barely noticed"); + } + + return lines; + } + + private static List getLowHealthLines(int tier) { + List lines = new ArrayList<>(); + + if (tier <= 2) { + lines.add("hands are shaking"); + lines.add("pulse in your ears"); + lines.add("something's wrong"); + } + + if (tier >= 3) { + lines.add("just numbers"); + lines.add("temporary"); + lines.add("you've felt worse"); + } + + return lines; + } + + private static List getLowOxygenLines(int tier) { + List lines = new ArrayList<>(); + + if (tier <= 2) { + lines.add("chest tightening"); + lines.add("the air is thin"); + lines.add("breathe"); + } + + if (tier >= 3) { + lines.add("still clinging to that habit"); + lines.add("do you even need it anymore?"); + lines.add("let go"); + } + + return lines; + } + + private static List getIdleLines(int tier) { + List lines = new ArrayList<>(); + + if (tier <= 2) { + lines.add("quiet"); + lines.add("what was that sound?"); + lines.add("the air feels heavy"); + } + + if (tier >= 3) { + lines.add("something moved"); + lines.add("who were you before this?"); + lines.add("the stillness has a weight to it"); + } + + if (tier >= 5) { + lines.add("are you listening to yourself?"); + lines.add("when did it get so quiet?"); + } + + return lines; + } + + private static List getDimensionLines(int tier) { + List lines = new ArrayList<>(); + + lines.add("the rules are different here"); + lines.add("the air tastes wrong"); + lines.add("something remembers this place"); + lines.add("not home"); + + return lines; + } + + private static List getPostBargainLines(int tier) { + List lines = new ArrayList<>(); + + lines.add("lighter"); + lines.add("something's different"); + lines.add("the thread pulled clean"); + lines.add("can't undo that"); + + return lines; + } + + private static List getAmbientLines(int tier) { + List lines = new ArrayList<>(); + + if (tier <= 1) { + lines.add("hm"); + lines.add("something flickered"); + } + + if (tier >= 2 && tier <= 4) { + lines.add("getting used to this"); + lines.add("familiar"); + lines.add("how long has it been?"); + } + + if (tier >= 5) { + lines.add("is this what you wanted?"); + lines.add("almost"); + lines.add("what's left?"); + } + + return lines; + } + + private static List getCombatKillLines(int tier) { + List lines = new ArrayList<>(); + + if (tier <= 2) { + lines.add("necessary"); + lines.add("gone"); + } + + if (tier >= 3) { + lines.add("easy"); + lines.add("next"); + } + + return lines; + } + + /** + * Whisper event types. + */ + public enum WhisperEvent { + DEATH, + LOW_HEALTH, + LOW_OXYGEN, + IDLE, + ENTERED_DIMENSION, + POST_BARGAIN, + AMBIENT, + COMBAT_KILL + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/LandingZoneHelper.java b/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/LandingZoneHelper.java new file mode 100644 index 000000000..6514a4adf --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/LandingZoneHelper.java @@ -0,0 +1,74 @@ +package com.ghostipedia.cosmiccore.common.teleporter; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; + +public class LandingZoneHelper { + + private static final int MIN_SEARCH_HEIGHT_BUFFER = 5; // Don't search below world limit + this buffer + private static final int CLEAR_AIR_HEIGHT = 3; // Clear this many blocks above platform for headroom + + public static class PlatformOptions { + + public final Block platformMaterial; + public final Block padBlock; + public final int platformRadius; + + // Pplatform options. + public PlatformOptions(Block platformMaterial, Block padBlock, int platformRadius) { + this.platformMaterial = platformMaterial; + this.padBlock = padBlock; + this.platformRadius = platformRadius; + } + } + + // Search downward from startY to find solid ground. + // Searches down to minBuildHeight + 5, then falls back to startY if no ground found. + public static BlockPos findSafeYLevel(ServerLevel level, int x, int z, int startY) { + for (int y = startY; y >= level.getMinBuildHeight() + MIN_SEARCH_HEIGHT_BUFFER; y--) { + BlockPos checkPos = new BlockPos(x, y, z); + if (level.getBlockState(checkPos.below()).isSolid()) { + // Found solid ground + return checkPos; + } + } + + return new BlockPos(x, startY, z); + } + + // Check if a pad block is intact at the given position. + public static boolean isPadIntact(ServerLevel level, BlockPos pos, Block expectedPad) { + return level.getBlockState(pos).is(expectedPad); + } + + // Build a landing platform with escape pad at center. + public static void buildPlatform(ServerLevel level, BlockPos center, PlatformOptions options) { + int radius = options.platformRadius; + + // Build platform 1 block below center (so players stand on it, pad is at center) + for (int x = -radius; x <= radius; x++) { + for (int z = -radius; z <= radius; z++) { + BlockPos platformPos = center.offset(x, -1, z); + level.setBlock(platformPos, options.platformMaterial.defaultBlockState(), 3); + } + } + + // Place pad at center + level.setBlock(center, options.padBlock.defaultBlockState(), 3); + + // Clear air above for headroom + for (int y = 0; y < CLEAR_AIR_HEIGHT; y++) { + for (int x = -radius; x <= radius; x++) { + for (int z = -radius; z <= radius; z++) { + BlockPos airPos = center.offset(x, y, z); + if (airPos.equals(center)) continue; // Don't clear the pad itself + if (level.getBlockState(airPos).isSolid()) { + level.setBlock(airPos, Blocks.AIR.defaultBlockState(), 3); + } + } + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/SafeTeleporter.java b/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/SafeTeleporter.java new file mode 100644 index 000000000..817f6a7c7 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/SafeTeleporter.java @@ -0,0 +1,25 @@ +package com.ghostipedia.cosmiccore.common.teleporter; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.portal.DimensionTransition; +import net.minecraft.world.phys.Vec3; + +/** Saftey first kids (builds a DimensionTransition that drops the entity safely on a target pad). */ +public final class SafeTeleporter { + + private SafeTeleporter() {} + + public static DimensionTransition toSafe(ServerLevel destLevel, BlockPos targetPos, Entity entity) { + Vec3 pos = new Vec3( + targetPos.getX() + 0.5, + targetPos.getY() + 0.1, + targetPos.getZ() + 0.5); + return new DimensionTransition(destLevel, pos, Vec3.ZERO, entity.getYRot(), entity.getXRot(), + arrived -> { + arrived.clearFire(); + arrived.fallDistance = 0; + }); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/TeleportOrigin.java b/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/TeleportOrigin.java new file mode 100644 index 000000000..ed02d1d77 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/TeleportOrigin.java @@ -0,0 +1,146 @@ +package com.ghostipedia.cosmiccore.common.teleporter; + +import com.ghostipedia.cosmiccore.api.capability.ITeleportOrigin; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.core.registries.Registries; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.Level; +import net.minecraft.world.phys.Vec3; +import net.neoforged.neoforge.common.util.INBTSerializable; + +import org.jetbrains.annotations.Nullable; + +public class TeleportOrigin implements ITeleportOrigin, INBTSerializable { + + @Override + public CompoundTag serializeNBT(HolderLookup.Provider provider) { + CompoundTag tag = save(); + return tag != null ? tag : new CompoundTag(); + } + + @Override + public void deserializeNBT(HolderLookup.Provider provider, CompoundTag nbt) { + if (nbt != null) { + load(nbt); + } + } + + @Nullable + private ResourceKey originDimension; + @Nullable + private Vec3 originPosition; + private float originYaw; + private float originPitch; + @Nullable + private BlockPos escapePadPosition; + + // spotless: off + @Override + public void setOriginDimension(ResourceKey dimension) { + this.originDimension = dimension; + } + + @Override + @Nullable + public ResourceKey getOriginDimension() { + return originDimension; + } + + @Override + public void setOriginPosition(Vec3 position) { + this.originPosition = position; + } + + @Override + @Nullable + public Vec3 getOriginPosition() { + return originPosition; + } + + @Override + public void setOriginRotation(float yaw, float pitch) { + this.originYaw = yaw; + this.originPitch = pitch; + } + + @Override + public float getOriginYaw() { + return originYaw; + } + + @Override + public float getOriginPitch() { + return originPitch; + } + + @Override + public boolean hasValidOrigin() { + return originDimension != null && originPosition != null; + } + + @Override + public void clearOriginData() { + originDimension = null; + originPosition = null; + originYaw = 0; + originPitch = 0; + escapePadPosition = null; + } + // spotless: on + + // Save capability data to NBT. + public CompoundTag save() { + CompoundTag tag = new CompoundTag(); + + if (originDimension != null) { + tag.putString("OriginDimension", originDimension.location().toString()); + } + + if (originPosition != null) { + tag.putDouble("OriginX", originPosition.x); + tag.putDouble("OriginY", originPosition.y); + tag.putDouble("OriginZ", originPosition.z); + } + + tag.putFloat("OriginYaw", originYaw); + tag.putFloat("OriginPitch", originPitch); + + if (escapePadPosition != null) { + tag.putLong("EscapePadPos", escapePadPosition.asLong()); + } + + return tag; + } + + // Load capability data from NBT. + public void load(CompoundTag tag) { + if (tag.contains("OriginDimension")) { + ResourceLocation dimLoc = ResourceLocation.parse(tag.getString("OriginDimension")); + this.originDimension = ResourceKey.create(Registries.DIMENSION, dimLoc); + } else { + this.originDimension = null; + } + + if (tag.contains("OriginX")) { + double x = tag.getDouble("OriginX"); + double y = tag.getDouble("OriginY"); + double z = tag.getDouble("OriginZ"); + this.originPosition = new Vec3(x, y, z); + } else { + this.originPosition = null; + } + + this.originYaw = tag.getFloat("OriginYaw"); + this.originPitch = tag.getFloat("OriginPitch"); + + if (tag.contains("EscapePadPos")) { + this.escapePadPosition = BlockPos.of(tag.getLong("EscapePadPos")); + } else { + this.escapePadPosition = null; + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/TeleportPadRegistry.java b/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/TeleportPadRegistry.java new file mode 100644 index 000000000..bb81f5dbb --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/teleporter/TeleportPadRegistry.java @@ -0,0 +1,79 @@ +package com.ghostipedia.cosmiccore.common.teleporter; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.ListTag; +import net.minecraft.nbt.Tag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.saveddata.SavedData; + +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; +import java.util.Set; + +// Tracks teleport pads that have been placed. Prevents duplicate platform spawning. +public class TeleportPadRegistry extends SavedData { + + private static final String DATA_NAME = "cosmiccore_teleport_pads"; + + private final Set pads = new HashSet<>(); + + public TeleportPadRegistry() { + super(); + } + + // Get the saved data instance for a specific dimension. + public static TeleportPadRegistry get(ServerLevel level) { + return level.getDataStorage().computeIfAbsent( + new SavedData.Factory<>(TeleportPadRegistry::new, TeleportPadRegistry::load), + DATA_NAME); + } + + // Check if a pad exists at the given position. + public boolean hasPadAt(BlockPos pos) { + return pads.contains(pos); + } + + // Register a new pad at the given position. + public void registerPad(BlockPos pos) { + if (pads.add(pos)) { + setDirty(); + } + } + + // Remove a pad registration (like if it gets broken) + public void removePad(BlockPos pos) { + if (pads.remove(pos)) { + setDirty(); + } + } + + @Override + public @NotNull CompoundTag save(@NotNull CompoundTag tag, @NotNull HolderLookup.Provider provider) { + ListTag padsList = new ListTag(); + + for (BlockPos pos : pads) { + CompoundTag padTag = new CompoundTag(); + padTag.putLong("Pos", pos.asLong()); + padsList.add(padTag); + } + + tag.put("Pads", padsList); + return tag; + } + + public static TeleportPadRegistry load(CompoundTag tag, HolderLookup.Provider provider) { + TeleportPadRegistry registry = new TeleportPadRegistry(); + + ListTag padsList = tag.getList("Pads", Tag.TAG_COMPOUND); + for (Tag padTagRaw : padsList) { + CompoundTag padTag = (CompoundTag) padTagRaw; + BlockPos pos = BlockPos.of(padTag.getLong("Pos")); + registry.pads.add(pos); + } + + return registry; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/wireless/GlobalWirelessSavedData.java b/src/main/java/com/ghostipedia/cosmiccore/common/wireless/GlobalWirelessSavedData.java new file mode 100644 index 000000000..34e7a91f1 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/wireless/GlobalWirelessSavedData.java @@ -0,0 +1,34 @@ +package com.ghostipedia.cosmiccore.common.wireless; + +import net.minecraft.core.HolderLookup; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.saveddata.SavedData; + +import org.jetbrains.annotations.NotNull; + +public class GlobalWirelessSavedData extends SavedData { + + private final ServerLevel serverLevel; + + public static GlobalWirelessSavedData getOrCreate(ServerLevel serverLevel) { + return serverLevel.getDataStorage().computeIfAbsent( + new SavedData.Factory<>(() -> new GlobalWirelessSavedData(serverLevel), + (tag, provider) -> new GlobalWirelessSavedData(serverLevel, tag)), + "gtceu_global_wireless"); + } + + private GlobalWirelessSavedData(ServerLevel serverLevel) { + this.serverLevel = serverLevel; + } + + private GlobalWirelessSavedData(ServerLevel serverLevel, CompoundTag tag) { + this(serverLevel); + } + + @NotNull + @Override + public CompoundTag save(@NotNull CompoundTag compound, @NotNull HolderLookup.Provider provider) { + return compound; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/wireless/GlobalWirelessVariableStorage.java b/src/main/java/com/ghostipedia/cosmiccore/common/wireless/GlobalWirelessVariableStorage.java new file mode 100644 index 000000000..8b32b6c0f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/wireless/GlobalWirelessVariableStorage.java @@ -0,0 +1,11 @@ +package com.ghostipedia.cosmiccore.common.wireless; + +import java.util.HashMap; +import java.util.UUID; + +public abstract class GlobalWirelessVariableStorage { + // --------------------- NEVER access these maps! Use the methods provided! --------------------- + + // Global wireless data stick map + public static HashMap GlobalWirelessDataSticks = new HashMap<>(20, 0.9f); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/wireless/WirelessDataStore.java b/src/main/java/com/ghostipedia/cosmiccore/common/wireless/WirelessDataStore.java new file mode 100644 index 000000000..2a7d29646 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/wireless/WirelessDataStore.java @@ -0,0 +1,53 @@ +package com.ghostipedia.cosmiccore.common.wireless; + +import com.gregtechceu.gtceu.api.capability.IDataAccessHatch; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; + +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +import static com.ghostipedia.cosmiccore.common.wireless.GlobalWirelessVariableStorage.GlobalWirelessDataSticks; + +public class WirelessDataStore { + + private final Set transmitters = new HashSet<>(); + + public void clearData() { + transmitters.clear(); + } + + public void addTransmitters(List data) { + transmitters.addAll(data); + } + + public void removeTransmitters(List data) { + data.forEach(transmitters::remove); + } + + public List getTransmitters() { + return transmitters.stream().toList(); + } + + public boolean isRecipeAvailable(@NotNull GTRecipe recipe, @NotNull Collection seen) { + return transmitters.stream().anyMatch(t -> t.isRecipeAvailable(recipe, seen)); + } + + public static WirelessDataStore getWirelessDataStore(UUID uuid) { + if (GlobalWirelessDataSticks.get(uuid) == null) + GlobalWirelessDataSticks.put(uuid, new WirelessDataStore()); + return GlobalWirelessDataSticks.get(uuid); + } + + public static void addHatches(UUID uuid, List hatches) { + var dataStore = getWirelessDataStore(uuid); + dataStore.addTransmitters(hatches); + GlobalWirelessDataSticks.put(uuid, dataStore); + } + + public static void removeHatches(UUID uuid, List hatches) { + var dataStore = getWirelessDataStore(uuid); + dataStore.removeTransmitters(hatches); + GlobalWirelessDataSticks.put(uuid, dataStore); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/common/worldgen/survey/VeinSurveyUtil.java b/src/main/java/com/ghostipedia/cosmiccore/common/worldgen/survey/VeinSurveyUtil.java new file mode 100644 index 000000000..c3deb26d1 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/common/worldgen/survey/VeinSurveyUtil.java @@ -0,0 +1,222 @@ +package com.ghostipedia.cosmiccore.common.worldgen.survey; + +import com.gregtechceu.gtceu.api.data.worldgen.GTOreDefinition; +import com.gregtechceu.gtceu.api.data.worldgen.IWorldGenLayer; +import com.gregtechceu.gtceu.api.data.worldgen.WorldGeneratorUtils; +import com.gregtechceu.gtceu.api.data.worldgen.ores.GeneratedVeinMetadata; +import com.gregtechceu.gtceu.api.data.worldgen.ores.OreVeinUtil; +import com.gregtechceu.gtceu.api.registry.GTRegistries; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.integration.map.cache.server.ServerCache; +import com.gregtechceu.gtceu.utils.GTUtil; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.XoroshiroRandomSource; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Optional; +import java.util.Set; + +public class VeinSurveyUtil { + + public enum VeinConfidence { + CONFIRMED, + PREDICTED + } + + public record VeinInfo( + BlockPos center, + ChunkPos originChunk, + GTOreDefinition definition, + ResourceLocation veinId, + int estimatedRadius, + VeinConfidence confidence) { + + public String getVeinName() { + return veinId != null ? veinId.getPath() : "unknown"; + } + + public int horizontalDistanceFrom(BlockPos pos) { + int dx = center.getX() - pos.getX(); + int dz = center.getZ() - pos.getZ(); + return (int) Math.sqrt(dx * dx + dz * dz); + } + + public String directionFrom(BlockPos pos) { + int dx = center.getX() - pos.getX(); + int dz = center.getZ() - pos.getZ(); + String ns = dz < -10 ? "N" : dz > 10 ? "S" : ""; + String ew = dx > 10 ? "E" : dx < -10 ? "W" : ""; + if (ns.isEmpty() && ew.isEmpty()) return "HERE"; + return ns + ew; + } + + public boolean isConfirmed() { + return confidence == VeinConfidence.CONFIRMED; + } + } + + public static List surveyVeins(ServerLevel level, BlockPos centerPos, int radiusBlocks, + IWorldGenLayer targetLayer) { + List results = new ArrayList<>(); + Set confirmedGridPositions = new HashSet<>(); + + // Phase 1: Query GT's ServerCache for confirmed veins + List cachedVeins = ServerCache.instance.getNearbyVeins( + level.dimension(), centerPos, radiusBlocks); + + for (GeneratedVeinMetadata metadata : cachedVeins) { + GTOreDefinition definition = metadata.definition().value(); + if (targetLayer != null && !definition.layer().equals(targetLayer)) { + continue; + } + + BlockPos veinCenter = metadata.center(); + if (distanceXZ(veinCenter, centerPos) > radiusBlocks) { + continue; + } + + confirmedGridPositions.add(metadata.originChunk()); + + ResourceLocation veinId = metadata.definition().unwrapKey() + .map(ResourceKey::location) + .orElse(null); + + results.add(new VeinInfo( + veinCenter, + metadata.originChunk(), + definition, + veinId, + definition.clusterSize().getMaxValue(), + VeinConfidence.CONFIRMED)); + } + + // Phase 2: For grid positions not in cache, use prediction + long worldSeed = level.getSeed(); + int gridSize = ConfigHolder.INSTANCE.worldgen.oreVeins.oreVeinGridSize; + int randomOffset = ConfigHolder.INSTANCE.worldgen.oreVeins.oreVeinRandomOffset; + + int radiusChunks = (radiusBlocks / 16) + (randomOffset / 16) + 2; + int centerChunkX = centerPos.getX() >> 4; + int centerChunkZ = centerPos.getZ() >> 4; + + int gridStartX = Math.floorDiv(centerChunkX - radiusChunks, gridSize) * gridSize; + int gridEndX = Math.floorDiv(centerChunkX + radiusChunks, gridSize) * gridSize; + int gridStartZ = Math.floorDiv(centerChunkZ - radiusChunks, gridSize) * gridSize; + int gridEndZ = Math.floorDiv(centerChunkZ + radiusChunks, gridSize) * gridSize; + + for (int gridX = gridStartX; gridX <= gridEndX; gridX += gridSize) { + for (int gridZ = gridStartZ; gridZ <= gridEndZ; gridZ += gridSize) { + ChunkPos chunkPos = new ChunkPos(gridX, gridZ); + + if (confirmedGridPositions.contains(chunkPos)) { + continue; + } + + List predictedVeins = predictVeinsAtGridPos(level, worldSeed, chunkPos, targetLayer); + + for (VeinInfo info : predictedVeins) { + if (info.horizontalDistanceFrom(centerPos) <= radiusBlocks) { + results.add(info); + } + } + } + } + + results.sort((a, b) -> Integer.compare( + a.horizontalDistanceFrom(centerPos), + b.horizontalDistanceFrom(centerPos))); + + return results; + } + + private static int distanceXZ(BlockPos a, BlockPos b) { + int dx = a.getX() - b.getX(); + int dz = a.getZ() - b.getZ(); + return (int) Math.sqrt(dx * dx + dz * dz); + } + + /** + * Prediction algorithm for ungenerated chunks. + * Must match GT's OreGenerator.createConfigs() random sequence exactly. + */ + private static List predictVeinsAtGridPos( + ServerLevel level, long worldSeed, ChunkPos chunkPos, + IWorldGenLayer targetLayer) { + List results = new ArrayList<>(); + RandomSource random = new XoroshiroRandomSource(worldSeed ^ chunkPos.toLong()); + + Optional veinCenterOpt = OreVeinUtil.getVeinCenter(chunkPos, random); + if (veinCenterOpt.isEmpty()) return results; + + BlockPos veinCenter = veinCenterOpt.get(); + Holder biome = level.getBiome(veinCenter); + + var applicableLayers = WorldGeneratorUtils.WORLD_GEN_LAYERS.values().stream() + .filter(l -> l.isApplicableForLevel(level.dimension())) + .toList(); + + for (IWorldGenLayer layer : applicableLayers) { + var biomeVeins = WorldGeneratorUtils.getCachedBiomeVeins(level, biome).stream() + .filter(wv -> wv.vein().value().layer().equals(layer)) + .toList(); + + var selectedWeightedVein = GTUtil.getRandomItem(random, biomeVeins); + if (selectedWeightedVein == null) continue; + + random.nextLong(); + + if (targetLayer != null && !layer.equals(targetLayer)) continue; + + Holder selectedVein = selectedWeightedVein.vein(); + ResourceLocation veinId = selectedVein.unwrapKey() + .map(ResourceKey::location) + .orElse(null); + BlockPos finalCenter = new BlockPos(veinCenter.getX(), 0, veinCenter.getZ()); + int estimatedRadius = selectedVein.value().clusterSize().getMaxValue(); + + results.add(new VeinInfo(finalCenter, chunkPos, selectedVein.value(), veinId, estimatedRadius, + VeinConfidence.PREDICTED)); + } + + return results; + } + + public static Optional findNearestVein( + ServerLevel level, BlockPos centerPos, int maxRadiusBlocks, + IWorldGenLayer layer, String veinNameFilter) { + List veins = surveyVeins(level, centerPos, maxRadiusBlocks, layer); + + if (veinNameFilter != null && !veinNameFilter.isEmpty()) { + String filterLower = veinNameFilter.toLowerCase(); + veins = veins.stream() + .filter(v -> v.getVeinName().toLowerCase().contains(filterLower)) + .toList(); + } + + return veins.isEmpty() ? Optional.empty() : Optional.of(veins.get(0)); + } + + public static List getAvailableVeinTypes(ServerLevel level, IWorldGenLayer layer) { + List types = new ArrayList<>(); + Registry registry = level.registryAccess() + .registryOrThrow(GTRegistries.ORE_VEIN_REGISTRY); + for (Holder.Reference holder : registry.holders().toList()) { + GTOreDefinition vein = holder.value(); + if ((layer == null || vein.layer() == layer) && vein.weight() > 0) { + types.add(holder.key().location().getPath()); + } + } + return types; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/forge/ABSModifications.java b/src/main/java/com/ghostipedia/cosmiccore/forge/ABSModifications.java index bd4059e14..79ed65d23 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/forge/ABSModifications.java +++ b/src/main/java/com/ghostipedia/cosmiccore/forge/ABSModifications.java @@ -2,20 +2,31 @@ import com.ghostipedia.cosmiccore.CosmicCore; import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; + +import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.event.PostMaterialEvent; +import com.gregtechceu.gtceu.api.data.chemical.material.properties.AlloyBlastProperty; import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; -import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.data.recipe.misc.alloyblast.CustomAlloyBlastRecipeProducer; -import net.minecraftforge.eventbus.api.EventPriority; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -@Mod.EventBusSubscriber(modid = CosmicCore.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) +import net.neoforged.bus.api.EventPriority; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; + +@EventBusSubscriber(modid = CosmicCore.MOD_ID, bus = EventBusSubscriber.Bus.MOD) public class ABSModifications { + @SubscribeEvent(priority = EventPriority.LOW) public static void addAlloyBlastProperties(PostMaterialEvent event) { - CosmicMaterials.ResonantVirtueMeld.getProperty(PropertyKey.ALLOY_BLAST) - .setRecipeProducer(new CustomAlloyBlastRecipeProducer(-1, -1, 32)); + Material material = CosmicMaterials.ResonantVirtueMeld; + AlloyBlastProperty property = material.getProperty(PropertyKey.ALLOY_BLAST); + if (property == null) { + // TODO(cosmiccore-42.9): GTCEu 8.0 stopped auto-adding an AlloyBlastProperty to alloys with + // 2+ fluid-only components (here Virtue + Prisma), so add it explicitly to keep this material's + // ABS recipe. When ABS recipe-gen is re-enabled, confirm a MOLTEN fluid is registered for it too. + property = new AlloyBlastProperty(material.getBlastTemperature()); + material.setProperty(PropertyKey.ALLOY_BLAST, property); + } + property.setRecipeProducer(new CustomAlloyBlastRecipeProducer(-1, -1, 32)); } - } diff --git a/src/main/java/com/ghostipedia/cosmiccore/forge/ForgeCommonEventListener.java b/src/main/java/com/ghostipedia/cosmiccore/forge/ForgeCommonEventListener.java index 5e6f52d51..7e6369573 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/forge/ForgeCommonEventListener.java +++ b/src/main/java/com/ghostipedia/cosmiccore/forge/ForgeCommonEventListener.java @@ -1,21 +1,150 @@ package com.ghostipedia.cosmiccore.forge; import com.ghostipedia.cosmiccore.CosmicCore; -import com.ghostipedia.cosmiccore.common.machine.multiblock.part.SoulHatchPartMachine; -import com.gregtechceu.gtceu.api.block.MetaMachineBlock; +import com.ghostipedia.cosmiccore.CosmicUtils; +import com.ghostipedia.cosmiccore.common.commands.ExportRegistryCommand; +import com.ghostipedia.cosmiccore.common.commands.SoulCommand; +import com.ghostipedia.cosmiccore.common.commands.StarLadderCommand; +import com.ghostipedia.cosmiccore.common.commands.VeinSurveyCommand; +import com.ghostipedia.cosmiccore.common.commands.WirelessEnergyCommand; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; +import com.ghostipedia.cosmiccore.common.item.armor.boots.ICosmicBoots; +import com.ghostipedia.cosmiccore.common.item.behavior.EffectApplicationBehavior; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCommand; +import com.ghostipedia.cosmiccore.common.reflection.ReflectionCommands; +import com.ghostipedia.cosmiccore.mixin.accessor.LivingEntityAccessor; + +import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; +import com.gregtechceu.gtceu.api.item.armor.ArmorComponentItem; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.protocol.game.ClientboundPlayerAbilitiesPacket; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.event.level.BlockEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.event.RegisterCommandsEvent; +import net.neoforged.neoforge.event.entity.living.LivingDeathEvent; +import net.neoforged.neoforge.event.entity.living.LivingEquipmentChangeEvent; +import net.neoforged.neoforge.event.entity.living.LivingEvent; +import net.neoforged.neoforge.event.entity.living.LivingFallEvent; +import net.neoforged.neoforge.event.entity.living.LivingIncomingDamageEvent; +import net.neoforged.neoforge.event.tick.PlayerTickEvent; +import net.neoforged.bus.api.EventPriority; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; + +import static com.ghostipedia.cosmiccore.common.item.armor.ChestSanguineWarptechSuite.SANGUINE_SHIELD_NBT_KEY; -@Mod.EventBusSubscriber(modid = CosmicCore.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE) +@SuppressWarnings("unused") +@EventBusSubscriber(modid = CosmicCore.MOD_ID, bus = EventBusSubscriber.Bus.GAME) public class ForgeCommonEventListener { @SubscribeEvent - public static void entityPlacementEventHandler(BlockEvent.EntityPlaceEvent event) { - if (event.getPlacedBlock().getBlock() instanceof MetaMachineBlock block && block.getMachine(event.getLevel(), event.getPos()) instanceof SoulHatchPartMachine soulHatch - && event.getEntity() instanceof Player player) { - soulHatch.attachSoulNetwork(player); + public static void onPlayerTick(final PlayerTickEvent.Post event) { + Player player = event.getEntity(); + if (CosmicUtils.hasTheOneRing(player)) { + var effects = ((EffectApplicationBehavior) CosmicItems.THE_ONE_RING.get().getComponents().get(0)) + .getEffects(); + for (var effect : effects) { + if (player.getRandom().nextFloat() < effect.getSecond()) { + player.addEffect(new MobEffectInstance(effect.getFirst())); + } + } + ((LivingEntityAccessor) player).callRemoveEffectParticles(); + } + } + + @SubscribeEvent + public static void onEquipChange(LivingEquipmentChangeEvent e) { + if (!(e.getEntity() instanceof ServerPlayer p)) return; + if (e.getSlot() != EquipmentSlot.CHEST) return; + + boolean putOn = e.getTo().is(CosmicItems.SANGUINE_WARPTECH_CHESTPLATE.get()); + boolean tookOff = e.getFrom().is(CosmicItems.SANGUINE_WARPTECH_CHESTPLATE.get()) && !putOn; + + if (tookOff && !p.isCreative() && !p.isSpectator()) { + p.getAbilities().mayfly = false; + p.getAbilities().flying = false; + p.fallDistance = 0; + p.connection.send( + new ClientboundPlayerAbilitiesPacket(p.getAbilities())); + p.getPersistentData().putBoolean(SANGUINE_SHIELD_NBT_KEY, false); + } + } + + @SubscribeEvent(priority = EventPriority.HIGH) + public static void onPlayerDamage(LivingIncomingDamageEvent event) { + if (!(event.getEntity() instanceof Player player)) return; + + CompoundTag tag = player.getPersistentData(); + if (tag.contains(SANGUINE_SHIELD_NBT_KEY) && tag.getBoolean(SANGUINE_SHIELD_NBT_KEY)) { + event.setCanceled(true); + } + } + + @SubscribeEvent(priority = EventPriority.HIGH) + public static void onPlayerDeath(LivingDeathEvent event) { + if (!(event.getEntity() instanceof Player player)) return; + + CompoundTag tag = player.getPersistentData(); + if (tag.contains(SANGUINE_SHIELD_NBT_KEY) && tag.getBoolean(SANGUINE_SHIELD_NBT_KEY)) { + event.setCanceled(true); + player.sendSystemMessage( + Component.translatable("cosmiccore.armor.sanguinewarptech.message.death_defiance")); + } + } + + @SubscribeEvent + public static void registerCommand(RegisterCommandsEvent event) { + WirelessEnergyCommand.register(event.getDispatcher(), event.getBuildContext()); + SoulCommand.register(event.getDispatcher(), event.getBuildContext()); + ReflectionCommand.register(event.getDispatcher()); + ReflectionCommands.register(event.getDispatcher()); + VeinSurveyCommand.register(event.getDispatcher()); + ExportRegistryCommand.register(event.getDispatcher()); + StarLadderCommand.register(event.getDispatcher()); + } + + @SubscribeEvent + public static void onLivingJump(LivingEvent.LivingJumpEvent event) { + if (!(event.getEntity() instanceof Player player)) return; + + ItemStack boots = player.getItemBySlot(EquipmentSlot.FEET); + if (boots.isEmpty()) return; + + if (!(boots.getItem() instanceof ArmorComponentItem armorItem)) return; + if (!(armorItem.getArmorLogic() instanceof ICosmicBoots cosmicBoots)) return; + + var electric = GTCapabilityHelper.getElectricItem(boots); + if (electric == null || electric.getCharge() <= 0) return; + + double jumpPower = cosmicBoots.getEffectiveJumpPower(boots); + if (jumpPower <= 1.0) return; + + var motion = player.getDeltaMovement(); + double boostedY = motion.y * jumpPower; + player.setDeltaMovement(motion.x, boostedY, motion.z); + } + + @SubscribeEvent(priority = EventPriority.HIGH) + public static void onLivingFall(LivingFallEvent event) { + if (!(event.getEntity() instanceof Player player)) return; + + ItemStack boots = player.getItemBySlot(EquipmentSlot.FEET); + if (boots.isEmpty()) return; + + if (!(boots.getItem() instanceof ArmorComponentItem armorItem)) return; + if (!(armorItem.getArmorLogic() instanceof ICosmicBoots cosmicBoots)) return; + + var electric = GTCapabilityHelper.getElectricItem(boots); + if (electric == null || electric.getCharge() <= 0) return; + + if (cosmicBoots.negatesFallDamage()) { + event.setCanceled(true); + player.fallDistance = 0; } } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicCoreRecipes.java b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicCoreRecipes.java index 1a0b2831d..eea416b87 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicCoreRecipes.java +++ b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicCoreRecipes.java @@ -1,29 +1,31 @@ package com.ghostipedia.cosmiccore.gtbridge; +import com.ghostipedia.cosmiccore.api.capability.recipe.CosmicRecipeCapabilities; +import com.ghostipedia.cosmiccore.api.capability.souls.SoulType; +import com.ghostipedia.cosmiccore.api.recipe.ingredient.SoulIngredient; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.LarvaMachine; +import com.ghostipedia.cosmiccore.common.recipe.condition.LinkedPartnerCondition; +import com.ghostipedia.cosmiccore.common.recipe.condition.LinkedPartnerDimensionCondition; +import com.ghostipedia.cosmiccore.common.recipe.condition.LinkedPartnerDimensionFluidCondition; +import com.ghostipedia.cosmiccore.common.recipe.condition.LinkedPartnerDimensionItemCondition; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.data.recipe.serialized.chemistry.DistillationRecipes; -import net.minecraft.data.recipes.FinishedRecipe; -import net.minecraft.world.level.block.Blocks; -import java.util.function.Consumer; +import net.minecraft.data.recipes.RecipeOutput; +import net.minecraft.world.item.Items; +import net.minecraft.world.level.material.Fluids; import static com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials.DilutedPrisma; import static com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials.Prisma; -import static com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes.NAQUAHINE_REACTOR; -import static com.gregtechceu.gtceu.common.data.GTMaterials.Water; +import static com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes.*; +import static com.gregtechceu.gtceu.api.data.tag.TagPrefix.*; +import static com.gregtechceu.gtceu.common.data.GTMaterials.*; import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.DISTILLATION_RECIPES; public class CosmicCoreRecipes { - - public static void init(Consumer provider) { -// SOUL_TESTER_RECIPES.recipeBuilder("dirt_to_soul") -// .inputItems(Blocks.DIRT.asItem(), 1) -// .output(SoulRecipeCapability.CAP, 1000000) -// .duration(10) -// .save(provider); -// + public static void init(RecipeOutput provider) { + registerIndustrialPrimitiveBlastFurnaceRecipes(provider); DISTILLATION_RECIPES.recipeBuilder("diluted_prisma_to_prisma_and_water") .inputFluids(DilutedPrisma.getFluid(5000)) @@ -32,25 +34,197 @@ public static void init(Consumer provider) { .duration(40) .EUt(GTValues.VA[GTValues.HV]) .save(provider); -// GROVE_RECIPES.recipeBuilder("dirt_movement") -// .input(SoulRecipeCapability.CAP, 100) -// .notConsumable(CosmicItems.DONK) -// .notConsumable(Items.ZOMBIE_HEAD) -// .outputItems(Items.ROTTEN_FLESH, 1) -// .duration(20) -// .EUt(GTValues.VA[GTValues.HV]) -// .save(provider); -// GROVE_RECIPES.recipeBuilder("killing_mobs") -// .output(SoulRecipeCapability.CAP, 1000) -// .notConsumable(Items.ZOMBIE_HEAD) -// .duration(20) -// .EUt(GTValues.VA[GTValues.HV]) -// .save(provider); -// NAQUAHINE_REACTOR.recipeBuilder("dirt_to_power") -// .inputItems(Blocks.DIRT.asItem(), 1) -// .EUt(-GTValues.V[GTValues.UV]) -// .duration(10) -// .save(provider); + + LarvaMachine.generateTargettingChipRecipes(provider); + + // === Link Test Station Recipes === + // Basic recipe - no partner required (verifies machine works) + LINK_TEST_RECIPES.recipeBuilder("link_test_basic") + .inputItems(Items.IRON_INGOT) + .outputItems(Items.IRON_NUGGET, 9) + .duration(100) + .EUt(GTValues.VA[GTValues.LV]) + .save(provider); + + // Linked recipe - requires at least 1 linked partner + LINK_TEST_RECIPES.recipeBuilder("link_test_linked") + .inputItems(Items.GOLD_INGOT) + .outputItems(Items.DIAMOND) + .duration(200) + .EUt(GTValues.VA[GTValues.MV]) + .addCondition(new LinkedPartnerCondition(1)) + .save(provider); + + // Linked recipe - requires partner to be formed + LINK_TEST_RECIPES.recipeBuilder("link_test_formed_partner") + .inputItems(Items.EMERALD) + .outputItems(Items.NETHER_STAR) + .duration(400) + .EUt(GTValues.VA[GTValues.HV]) + .addCondition(new LinkedPartnerCondition(1, true, false)) + .save(provider); + + // Linked recipe - requires partner in Moon dimension + LINK_TEST_RECIPES.recipeBuilder("link_test_moon_partner") + .inputItems(Items.LAPIS_LAZULI, 4) + .outputItems(Items.ENDER_PEARL) + .duration(200) + .EUt(GTValues.VA[GTValues.MV]) + .addCondition(new LinkedPartnerDimensionCondition("ad_astra:moon")) + .save(provider); + + // Linked recipe - requires partner in Overworld (for testing from other dimensions) + LINK_TEST_RECIPES.recipeBuilder("link_test_overworld_partner") + .inputItems(Items.REDSTONE, 4) + .outputItems(Items.GLOWSTONE_DUST, 4) + .duration(200) + .EUt(GTValues.VA[GTValues.MV]) + .addCondition(new LinkedPartnerDimensionCondition("minecraft:overworld")) + .save(provider); + + // Linked recipe - requires partner in Overworld with diamonds in input + LINK_TEST_RECIPES.recipeBuilder("link_test_dimension_item") + .inputItems(Items.COAL, 8) + .outputItems(Items.DIAMOND) + .duration(400) + .EUt(GTValues.VA[GTValues.HV]) + .addCondition(new LinkedPartnerDimensionItemCondition("minecraft:overworld", Items.DIAMOND, 1)) + .save(provider); + + // Linked recipe - requires partner in Overworld with water in input + LINK_TEST_RECIPES.recipeBuilder("link_test_dimension_fluid") + .inputItems(Items.SPONGE) + .outputItems(Items.WET_SPONGE) + .duration(100) + .EUt(GTValues.VA[GTValues.LV]) + .addCondition(new LinkedPartnerDimensionFluidCondition("minecraft:overworld", Fluids.WATER, 1000)) + .save(provider); + + /* + * EMBER_TESTER_RECIPES.recipeBuilder("test") + * .input(CosmicRecipeCapabilities.EMBER, 100d) + * .outputItems(Items.COBBLESTONE) + * .save(provider); + */ + + SOUL_TESTER_RECIPES.recipeBuilder("generate_soul") + .notConsumable(Items.DIRT) + .output(CosmicRecipeCapabilities.SOUL, SoulIngredient.of(SoulType.Raw, 10)) + .output(CosmicRecipeCapabilities.SOUL, SoulIngredient.of(SoulType.Temporal, 50)) + .duration(20) + .save(provider); + + SOUL_TESTER_RECIPES.recipeBuilder("generate_soul_2") + .notConsumable(Items.STONE) + .input(CosmicRecipeCapabilities.SOUL, SoulIngredient.of(SoulType.Raw, 10)) + .outputItems(ingot, Steel) + .duration(20) + .save(provider); + + // GROVE_RECIPES.recipeBuilder("dirt_movement") + // .input(SoulRecipeCapability.CAP, 100) + // .notConsumable(CosmicItems.DONK) + // .notConsumable(Items.ZOMBIE_HEAD) + // .outputItems(Items.ROTTEN_FLESH, 1) + // .duration(20) + // .EUt(GTValues.VA[GTValues.HV]) + // .save(provider); + // GROVE_RECIPES.recipeBuilder("killing_mobs") + // .output(SoulRecipeCapability.CAP, 1000) + // .notConsumable(Items.ZOMBIE_HEAD) + // .duration(20) + // .EUt(GTValues.VA[GTValues.HV]) + // .save(provider); + // NAQUAHINE_REACTOR.recipeBuilder("dirt_to_power") + // .inputItems(Blocks.DIRT.asItem(), 1) + // .EUt(-GTValues.V[GTValues.UV]) + // .duration(10) + // .save(provider); } + private static void registerIndustrialPrimitiveBlastFurnaceRecipes(RecipeOutput provider) { + INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder("steel_from_coal_gem").inputItems(ingot, Iron) + .inputItems(gem, Coal, 2).outputItems(ingot, Steel).outputItems(dustTiny, DarkAsh, 2) + .duration((int) (1800 * 0.75f)).inputFluids(Creosote.getFluid(250)) + .save(provider); + INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder("steel_from_coal_dust").inputItems(ingot, Iron) + .inputItems(dust, Coal, 2).outputItems(ingot, Steel).outputItems(dustTiny, DarkAsh, 2) + .duration((int) (1800 * 0.75f)).inputFluids(Creosote.getFluid(250)) + .save(provider); + INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder("steel_from_charcoal_gem").inputItems(ingot, Iron) + .inputItems(gem, Charcoal, 2).outputItems(ingot, Steel).outputItems(dustTiny, DarkAsh, 2) + .duration((int) (1800 * 0.75f)).inputFluids(Creosote.getFluid(250)) + .save(provider); + INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder("steel_from_charcoal_dust").inputItems(ingot, Iron) + .inputItems(dust, Charcoal, 2).outputItems(ingot, Steel).outputItems(dustTiny, DarkAsh, 2) + .inputFluids(Creosote.getFluid(250)) + .duration(1800).save(provider); + INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder("steel_from_coke_gem").inputItems(ingot, Iron) + .inputItems(gem, Coke).outputItems(ingot, Steel).chancedOutput(dust, Ash, "1/9", 0) + .duration((int) (1500 * 0.75f)).inputFluids(Creosote.getFluid(250)) + .save(provider); + INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder("steel_from_coke_dust").inputItems(ingot, Iron) + .inputItems(dust, Coke).outputItems(ingot, Steel).chancedOutput(dust, Ash, "1/9", 0) + .duration((int) (1500 * 0.75f)).inputFluids(Creosote.getFluid(250)) + .save(provider); + + INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder("steel_from_coal_block").inputItems(block, Iron) + .inputItems(block, Coal, 2).outputItems(block, Steel).outputItems(dust, DarkAsh, 2) + .duration((int) (16200 * 0.75f)).inputFluids(Creosote.getFluid(2000)) + .save(provider); + INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder("steel_from_charcoal_block").inputItems(block, Iron) + .inputItems(block, Charcoal, 2).outputItems(block, Steel).outputItems(dust, DarkAsh, 2) + .duration((int) (16200 * 0.75f)).inputFluids(Creosote.getFluid(2000)) + .save(provider); + INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder("steel_from_coke_block").inputItems(block, Iron) + .inputItems(block, Coke).outputItems(block, Steel).outputItems(dust, Ash) + .duration((int) (13500 * 0.75f)).inputFluids(Creosote.getFluid(2000)) + .save(provider); + + INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder("steel_from_coal_gem_wrought") + .inputItems(ingot, WroughtIron) + .inputItems(gem, Coal, 2).outputItems(ingot, Steel).outputItems(dustTiny, DarkAsh, 2) + .duration((int) (800 * 0.75f)).inputFluids(Creosote.getFluid(250)) + .save(provider); + INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder("steel_from_coal_dust_wrought") + .inputItems(ingot, WroughtIron) + .inputItems(dust, Coal, 2).outputItems(ingot, Steel).outputItems(dustTiny, DarkAsh, 2) + .duration((int) (800 * 0.75f)).inputFluids(Creosote.getFluid(250)) + .save(provider); + INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder("steel_from_charcoal_gem_wrought") + .inputItems(ingot, WroughtIron) + .inputItems(gem, Charcoal, 2).outputItems(ingot, Steel).outputItems(dustTiny, DarkAsh, 2) + .duration((int) (800 * 0.75f)).inputFluids(Creosote.getFluid(250)) + .save(provider); + INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder("steel_from_charcoal_dust_wrought") + .inputItems(ingot, WroughtIron) + .inputItems(dust, Charcoal, 2).outputItems(ingot, Steel).outputItems(dustTiny, DarkAsh, 2) + .duration((int) (800 * 0.75f)).inputFluids(Creosote.getFluid(250)) + .save(provider); + INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder("steel_from_coke_gem_wrought") + .inputItems(ingot, WroughtIron) + .inputItems(gem, Coke).outputItems(ingot, Steel).chancedOutput(dust, Ash, "1/9", 0) + .duration((int) (600 * 0.75f)).inputFluids(Creosote.getFluid(250)) + .save(provider); + INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder("steel_from_coke_dust_wrought") + .inputItems(ingot, WroughtIron) + .inputItems(dust, Coke).outputItems(ingot, Steel).chancedOutput(dust, Ash, "1/9", 0) + .duration((int) (600 * 0.75f)).inputFluids(Creosote.getFluid(250)) + .save(provider); + + INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder("steel_from_coal_block_wrought") + .inputItems(block, WroughtIron) + .inputItems(block, Coal, 2).outputItems(block, Steel).outputItems(dust, DarkAsh, 2) + .duration((int) (7200 * 0.75f)).inputFluids(Creosote.getFluid(2000)) + .save(provider); + INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder("steel_from_charcoal_block_wrought") + .inputItems(block, WroughtIron).inputItems(block, Charcoal, 2).outputItems(block, Steel) + .outputItems(dust, DarkAsh, 2).duration((int) (7200 * 0.75f)).inputFluids(Creosote.getFluid(2000)) + .save(provider); + INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES.recipeBuilder("steel_from_coke_block_wrought") + .inputItems(block, WroughtIron) + .inputItems(block, Coke).outputItems(block, Steel).outputItems(dust, Ash).duration((int) (5400 * 0.75f)) + .inputFluids(Creosote.getFluid(2000)) + .save(provider); + } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicRecipeTypes.java b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicRecipeTypes.java index 7bb7227bf..f27f35de2 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicRecipeTypes.java +++ b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/CosmicRecipeTypes.java @@ -1,34 +1,364 @@ package com.ghostipedia.cosmiccore.gtbridge; - +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.CosmicGuiTextures; import com.ghostipedia.cosmiccore.api.capability.recipe.SoulRecipeCapability; +import com.ghostipedia.cosmiccore.common.data.CosmicSounds; + +import com.gregtechceu.gtceu.api.block.ICoilType; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; +import com.gregtechceu.gtceu.common.data.GTSoundEntries; +import com.gregtechceu.gtceu.common.recipe.condition.DimensionCondition; +import com.gregtechceu.gtceu.utils.ResearchManager; + import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; import com.lowdragmc.lowdraglib.utils.LocalizationUtils; +import net.minecraft.client.resources.language.I18n; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; + +import static com.ghostipedia.cosmiccore.common.data.CosmicSounds.*; +import static com.gregtechceu.gtceu.common.data.GCYMRecipeTypes.ALLOY_BLAST_RECIPES; +import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.*; +import static com.lowdragmc.lowdraglib.gui.texture.ProgressTexture.FillDirection.LEFT_TO_RIGHT; + public class CosmicRecipeTypes { - public static final GTRecipeType SOUL_TESTER_RECIPES = GTRecipeTypes.register("soul_tester", GTRecipeTypes.MULTIBLOCK) + public static final GTRecipeType COSMIC_DUMMY_SPAM_YEETER = GTRecipeTypes + .register(CosmicCore.id("fuckassbeeball"), ELECTRIC) + .setMaxIOSize(54, 54, 54, 54); + + public static final GTRecipeType LAMINATOR = GTRecipeTypes + .register(CosmicCore.id("laminator"), ELECTRIC) + .setSound(CosmicSounds.LAMINATOR) + .setMaxIOSize(3, 2, 2, 0) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType DAWNFORGE_ECLIPSED = GTRecipeTypes + .register(CosmicCore.id("eclipsed_dawnforge"), ELECTRIC) + .setSound(CosmicSounds.LAMINATOR) + .setMaxIOSize(12, 1, 3, 1) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType VORAX = GTRecipeTypes + .register(CosmicCore.id("vorax"), ELECTRIC) + .setSound(CosmicSounds.VOARX) + .setMaxIOSize(1, 0, 4, 2) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType MANA_FLUIDIZER = GTRecipeTypes + .register(CosmicCore.id("mana_fluidizer"), ELECTRIC) + .setMaxIOSize(1, 1, 1, 1) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType PCB_FABRICATOR = GTRecipeTypes + .register(CosmicCore.id("pcb_fab"), ELECTRIC) + .setMaxIOSize(8, 1, 4, 0) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType TITAN_FUSION_RECIPES = GTRecipeTypes + .register(CosmicCore.id("titan_fusion"), ELECTRIC) + .setMaxIOSize(3, 3, 3, 6) + .setSound(GTSoundEntries.REPLICATOR) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType LUNAR_HAMMER = GTRecipeTypes + .register(CosmicCore.id("lunar_hammer"), ELECTRIC) + .setMaxIOSize(3, 3, 2, 2) + .setSound(GTSoundEntries.JET_ENGINE) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType CRYOGENICS_CHAMBER = GTRecipeTypes + .register(CosmicCore.id("cryo_chamber"), ELECTRIC) + .setMaxIOSize(6, 3, 3, 6) + .setSound(GTSoundEntries.JET_ENGINE) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType SOUL_TESTER_RECIPES = GTRecipeTypes + .register(CosmicCore.id("soul_tester"), GTRecipeTypes.MULTIBLOCK) .setMaxSize(IO.IN, SoulRecipeCapability.CAP, 1) .setMaxSize(IO.OUT, SoulRecipeCapability.CAP, 1) .setMaxIOSize(1, 1, 0, 0) .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); - public static final GTRecipeType GROVE_RECIPES = GTRecipeTypes.register("drygmy_grove", GTRecipeTypes.MULTIBLOCK) + /* + * public static final GTRecipeType EMBER_TESTER_RECIPES = GTRecipeTypes + * .register(CosmicCore.id("ember_tester"), GTRecipeTypes.MULTIBLOCK) + * .setMaxIOSize(1, 1, 0, 0) + * .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + */ + + public static final GTRecipeType VOID_MINER = GTRecipeTypes + .register(CosmicCore.id("void_miner"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(1, 27, 2, 0) + .setSound(MINING_MACHINE) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType HEAVY_ASSEMBLER = GTRecipeTypes + .register(CosmicCore.id("heavy_assembler"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(12, 3, 6, 0) + .setSound(HEAVY_ASSEM) + .setProgressBar(CosmicGuiTextures.PROGRESS_BAR_HEAVY, ProgressTexture.FillDirection.UP_TO_DOWN); + + public static final GTRecipeType PLASMITE_FORGE = GTRecipeTypes + .register(CosmicCore.id("plasmite_forge"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(3, 3, 3, 3) + .setSound(HEAVY_ASSEM) + .setProgressBar(CosmicGuiTextures.PROGRESS_BAR_HEAVY, ProgressTexture.FillDirection.UP_TO_DOWN); + + public static final GTRecipeType PRISMA_FOUNDRY = GTRecipeTypes + .register(CosmicCore.id("prisma_foundry"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(3, 6, 3, 0) + .setSound(MINING_MACHINE) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType ATMOSPHERE_SIPHON = GTRecipeTypes + .register(CosmicCore.id("atmo_siphon"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(3, 0, 4, 16) + .setSound(GAS_SUCC) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType MANA_DIGITIZER = GTRecipeTypes + .register(CosmicCore.id("mana_digitizer"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(1, 0, 2, 2) + .setSound(GAS_SUCC) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType COMPONENT_ASSEMBLY_LINE = GTRecipeTypes + .register(CosmicCore.id("component_assembly_line"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(16, 1, 4, 2) + .setSound(GAS_SUCC) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType GROVE_RECIPES = GTRecipeTypes.register(CosmicCore.id("drygmy_grove"), GTRecipeTypes.MULTIBLOCK) .setMaxSize(IO.IN, SoulRecipeCapability.CAP, 1) .setMaxSize(IO.OUT, SoulRecipeCapability.CAP, 1) .setMaxIOSize(2, 9, 1, 3) .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); - public static final GTRecipeType LEACHING_PLANT = GTRecipeTypes.register("leaching_plant", GTRecipeTypes.MULTIBLOCK) + + public final static GTRecipeType INDUSTRIAL_PRIMITIVE_BLAST_FURNACE_RECIPES = register(CosmicCore.id("industrial_primitive_blast_furnace"), MULTIBLOCK) + .setMaxIOSize(3, 3, 1, 0) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, LEFT_TO_RIGHT) + .setMaxTooltips(1) + .setSound(GTSoundEntries.FIRE); + public static final GTRecipeType LEACHING_PLANT = GTRecipeTypes.register(CosmicCore.id("leaching_plant"), GTRecipeTypes.MULTIBLOCK) .setMaxIOSize(3, 6, 3, 3) .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); - public static final GTRecipeType CHROMATIC_FLOTATION_PLANT = GTRecipeTypes.register("chromatic_flotation_plant", GTRecipeTypes.MULTIBLOCK) - .setMaxIOSize(3, 9, 3, 3) + + public static final GTRecipeType HELLFIRE_FOUNDRY = GTRecipeTypes + .register(CosmicCore.id("hellfire_foundry"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(5, 1, 1, 0) + .setMaxSize(IO.IN, SoulRecipeCapability.CAP, 1) + .setMaxTooltips(4) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.ALWAYS_FULL); + public static final GTRecipeType SUFFERING_CHAMBER = GTRecipeTypes + .register(CosmicCore.id("suffering_chamber"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(1, 0, 0, 0) + .setMaxSize(IO.OUT, SoulRecipeCapability.CAP, 1) + .setMaxTooltips(5) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, LEFT_TO_RIGHT); + public static final GTRecipeType ARCANE_DISTILLERY = GTRecipeTypes + .register(CosmicCore.id("arcane_distillery"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(3, 2, 3, 2) + .setMaxTooltips(4) + .setSound(CosmicSounds.ARCANE_DISTIL) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, LEFT_TO_RIGHT); + public static final GTRecipeType ARCANE_FOLDING = GTRecipeTypes + .register(CosmicCore.id("arcane_folding"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(3, 2, 1, 0) + .setMaxTooltips(4) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, LEFT_TO_RIGHT); + public static final GTRecipeType POLYMERIZER = GTRecipeTypes + .register(CosmicCore.id("polymerizer"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(3, 2, 3, 2) + .setMaxTooltips(4) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, LEFT_TO_RIGHT); + public static final GTRecipeType HEMOPHAGIC_TRANSFUSER = GTRecipeTypes + .register(CosmicCore.id("hemophagic_transfuser"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(6, 6, 3, 3) + .setMaxSize(IO.IN, SoulRecipeCapability.CAP, 1) + .setMaxTooltips(4) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.ALWAYS_FULL); + public static final GTRecipeType CHROMATIC_FLOTATION_PLANT = GTRecipeTypes + .register(CosmicCore.id("chromatic_flotation_plant"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(3, 4, 3, 3) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType ONEIRIC_SIEVE = GTRecipeTypes + .register(CosmicCore.id("oneiric_sieve"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(3, 1, 2, 2) + .setMaxSize(IO.IN, SoulRecipeCapability.CAP, 1) + .setMaxSize(IO.OUT, SoulRecipeCapability.CAP, 1) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType SPIRIT_CRUCIBLE = GTRecipeTypes + .register(CosmicCore.id("spirit_crucible"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(3, 6, 3, 0) + .setSound(ARCANE_DISTIL) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType SOUL_FOUNDRY = GTRecipeTypes + .register(CosmicCore.id("soul_foundry"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(6, 1, 3, 1) + .setSound(CosmicSounds.LAMINATOR) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType CALX_REACTOR = GTRecipeTypes + .register(CosmicCore.id("calx_reactor"), ELECTRIC) + .setMaxIOSize(2, 2, 1, 0) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType ROASTER = GTRecipeTypes + .register(CosmicCore.id("roaster"), ELECTRIC) + .setMaxIOSize(2, 3, 1, 0) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType MANA_LEACHING_TUB = GTRecipeTypes + .register(CosmicCore.id("mana_leaching_tub"), ELECTRIC) + .setMaxIOSize(1, 1, 2, 2) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType THERMOMAG = GTRecipeTypes + .register(CosmicCore.id("thermomagnitizer"), ELECTRIC) + .setMaxIOSize(3, 2, 0, 0) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType VAC_BUBBLER = GTRecipeTypes + .register(CosmicCore.id("vacuum_bubbler"), ELECTRIC) + .setMaxIOSize(2, 3, 2, 3) .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); - public static final GTRecipeType NAQUAHINE_REACTOR = GTRecipeTypes.register("naquahine_reactor", GTRecipeTypes.MULTIBLOCK) + public static final GTRecipeType LARGE_ROASTER = GTRecipeTypes + .register(CosmicCore.id("large_roaster"), ELECTRIC) + .setMaxIOSize(4, 4, 4, 4) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType VILE_FISSION = GTRecipeTypes + .register(CosmicCore.id("vile_fission"), ELECTRIC) + .setMaxIOSize(1, 1, 1, 1) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType VOID_SALT_FISSION = GTRecipeTypes + .register(CosmicCore.id("void_salt_fission"), ELECTRIC) + .setMaxIOSize(2, 3, 2, 2) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType RADBOLT_RECONSTRUCTOR = GTRecipeTypes + .register(CosmicCore.id("reconstructor"), ELECTRIC) + .setMaxIOSize(3, 2, 1, 1) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType SPOOLING_MACHINE = GTRecipeTypes + .register(CosmicCore.id("spooling_machine"), ELECTRIC) + .setMaxIOSize(2, 2, 1, 0) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType ORBITAL_FORGE_EBF = GTRecipeTypes + .register(CosmicCore.id("orbital_forge"), GTRecipeTypes.MULTIBLOCK) + .setSound(CosmicSounds.ORBITAL_FORGE) + .setHasResearchSlot(true) + .setMaxIOSize(3, 3, 3, 3) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARC_FURNACE, ProgressTexture.FillDirection.LEFT_TO_RIGHT) + .addDataInfo(data -> { + int temp = data.getInt("ebf_temp"); + return LocalizationUtils.format("gtceu.recipe.temperature", temp); + }) + .addDataInfo(data -> { + int temp = data.getInt("ebf_temp"); + ICoilType requiredCoil = ICoilType.getMinRequiredType(temp); + + if (requiredCoil != null && !requiredCoil.getMaterial().isNull()) { + return LocalizationUtils.format("gtceu.recipe.coil.tier", + I18n.get(requiredCoil.getMaterial().getUnlocalizedName())); + } + return ""; + }); + + public static final GTRecipeType ORBITAL_FORGE_ABS = GTRecipeTypes + .register(CosmicCore.id("orbital_forge_abs"), GTRecipeTypes.MULTIBLOCK) + .setSound(CosmicSounds.ORBITAL_FORGE) + .setHasResearchSlot(true) + .setMaxIOSize(9, 3, 3, 3) + .setProgressBar(GuiTextures.PROGRESS_BAR_COKE_OVEN, ProgressTexture.FillDirection.LEFT_TO_RIGHT) + .addDataInfo(data -> { + int temp = data.getInt("ebf_temp"); + return LocalizationUtils.format("gtceu.recipe.temperature", temp); + }) + .addDataInfo(data -> { + int temp = data.getInt("ebf_temp"); + ICoilType requiredCoil = ICoilType.getMinRequiredType(temp); + + if (requiredCoil != null && !requiredCoil.getMaterial().isNull()) { + return LocalizationUtils.format("gtceu.recipe.coil.tier", + I18n.get(requiredCoil.getMaterial().getUnlocalizedName())); + } + return ""; + }); + public static final GTRecipeType DAWN_FORGE = GTRecipeTypes.register(CosmicCore.id("dawn_forge"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(8, 1, 2, 0) + .setSound(DAWN_FORGE_SFX) + .setMaxTooltips(5) + .setProgressBar(CosmicGuiTextures.DAWN_FORGE, ProgressTexture.FillDirection.ALWAYS_FULL); + + public static final GTRecipeType CINDER_HEARTH = GTRecipeTypes + .register(CosmicCore.id("cinder_hearth"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(3, 0, 3, 3) + .setMaxSize(IO.IN, SoulRecipeCapability.CAP, 1) + .setSound(DAWN_FORGE_SFX) + .setMaxTooltips(7) + .setProgressBar(GuiTextures.PROGRESS_BAR_BOILER_HEAT, ProgressTexture.FillDirection.DOWN_TO_UP); + + public static final GTRecipeType ARCANE_CRUCIBLE = GTRecipeTypes + .register(CosmicCore.id("arcane_crucible"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(6, 4, 3, 3) + .setMaxSize(IO.IN, SoulRecipeCapability.CAP, 1) + .setSound(DAWN_FORGE_SFX) + .setMaxTooltips(7) + .setProgressBar(GuiTextures.PROGRESS_BAR_MASS_FAB, LEFT_TO_RIGHT); + + public static final GTRecipeType PYROTHERMIC_REFINERY = GTRecipeTypes + .register(CosmicCore.id("pyrothermic_refinery"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(3, 3, 3, 3) + .setMaxSize(IO.IN, SoulRecipeCapability.CAP, 1) + .setSound(GTSoundEntries.JET_ENGINE) + .setMaxTooltips(3) + .setProgressBar(GuiTextures.PROGRESS_BAR_MASS_FAB, LEFT_TO_RIGHT); + + public static final GTRecipeType MANA_ETCHING_FACTORY = GTRecipeTypes + .register(CosmicCore.id("mana_etching"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(3, 2, 3, 0) + .setSound(DAWN_FORGE_SFX) + .setMaxTooltips(5) + .setProgressBar(GuiTextures.PROGRESS_BAR_CRYSTALLIZATION, LEFT_TO_RIGHT); + public static final GTRecipeType BIO_LAB = GTRecipeTypes.register(CosmicCore.id("bio_lab"), ELECTRIC) + .setMaxIOSize(6, 2, 3, 2) + .setSound(DAWN_FORGE_SFX) + .setMaxTooltips(5) + .setProgressBar(GuiTextures.PROGRESS_BAR_CRYSTALLIZATION, LEFT_TO_RIGHT); + + public static final GTRecipeType STAR_LADDER_RESEARCH = GTRecipeTypes + .register(CosmicCore.id("star_ladder_research"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(16, 16, 16, 16) + // .setSound(CosmicSounds.BLACK_HOLE_CRY) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType STELLAR_IRIS = GTRecipeTypes.register(CosmicCore.id("stellar_iris"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(16, 16, 16, 16) + // .setSound(CosmicSounds.BLACK_HOLE_CRY) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + // Stellar Iris Module Recipe Types + public static final GTRecipeType STELLAR_SMELTING = GTRecipeTypes + .register(CosmicCore.id("ignition_complex"), GTRecipeTypes.MULTIBLOCK) + .setSound(GAS_SUCC) + .setMaxIOSize(9, 9, 3, 3) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType CHROMATIC_DISTILLATION_PLANT = GTRecipeTypes + .register(CosmicCore.id("chormatic_distillation_plant"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(1, 1, 1, 16) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType CELESTIAL_BORE = GTRecipeTypes.register(CosmicCore.id("celestial_bore"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(1, 54, 3, 18) + .setSound(CosmicSounds.LAMINATOR) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType NAQUAHINE_REACTOR = GTRecipeTypes + .register(CosmicCore.id("naquahine_reactor"), GTRecipeTypes.MULTIBLOCK) .addDataInfo(data -> { int minStrength = data.getInt("min_field"); return LocalizationUtils.format("cosmiccore.recipe.minField", minStrength); @@ -41,9 +371,199 @@ public class CosmicRecipeTypes { return LocalizationUtils.format("cosmiccore.recipe.fieldDecay", decayRate); }) .setMaxIOSize(1, 0, 1, 0) + .setSound(GTSoundEntries.ARC) .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType MINI_NAQUAHINE_REACTOR = GTRecipeTypes + .register(CosmicCore.id("mini_naquahine_reactor"), GTRecipeTypes.GENERATOR) + .setMaxIOSize(1, 0, 1, 0) + .setSound(GTSoundEntries.ARC) + .setProgressBar(GuiTextures.PROGRESS_BAR_GAS_COLLECTOR, ProgressTexture.FillDirection.DOWN_TO_UP); + public static final GTRecipeType INDUSTRIAL_CHEMVAT = GTRecipeTypes + .register(CosmicCore.id("industrial_chemvat"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(6, 6, 6, 6) + .setHasResearchSlot(true) + .setSound(CHEMVAT) + .setMaxTooltips(5) + .onRecipeBuild(ResearchManager::createDefaultResearchRecipe) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + public static final GTRecipeType BIOVAT = GTRecipeTypes + .register(CosmicCore.id("biovat"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(6, 6, 3, 3) + .setHasResearchSlot(true) + .setSound(GTSoundEntries.CHEMICAL) + .setMaxTooltips(6) + .onRecipeBuild(ResearchManager::createDefaultResearchRecipe) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType WASP_RECIPES = GTRecipeTypes + .register(CosmicCore.id("wasp"), GTRecipeTypes.MULTIBLOCK) + .addDataInfo(data -> LocalizationUtils.format("cosmiccore.recipe.asteroid_weight_greater_1")) + .setMaxIOSize(2, 15, 3, 5) + .setMaxTooltips(4) + .setProgressBar(GuiTextures.PROGRESS_BAR_SIFT, ProgressTexture.FillDirection.UP_TO_DOWN); + // Dummy recipe. Maybe add recipes here? Either way it won't be used for recipe searching, that's taken care of by + // BeeRecipeLogic + public static final GTRecipeType BEES = GTRecipeTypes + .register(CosmicCore.id("bees"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(1, 9, 0, 0) + .setMaxTooltips(6) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + /* + * TODO: Multiblocks that might not need a RecipeType or might use it to do really weird things + * RIFTGENERATOR + * PENROSE STUFF + * LOCAL DYSON + */ + // Todo - Custom JEI page / Custom Heating Logic, Custom Slag Generation Logic, THE WHOLE FUCKING PIPENET PROPERTY + // DEDICATED TO SUPERMOLTEN SLAG [FEAR] + public static final GTRecipeType VOMAHINE_CORE_DRILL = GTRecipeTypes + .register(CosmicCore.id("core_drill"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(3, 6, 3, 6) + .setHasResearchSlot(true) + .setSound(GTSoundEntries.REPLICATOR) // TODO - Sounds, VFX + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + // Todo - Custom JEI page + public static final GTRecipeType REGOLITH_SIFTER = GTRecipeTypes + .register(CosmicCore.id("regolith_sifter"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(0, 6, 2, 0) + .setHasResearchSlot(true) + .setSound(GTSoundEntries.REPLICATOR) // TODO - Sounds + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + /* + * TODO: Soul Folding with LifeEssence lets you create your first potential which is your first source of + * L.Infinity. Later soul folding/forging allows for unique machine augmentations. + */ + public static final GTRecipeType LIFE_FORCE_MANIPULATOR = GTRecipeTypes + .register(CosmicCore.id("life_force_manipulator"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(2, 3, 6, 6) + .setHasResearchSlot(true) + .setSound(GTSoundEntries.REPLICATOR) // TODO - Sounds + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + /* + * TODO: Neutron Forge Pressure/Heat Buildup Mechanic, feeding it astronomically large amounts of plasma allow it to + * unlock 'COSMIC PARALLELS' - Which Allow MULTIPLE UNIQUE RECIPES to run at once. + */ + public static final GTRecipeType NEUTRON_FORGE = GTRecipeTypes.register(CosmicCore.id("neutron_forge"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(12, 12, 12, 12) + .setHasResearchSlot(true) + .setSound(GTSoundEntries.REPLICATOR) // TODO - Sounds + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + public static final GTRecipeType MULTITHREADED_PROCESSOR = GTRecipeTypes + .register(CosmicCore.id("dream_basin"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(9, 9, 9, 9) + .setSound(GTSoundEntries.ASSEMBLER) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + /* + * TODO - Allow This block to replace the Master Ritual stone, and then set the structure shape based on the ritual + */ + public static final GTRecipeType MECHANICAL_RITUAL = GTRecipeTypes + .register(CosmicCore.id("mechanical_ritual"), GTRecipeTypes.MULTIBLOCK) + .setMaxIOSize(4, 4, 4, 4) // TODO - Figure out what's the optimal outputs + .setHasResearchSlot(true) + .setSound(GTSoundEntries.CHEMICAL) // TODO - Sounds + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + /* + * TODO - Go Find all the info about the actual Concept Incinerator, That's so much lore to dig through but I don't + * remember if this also erases the concept out of peoples memories as well as all traces of an idea. + * This Thing is meant to allow the deconstruction of concepts into laws, and laws are meant to be dissolved with + * their counterparts. Every Hebrew Letter needs a Pairing Counterlaw. + */ + // public static final GTRecipeType CONCEPT_INCINERATOR = GTRecipeTypes + // .register(CosmicCore.id("concept_incinerator"), GTRecipeTypes.MULTIBLOCK) + // .setMaxIOSize(4, 4, 4, 4) + // .setHasResearchSlot(true) + // .setSound(GTSoundEntries.CHEMICAL) // TODO - Sounds + // .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + /* + * TODO + * Retcon Hashers allow the player to target potential sequence breaks in the already established environment + * Every sequence break is recorded to a teams data and should be semi-random with mandatory breaks needed for + * progression + */ + // public static final GTRecipeType RETCON_HASHER = GTRecipeTypes.register(CosmicCore.id("retcon_hasher"), + // GTRecipeTypes.MULTIBLOCK) + // .setMaxIOSize(4, 4, 4, 4) + // .setHasResearchSlot(true) + // .setSound(GTSoundEntries.CHEMICAL) // TODO - Sounds + // .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW_MULTIPLE, ProgressTexture.FillDirection.LEFT_TO_RIGHT); + + // Link Test Station recipe type for testing cross-dimensional linking + public static final GTRecipeType LINK_TEST_RECIPES = GTRecipeTypes + .register(CosmicCore.id("link_test"), ELECTRIC) + .setMaxIOSize(2, 2, 0, 0) + .setSound(GTSoundEntries.ASSEMBLER) + .setProgressBar(GuiTextures.PROGRESS_BAR_ARROW, ProgressTexture.FillDirection.LEFT_TO_RIGHT); public static void init() { + LASER_ENGRAVER_RECIPES.setMaxIOSize(2, 2, 1, 1); + // Oh my God + MIXER_RECIPES.setMaxTooltips(4); + BREWING_RECIPES.setMaxTooltips(4); + FERMENTING_RECIPES.setMaxTooltips(4); + DISTILLERY_RECIPES.setMaxTooltips(4); + AUTOCLAVE_RECIPES.setMaxTooltips(4); + FLUID_HEATER_RECIPES.setMaxTooltips(4); + CRACKING_RECIPES.setMaxIOSize(2, 2, 2, 2); + CHEMICAL_RECIPES.onRecipeBuild((builder, provider) -> { + LARGE_CHEMICAL_RECIPES.copyFrom(builder) + .save(provider); + INDUSTRIAL_CHEMVAT.copyFrom(builder) + .save(provider); + }); + LARGE_CHEMICAL_RECIPES.onRecipeBuild((builder, provider) -> { + INDUSTRIAL_CHEMVAT.copyFrom(builder) + .save(provider); + }); + + // Eclipsed Forge is the big EU powered version of the Dawn Forge + DAWN_FORGE.onRecipeBuild((builder, provider) -> { + DAWNFORGE_ECLIPSED.copyFrom(builder) + .save(provider); + }); + // Large Roaster can do all the small Roaster can, but also allows Ember :) + ROASTER.onRecipeBuild((builder, provider) -> { + LARGE_ROASTER.copyFrom(builder) + .save(provider); + }); + + BLAST_RECIPES.onRecipeBuild((builder, provider) -> { + var orbitBuilderEBF = ORBITAL_FORGE_EBF.copyFrom(builder); + // Orbital Forge ONLY copies Standard EBF recipes, if an EBF recipe contains a dimension condition, it is + // assumed it can't be done in space + if (!builder.conditions.isEmpty() && + builder.conditions.stream().anyMatch(cond -> cond instanceof DimensionCondition)) { + // Do Nothing if the recipe Contains a Dimension + } else { + // If It Doesn't have a Dimension, add the recipe and give it an dimension req of 'Sun Orbit' + orbitBuilderEBF + .addCondition(new DimensionCondition( + ResourceKey.create(Registries.DIMENSION, ResourceLocation.parse("frontiers:sun_orbit")))) + .save(provider); + } + }); + + // BLAST_RECIPES.onRecipeBuild((builder, provider) -> { + // STELLAR_SMELTING.copyFrom(builder) + // .save(provider); + // }); + + ALLOY_BLAST_RECIPES.onRecipeBuild((builder, provider) -> { + var orbitBuilderABS = ORBITAL_FORGE_ABS.copyFrom(builder); + // Orbital Forge ONLY copies Standard ABS recipes, if an ABS recipe contains a dimension condition, it is + // assumed it can't be done in space + if (!builder.conditions.isEmpty() && + builder.conditions.stream().anyMatch(cond -> cond instanceof DimensionCondition)) { + // Do Nothing if the recipe Contains a Dimension + } else { + // If It Doesn't have a Dimension, add the recipe and give it an dimension req of 'Sun Orbit' + orbitBuilderABS + .addCondition(new DimensionCondition( + ResourceKey.create(Registries.DIMENSION, ResourceLocation.parse("frontiers:sun_orbit")))) + .save(provider); + } + }); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/CodecRecipeEditor.java b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/CodecRecipeEditor.java new file mode 100644 index 000000000..c1c7d5cf0 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/CodecRecipeEditor.java @@ -0,0 +1,230 @@ +package com.ghostipedia.cosmiccore.gtbridge.recipemaker; + +import com.ghostipedia.cosmiccore.gtbridge.recipemaker.RecipeCodecReader.JsonField; + +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; + +import com.lowdragmc.lowdraglib.gui.texture.ColorRectTexture; +import com.lowdragmc.lowdraglib.gui.widget.DraggableScrollableWidgetGroup; +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.SelectorWidget; +import com.lowdragmc.lowdraglib.gui.widget.TextFieldWidget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.capability.templates.FluidTank; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +/** + * Generic editor for any recipe type that has no hand-built or GregTech editor. It treats a sampled recipe (from + * {@link RecipeCodecReader}) as a TEMPLATE: numeric/string fields are pre-filled and editable, item/fluid fields + * get phantom slots (left empty = keep the template's value, filled = override). Export rebuilds the recipe JSON + * from the template plus the user's overrides and emits {@code event.custom({...})}, which is valid KubeJS for any + * type. Runs identically on both sides (codec data is available on each), so no syncing is needed. + */ +public final class CodecRecipeEditor { + + private static final int TANK_CAPACITY = 64_000; + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + + private CodecRecipeEditor() {} + + public static void build(WidgetGroup editor, Player player, String typeId) { + ResourceLocation rl = ResourceLocation.tryParse(typeId); + List fields = rl == null ? List.of() : RecipeCodecReader.fields(player, rl); + JsonObject sample = rl == null ? null : RecipeCodecReader.sample(player, rl); + + editor.addWidget(new LabelWidget(0, 0, shortName(typeId))); + if (fields.isEmpty() || sample == null) { + editor.addWidget(new LabelWidget(0, 14, "no sample recipe")); + editor.addWidget(new LabelWidget(0, 24, "(can't auto-build)")); + return; + } + + String[] recipeId = { "" }; + editor.addWidget(new LabelWidget(0, 12, "id")); + editor.addWidget(new TextFieldWidget(16, 11, 106, 12, () -> recipeId[0], s -> recipeId[0] = s)); + + Map itemState = new LinkedHashMap<>(); + Map fluidState = new LinkedHashMap<>(); + Map valueState = new LinkedHashMap<>(); + + DraggableScrollableWidgetGroup body = new DraggableScrollableWidgetGroup(0, 26, 128, 162); + body.setBackground(new ColorRectTexture(0x40000000)); + int y = 2; + for (JsonField field : fields) { + String label = field.output() ? field.name() + " (out)" : field.name(); + Kind ui = uiKind(field); + switch (ui) { + case ITEM -> { + int slots = field.kind() == RecipeCodecReader.Kind.LIST ? listSlots(field) : 1; + CustomItemStackHandler handler = new CustomItemStackHandler(slots); + itemState.put(field.name(), handler); + body.addWidget(new LabelWidget(2, y, label)); + for (int i = 0; i < slots; i++) { + body.addWidget(new ConfigurableItemSlot(handler, i, 2 + (i % 6) * 18, y + 10 + (i / 6) * 18)); + } + y += 12 + ((slots + 5) / 6) * 18; + } + case FLUID -> { + int slots = field.kind() == RecipeCodecReader.Kind.LIST ? listSlots(field) : 1; + FluidTank[] tanks = new FluidTank[slots]; + for (int i = 0; i < slots; i++) tanks[i] = new FluidTank(TANK_CAPACITY); + fluidState.put(field.name(), tanks); + body.addWidget(new LabelWidget(2, y, label)); + for (int i = 0; i < slots; i++) { + body.addWidget(new ConfigurableFluidSlot(tanks[i], 2 + (i % 6) * 18, y + 10 + (i / 6) * 18)); + } + y += 12 + ((slots + 5) / 6) * 18; + } + case BOOLEAN -> { + String[] value = { sample.has(field.name()) ? sample.get(field.name()).getAsString() : "false" }; + valueState.put(field.name(), value); + body.addWidget(new LabelWidget(2, y, label)); + body.addWidget(new SelectorWidget(52, y, 70, 12, List.of("false", "true"), 0) + .setOnChanged(v -> value[0] = v).setSupplier(() -> value[0])); + y += 16; + } + case FIELD -> { + String[] value = { sample.has(field.name()) ? sample.get(field.name()).getAsString() : "" }; + valueState.put(field.name(), value); + body.addWidget(new LabelWidget(2, y, label)); + body.addWidget(new TextFieldWidget(52, y, 70, 12, () -> value[0], s -> value[0] = s)); + y += 16; + } + default -> { + body.addWidget(new LabelWidget(2, y, label + " (kept)")); + y += 12; + } + } + } + editor.addWidget(body); + editor.addWidget(new ExportButtonWidget(0, 192, 120, 16, GuiTextures.VANILLA_BUTTON, + () -> export(typeId, recipeId, sample, fields, itemState, fluidState, valueState))); + editor.addWidget(new LabelWidget(34, 196, "Copy KubeJS")); + } + + private static String export(String typeId, String[] recipeId, JsonObject sample, List fields, + Map itemState, + Map fluidState, Map valueState) { + JsonObject out = sample.deepCopy(); + out.addProperty("type", typeId); + for (JsonField field : fields) { + String name = field.name(); + switch (uiKind(field)) { + case ITEM -> { + CustomItemStackHandler handler = itemState.get(name); + JsonElement shape = elementShape(sample.get(name)); + if (field.kind() == RecipeCodecReader.Kind.LIST) { + JsonArray array = new JsonArray(); + for (int i = 0; i < handler.getSlots(); i++) { + ItemStack stack = handler.getStackInSlot(i); + if (!stack.isEmpty()) array.add(itemToJson(shape, stack)); + } + if (!array.isEmpty()) out.add(name, array); + } else { + ItemStack stack = handler.getStackInSlot(0); + if (!stack.isEmpty()) out.add(name, itemToJson(shape, stack)); + } + } + case FLUID -> { + FluidTank[] tanks = fluidState.get(name); + JsonElement shape = elementShape(sample.get(name)); + if (field.kind() == RecipeCodecReader.Kind.LIST) { + JsonArray array = new JsonArray(); + for (FluidTank tank : tanks) { + if (!tank.getFluid().isEmpty()) array.add(fluidToJson(shape, tank.getFluid())); + } + if (!array.isEmpty()) out.add(name, array); + } else if (!tanks[0].getFluid().isEmpty()) { + out.add(name, fluidToJson(shape, tanks[0].getFluid())); + } + } + case BOOLEAN -> out.addProperty(name, "true".equals(valueState.get(name)[0])); + case FIELD -> { + String text = valueState.get(name)[0].trim(); + if (text.isEmpty()) break; + if (field.kind() == RecipeCodecReader.Kind.NUMBER) { + if (text.contains(".")) out.addProperty(name, Double.parseDouble(text)); + else out.addProperty(name, Long.parseLong(text)); + } else { + out.addProperty(name, text); + } + } + default -> { } + } + } + String result = "event.custom(" + GSON.toJson(out) + ")"; + if (!recipeId[0].isBlank()) result += ".id('" + recipeId[0].trim() + "')"; + return result; + } + + private enum Kind { ITEM, FLUID, BOOLEAN, FIELD, KEEP } + + private static Kind uiKind(JsonField field) { + RecipeCodecReader.Kind k = field.kind() == RecipeCodecReader.Kind.LIST ? field.elementKind() : field.kind(); + return switch (k) { + case ITEM -> Kind.ITEM; + case FLUID -> Kind.FLUID; + case BOOLEAN -> Kind.BOOLEAN; + case NUMBER, STRING -> field.kind() == RecipeCodecReader.Kind.LIST ? Kind.KEEP : Kind.FIELD; + default -> Kind.KEEP; + }; + } + + private static int listSlots(JsonField field) { + return Math.min(64, Math.max(4, field.listMax() + 4)); + } + + private static JsonElement elementShape(JsonElement sampleValue) { + if (sampleValue != null && sampleValue.isJsonArray() && !sampleValue.getAsJsonArray().isEmpty()) { + return sampleValue.getAsJsonArray().get(0); + } + return sampleValue; + } + + private static JsonElement itemToJson(JsonElement shape, ItemStack stack) { + String id = BuiltInRegistries.ITEM.getKey(stack.getItem()).toString(); + if (shape != null && shape.isJsonObject()) { + JsonObject object = shape.getAsJsonObject().deepCopy(); + if (object.has("id")) object.addProperty("id", id); + else object.addProperty("item", id); + if (object.has("count")) object.addProperty("count", stack.getCount()); + return object; + } + if (shape != null && shape.isJsonPrimitive()) { + return new com.google.gson.JsonPrimitive(id); + } + JsonObject object = new JsonObject(); + object.addProperty("item", id); + if (stack.getCount() > 1) object.addProperty("count", stack.getCount()); + return object; + } + + private static JsonElement fluidToJson(JsonElement shape, FluidStack stack) { + String id = BuiltInRegistries.FLUID.getKey(stack.getFluid()).toString(); + JsonObject object = shape != null && shape.isJsonObject() ? shape.getAsJsonObject().deepCopy() : new JsonObject(); + object.addProperty("fluid", id); + object.addProperty("amount", stack.getAmount()); + return object; + } + + private static String shortName(String typeId) { + int colon = typeId.indexOf(':'); + return colon < 0 ? typeId : typeId.substring(colon + 1); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/ConfigurableFluidSlot.java b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/ConfigurableFluidSlot.java new file mode 100644 index 000000000..3da10c225 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/ConfigurableFluidSlot.java @@ -0,0 +1,96 @@ +package com.ghostipedia.cosmiccore.gtbridge.recipemaker; + +import com.gregtechceu.gtceu.api.gui.GuiTextures; + +import com.lowdragmc.lowdraglib.gui.widget.PhantomFluidWidget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.capability.templates.FluidTank; + +/** + * A phantom fluid slot for the recipe-maker. Clicking with a fluid container on the cursor sets the ghost fluid + * (parent behaviour); with an empty cursor, left/right-click steps the amount by 250mB (clearing at zero) and + * shift-click cycles through common amounts. Middle-click opens the per-slot options popout. Changes are applied + * server-side via the client-action channel. + */ +public class ConfigurableFluidSlot extends PhantomFluidWidget { + + private static final int ADJUST = 100; + private static final int CYCLE = 101; + private static final int CONFIGURE = 102; + private static final int STEP = 250; + private static final int[] PRESETS = { 250, 500, 1000, 2000, 4000, 8000, 16000, 32000 }; + + private final FluidTank tank; + private Runnable onConfigure; + + public ConfigurableFluidSlot(FluidTank tank, int x, int y) { + super(tank, 0, x, y, 18, 18, tank::getFluid, tank::setFluid); + this.tank = tank; + setBackground(GuiTextures.FLUID_SLOT); + } + + public ConfigurableFluidSlot setOnConfigure(Runnable onConfigure) { + this.onConfigure = onConfigure; + return this; + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (isMouseOverElement(mouseX, mouseY)) { + if (onConfigure != null && button == 2) { + writeClientAction(CONFIGURE, buffer -> {}); + onConfigure.run(); + return true; + } + if (Minecraft.getInstance().player.containerMenu.getCarried().isEmpty() && !getLastFluidInTank().isEmpty()) { + if (Screen.hasShiftDown()) { + writeClientAction(CYCLE, buffer -> {}); + return true; + } + if (button == 0) { + writeClientAction(ADJUST, buffer -> buffer.writeBoolean(true)); + return true; + } + if (button == 1) { + writeClientAction(ADJUST, buffer -> buffer.writeBoolean(false)); + return true; + } + } + } + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + public void handleClientAction(int id, RegistryFriendlyByteBuf buffer) { + FluidStack fluid = tank.getFluid(); + if (id == ADJUST && !fluid.isEmpty()) { + setAmount(fluid, fluid.getAmount() + (buffer.readBoolean() ? STEP : -STEP)); + } else if (id == CYCLE && !fluid.isEmpty()) { + setAmount(fluid, nextPreset(fluid.getAmount())); + } else if (id == CONFIGURE) { + if (onConfigure != null) onConfigure.run(); + } else { + super.handleClientAction(id, buffer); + } + } + + private void setAmount(FluidStack fluid, int amount) { + if (amount <= 0) { + tank.setFluid(FluidStack.EMPTY); + } else { + fluid.setAmount(Math.min(amount, tank.getCapacity())); + tank.setFluid(fluid); + } + } + + private static int nextPreset(int current) { + for (int preset : PRESETS) { + if (preset > current) return preset; + } + return PRESETS[0]; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/ConfigurableItemSlot.java b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/ConfigurableItemSlot.java new file mode 100644 index 000000000..b7ba1214f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/ConfigurableItemSlot.java @@ -0,0 +1,99 @@ +package com.ghostipedia.cosmiccore.gtbridge.recipemaker; + +import com.gregtechceu.gtceu.api.gui.GuiTextures; + +import com.lowdragmc.lowdraglib.gui.widget.PhantomSlotWidget; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.RegistryFriendlyByteBuf; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.items.IItemHandlerModifiable; + +/** + * A phantom item slot for the recipe-maker. Clicking with something on the cursor sets the ghost item (parent + * behaviour); with an empty cursor, left/right-click adjusts the stack count by one (clearing at zero) and + * middle-click cycles through common counts. Shift-click opens the per-slot options popout (chance/boost for + * outputs, not-consumed for inputs). All changes are applied server-side via the client-action channel. + */ +public class ConfigurableItemSlot extends PhantomSlotWidget { + + private static final int ADJUST = 100; + private static final int CYCLE = 101; + private static final int CONFIGURE = 102; + private static final int[] PRESETS = { 1, 2, 4, 8, 16, 32, 64 }; + + private final IItemHandlerModifiable handler; + private final int index; + private Runnable onConfigure; + + public ConfigurableItemSlot(IItemHandlerModifiable handler, int index, int x, int y) { + super(handler, index, x, y); + this.handler = handler; + this.index = index; + setClearSlotOnRightClick(false); + setBackgroundTexture(GuiTextures.SLOT); + } + + public ConfigurableItemSlot setOnConfigure(Runnable onConfigure) { + this.onConfigure = onConfigure; + return this; + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (isMouseOverElement(mouseX, mouseY)) { + if (onConfigure != null && button == 2) { //MMB for configs - SHIFT+CLICK for other bullshit that isn't configs man. + writeClientAction(CONFIGURE, buffer -> {}); + onConfigure.run(); + return true; + } + if (Minecraft.getInstance().player.containerMenu.getCarried().isEmpty() + && !handler.getStackInSlot(index).isEmpty()) { + if (Screen.hasShiftDown()) { + writeClientAction(CYCLE, buffer -> {}); + return true; + } + if (button == 0) { + writeClientAction(ADJUST, buffer -> buffer.writeBoolean(true)); + return true; + } + if (button == 1) { + writeClientAction(ADJUST, buffer -> buffer.writeBoolean(false)); + return true; + } + } + } + return super.mouseClicked(mouseX, mouseY, button); + } + + @Override + public void handleClientAction(int id, RegistryFriendlyByteBuf buffer) { + ItemStack stack = handler.getStackInSlot(index); + if (id == ADJUST && !stack.isEmpty()) { + setCount(stack, stack.getCount() + (buffer.readBoolean() ? 1 : -1)); + } else if (id == CYCLE && !stack.isEmpty()) { + setCount(stack, nextPreset(stack.getCount())); + } else if (id == CONFIGURE) { + if (onConfigure != null) onConfigure.run(); + } else { + super.handleClientAction(id, buffer); + } + } + + private void setCount(ItemStack stack, int count) { + if (count <= 0) { + handler.setStackInSlot(index, ItemStack.EMPTY); + } else { + stack.setCount(count); + handler.setStackInSlot(index, stack); + } + } + + private static int nextPreset(int current) { + for (int preset : PRESETS) { + if (preset > current) return preset; + } + return PRESETS[0]; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/CraftingRecipeEditor.java b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/CraftingRecipeEditor.java new file mode 100644 index 000000000..daaa89c16 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/CraftingRecipeEditor.java @@ -0,0 +1,124 @@ +package com.ghostipedia.cosmiccore.gtbridge.recipemaker; + +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; + +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.SelectorWidget; +import com.lowdragmc.lowdraglib.gui.widget.TextFieldWidget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.item.ItemStack; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.StringJoiner; + +/** + * Hand-built editor for vanilla 3x3 crafting (shaped + shapeless) - the default view of the Recipe Forge. Shaped + * recipes are trimmed to their bounding box and compiled to a pattern + key map; shapeless just lists the + * ingredients. Exports KubeJS event.shaped / event.shapeless. + */ +public final class CraftingRecipeEditor { + + private CraftingRecipeEditor() {} + + public static void build(WidgetGroup editor) { + CustomItemStackHandler grid = new CustomItemStackHandler(9); + CustomItemStackHandler output = new CustomItemStackHandler(1); + boolean[] shapeless = { false }; + String[] recipeId = { "" }; + + editor.addWidget(new LabelWidget(0, 0, "Crafting")); + editor.addWidget(new LabelWidget(0, 11, "id")); + editor.addWidget(new TextFieldWidget(16, 10, 106, 12, () -> recipeId[0], s -> recipeId[0] = s)); + for (int i = 0; i < 9; i++) { + editor.addWidget(new ConfigurableItemSlot(grid, i, (i % 3) * 18, 28 + (i / 3) * 18)); + } + editor.addWidget(new LabelWidget(60, 50, "->")); + editor.addWidget(new ConfigurableItemSlot(output, 0, 74, 46)); + + editor.addWidget(new LabelWidget(0, 94, "Mode")); + editor.addWidget(new SelectorWidget(34, 92, 84, 14, List.of("shaped", "shapeless"), 0) + .setOnChanged(name -> shapeless[0] = name.equals("shapeless")) + .setSupplier(() -> shapeless[0] ? "shapeless" : "shaped")); + + editor.addWidget(new ExportButtonWidget(0, 192, 120, 16, GuiTextures.VANILLA_BUTTON, + () -> export(grid, output, shapeless[0], recipeId[0]))); + editor.addWidget(new LabelWidget(34, 196, "Copy KubeJS")); + } + + private static String export(CustomItemStackHandler grid, CustomItemStackHandler output, boolean shapeless, + String recipeId) { + ItemStack out = output.getStackInSlot(0); + if (out.isEmpty()) return "// set a crafting output"; + String result = itemString(out); + String recipe = shapeless ? shapeless(grid, result) : shaped(grid, result); + if (recipe.startsWith("//")) return recipe; + if (!recipeId.isBlank()) recipe += ".id('" + recipeId.trim() + "')"; + return recipe; + } + + private static String shapeless(CustomItemStackHandler grid, String result) { + StringJoiner inputs = new StringJoiner(", "); + for (int i = 0; i < 9; i++) { + ItemStack stack = grid.getStackInSlot(i); + if (!stack.isEmpty()) inputs.add(itemString(stack)); + } + if (inputs.length() == 0) return "// add ingredients"; + return "event.shapeless(" + result + ", [" + inputs + "])"; + } + + private static String shaped(CustomItemStackHandler grid, String result) { + int minRow = 3; + int maxRow = -1; + int minCol = 3; + int maxCol = -1; + for (int i = 0; i < 9; i++) { + if (grid.getStackInSlot(i).isEmpty()) continue; + minRow = Math.min(minRow, i / 3); + maxRow = Math.max(maxRow, i / 3); + minCol = Math.min(minCol, i % 3); + maxCol = Math.max(maxCol, i % 3); + } + if (maxRow < 0) return "// add ingredients"; + + Map keyMap = new LinkedHashMap<>(); + char next = 'A'; + List rows = new ArrayList<>(); + for (int r = minRow; r <= maxRow; r++) { + StringBuilder row = new StringBuilder(); + for (int c = minCol; c <= maxCol; c++) { + ItemStack stack = grid.getStackInSlot(r * 3 + c); + if (stack.isEmpty()) { + row.append(' '); + continue; + } + String id = BuiltInRegistries.ITEM.getKey(stack.getItem()).toString(); + Character ch = keyMap.get(id); + if (ch == null) { + ch = next++; + keyMap.put(id, ch); + } + row.append(ch.charValue()); + } + rows.add(row.toString()); + } + + StringJoiner pattern = new StringJoiner("', '", "'", "'"); + for (String row : rows) pattern.add(row); + StringJoiner key = new StringJoiner(", "); + for (Map.Entry entry : keyMap.entrySet()) { + key.add(entry.getValue() + ": '" + entry.getKey() + "'"); + } + return "event.shaped(" + result + ", [" + pattern + "], {" + key + "})"; + } + + private static String itemString(ItemStack stack) { + var id = BuiltInRegistries.ITEM.getKey(stack.getItem()); + return stack.getCount() > 1 ? "'" + stack.getCount() + "x " + id + "'" : "'" + id + "'"; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/ExportButtonWidget.java b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/ExportButtonWidget.java new file mode 100644 index 000000000..c45e05915 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/ExportButtonWidget.java @@ -0,0 +1,33 @@ +package com.ghostipedia.cosmiccore.gtbridge.recipemaker; + +import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; +import com.lowdragmc.lowdraglib.gui.widget.ButtonWidget; + +import net.minecraft.client.Minecraft; +import net.minecraft.network.RegistryFriendlyByteBuf; + +import java.util.function.Supplier; + +/** + * Export button for the recipe-maker. The press runs server-side (where the slot/field state lives), builds the + * KubeJS line, and ships it to the client via LDLib's widget update channel; {@link #readUpdateInfo} then runs + * client-side and drops it on the clipboard. Avoids needing a bespoke network payload for a client-only action. + */ +public class ExportButtonWidget extends ButtonWidget { + + private static final int CLIPBOARD = 1; + + public ExportButtonWidget(int x, int y, int width, int height, IGuiTexture texture, Supplier exporter) { + super(x, y, width, height, texture, null); + setOnPressCallback(data -> writeUpdateInfo(CLIPBOARD, buffer -> buffer.writeUtf(exporter.get()))); + } + + @Override + public void readUpdateInfo(int id, RegistryFriendlyByteBuf buffer) { + if (id == CLIPBOARD) { + Minecraft.getInstance().keyboardHandler.setClipboard(buffer.readUtf()); + } else { + super.readUpdateInfo(id, buffer); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/KubeJsRecipeExporter.java b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/KubeJsRecipeExporter.java new file mode 100644 index 000000000..4c90614c3 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/KubeJsRecipeExporter.java @@ -0,0 +1,112 @@ +package com.ghostipedia.cosmiccore.gtbridge.recipemaker; + +import com.gregtechceu.gtceu.api.GTValues; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.fluids.FluidStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.StringJoiner; + +/** + * Turns a {@link RecipeDraft} into a single GTCEu KubeJS recipe-event line that can be pasted into a server + * script. Output shape: {@code event.recipes..('id').itemInputs(...).itemOutputs(...) + * .inputFluids(...).outputFluids(...).chancedOutput(...).EUt(v, a).duration(t)}. The recipe-type id directly + * names the KubeJS accessor, since GTCEu registers a recipe schema per type id. + */ +public final class KubeJsRecipeExporter { + + private KubeJsRecipeExporter() {} + + public static String export(RecipeDraft draft, String recipeId) { + if (draft.recipeType == null) return "// no recipe type selected"; + + var typeId = draft.recipeType.registryName; + String idArg = recipeId == null || recipeId.isBlank() ? "" : "'" + recipeId.trim() + "'"; + List lines = new ArrayList<>(); + lines.add("event.recipes." + typeId.getNamespace() + "." + typeId.getPath() + "(" + idArg + ")"); + + StringJoiner consumed = new StringJoiner(", "); + List extraInputs = new ArrayList<>(); + for (int i = 0; i < draft.itemInputs.size(); i++) { + ItemStack stack = draft.itemInputs.get(i); + if (stack == null || stack.isEmpty()) continue; + boolean noConsume = i < draft.itemInputNotConsumed.size() && draft.itemInputNotConsumed.get(i); + int chance = i < draft.itemInputChances.size() ? draft.itemInputChances.get(i) : RecipeDraft.GUARANTEED; + int boost = i < draft.itemInputBoosts.size() ? draft.itemInputBoosts.get(i) : 0; + if (noConsume) { + extraInputs.add(".notConsumable(" + itemString(stack) + ")"); + } else if (chance < RecipeDraft.GUARANTEED) { + extraInputs.add(".chancedInput(" + itemString(stack) + ", " + chance + ", " + boost + ")"); + } else { + consumed.add(itemString(stack)); + } + } + if (consumed.length() > 0) lines.add(".itemInputs(" + consumed + ")"); + lines.addAll(extraInputs); + + StringJoiner guaranteed = new StringJoiner(", "); + List chanced = new ArrayList<>(); + for (int i = 0; i < draft.itemOutputs.size(); i++) { + ItemStack stack = draft.itemOutputs.get(i); + if (stack == null || stack.isEmpty()) continue; + int chance = draft.chanceOf(i); + if (chance >= RecipeDraft.GUARANTEED) { + guaranteed.add(itemString(stack)); + } else { + int boost = i < draft.itemOutputBoosts.size() ? draft.itemOutputBoosts.get(i) : 0; + chanced.add(".chancedOutput(" + itemString(stack) + ", " + chance + ", " + boost + ")"); + } + } + if (guaranteed.length() > 0) lines.add(".itemOutputs(" + guaranteed + ")"); + lines.addAll(chanced); + + for (int i = 0; i < draft.fluidInputs.size(); i++) { + FluidStack fluid = draft.fluidInputs.get(i); + if (fluid == null || fluid.isEmpty()) continue; + int chance = i < draft.fluidInputChances.size() ? draft.fluidInputChances.get(i) : RecipeDraft.GUARANTEED; + int boost = i < draft.fluidInputBoosts.size() ? draft.fluidInputBoosts.get(i) : 0; + if (chance < RecipeDraft.GUARANTEED) { + lines.add(".chancedInput(" + fluidArgs(fluid) + ", " + chance + ", " + boost + ")"); + } else { + lines.add(".inputFluids(" + fluidArgs(fluid) + ")"); + } + } + for (int i = 0; i < draft.fluidOutputs.size(); i++) { + FluidStack fluid = draft.fluidOutputs.get(i); + if (fluid == null || fluid.isEmpty()) continue; + int chance = i < draft.fluidOutputChances.size() ? draft.fluidOutputChances.get(i) : RecipeDraft.GUARANTEED; + int boost = i < draft.fluidOutputBoosts.size() ? draft.fluidOutputBoosts.get(i) : 0; + if (chance < RecipeDraft.GUARANTEED) { + lines.add(".chancedOutput(" + fluidArgs(fluid) + ", " + chance + ", " + boost + ")"); + } else { + lines.add(".outputFluids(" + fluidArgs(fluid) + ")"); + } + } + + lines.add(".EUt(GTValues.VA[GTValues." + GTValues.VN[draft.voltageTier] + "], " + draft.amperage + ")"); + if (draft.blastTemp > 0) lines.add(".blastFurnaceTemp(" + draft.blastTemp + ")"); + if (draft.cwu > 0) lines.add(".CWUt(" + draft.cwu + ")"); + if (draft.cleanroom != null && !draft.cleanroom.isEmpty() && !draft.cleanroom.equals("none")) { + lines.add(".cleanroom(CleanroomType." + draft.cleanroom.toUpperCase(Locale.ROOT) + ")"); + } + if (draft.dimension != null && !draft.dimension.isEmpty()) { + lines.add(".dimension('" + draft.dimension + "')"); + } + lines.add(".duration(" + draft.duration + ")"); + + return String.join("\n", lines); + } + + private static String itemString(ItemStack stack) { + var id = BuiltInRegistries.ITEM.getKey(stack.getItem()); + return stack.getCount() > 1 ? "'" + stack.getCount() + "x " + id + "'" : "'" + id + "'"; + } + + private static String fluidArgs(FluidStack stack) { + return "'" + BuiltInRegistries.FLUID.getKey(stack.getFluid()) + " " + stack.getAmount() + "'"; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/RecipeCodecReader.java b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/RecipeCodecReader.java new file mode 100644 index 000000000..f008367c8 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/RecipeCodecReader.java @@ -0,0 +1,121 @@ +package com.ghostipedia.cosmiccore.gtbridge.recipemaker; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.RegistryOps; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.crafting.Recipe; +import net.minecraft.world.item.crafting.RecipeHolder; +import net.minecraft.world.item.crafting.RecipeType; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import com.mojang.serialization.Codec; +import com.mojang.serialization.JsonOps; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +/** + * Reads a recipe type's structure from its serializer CODEC by encoding a real example recipe to JSON, then + * inferring an editable field model from the JSON shape. Unlike {@link RecipeSchemaReader} (KubeJS schemas, which + * are server-only), the recipe manager + serializers exist on BOTH sides, so this works identically client and + * server - the held-item editor can be built on each side without syncing. The chosen sample is deterministic + * (lowest recipe id) so both sides infer the same model. This is the generic engine for vanilla + any mod's + * recipe types, and the basis for the raw-JSON export ({@code event.custom}) + load-as-template. + */ +public final class RecipeCodecReader { + + public enum Kind { ITEM, FLUID, NUMBER, STRING, BOOLEAN, LIST, OBJECT, OTHER } + public record JsonField(String name, Kind kind, Kind elementKind, boolean output, int listMax) {} + private static final int MAX_SAMPLES = 64; + + private RecipeCodecReader() {} + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private static List> recipesOf(Player player, ResourceLocation typeId) { + RecipeType type = BuiltInRegistries.RECIPE_TYPE.get(typeId); + if (type == null) return List.of(); + Collection> all = (Collection) player.level().getRecipeManager().getAllRecipesFor((RecipeType) type); + List> sorted = new ArrayList<>(all); + sorted.sort(Comparator.comparing(holder -> holder.id().toString())); + return sorted; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + private static JsonObject encode(RecipeHolder holder, RegistryOps ops) { + Recipe recipe = holder.value(); + Codec codec = recipe.getSerializer().codec().codec(); + Object encoded = codec.encodeStart(ops, recipe).result().orElse(null); + return encoded instanceof JsonObject json ? json : null; + } + + /** The lowest-id recipe of the type, encoded to JSON - used as the editable template (deterministic). */ + public static JsonObject sample(Player player, ResourceLocation typeId) { + List> recipes = recipesOf(player, typeId); + if (recipes.isEmpty()) return null; + return encode(recipes.getFirst(), RegistryOps.create(JsonOps.INSTANCE, player.level().registryAccess())); + } + + public static List fields(Player player, ResourceLocation typeId) { + List fields = new ArrayList<>(); + List> recipes = recipesOf(player, typeId); + if (recipes.isEmpty()) return fields; + RegistryOps ops = RegistryOps.create(JsonOps.INSTANCE, player.level().registryAccess()); + JsonObject base = encode(recipes.getFirst(), ops); + if (base == null) return fields; + + Map listMax = new HashMap<>(); + int limit = Math.min(recipes.size(), MAX_SAMPLES); + for (int i = 0; i < limit; i++) { + JsonObject json = encode(recipes.get(i), ops); + if (json == null) continue; + for (Map.Entry entry : json.entrySet()) { + if (entry.getValue().isJsonArray()) { + listMax.merge(entry.getKey(), entry.getValue().getAsJsonArray().size(), Math::max); + } + } + } + + for (Map.Entry entry : base.entrySet()) { + if (entry.getKey().equals("type")) continue; + JsonElement value = entry.getValue(); + Kind kind = kindOf(value); + Kind element = Kind.OTHER; + if (kind == Kind.LIST && !value.getAsJsonArray().isEmpty()) { + element = kindOf(value.getAsJsonArray().get(0)); + } + fields.add(new JsonField(entry.getKey(), kind, element, isOutput(entry.getKey()), + listMax.getOrDefault(entry.getKey(), 0))); + } + return fields; + } + + private static Kind kindOf(JsonElement element) { + if (element.isJsonArray()) return Kind.LIST; + if (element.isJsonObject()) { + JsonObject object = element.getAsJsonObject(); + if (object.has("fluid")) return Kind.FLUID; + if (object.has("item") || object.has("tag") || object.has("id")) return Kind.ITEM; + return Kind.OBJECT; + } + if (element.isJsonPrimitive()) { + JsonPrimitive primitive = element.getAsJsonPrimitive(); + if (primitive.isNumber()) return Kind.NUMBER; + if (primitive.isBoolean()) return Kind.BOOLEAN; + return Kind.STRING; + } + return Kind.OTHER; + } + + private static boolean isOutput(String key) { + String lower = key.toLowerCase(Locale.ROOT); + return lower.contains("result") || lower.contains("output"); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/RecipeDraft.java b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/RecipeDraft.java new file mode 100644 index 000000000..4c8115861 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/RecipeDraft.java @@ -0,0 +1,86 @@ +package com.ghostipedia.cosmiccore.gtbridge.recipemaker; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.recipe.GTRecipeType; + +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.fluids.FluidStack; + +import java.util.ArrayList; +import java.util.List; + +/** + * Mutable in-progress recipe being authored by the recipe-maker tool. Slot counts are not fixed: they are + * derived from the selected {@link GTRecipeType}'s capability limits ({@code maxInputs}/{@code maxOutputs}), + * which is what lets one UI cover every GregTech recipe type instead of a hand-written layout per type. + * Item-output chances are parallel to {@link #itemOutputs}; {@link #GUARANTEED} means an unconditional output. + */ +public class RecipeDraft { + + public static final int GUARANTEED = 10000; + + public GTRecipeType recipeType; + + public final List itemInputs = new ArrayList<>(); + public final List itemInputNotConsumed = new ArrayList<>(); + public final List itemInputChances = new ArrayList<>(); + public final List itemInputBoosts = new ArrayList<>(); + public final List itemOutputs = new ArrayList<>(); + public final List itemOutputChances = new ArrayList<>(); + public final List itemOutputBoosts = new ArrayList<>(); + public final List fluidInputs = new ArrayList<>(); + public final List fluidInputChances = new ArrayList<>(); + public final List fluidInputBoosts = new ArrayList<>(); + public final List fluidOutputs = new ArrayList<>(); + public final List fluidOutputChances = new ArrayList<>(); + public final List fluidOutputBoosts = new ArrayList<>(); + + public int voltageTier = GTValues.LV; + public long amperage = 1L; + public int duration = 100; + + public int blastTemp = 0; + public int cwu = 0; + public String cleanroom = "none"; + public String dimension = ""; + + public int maxItemInputs() { + return recipeType == null ? 0 : recipeType.getMaxInputs(ItemRecipeCapability.CAP); + } + + public int maxItemOutputs() { + return recipeType == null ? 0 : recipeType.getMaxOutputs(ItemRecipeCapability.CAP); + } + + public int maxFluidInputs() { + return recipeType == null ? 0 : recipeType.getMaxInputs(FluidRecipeCapability.CAP); + } + + public int maxFluidOutputs() { + return recipeType == null ? 0 : recipeType.getMaxOutputs(FluidRecipeCapability.CAP); + } + + public void setRecipeType(GTRecipeType type) { + this.recipeType = type; + itemInputs.clear(); + itemOutputs.clear(); + itemOutputChances.clear(); + fluidInputs.clear(); + fluidOutputs.clear(); + } + + public void setItemOutput(int index, ItemStack stack, int chance) { + while (itemOutputs.size() <= index) { + itemOutputs.add(ItemStack.EMPTY); + itemOutputChances.add(GUARANTEED); + } + itemOutputs.set(index, stack); + itemOutputChances.set(index, chance); + } + + public int chanceOf(int index) { + return index >= 0 && index < itemOutputChances.size() ? itemOutputChances.get(index) : GUARANTEED; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/RecipeMakerBehavior.java b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/RecipeMakerBehavior.java new file mode 100644 index 000000000..e36eb151c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/RecipeMakerBehavior.java @@ -0,0 +1,428 @@ +package com.ghostipedia.cosmiccore.gtbridge.recipemaker; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.item.component.IItemUIFactory; +import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; +import com.gregtechceu.gtceu.api.recipe.GTRecipeType; +import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; + +import com.lowdragmc.lowdraglib.gui.factory.HeldItemUIFactory; +import com.lowdragmc.lowdraglib.gui.modular.ModularUI; +import com.lowdragmc.lowdraglib.gui.texture.ColorRectTexture; +import com.lowdragmc.lowdraglib.gui.widget.ButtonWidget; +import com.lowdragmc.lowdraglib.gui.widget.DraggableScrollableWidgetGroup; +import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; +import com.lowdragmc.lowdraglib.gui.widget.SelectorWidget; +import com.lowdragmc.lowdraglib.gui.widget.TextFieldWidget; +import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.gui.widget.custom.PlayerInventoryWidget; +import com.lowdragmc.lowdraglib.utils.Position; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.fluids.FluidStack; +import net.neoforged.neoforge.fluids.capability.templates.FluidTank; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.Locale; +import java.util.function.Consumer; +import java.util.function.Supplier; + +public class RecipeMakerBehavior implements IItemUIFactory { + + private static final String CRAFTING = "minecraft:crafting"; + private static final int WIDTH = 288; + private static final int HEIGHT = 312; + private static final int POOL_ITEM = 64; + private static final int POOL_FLUID = 32; + private static final int TANK_CAPACITY = 64_000; + private static final int COLS = 3; + + @Override + public ModularUI createUI(HeldItemUIFactory.HeldItemHolder holder, Player player) { + ModularUI ui = new ModularUI(WIDTH, HEIGHT, holder, player); + ui.widget(new LabelWidget(8, 6, "Recipe Forge")); + + WidgetGroup editorArea = new WidgetGroup(148, 20, WIDTH - 156, HEIGHT - 102); + + Consumer open = entryId -> { + editorArea.clearAllWidgets(); + if (CRAFTING.equals(entryId)) { + CraftingRecipeEditor.build(editorArea); + return; + } + ResourceLocation rl = ResourceLocation.tryParse(entryId); + if (rl != null && BuiltInRegistries.RECIPE_TYPE.get(rl) instanceof GTRecipeType type) { + buildGtEditor(editorArea, type); + } else { + CodecRecipeEditor.build(editorArea, player, entryId); + } + }; + + DraggableScrollableWidgetGroup list = new DraggableScrollableWidgetGroup(8, 32, 132, HEIGHT - 114); + list.setBackground(new ColorRectTexture(0x60000000)); + + String[] search = { "" }; + Consumer populate = filter -> { + list.clearAllWidgets(); + String needle = filter == null ? "" : filter.toLowerCase(Locale.ROOT).trim(); + int[] rowY = { 1 }; + addEntry(list, rowY, "crafting (3x3)", CRAFTING, needle, open); + for (ResourceLocation id : allRecipeTypeIds()) { + if (id.toString().equals(CRAFTING)) continue; + addEntry(list, rowY, id.getPath(), id.toString(), needle, open); + } + }; + populate.accept(""); + + ui.widget(new SearchFieldWidget(8, 18, 132, 12, () -> search[0], + s -> { + search[0] = s; + populate.accept(s); + }, + text -> { + search[0] = text; + populate.accept(text); + })); + ui.widget(list); + ui.widget(editorArea); + + PlayerInventoryWidget inventory = new PlayerInventoryWidget(); + inventory.setPlayer(player); + inventory.setSelfPosition(new Position(63, HEIGHT - 85)); + ui.widget(inventory); + + open.accept(CRAFTING); + ui.mainGroup.setBackground(GuiTextures.BACKGROUND); + return ui; + } + + private static void addEntry(DraggableScrollableWidgetGroup list, int[] rowY, String label, String id, + String needle, Consumer open) { + if (!needle.isEmpty() && !id.toLowerCase(Locale.ROOT).contains(needle)) return; + int y = rowY[0]; + list.addWidget(new ButtonWidget(1, y, 128, 14, GuiTextures.VANILLA_BUTTON, data -> open.accept(id))); + list.addWidget(new LabelWidget(4, y + 3, label)); + rowY[0] += 15; + } + + private static void buildGtEditor(WidgetGroup editor, GTRecipeType type) { + CustomItemStackHandler itemIn = new CustomItemStackHandler(POOL_ITEM); + CustomItemStackHandler itemOut = new CustomItemStackHandler(POOL_ITEM); + FluidTank[] fluidIn = tanks(); + FluidTank[] fluidOut = tanks(); + int[] tier = { GTValues.LV }; + long[] amperage = { 1 }; + int[] duration = { 100 }; + int[] blastTemp = { 0 }; + int[] cwu = { 0 }; + String[] cleanroom = { "none" }; + String[] dimension = { "" }; + boolean[] capOpen = { false }; + boolean[] condOpen = { false }; + int[] outChance = new int[POOL_ITEM]; + int[] outBoost = new int[POOL_ITEM]; + int[] inChance = new int[POOL_ITEM]; + int[] inBoost = new int[POOL_ITEM]; + boolean[] inNoConsume = new boolean[POOL_ITEM]; + int[] fOutChance = new int[POOL_FLUID]; + int[] fOutBoost = new int[POOL_FLUID]; + int[] fInChance = new int[POOL_FLUID]; + int[] fInBoost = new int[POOL_FLUID]; + int[] selSlot = { 0 }; + boolean[] selOut = { false }; + boolean[] selFluid = { false }; + Arrays.fill(outChance, RecipeDraft.GUARANTEED); + Arrays.fill(inChance, RecipeDraft.GUARANTEED); + Arrays.fill(fOutChance, RecipeDraft.GUARANTEED); + Arrays.fill(fInChance, RecipeDraft.GUARANTEED); + Supplier chanceArr = () -> selFluid[0] ? (selOut[0] ? fOutChance : fInChance) + : (selOut[0] ? outChance : inChance); + Supplier boostArr = () -> selFluid[0] ? (selOut[0] ? fOutBoost : fInBoost) + : (selOut[0] ? outBoost : inBoost); + String[] recipeId = { "" }; + + editor.addWidget(new LabelWidget(0, 0, type.registryName.getPath())); + editor.addWidget(new LabelWidget(0, 11, "id")); + editor.addWidget(new TextFieldWidget(16, 10, 106, 12, () -> recipeId[0], s -> recipeId[0] = s)); + editor.addWidget(new LabelWidget(0, 26, "Inputs")); + editor.addWidget(new LabelWidget(66, 26, "Outputs")); + + DraggableScrollableWidgetGroup inputGroup = new DraggableScrollableWidgetGroup(0, 35, 62, 83); + DraggableScrollableWidgetGroup outputGroup = new DraggableScrollableWidgetGroup(66, 35, 62, 83); + inputGroup.setBackground(new ColorRectTexture(0x40000000)); + outputGroup.setBackground(new ColorRectTexture(0x40000000)); + editor.addWidget(inputGroup); + editor.addWidget(outputGroup); + + editor.addWidget(new LabelWidget(0, 126, "Amp")); + editor.addWidget(new TextFieldWidget(26, 124, 30, 12, + () -> String.valueOf(amperage[0]), s -> amperage[0] = parseLong(s, 1)).setNumbersOnly(1L, Long.MAX_VALUE)); + editor.addWidget(new LabelWidget(64, 126, "Tick")); + editor.addWidget(new TextFieldWidget(90, 124, 30, 12, + () -> String.valueOf(duration[0]), s -> duration[0] = (int) parseLong(s, 100)) + .setNumbersOnly(1L, Integer.MAX_VALUE)); + + editor.addWidget(new LabelWidget(0, 142, "Tier")); + editor.addWidget(new SelectorWidget(26, 140, 90, 16, tierNames(), tier[0]) + .setIsUp(true) + .setOnChanged(name -> tier[0] = tierIndex(name)) + .setSupplier(() -> GTValues.VN[tier[0]])); + + WidgetGroup capabilities = new WidgetGroup(0, 0, 128, 138); + capabilities.setBackground(GuiTextures.BACKGROUND); + capabilities.setVisible(false); + capabilities.setActive(false); + capabilities.addWidget(new LabelWidget(4, 3, "Capabilities")); + capabilities.addWidget(new LabelWidget(4, 20, "CWU/t")); + capabilities.addWidget(new TextFieldWidget(52, 18, 70, 12, + () -> String.valueOf(cwu[0]), s -> cwu[0] = (int) parseLong(s, 0)) + .setNumbersOnly(0L, Integer.MAX_VALUE)); + + WidgetGroup conditions = new WidgetGroup(0, 0, 128, 138); + conditions.setBackground(GuiTextures.BACKGROUND); + conditions.setVisible(false); + conditions.setActive(false); + conditions.addWidget(new LabelWidget(4, 3, "Conditions")); + + WidgetGroup heatRow = new WidgetGroup(0, 18, 128, 14); + heatRow.addWidget(new LabelWidget(4, 3, "Heat K")); + heatRow.addWidget(new TextFieldWidget(52, 1, 70, 12, + () -> String.valueOf(blastTemp[0]), s -> blastTemp[0] = (int) parseLong(s, 0)) + .setNumbersOnly(0L, Integer.MAX_VALUE)); + conditions.addWidget(heatRow); + + conditions.addWidget(new LabelWidget(4, 38, "Clean")); + conditions.addWidget(new SelectorWidget(40, 35, 84, 14, cleanroomNames(), cleanroomIndex(cleanroom[0])) + .setOnChanged(name -> cleanroom[0] = name) + .setSupplier(() -> cleanroom[0])); + + conditions.addWidget(new LabelWidget(4, 56, "Dim")); + conditions.addWidget(new TextFieldWidget(40, 54, 84, 12, + () -> dimension[0], s -> dimension[0] = s.trim())); + + WidgetGroup slotConfig = new WidgetGroup(0, 0, 128, 138); + slotConfig.setBackground(GuiTextures.BACKGROUND); + slotConfig.setVisible(false); + slotConfig.setActive(false); + slotConfig.addWidget(new LabelWidget(4, 3, "Slot options")); + slotConfig.addWidget(new LabelWidget(4, 22, "Chance")); + slotConfig.addWidget(new TextFieldWidget(52, 20, 70, 12, + () -> String.valueOf(chanceArr.get()[selSlot[0]]), + s -> chanceArr.get()[selSlot[0]] = (int) parseLong(s, RecipeDraft.GUARANTEED)) + .setNumbersOnly(1L, RecipeDraft.GUARANTEED)); + slotConfig.addWidget(new LabelWidget(4, 36, "/ 10000")); + slotConfig.addWidget(new LabelWidget(4, 52, "Boost")); + slotConfig.addWidget(new TextFieldWidget(52, 50, 70, 12, + () -> String.valueOf(boostArr.get()[selSlot[0]]), + s -> boostArr.get()[selSlot[0]] = (int) parseLong(s, 0)).setNumbersOnly(0L, Integer.MAX_VALUE)); + + WidgetGroup consumeRow = new WidgetGroup(0, 68, 128, 16); + consumeRow.addWidget(new LabelWidget(4, 2, "Consume")); + consumeRow.addWidget(new SelectorWidget(52, 0, 70, 14, List.of("consumed", "not consumed"), 0) + .setOnChanged(name -> inNoConsume[selSlot[0]] = name.equals("not consumed")) + .setSupplier(() -> inNoConsume[selSlot[0]] ? "not consumed" : "consumed")); + consumeRow.setVisible(false); + consumeRow.setActive(false); + slotConfig.addWidget(consumeRow); + + Runnable closeAll = () -> { + capOpen[0] = false; + condOpen[0] = false; + capabilities.setVisible(false); + capabilities.setActive(false); + conditions.setVisible(false); + conditions.setActive(false); + slotConfig.setVisible(false); + slotConfig.setActive(false); + }; + + SlotConfig onConfigure = (slot, isOutput, isFluid) -> { + closeAll.run(); + selSlot[0] = slot; + selOut[0] = isOutput; + selFluid[0] = isFluid; + boolean itemInput = !isOutput && !isFluid; + consumeRow.setVisible(itemInput); + consumeRow.setActive(itemInput); + slotConfig.setVisible(true); + slotConfig.setActive(true); + }; + + slotConfig.addWidget(new ButtonWidget(4, 118, 120, 14, GuiTextures.VANILLA_BUTTON, data -> closeAll.run())); + slotConfig.addWidget(new LabelWidget(54, 121, "Close")); + capabilities.addWidget(new ButtonWidget(4, 118, 120, 14, GuiTextures.VANILLA_BUTTON, data -> closeAll.run())); + capabilities.addWidget(new LabelWidget(54, 121, "Close")); + conditions.addWidget(new ButtonWidget(4, 118, 120, 14, GuiTextures.VANILLA_BUTTON, data -> closeAll.run())); + conditions.addWidget(new LabelWidget(54, 121, "Close")); + + editor.addWidget(new ButtonWidget(0, 158, 120, 14, GuiTextures.VANILLA_BUTTON, data -> { + boolean open = !capOpen[0]; + closeAll.run(); + capOpen[0] = open; + capabilities.setVisible(open); + capabilities.setActive(open); + })); + editor.addWidget(new LabelWidget(34, 161, "Capabilities")); + + editor.addWidget(new ButtonWidget(0, 176, 120, 14, GuiTextures.VANILLA_BUTTON, data -> { + boolean open = !condOpen[0]; + closeAll.run(); + condOpen[0] = open; + conditions.setVisible(open); + conditions.setActive(open); + })); + editor.addWidget(new LabelWidget(38, 179, "Conditions")); + + editor.addWidget(new ExportButtonWidget(0, 192, 120, 16, GuiTextures.VANILLA_BUTTON, + () -> buildScript(type, recipeId, itemIn, itemOut, fluidIn, fluidOut, tier, amperage, duration, + blastTemp, cwu, cleanroom, dimension, outChance, outBoost, inChance, inBoost, inNoConsume, + fOutChance, fOutBoost, fInChance, fInBoost))); + editor.addWidget(new LabelWidget(34, 196, "Copy KubeJS")); + editor.addWidget(capabilities); + editor.addWidget(conditions); + editor.addWidget(slotConfig); + rebuild(type, inputGroup, outputGroup, itemIn, itemOut, fluidIn, fluidOut, heatRow, onConfigure); + } + + private static void rebuild(GTRecipeType type, DraggableScrollableWidgetGroup inputGroup, + DraggableScrollableWidgetGroup outputGroup, CustomItemStackHandler itemIn, + CustomItemStackHandler itemOut, FluidTank[] fluidIn, FluidTank[] fluidOut, + WidgetGroup heatRow, SlotConfig onConfigure) { + inputGroup.clearAllWidgets(); + outputGroup.clearAllWidgets(); + boolean blast = type != null && type.registryName.getPath().contains("blast"); + heatRow.setVisible(blast); + heatRow.setActive(blast); + if (type == null) return; + fillSide(inputGroup, itemIn, type.getMaxInputs(ItemRecipeCapability.CAP), + fluidIn, type.getMaxInputs(FluidRecipeCapability.CAP), false, onConfigure); + fillSide(outputGroup, itemOut, type.getMaxOutputs(ItemRecipeCapability.CAP), + fluidOut, type.getMaxOutputs(FluidRecipeCapability.CAP), true, onConfigure); + } + + private static void fillSide(DraggableScrollableWidgetGroup group, CustomItemStackHandler items, int itemCount, + FluidTank[] tanks, int fluidCount, boolean isOutput, SlotConfig onConfigure) { + for (int i = 0; i < itemCount && i < items.getSlots(); i++) { + int slot = i; + group.addWidget(new ConfigurableItemSlot(items, i, (i % COLS) * 18, (i / COLS) * 18) + .setOnConfigure(() -> onConfigure.open(slot, isOutput, false))); + } + int fluidY = (itemCount == 0 ? 0 : (itemCount + COLS - 1) / COLS * 18 + 4); + for (int i = 0; i < fluidCount && i < tanks.length; i++) { + int slot = i; + group.addWidget(new ConfigurableFluidSlot(tanks[i], (i % COLS) * 18, fluidY + (i / COLS) * 18) + .setOnConfigure(() -> onConfigure.open(slot, isOutput, true))); + } + } + + @FunctionalInterface + private interface SlotConfig { + void open(int slot, boolean isOutput, boolean isFluid); + } + + private static String buildScript(GTRecipeType type, String[] recipeId, CustomItemStackHandler itemIn, + CustomItemStackHandler itemOut, FluidTank[] fluidIn, FluidTank[] fluidOut, + int[] tier, long[] amperage, int[] duration, int[] blastTemp, int[] cwu, + String[] cleanroom, String[] dimension, int[] outChance, int[] outBoost, + int[] inChance, int[] inBoost, boolean[] inNoConsume, int[] fOutChance, + int[] fOutBoost, int[] fInChance, int[] fInBoost) { + if (type == null) return "// select a recipe type first"; + RecipeDraft draft = new RecipeDraft(); + draft.recipeType = type; + for (int i = 0; i < type.getMaxInputs(ItemRecipeCapability.CAP); i++) { + ItemStack stack = itemIn.getStackInSlot(i); + if (!stack.isEmpty()) { + draft.itemInputs.add(stack.copy()); + draft.itemInputNotConsumed.add(inNoConsume[i]); + draft.itemInputChances.add(inChance[i]); + draft.itemInputBoosts.add(inBoost[i]); + } + } + for (int i = 0; i < type.getMaxOutputs(ItemRecipeCapability.CAP); i++) { + ItemStack stack = itemOut.getStackInSlot(i); + if (!stack.isEmpty()) { + draft.itemOutputs.add(stack.copy()); + draft.itemOutputChances.add(outChance[i]); + draft.itemOutputBoosts.add(outBoost[i]); + } + } + for (int i = 0; i < type.getMaxInputs(FluidRecipeCapability.CAP); i++) { + FluidStack fluid = fluidIn[i].getFluid(); + if (!fluid.isEmpty()) { + draft.fluidInputs.add(fluid.copy()); + draft.fluidInputChances.add(fInChance[i]); + draft.fluidInputBoosts.add(fInBoost[i]); + } + } + for (int i = 0; i < type.getMaxOutputs(FluidRecipeCapability.CAP); i++) { + FluidStack fluid = fluidOut[i].getFluid(); + if (!fluid.isEmpty()) { + draft.fluidOutputs.add(fluid.copy()); + draft.fluidOutputChances.add(fOutChance[i]); + draft.fluidOutputBoosts.add(fOutBoost[i]); + } + } + draft.voltageTier = tier[0]; + draft.amperage = amperage[0]; + draft.duration = duration[0]; + draft.blastTemp = blastTemp[0]; + draft.cwu = cwu[0]; + draft.cleanroom = cleanroom[0]; + draft.dimension = dimension[0]; + return KubeJsRecipeExporter.export(draft, recipeId[0]); + } + + private static FluidTank[] tanks() { + FluidTank[] result = new FluidTank[POOL_FLUID]; + for (int i = 0; i < POOL_FLUID; i++) result[i] = new FluidTank(TANK_CAPACITY); + return result; + } + + private static long parseLong(String text, long fallback) { + try { + return Long.parseLong(text.trim()); + } catch (NumberFormatException e) { + return fallback; + } + } + + private static List tierNames() { + List names = new ArrayList<>(); + for (int i = 0; i <= GTValues.MAX; i++) names.add(GTValues.VN[i]); + return names; + } + + private static int tierIndex(String name) { + for (int i = 0; i <= GTValues.MAX; i++) { + if (GTValues.VN[i].equals(name)) return i; + } + return GTValues.LV; + } + + private static List cleanroomNames() { + List names = new ArrayList<>(); + names.add("none"); + CleanroomType.getAllTypes().stream().map(CleanroomType::name).sorted().forEach(names::add); + return names; + } + + private static int cleanroomIndex(String name) { + int index = cleanroomNames().indexOf(name); + return index < 0 ? 0 : index; + } + + private static List allRecipeTypeIds() { + List ids = new ArrayList<>(BuiltInRegistries.RECIPE_TYPE.keySet()); + ids.sort(Comparator.comparing(ResourceLocation::getPath).thenComparing(ResourceLocation::getNamespace)); + return ids; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/RecipeSchemaReader.java b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/RecipeSchemaReader.java new file mode 100644 index 000000000..9decc5fec --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/RecipeSchemaReader.java @@ -0,0 +1,100 @@ +package com.ghostipedia.cosmiccore.gtbridge.recipemaker; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.entity.player.Player; + +import dev.latvian.mods.kubejs.core.RecipeManagerKJS; +import dev.latvian.mods.kubejs.recipe.RecipeKey; +import dev.latvian.mods.kubejs.recipe.component.BooleanComponent; +import dev.latvian.mods.kubejs.recipe.component.ComponentRole; +import dev.latvian.mods.kubejs.recipe.component.FluidIngredientComponent; +import dev.latvian.mods.kubejs.recipe.component.FluidStackComponent; +import dev.latvian.mods.kubejs.recipe.component.IngredientComponent; +import dev.latvian.mods.kubejs.recipe.component.ItemStackComponent; +import dev.latvian.mods.kubejs.recipe.component.ListRecipeComponent; +import dev.latvian.mods.kubejs.recipe.component.NumberComponent; +import dev.latvian.mods.kubejs.recipe.component.RecipeComponent; +import dev.latvian.mods.kubejs.recipe.component.SizedFluidIngredientComponent; +import dev.latvian.mods.kubejs.recipe.component.SizedIngredientComponent; +import dev.latvian.mods.kubejs.recipe.component.StringComponent; +import dev.latvian.mods.kubejs.recipe.component.TimeComponent; +import dev.latvian.mods.kubejs.recipe.schema.RecipeNamespace; +import dev.latvian.mods.kubejs.recipe.schema.RecipeSchemaStorage; +import dev.latvian.mods.kubejs.recipe.schema.RecipeSchemaType; +import dev.latvian.mods.kubejs.server.ServerScriptManager; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.Map; + +/** + * Reads KubeJS recipe schemas so the Recipe Forge can auto-generate an editor for any recipe type that has one + * (vanilla, GregTech, or any mod that ships/derives a KubeJS schema), without hand-writing a layout per type. The + * live {@link RecipeSchemaStorage} only exists server-side (on {@link ServerScriptManager}), reached via the + * recipe manager- which is why schema-driven editors must be built in the picker's server-side click handler, + * where the resulting widgets then sync to the client like the GregTech slot rebuild does. + */ +public final class RecipeSchemaReader { + + public enum Kind { ITEM, FLUID, NUMBER, BOOLEAN, STRING, OTHER } + public record SchemaField(String name, ComponentRole role, Kind kind, boolean list, RecipeKey key) {} + + private RecipeSchemaReader() {} + + public static RecipeSchemaStorage storage(Player player) { + MinecraftServer server = player.getServer(); + if (server == null) return null; + if (server.getRecipeManager() instanceof RecipeManagerKJS kjs && kjs.kjs$getResources() != null) { + ServerScriptManager manager = kjs.kjs$getResources().kjs$getServerScriptManager(); + return manager == null ? null : manager.recipeSchemaStorage; + } + return null; + } + + public static List typeIds(Player player) { + List ids = new ArrayList<>(); + RecipeSchemaStorage storage = storage(player); + if (storage == null) return ids; + for (Map.Entry entry : storage.namespaces.entrySet()) { + for (String path : entry.getValue().keySet()) { + ids.add(entry.getKey() + ":" + path); + } + } + ids.sort(Comparator.naturalOrder()); + return ids; + } + + public static List fields(Player player, String typeId) { + List fields = new ArrayList<>(); + RecipeSchemaStorage storage = storage(player); + if (storage == null) return fields; + int colon = typeId.indexOf(':'); + if (colon < 0) return fields; + RecipeNamespace namespace = storage.namespaces.get(typeId.substring(0, colon)); + if (namespace == null) return fields; + RecipeSchemaType type = namespace.get(typeId.substring(colon + 1)); + if (type == null) return fields; + for (RecipeKey key : type.schema.keys) { + boolean list = key.component instanceof ListRecipeComponent; + RecipeComponent base = list ? ((ListRecipeComponent) key.component).component() : key.component; + fields.add(new SchemaField(key.name, key.role, kindOf(base), list, key)); + } + return fields; + } + + private static Kind kindOf(RecipeComponent component) { + if (component instanceof ItemStackComponent || component instanceof IngredientComponent + || component instanceof SizedIngredientComponent) { + return Kind.ITEM; + } + if (component instanceof FluidStackComponent || component instanceof FluidIngredientComponent + || component instanceof SizedFluidIngredientComponent) { + return Kind.FLUID; + } + if (component instanceof NumberComponent || component instanceof TimeComponent) return Kind.NUMBER; + if (component instanceof BooleanComponent) return Kind.BOOLEAN; + if (component instanceof StringComponent) return Kind.STRING; + return Kind.OTHER; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/SearchFieldWidget.java b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/SearchFieldWidget.java new file mode 100644 index 000000000..ababeeb5d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/gtbridge/recipemaker/SearchFieldWidget.java @@ -0,0 +1,38 @@ +package com.ghostipedia.cosmiccore.gtbridge.recipemaker; + +import com.lowdragmc.lowdraglib.gui.widget.TextFieldWidget; + +import java.util.function.Consumer; +import java.util.function.Supplier; + +/** + * A text field that also re-filters a list CLIENT-side as you type. LDLib's normal text responder only fires + * server-side (through handleClientAction), and widget add/remove is not cross-synced mid-session - each side + * rebuilds its own widget tree. So a server-only rebuild leaves the client's view stale (it keeps showing the + * unfiltered list). This widget runs onClientType with the live text on the client so the picker can rebuild its + * own list locally; the server responder rebuilds the server's copy identically, keeping click indices aligned. + */ +public class SearchFieldWidget extends TextFieldWidget { + + private final Consumer onClientType; + + public SearchFieldWidget(int x, int y, int width, int height, Supplier getter, Consumer setter, + Consumer onClientType) { + super(x, y, width, height, getter, setter); + this.onClientType = onClientType; + } + + @Override + public boolean charTyped(char codePoint, int modifiers) { + boolean result = super.charTyped(codePoint, modifiers); + if (result && onClientType != null) onClientType.accept(getRawCurrentString()); + return result; + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + boolean result = super.keyPressed(keyCode, scanCode, modifiers); + if (result && onClientType != null) onClientType.accept(getRawCurrentString()); + return result; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/emi/CosmicFavorite.java b/src/main/java/com/ghostipedia/cosmiccore/integration/emi/CosmicFavorite.java new file mode 100644 index 000000000..c103c9dbb --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/integration/emi/CosmicFavorite.java @@ -0,0 +1,105 @@ +package com.ghostipedia.cosmiccore.integration.emi; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.world.level.material.Fluid; + +import dev.emi.emi.EmiPort; +import dev.emi.emi.EmiRenderHelper; +import dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.runtime.EmiDrawContext; +import dev.emi.emi.runtime.EmiFavorite; + +public class CosmicFavorite extends EmiFavorite { + + private long amount; + + public CosmicFavorite(EmiIngredient stack, long amount) { + super(stack, null); + this.amount = Math.max(1, amount); + } + + public void adjustAmount(long delta) { + this.amount = Math.max(1, amount + delta); + } + + public long getScrollStep(boolean large) { + if (!large) return 1; + return isFluid() ? 1000 : 64; + } + + private boolean isFluid() { + if (getStack().getEmiStacks().isEmpty()) return false; + return getStack().getEmiStacks().get(0).getKey() instanceof Fluid; + } + + @Override + public long getAmount() { + return amount; + } + + @Override + public void render(GuiGraphics raw, int x, int y, float delta, int flags) { + EmiDrawContext context = EmiDrawContext.wrap(raw); + + // Render the stack without the default amount overlay + getStack().render(context.raw(), x, y, delta, flags & ~EmiIngredient.RENDER_AMOUNT); + + // Render our compact amount at half scale + renderCompactAmount(context, x, y, amount); + + // Render recipe favorite indicator if applicable + if ((flags & EmiIngredient.RENDER_INGREDIENT) != 0 && getRecipe() != null) { + EmiRenderHelper.renderRecipeFavorite(getStack(), context, x, y); + } + } + + private void renderCompactAmount(EmiDrawContext context, int x, int y, long amount) { + String text = formatCompact(amount); + Component component = EmiPort.literal(text); + Minecraft client = Minecraft.getInstance(); + int textWidth = client.font.width(component); + + context.push(); + context.matrices().translate(0, 0, 200); + + float scale = 0.5f; + context.matrices().translate(x + 16, y + 16, 0); + context.matrices().scale(scale, scale, 1); + + int tx = -textWidth; + int ty = -client.font.lineHeight; + + context.drawTextWithShadow(component, tx, ty, 0xFFFFFF); + context.pop(); + } + + private String formatCompact(long amount) { + if (isFluid()) { + return formatFluidAmount(amount); + } + return formatItemAmount(amount); + } + + private String formatFluidAmount(long mB) { + if (mB < 1000) return mB + "mB"; + double buckets = mB / 1000.0; + if (buckets >= 1_000_000_000) return String.format("%.1fBB", buckets / 1_000_000_000); + if (buckets >= 1_000_000) return String.format("%.1fMB", buckets / 1_000_000); + if (buckets >= 1000) return String.format("%.1fKB", buckets / 1000); + return String.format("%.1fB", buckets); + } + + private String formatItemAmount(long count) { + if (count >= 1_000_000_000) return String.format("%.1fB", count / 1_000_000_000.0); + if (count >= 1_000_000) return String.format("%.1fM", count / 1_000_000.0); + if (count >= 1000) return String.format("%.1fK", count / 1000.0); + return String.valueOf(count); + } + + @Override + public EmiIngredient copy() { + return new CosmicFavorite(getStack(), amount); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/emi/CosmicRecipeFavorite.java b/src/main/java/com/ghostipedia/cosmiccore/integration/emi/CosmicRecipeFavorite.java new file mode 100644 index 000000000..5d5a07f55 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/integration/emi/CosmicRecipeFavorite.java @@ -0,0 +1,163 @@ +package com.ghostipedia.cosmiccore.integration.emi; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.world.level.material.Fluid; + +import dev.emi.emi.EmiPort; +import dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.runtime.EmiDrawContext; +import dev.emi.emi.runtime.EmiFavorite; + +import java.util.ArrayList; +import java.util.List; + +/** + * A recipe favorite that displays output (yellow highlight) followed by inputs inline. + * Format: [OUTPUT amount] [INPUT1 amount] [INPUT2 amount] ... + * Wraps to next row when out of horizontal space. + */ +public class CosmicRecipeFavorite extends EmiFavorite { + + public record InputEntry(EmiIngredient stack, long amount) {} + + private final List inputs; + private final long outputAmount; + + public CosmicRecipeFavorite(EmiIngredient output, long outputAmount, List inputs) { + super(output, null); + this.outputAmount = Math.max(1, outputAmount); + this.inputs = new ArrayList<>(inputs); + } + + public List getInputs() { + return inputs; + } + + public long getOutputAmount() { + return outputAmount; + } + + @Override + public long getAmount() { + return outputAmount; + } + + public int getTotalSlots() { + return 1 + inputs.size(); + } + + @Override + public void render(GuiGraphics raw, int x, int y, float delta, int flags) { + EmiDrawContext context = EmiDrawContext.wrap(raw); + + // Render output with yellow tint + renderStackWithAmount(context, getStack(), x, y, delta, flags, outputAmount, true); + } + + /** + * Render the full recipe entry across multiple slots. + * Called by our custom sidebar renderer. + */ + public void renderFull(EmiDrawContext context, int startX, int startY, int gridWidth, float delta, int flags) { + int slotSize = 18; + int currentX = startX; + int currentY = startY; + int slotsOnRow = 0; + + // Render output with yellow highlight + renderStackWithAmount(context, getStack(), currentX, currentY, delta, flags, outputAmount, true); + currentX += slotSize; + slotsOnRow++; + + // Render inputs + for (InputEntry input : inputs) { + if (slotsOnRow >= gridWidth) { + currentX = startX; + currentY += slotSize; + slotsOnRow = 0; + } + + renderStackWithAmount(context, input.stack, currentX, currentY, delta, flags, input.amount, false); + currentX += slotSize; + slotsOnRow++; + } + } + + /** + * Calculate how many rows this recipe takes given grid width. + */ + public int getRowCount(int gridWidth) { + if (gridWidth <= 0) return 1; + int totalSlots = getTotalSlots(); + return (totalSlots + gridWidth - 1) / gridWidth; + } + + private void renderStackWithAmount(EmiDrawContext context, EmiIngredient stack, int x, int y, + float delta, int flags, long amount, boolean highlight) { + // Yellow highlight for output + if (highlight) { + context.fill(x, y, 18, 18, 0x44FFFF00); + } + + // Render the stack without default amount + stack.render(context.raw(), x, y, delta, flags & ~EmiIngredient.RENDER_AMOUNT); + + // Render compact amount + renderCompactAmount(context, x, y, amount, isFluid(stack)); + } + + private void renderCompactAmount(EmiDrawContext context, int x, int y, long amount, boolean fluid) { + String text = fluid ? formatFluidAmount(amount) : formatItemAmount(amount); + var component = EmiPort.literal(text); + Minecraft client = Minecraft.getInstance(); + int textWidth = client.font.width(component); + + context.push(); + context.matrices().translate(0, 0, 200); + + float scale = 0.5f; + context.matrices().translate(x + 16, y + 16, 0); + context.matrices().scale(scale, scale, 1); + + context.drawTextWithShadow(component, -textWidth, -client.font.lineHeight, 0xFFFFFF); + context.pop(); + } + + private boolean isFluid(EmiIngredient stack) { + if (stack.getEmiStacks().isEmpty()) return false; + return stack.getEmiStacks().get(0).getKey() instanceof Fluid; + } + + private String formatFluidAmount(long mB) { + if (mB < 1000) return mB + "mB"; + double buckets = mB / 1000.0; + if (buckets >= 1_000_000_000) return String.format("%.1fBB", buckets / 1_000_000_000); + if (buckets >= 1_000_000) return String.format("%.1fMB", buckets / 1_000_000); + if (buckets >= 1000) return String.format("%.1fKB", buckets / 1000); + return String.format("%.1fB", buckets); + } + + private String formatItemAmount(long count) { + if (count >= 1_000_000_000) return String.format("%.1fB", count / 1_000_000_000.0); + if (count >= 1_000_000) return String.format("%.1fM", count / 1_000_000.0); + if (count >= 1000) return String.format("%.1fK", count / 1000.0); + return String.valueOf(count); + } + + @Override + public EmiIngredient copy() { + return new CosmicRecipeFavorite(getStack(), outputAmount, inputs); + } + + @Override + public boolean strictEquals(EmiIngredient other) { + if (other instanceof CosmicRecipeFavorite otherRecipe) { + return getStack().equals(otherRecipe.getStack()); + } + if (other != null && !other.isEmpty()) { + return getStack().equals(other); + } + return false; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/emi/RecipeScreenAccessor.java b/src/main/java/com/ghostipedia/cosmiccore/integration/emi/RecipeScreenAccessor.java new file mode 100644 index 000000000..8422eabbf --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/integration/emi/RecipeScreenAccessor.java @@ -0,0 +1,16 @@ +package com.ghostipedia.cosmiccore.integration.emi; + +import dev.emi.emi.api.recipe.EmiRecipe; +import dev.emi.emi.api.stack.EmiIngredient; +import org.jetbrains.annotations.Nullable; + +/** + * Duck interface for accessing recipe data on RecipeScreen via mixin. + */ +public interface RecipeScreenAccessor { + + EmiIngredient getHoveredStack(int mouseX, int mouseY); + + @Nullable + EmiRecipe getHoveredRecipe(int mouseX, int mouseY); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/emi/favorites/CosmicBookmarkGroup.java b/src/main/java/com/ghostipedia/cosmiccore/integration/emi/favorites/CosmicBookmarkGroup.java new file mode 100644 index 000000000..93a650163 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/integration/emi/favorites/CosmicBookmarkGroup.java @@ -0,0 +1,70 @@ +package com.ghostipedia.cosmiccore.integration.emi.favorites; + +import dev.emi.emi.runtime.EmiFavorite; + +import java.util.ArrayList; +import java.util.List; + +public class CosmicBookmarkGroup { + + public enum GroupType { + REGULAR, + RECIPE + } + + private String name; + private GroupType type; + private List favorites; + + public CosmicBookmarkGroup(String name) { + this(name, GroupType.REGULAR); + } + + public CosmicBookmarkGroup(String name, GroupType type) { + this.name = name; + this.type = type; + this.favorites = new ArrayList<>(); + } + + public CosmicBookmarkGroup(String name, GroupType type, List favorites) { + this.name = name; + this.type = type; + this.favorites = new ArrayList<>(favorites); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public GroupType getType() { + return type; + } + + public void setType(GroupType type) { + this.type = type; + } + + public boolean isRecipeGroup() { + return type == GroupType.RECIPE; + } + + public List getFavorites() { + return favorites; + } + + public void setFavorites(List favorites) { + this.favorites = new ArrayList<>(favorites); + } + + public void clear() { + favorites.clear(); + } + + public int size() { + return favorites.size(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/emi/favorites/CosmicBookmarkManager.java b/src/main/java/com/ghostipedia/cosmiccore/integration/emi/favorites/CosmicBookmarkManager.java new file mode 100644 index 000000000..ed5597631 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/integration/emi/favorites/CosmicBookmarkManager.java @@ -0,0 +1,385 @@ +package com.ghostipedia.cosmiccore.integration.emi.favorites; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.integration.emi.CosmicFavorite; +import com.ghostipedia.cosmiccore.integration.emi.CosmicRecipeFavorite; + +import net.minecraft.client.Minecraft; + +import com.google.gson.Gson; +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 dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.api.stack.serializer.EmiIngredientSerializer; +import dev.emi.emi.runtime.EmiFavorite; +import dev.emi.emi.runtime.EmiFavorites; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +public class CosmicBookmarkManager { + + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); + private static CosmicBookmarkManager instance; + + private List groups = new ArrayList<>(); + private int activeIndex = 0; + private int currentRecipePage = 0; + + private CosmicBookmarkManager() { + groups.add(new CosmicBookmarkGroup("Default")); + } + + public static CosmicBookmarkManager getInstance() { + if (instance == null) { + instance = new CosmicBookmarkManager(); + } + return instance; + } + + public int getActiveIndex() { + return activeIndex; + } + + public int getGroupCount() { + return groups.size(); + } + + public CosmicBookmarkGroup getActiveGroup() { + if (activeIndex >= 0 && activeIndex < groups.size()) { + return groups.get(activeIndex); + } + return groups.get(0); + } + + public int getCurrentRecipePage() { + return currentRecipePage; + } + + public void setCurrentRecipePage(int page) { + this.currentRecipePage = page; + } + + public CosmicBookmarkGroup getGroupAt(int index) { + if (index >= 0 && index < groups.size()) { + return groups.get(index); + } + return null; + } + + public void nextGroup() { + saveCurrentToGroup(); + activeIndex = (activeIndex + 1) % groups.size(); + loadGroupToEmi(); + } + + public void prevGroup() { + saveCurrentToGroup(); + activeIndex = (activeIndex - 1 + groups.size()) % groups.size(); + loadGroupToEmi(); + } + + public void setActiveIndex(int index) { + if (index >= 0 && index < groups.size() && index != activeIndex) { + saveCurrentToGroup(); + activeIndex = index; + loadGroupToEmi(); + } + } + + public void addGroup(String name) { + addGroup(name, CosmicBookmarkGroup.GroupType.REGULAR); + } + + public void addGroup(String name, CosmicBookmarkGroup.GroupType type) { + saveCurrentToGroup(); + groups.add(new CosmicBookmarkGroup(name, type)); + activeIndex = groups.size() - 1; + loadGroupToEmi(); + } + + public void removeGroup(int index) { + if (groups.size() <= 1) return; + if (index < 0 || index >= groups.size()) return; + + groups.remove(index); + if (activeIndex >= groups.size()) { + activeIndex = groups.size() - 1; + } + loadGroupToEmi(); + } + + public void saveCurrentToGroup() { + CosmicBookmarkGroup group = getActiveGroup(); + group.setFavorites(new ArrayList<>(EmiFavorites.favorites)); + } + + public void loadGroupToEmi() { + CosmicBookmarkGroup group = getActiveGroup(); + EmiFavorites.favorites.clear(); + EmiFavorites.favorites.addAll(group.getFavorites()); + } + + /** + * Find which recipe favorite is at the given screen position. + * Returns null if no recipe at that position or not in a recipe group. + */ + public CosmicRecipeFavorite getRecipeAtPosition(int mouseX, int mouseY, int tx, int ty, int tw, int th, + int currentPage) { + if (!getActiveGroup().isRecipeGroup()) return null; + + int slotSize = 18; + if (mouseX < tx || mouseX >= tx + tw * slotSize || mouseY < ty || mouseY >= ty + th * slotSize) { + return null; + } + + int hoveredRow = (mouseY - ty) / slotSize; + int hoveredCol = (mouseX - tx) / slotSize; + + List recipes = EmiFavorites.favorites.stream() + .filter(f -> f instanceof CosmicRecipeFavorite) + .map(f -> (CosmicRecipeFavorite) f) + .toList(); + + if (recipes.isEmpty()) return null; + + List pageLayout = calculatePageLayout(recipes, tw, th, currentPage); + + for (RecipeRenderInfo info : pageLayout) { + if (hoveredRow >= info.startRow() && hoveredRow < info.startRow() + info.rowCount()) { + int relativeRow = hoveredRow - info.startRow(); + int slotIndex = relativeRow * tw + hoveredCol; + if (slotIndex >= 0 && slotIndex < info.recipe().getTotalSlots()) { + return info.recipe(); + } + } + } + + return null; + } + + private List calculatePageLayout(List recipes, int gridWidth, int totalRows, + int page) { + List result = new ArrayList<>(); + + List recipeRowCounts = new ArrayList<>(); + for (CosmicRecipeFavorite recipe : recipes) { + recipeRowCounts.add(recipe.getRowCount(gridWidth)); + } + + int rowsUsed = 0; + int currentPage = 0; + + for (int i = 0; i < recipes.size(); i++) { + int rowsNeeded = recipeRowCounts.get(i); + + if (rowsUsed + rowsNeeded > totalRows && rowsUsed > 0) { + currentPage++; + rowsUsed = 0; + } + + if (currentPage == page) { + result.add(new RecipeRenderInfo(recipes.get(i), rowsUsed, rowsNeeded)); + } else if (currentPage > page) { + break; + } + + rowsUsed += rowsNeeded; + } + + return result; + } + + /** + * Calculate how many pages are needed to display all recipes in the current group. + * Only meaningful for recipe groups. + */ + public int getRecipePageCount(int gridWidth, int gridHeight) { + if (!getActiveGroup().isRecipeGroup() || gridWidth <= 0 || gridHeight <= 0) { + return 1; + } + + List recipes = EmiFavorites.favorites.stream() + .filter(f -> f instanceof CosmicRecipeFavorite) + .map(f -> (CosmicRecipeFavorite) f) + .toList(); + + if (recipes.isEmpty()) return 1; + + int pageCount = 1; + int rowsUsed = 0; + + for (CosmicRecipeFavorite recipe : recipes) { + int rowsNeeded = recipe.getRowCount(gridWidth); + + if (rowsUsed + rowsNeeded > gridHeight && rowsUsed > 0) { + pageCount++; + rowsUsed = 0; + } + rowsUsed += rowsNeeded; + } + + return pageCount; + } + + public Path getSavePath() { + return Minecraft.getInstance().gameDirectory.toPath() + .resolve("config") + .resolve("cosmiccore") + .resolve("cosmic_bookmarks.json"); + } + + public void save() { + saveCurrentToGroup(); + + JsonObject root = new JsonObject(); + root.addProperty("activeGroup", activeIndex); + + JsonArray groupsArray = new JsonArray(); + for (CosmicBookmarkGroup group : groups) { + JsonObject groupObj = new JsonObject(); + groupObj.addProperty("name", group.getName()); + groupObj.addProperty("type", group.getType().name()); + + JsonArray favoritesArray = new JsonArray(); + for (EmiFavorite fav : group.getFavorites()) { + JsonObject favObj = new JsonObject(); + JsonElement stack = EmiIngredientSerializer.getSerialized(fav.getStack()); + if (stack != null) { + favObj.add("stack", stack); + + if (fav instanceof CosmicRecipeFavorite recipe) { + favObj.addProperty("isRecipe", true); + favObj.addProperty("outputAmount", recipe.getOutputAmount()); + JsonArray inputsArray = new JsonArray(); + for (CosmicRecipeFavorite.InputEntry input : recipe.getInputs()) { + JsonObject inputObj = new JsonObject(); + JsonElement inputStack = EmiIngredientSerializer.getSerialized(input.stack()); + if (inputStack != null) { + inputObj.add("stack", inputStack); + inputObj.addProperty("amount", input.amount()); + inputsArray.add(inputObj); + } + } + favObj.add("inputs", inputsArray); + } else if (fav instanceof CosmicFavorite cosmic) { + favObj.addProperty("cosmicAmount", cosmic.getAmount()); + } + + if (fav.getRecipe() != null && fav.getRecipe().getId() != null) { + favObj.addProperty("recipe", fav.getRecipe().getId().toString()); + } + favoritesArray.add(favObj); + } + } + groupObj.add("favorites", favoritesArray); + groupsArray.add(groupObj); + } + root.add("groups", groupsArray); + + try { + Path path = getSavePath(); + Files.createDirectories(path.getParent()); + Files.writeString(path, GSON.toJson(root)); + } catch (IOException e) { + CosmicCore.LOGGER.error("Failed to save cosmic bookmarks", e); + } + } + + public void load() { + Path path = getSavePath(); + if (!Files.exists(path)) { + return; + } + + try { + String content = Files.readString(path); + JsonObject root = JsonParser.parseString(content).getAsJsonObject(); + + groups.clear(); + activeIndex = root.has("activeGroup") ? root.get("activeGroup").getAsInt() : 0; + + if (root.has("groups")) { + JsonArray groupsArray = root.getAsJsonArray("groups"); + for (JsonElement groupEl : groupsArray) { + JsonObject groupObj = groupEl.getAsJsonObject(); + String name = groupObj.has("name") ? groupObj.get("name").getAsString() : "Unnamed"; + CosmicBookmarkGroup.GroupType type = CosmicBookmarkGroup.GroupType.REGULAR; + if (groupObj.has("type")) { + try { + type = CosmicBookmarkGroup.GroupType.valueOf(groupObj.get("type").getAsString()); + } catch (IllegalArgumentException ignored) {} + } + CosmicBookmarkGroup group = new CosmicBookmarkGroup(name, type); + + if (groupObj.has("favorites")) { + JsonArray favoritesArray = groupObj.getAsJsonArray("favorites"); + List favorites = new ArrayList<>(); + + for (JsonElement favEl : favoritesArray) { + JsonObject favObj = favEl.getAsJsonObject(); + if (favObj.has("stack")) { + EmiIngredient ingredient = EmiIngredientSerializer.getDeserialized(favObj.get("stack")); + if (!ingredient.isEmpty()) { + EmiFavorite fav; + + if (favObj.has("isRecipe") && favObj.get("isRecipe").getAsBoolean()) { + long outputAmount = favObj.has("outputAmount") ? + favObj.get("outputAmount").getAsLong() : 1; + List inputs = new ArrayList<>(); + if (favObj.has("inputs")) { + for (JsonElement inputEl : favObj.getAsJsonArray("inputs")) { + JsonObject inputObj = inputEl.getAsJsonObject(); + if (inputObj.has("stack")) { + EmiIngredient inputStack = EmiIngredientSerializer + .getDeserialized(inputObj.get("stack")); + long inputAmount = inputObj.has("amount") ? + inputObj.get("amount").getAsLong() : 1; + if (!inputStack.isEmpty()) { + inputs.add(new CosmicRecipeFavorite.InputEntry(inputStack, + inputAmount)); + } + } + } + } + fav = new CosmicRecipeFavorite(ingredient, outputAmount, inputs); + } else if (favObj.has("cosmicAmount")) { + long amount = favObj.get("cosmicAmount").getAsLong(); + fav = new CosmicFavorite(ingredient, amount); + } else { + fav = new EmiFavorite(ingredient, null); + } + favorites.add(fav); + } + } + } + group.setFavorites(favorites); + } + groups.add(group); + } + } + + if (groups.isEmpty()) { + groups.add(new CosmicBookmarkGroup("Default")); + } + + if (activeIndex >= groups.size()) { + activeIndex = 0; + } + + loadGroupToEmi(); + + } catch (Exception e) { + CosmicCore.LOGGER.error("Failed to load cosmic bookmarks", e); + groups.clear(); + groups.add(new CosmicBookmarkGroup("Default")); + activeIndex = 0; + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/emi/favorites/RecipeRenderInfo.java b/src/main/java/com/ghostipedia/cosmiccore/integration/emi/favorites/RecipeRenderInfo.java new file mode 100644 index 000000000..c2f402fc4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/integration/emi/favorites/RecipeRenderInfo.java @@ -0,0 +1,5 @@ +package com.ghostipedia.cosmiccore.integration.emi.favorites; + +import com.ghostipedia.cosmiccore.integration.emi.CosmicRecipeFavorite; + +public record RecipeRenderInfo(CosmicRecipeFavorite recipe, int startRow, int rowCount) {} diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/kjs/CosmicCoreKubeJSPlugin.java b/src/main/java/com/ghostipedia/cosmiccore/integration/kjs/CosmicCoreKubeJSPlugin.java index ac2af080d..b60206bc5 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/integration/kjs/CosmicCoreKubeJSPlugin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/integration/kjs/CosmicCoreKubeJSPlugin.java @@ -1,67 +1,56 @@ package com.ghostipedia.cosmiccore.integration.kjs; - import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.api.capability.souls.SoulType; import com.ghostipedia.cosmiccore.common.data.CosmicBlocks; import com.ghostipedia.cosmiccore.common.data.CosmicItems; import com.ghostipedia.cosmiccore.common.data.CosmicMachines; import com.ghostipedia.cosmiccore.common.data.materials.CosmicElements; import com.ghostipedia.cosmiccore.common.data.materials.CosmicMaterials; +import com.ghostipedia.cosmiccore.common.data.worldgen.CosmicWorldGenLayers; +import com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.BranchingVeinGenerator; +import com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.ClusterVeinGenerator; +import com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.FractureVeinGenerator; +import com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.LensVeinGenerator; +import com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.ShellVeinGenerator; +import com.ghostipedia.cosmiccore.common.data.worldgen.generator.veins.StringerVeinGenerator; import com.ghostipedia.cosmiccore.gtbridge.CosmicRecipeTypes; -import com.ghostipedia.cosmiccore.integration.kjs.recipe.CosmicCoreRecipeSchema; -import com.ghostipedia.cosmiccore.integration.kjs.recipe.components.CosmicRecipeComponent; -import com.gregtechceu.gtceu.api.addon.AddonFinder; -import com.gregtechceu.gtceu.api.registry.GTRegistries; -import dev.latvian.mods.kubejs.KubeJSPlugin; -import dev.latvian.mods.kubejs.recipe.schema.RecipeComponentFactoryRegistryEvent; -import dev.latvian.mods.kubejs.recipe.schema.RegisterRecipeSchemasEvent; -import dev.latvian.mods.kubejs.script.BindingsEvent; -import dev.latvian.mods.kubejs.script.ScriptType; -import dev.latvian.mods.kubejs.util.ClassFilter; -import net.minecraft.resources.ResourceLocation; -public class CosmicCoreKubeJSPlugin extends KubeJSPlugin { +import dev.latvian.mods.kubejs.plugin.ClassFilter; +import dev.latvian.mods.kubejs.plugin.KubeJSPlugin; +import dev.latvian.mods.kubejs.script.BindingRegistry; - @Override - public void initStartup() { - super.initStartup(); - } +/** + * KubeJS integration for CosmicCore. Exposes the addon's data holders and vein generators as script bindings and + * lets scripts import the {@code com.ghostipedia.cosmiccore} package. The soul/ember recipe schema + components from + * the 1.20.1 build are not ported yet (those subsystems are shelved), so registerRecipeSchemas/Components are left + * to their defaults; CosmicCore recipe types still get GTCEu's default schema via GTCEu's own KubeJS plugin. + */ +public class CosmicCoreKubeJSPlugin implements KubeJSPlugin { @Override - public void init() { - super.init(); - } - - @Override - public void registerClasses(ScriptType type, ClassFilter filter) { - super.registerClasses(type, filter); - // allow user to access all gtceu classes by importing them. + public void registerClasses(ClassFilter filter) { filter.allow("com.ghostipedia.cosmiccore"); } @Override - public void registerRecipeSchemas(RegisterRecipeSchemasEvent event) { - for (var entry : GTRegistries.RECIPE_TYPES.entries()) { - event.register(entry.getKey(), CosmicCoreRecipeSchema.SCHEMA); - } - } - - @Override - public void registerRecipeComponents(RecipeComponentFactoryRegistryEvent event) { - event.register("cosmicSoulIn", CosmicRecipeComponent.SOUL_IN); - event.register("cosmicSoulOut", CosmicRecipeComponent.SOUL_OUT); - } - - @Override - public void registerBindings(BindingsEvent event) { - super.registerBindings(event); - event.add("CosmicMaterials", CosmicMaterials.class); - event.add("CosmicElements", CosmicElements.class); - event.add("CosmicBlocks", CosmicBlocks.class); - event.add("CosmicMachines", CosmicMachines.class); - event.add("CosmicItems", CosmicItems.class); - event.add("CosmicRecipeTypes", CosmicRecipeTypes.class); - - event.add("CosmicCore", CosmicCore.class); + public void registerBindings(BindingRegistry bindings) { + bindings.add("CosmicMaterials", CosmicMaterials.class); + bindings.add("CosmicElements", CosmicElements.class); + bindings.add("CosmicBlocks", CosmicBlocks.class); + bindings.add("CosmicMachines", CosmicMachines.class); + bindings.add("CosmicItems", CosmicItems.class); + bindings.add("CosmicRecipeTypes", CosmicRecipeTypes.class); + bindings.add("CosmicSoulTypes", SoulType.class); + + bindings.add("FractureVeinGenerator", FractureVeinGenerator.class); + bindings.add("BranchingVeinGenerator", BranchingVeinGenerator.class); + bindings.add("LensVeinGenerator", LensVeinGenerator.class); + bindings.add("ClusterVeinGenerator", ClusterVeinGenerator.class); + bindings.add("StringerVeinGenerator", StringerVeinGenerator.class); + bindings.add("ShellVeinGenerator", ShellVeinGenerator.class); + + bindings.add("CosmicWorldGenLayers", CosmicWorldGenLayers.class); + bindings.add("CosmicCore", CosmicCore.class); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/kjs/recipe/CosmicCoreRecipeSchema.java b/src/main/java/com/ghostipedia/cosmiccore/integration/kjs/recipe/CosmicCoreRecipeSchema.java deleted file mode 100644 index 80a6cfa14..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/integration/kjs/recipe/CosmicCoreRecipeSchema.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.ghostipedia.cosmiccore.integration.kjs.recipe; - -import com.ghostipedia.cosmiccore.api.capability.recipe.SoulRecipeCapability; -import com.gregtechceu.gtceu.integration.kjs.recipe.GTRecipeSchema; -import dev.latvian.mods.kubejs.recipe.schema.RecipeSchema; -import lombok.experimental.Accessors; - -import static com.gregtechceu.gtceu.integration.kjs.recipe.GTRecipeSchema.*; - - -public interface CosmicCoreRecipeSchema { - - @SuppressWarnings({"unused", "UnusedReturnValue"}) - @Accessors(chain = true, fluent = true) - class CosmicRecipeJS extends GTRecipeSchema.GTRecipeJS { - - public GTRecipeSchema.GTRecipeJS soulInput(int souls) { - return this.input(SoulRecipeCapability.CAP, souls); - } - - public GTRecipeSchema.GTRecipeJS soulOutput(int souls) { - return this.output(SoulRecipeCapability.CAP, souls); - } - - public GTRecipeSchema.GTRecipeJS magnetStats(int minField, int decayRate,boolean perTick){ - this.addData("min_field", minField); - this.addData("decay_rate", decayRate); - this.addData("per_tick", perTick); - return this; - } - public GTRecipeSchema.GTRecipeJS magnetStats(int minField, int decayRate){ - this.addData("min_field", minField); - this.addData("decay_rate", decayRate); - this.addData("per_tick", true); - return this; - } - } - - RecipeSchema SCHEMA = new RecipeSchema(CosmicRecipeJS.class, CosmicRecipeJS::new, DURATION, DATA, CONDITIONS, ALL_INPUTS, ALL_TICK_INPUTS, ALL_OUTPUTS, ALL_TICK_OUTPUTS, IS_FUEL) - .constructor((recipe, schemaType, keys, from) -> recipe.id(from.getValue(recipe, ID)), ID) - .constructor(DURATION, CONDITIONS, ALL_INPUTS, ALL_OUTPUTS, ALL_TICK_INPUTS, ALL_TICK_OUTPUTS); - -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/kjs/recipe/components/CosmicRecipeComponent.java b/src/main/java/com/ghostipedia/cosmiccore/integration/kjs/recipe/components/CosmicRecipeComponent.java deleted file mode 100644 index 10c3c75da..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/integration/kjs/recipe/components/CosmicRecipeComponent.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.ghostipedia.cosmiccore.integration.kjs.recipe.components; - -import com.ghostipedia.cosmiccore.api.capability.recipe.SoulRecipeCapability; -import com.gregtechceu.gtceu.integration.kjs.recipe.components.ContentJS; -import dev.latvian.mods.kubejs.recipe.component.NumberComponent; - -public class CosmicRecipeComponent { - - public static final ContentJS SOUL_IN = new ContentJS<>(NumberComponent.ANY_INT, SoulRecipeCapability.CAP, false); - public static final ContentJS SOUL_OUT = new ContentJS<>(NumberComponent.ANY_INT, SoulRecipeCapability.CAP, true); - -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/recipes/CosmicCoreEMIPlugin.java b/src/main/java/com/ghostipedia/cosmiccore/integration/recipes/CosmicCoreEMIPlugin.java new file mode 100644 index 000000000..4b7644bf2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/integration/recipes/CosmicCoreEMIPlugin.java @@ -0,0 +1,77 @@ +package com.ghostipedia.cosmiccore.integration.recipes; + +import com.ghostipedia.cosmiccore.CosmicCore; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.LARVA; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.LarvaMachine; +import com.ghostipedia.cosmiccore.integration.recipes.emi.AsteroidEmiRecipe; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.ItemStack; + +import dev.emi.emi.api.EmiEntrypoint; +import dev.emi.emi.api.EmiPlugin; +import dev.emi.emi.api.EmiRegistry; +import dev.emi.emi.api.recipe.EmiRecipeCategory; +import dev.emi.emi.api.stack.Comparison; +import dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.api.stack.EmiStack; + +import java.util.ArrayList; +import java.util.List; + +@EmiEntrypoint +public class CosmicCoreEMIPlugin implements EmiPlugin { + + public static final ResourceLocation ASTEROID_CATEGORY_ID = CosmicCore.id("asteroid_mining"); + public static final EmiRecipeCategory ASTEROID_CATEGORY = new EmiRecipeCategory(ASTEROID_CATEGORY_ID, + EmiStack.of(CosmicItems.TARGETING_CHIP)); + + @Override + public void register(EmiRegistry registry) { + registry.setDefaultComparison(CosmicItems.TARGETING_CHIP.asStack(), Comparison.compareComponents()); + + registry.addCategory(ASTEROID_CATEGORY); + registry.addWorkstation(ASTEROID_CATEGORY, EmiStack.of(LARVA.LARVA.getBlock())); + + addAsteroidRecipe(registry, "carbonic_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.CARBON_ASTEROID.asStack())), CosmicItems.CARBON_ASTEROID.asStack()); + addAsteroidRecipe(registry, "ferric_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.FERRIC_ASTEROID.asStack())), CosmicItems.FERRIC_ASTEROID.asStack()); + addAsteroidRecipe(registry, "rare_metal_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.RARE_METAL_ASTEROID.asStack())), + CosmicItems.RARE_METAL_ASTEROID.asStack()); + addAsteroidRecipe(registry, "auric_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.AURIC_ASTEROID.asStack())), CosmicItems.AURIC_ASTEROID.asStack()); + addAsteroidRecipe(registry, "brimstone_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.BRIMSTONE_ASTEROID.asStack())), + CosmicItems.BRIMSTONE_ASTEROID.asStack()); + addAsteroidRecipe(registry, "lith_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.LITH_ASTEROID.asStack())), CosmicItems.LITH_ASTEROID.asStack()); + addAsteroidRecipe(registry, "mafic_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.MAFIC_ASTEROID.asStack())), CosmicItems.MAFIC_ASTEROID.asStack()); + addAsteroidRecipe(registry, "mossy_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.MOSSY_ASTEROID.asStack())), CosmicItems.MOSSY_ASTEROID.asStack()); + addAsteroidRecipe(registry, "occult_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.OCCULT_ASTEROID.asStack())), CosmicItems.OCCULT_ASTEROID.asStack()); + addAsteroidRecipe(registry, "oxide_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.OXIDE_ASTEROID.asStack())), CosmicItems.OXIDE_ASTEROID.asStack()); + addAsteroidRecipe(registry, "sanguine_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.SANGUINE_ASTEROID.asStack())), CosmicItems.SANGUINE_ASTEROID.asStack()); + addAsteroidRecipe(registry, "wasteland_asteroid", CosmicItems.TUNGSTENSTEEL_NANOLATTICE_SPOOL.asStack(), + List.of(EmiStack.of(CosmicItems.WASTELAND_ASTEROID.asStack())), + CosmicItems.WASTELAND_ASTEROID.asStack()); + } + + private void addAsteroidRecipe(EmiRegistry registry, String keySuffix, ItemStack spool, List outputs, + ItemStack icon) { + ItemStack chip = LarvaMachine.getAstroidDataChip(keySuffix, 1); + + List inputs = new ArrayList<>(); + inputs.add(EmiStack.of(chip)); + inputs.add(EmiStack.of(spool)); + + ResourceLocation recipeID = CosmicCore.id("emi/asteroid_processing/" + keySuffix); + registry.addRecipe(new AsteroidEmiRecipe(ASTEROID_CATEGORY, recipeID, inputs, outputs, EmiStack.of(icon))); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/recipes/CosmicCoreJEIPlugin.java b/src/main/java/com/ghostipedia/cosmiccore/integration/recipes/CosmicCoreJEIPlugin.java new file mode 100644 index 000000000..5e2cb3afa --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/integration/recipes/CosmicCoreJEIPlugin.java @@ -0,0 +1,40 @@ +package com.ghostipedia.cosmiccore.integration.recipes; + +import com.ghostipedia.cosmiccore.CosmicCore; + +import com.gregtechceu.gtceu.GTCEu; + +import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.resources.ResourceLocation; + +import lombok.Getter; +import mezz.jei.api.IModPlugin; +import mezz.jei.api.JeiPlugin; +import mezz.jei.api.registration.ISubtypeRegistration; +import mezz.jei.api.runtime.IJeiRuntime; + +import javax.annotation.ParametersAreNonnullByDefault; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +@JeiPlugin +public class CosmicCoreJEIPlugin implements IModPlugin { + + @Getter + private static IJeiRuntime runtime = null; + + @Override + public ResourceLocation getPluginUid() { + return CosmicCore.id("jei_plugin"); + } + + @Override + public void onRuntimeAvailable(IJeiRuntime jeiRuntime) { + runtime = jeiRuntime; + } + + @Override + public void registerItemSubtypes(ISubtypeRegistration registration) { + if (GTCEu.Mods.isREILoaded() || GTCEu.Mods.isEMILoaded()) return; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/integration/recipes/emi/AsteroidEmiRecipe.java b/src/main/java/com/ghostipedia/cosmiccore/integration/recipes/emi/AsteroidEmiRecipe.java new file mode 100644 index 000000000..8499727d5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/integration/recipes/emi/AsteroidEmiRecipe.java @@ -0,0 +1,87 @@ +package com.ghostipedia.cosmiccore.integration.recipes.emi; + +import net.minecraft.resources.ResourceLocation; + +import dev.emi.emi.api.recipe.EmiRecipe; +import dev.emi.emi.api.recipe.EmiRecipeCategory; +import dev.emi.emi.api.render.EmiTexture; +import dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.api.stack.EmiStack; +import dev.emi.emi.api.widget.WidgetHolder; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class AsteroidEmiRecipe implements EmiRecipe { + + private static final int W = 150; + private static final int H = 30; + + private final EmiRecipeCategory category; + private final ResourceLocation id; + private final List inputs; + private final List outputs; + @Getter + private final EmiStack icon; + + public AsteroidEmiRecipe(EmiRecipeCategory category, ResourceLocation id, List inputs, + List outputs, EmiStack icon) { + this.category = category; + this.id = id; + this.inputs = inputs; + this.outputs = outputs; + this.icon = icon; + } + + @Override + public EmiRecipeCategory getCategory() { + return category; + } + + @Override + public @Nullable ResourceLocation getId() { + return id; + } + + @Override + public List getInputs() { + return inputs; + } + + @Override + public List getOutputs() { + return outputs; + } + + @Override + public int getDisplayWidth() { + return W; + } + + @Override + public int getDisplayHeight() { + return H; + } + + @Override + public boolean supportsRecipeTree() { + return false; + } + + @Override + public void addWidgets(WidgetHolder widgets) { + widgets.addTexture(EmiTexture.EMPTY_ARROW, (W / 2 - 6), (H / 2 - 3)); + widgets.addSlot(inputs.get(0), 10, H / 2 - 5).drawBack(true); + widgets.addSlot(inputs.get(1), 30, H / 2 - 5).drawBack(true); + + int ox = 100; + int oy = H / 2 - 5; + + for (int i = 0; i < outputs.size(); i++) { + widgets.addSlot(outputs.get(i), ox + (i * 20), oy).recipeContext(this); + } + + widgets.addText(icon.getItemStack().getHoverName(), 0, 0, 0xFFFFFF, true); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/AdAstraSpaceSuitItemMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/AdAstraSpaceSuitItemMixin.java deleted file mode 100644 index d133132fc..000000000 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/AdAstraSpaceSuitItemMixin.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.ghostipedia.cosmiccore.mixin; - -import com.ghostipedia.cosmiccore.api.item.armor.SpaceArmorComponentItem; -import earth.terrarium.adastra.common.items.armor.SpaceSuitItem; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.entity.EquipmentSlot; -import net.minecraft.world.entity.LivingEntity; -import org.spongepowered.asm.mixin.Debug; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; - -@Debug(export = true) -@Mixin(SpaceSuitItem.class) -public abstract class AdAstraSpaceSuitItemMixin { - - /** - * @author MrQuentinet - * @reason In order for the GTArmor to work with AdAstra oxygen I needed to change the way the oxygen check is done. - */ - @Overwrite(remap = false) - public static long getOxygenAmount(Entity entity) { - if (!(entity instanceof LivingEntity livingEntity)) return 0; - var stack = livingEntity.getItemBySlot(EquipmentSlot.CHEST); - if (stack.getItem() instanceof SpaceSuitItem suit) { - return suit.getFluidContainer(stack).getFirstFluid().getFluidAmount(); - } else if (stack.getItem() instanceof SpaceArmorComponentItem suit) { - return suit.getFluidContainer(stack).getFirstFluid().getFluidAmount(); - } else return 0; - } - -} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/BlockPatternMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/BlockPatternMixin.java new file mode 100644 index 000000000..9a5a47070 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/BlockPatternMixin.java @@ -0,0 +1,265 @@ +package com.ghostipedia.cosmiccore.mixin; + +import com.ghostipedia.cosmiccore.api.block.IBlockPattern; + +import com.gregtechceu.gtceu.api.item.MetaMachineItem; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.pattern.BlockPattern; +import com.gregtechceu.gtceu.api.pattern.MultiblockState; +import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; +import com.gregtechceu.gtceu.api.pattern.predicates.SimplePredicate; + +import com.lowdragmc.lowdraglib.utils.BlockInfo; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; + +import appeng.api.config.Actionable; +import appeng.api.networking.IGrid; +import appeng.api.networking.security.IActionSource; +import appeng.api.stacks.AEItemKey; +import appeng.api.stacks.KeyCounter; +import org.apache.commons.lang3.ArrayUtils; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.BiPredicate; +import java.util.function.Consumer; + +@Mixin(value = BlockPattern.class, remap = false) +public abstract class BlockPatternMixin implements IBlockPattern { + + @Shadow + @Final + protected int[] centerOffset; + + @Shadow + @Final + protected int fingerLength; + + @Shadow + @Final + public int[][] aisleRepetitions; + + @Shadow + @Final + protected int thumbLength; + + @Shadow + @Final + protected int palmLength; + + @Shadow + @Final + protected TraceabilityPredicate[][][] blockMatches; + + @Shadow + protected abstract BlockPos setActualRelativeOffset(int x, int y, int z, Direction facing, Direction upwardsFacing, + boolean isFlipped); + + @Shadow + protected abstract void resetFacing(BlockPos pos, BlockState blockState, Direction facing, + BiPredicate checker, Consumer consumer); + + @Override + public void cosmiccore$autoBuild(Player player, MultiblockState worldState, IGrid grid) { + Level world = player.level(); + int minZ = -centerOffset[4]; + worldState.clean(); + MultiblockControllerMachine controller = worldState.getController(); + BlockPos centerPos = controller.getBlockPos(); + Direction facing = controller.getFrontFacing(); + Direction upwardsFacing = controller.getUpwardsFacing(); + boolean isFlipped = controller.isFlipped(); + Map cacheGlobal = worldState.getGlobalCount(); + Map cacheLayer = worldState.getLayerCount(); + Map blocks = new HashMap<>(); + Set placeBlockPos = new HashSet<>(); + blocks.put(centerPos, controller); + for (int c = 0, z = minZ++, r; c < this.fingerLength; c++) { + for (r = 0; r < aisleRepetitions[c][0]; r++) { + cacheLayer.clear(); + for (int b = 0, y = -centerOffset[1]; b < this.thumbLength; b++, y++) { + for (int a = 0, x = -centerOffset[0]; a < this.palmLength; a++, x++) { + TraceabilityPredicate predicate = this.blockMatches[c][b][a]; + BlockPos pos = setActualRelativeOffset(x, y, z, facing, upwardsFacing, isFlipped) + .offset(centerPos.getX(), centerPos.getY(), centerPos.getZ()); + worldState.update(pos, predicate); + if (!world.isEmptyBlock(pos)) { + blocks.put(pos, world.getBlockState(pos)); + for (SimplePredicate limit : predicate.limited) { + limit.testLimited(worldState); + } + } else { + boolean find = false; + BlockInfo[] infos = new BlockInfo[0]; + for (SimplePredicate limit : predicate.limited) { + if (limit.minLayerCount > 0) { + if (!cacheLayer.containsKey(limit)) { + cacheLayer.put(limit, 1); + } else + if (cacheLayer.get(limit) < limit.minLayerCount && (limit.maxLayerCount == -1 || + cacheLayer.get(limit) < limit.maxLayerCount)) { + cacheLayer.put(limit, cacheLayer.get(limit) + 1); + } else { + continue; + } + } else { + continue; + } + infos = limit.candidates == null ? null : limit.candidates.get(); + find = true; + break; + } + if (!find) { + for (SimplePredicate limit : predicate.limited) { + if (limit.minCount > 0) { + if (!cacheGlobal.containsKey(limit)) { + cacheGlobal.put(limit, 1); + } else if (cacheGlobal.get(limit) < limit.minCount && + (limit.maxCount == -1 || cacheGlobal.get(limit) < limit.maxCount)) { + cacheGlobal.put(limit, cacheGlobal.get(limit) + 1); + } else { + continue; + } + } else { + continue; + } + infos = limit.candidates == null ? null : limit.candidates.get(); + find = true; + break; + } + } + if (!find) { + // no limited + for (SimplePredicate limit : predicate.limited) { + if (limit.maxLayerCount != -1 && + cacheLayer.getOrDefault(limit, Integer.MAX_VALUE) == limit.maxLayerCount) + continue; + if (limit.maxCount != -1 && + cacheGlobal.getOrDefault(limit, Integer.MAX_VALUE) == limit.maxCount) + continue; + if (cacheLayer.containsKey(limit)) { + cacheLayer.put(limit, cacheLayer.get(limit) + 1); + } else { + cacheLayer.put(limit, 1); + } + if (cacheGlobal.containsKey(limit)) { + cacheGlobal.put(limit, cacheGlobal.get(limit) + 1); + } else { + cacheGlobal.put(limit, 1); + } + infos = ArrayUtils.addAll(infos, + limit.candidates == null ? null : limit.candidates.get()); + } + for (SimplePredicate common : predicate.common) { + infos = ArrayUtils.addAll(infos, + common.candidates == null ? null : common.candidates.get()); + } + } + List candidates = new ArrayList<>(); + if (infos != null) { + for (BlockInfo info : infos) { + if (info.getBlockState().getBlock() != Blocks.AIR) { + candidates.add(info.getItemStackForm()); + } + } + } + // check inventory + ItemStack found = null; + AEItemKey key = null; + var meInv = grid.getStorageService().getInventory(); + var counter = meInv.getAvailableStacks(); + if (!player.isCreative()) { + key = cosmiccore$getMatchStackWithHandler(candidates, counter); + if (key == null) continue; + found = key.toStack(); + } else { + for (ItemStack candidate : candidates) { + found = candidate.copy(); + if (!found.isEmpty() && found.getItem() instanceof BlockItem) { + break; + } + found = null; + } + } + if (found == null) continue; + BlockItem itemBlock = (BlockItem) found.getItem(); + BlockPlaceContext context = new BlockPlaceContext(world, player, InteractionHand.MAIN_HAND, + found, BlockHitResult.miss(player.getEyePosition(0), Direction.UP, pos)); + InteractionResult interactionResult = itemBlock.place(context); + if (interactionResult != InteractionResult.FAIL) { + placeBlockPos.add(pos); + if (key != null) { + grid.getStorageService().getInventory().extract(key, 1, Actionable.MODULATE, + IActionSource.ofPlayer(player)); + } + } + if (world.getBlockEntity(pos) instanceof MetaMachine machineBlockEntity) { + blocks.put(pos, machineBlockEntity); + } else { + blocks.put(pos, world.getBlockState(pos)); + } + } + } + } + z++; + } + } + Direction frontFacing = controller.self().getFrontFacing(); + blocks.forEach((pos, block) -> { + // adjust facing + if (!(block instanceof MultiblockControllerMachine)) { + if (block instanceof BlockState && placeBlockPos.contains(pos)) { + resetFacing(pos, (BlockState) block, frontFacing, (p, f) -> { + Object object = blocks.get(p.relative(f)); + return object == null || + (object instanceof BlockState && ((BlockState) object).getBlock() == Blocks.AIR); + }, state -> world.setBlock(pos, state, 3)); + } else if (block instanceof MetaMachine machine) { + resetFacing(pos, machine.getBlockState(), frontFacing, (p, f) -> { + Object object = blocks.get(p.relative(f)); + if (object == null || (object instanceof BlockState blockState && blockState.isAir())) { + return machine.isFacingValid(f); + } + return false; + }, state -> world.setBlock(pos, state, 3)); + } + } + }); + } + + @Unique + @Nullable + private static AEItemKey cosmiccore$getMatchStackWithHandler(List candidates, KeyCounter counter) { + for (var entry : counter) { + var key = entry.getKey(); + if (candidates + .stream() + .anyMatch(stack -> AEItemKey.matches(key, stack) && entry.getLongValue() > 0 && + stack.getItem() instanceof BlockItem blockItem && !(blockItem instanceof MetaMachineItem))) + return (AEItemKey) key; + } + return null; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/BlocksMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/BlocksMixin.java new file mode 100644 index 000000000..ed49f5194 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/BlocksMixin.java @@ -0,0 +1,28 @@ +package com.ghostipedia.cosmiccore.mixin; + +import net.minecraft.world.level.block.Blocks; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.*; + +/** + * @author SpicierSpace153 (kathryne) + * @reason change hardness so tinkers can aoe + */ + +@Unique +@Mixin(value = Blocks.class, remap = true) +public class BlocksMixin { + + @ModifyArg( + method = "", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;strength(F)Lnet/minecraft/world/level/block/state/BlockBehaviour$Properties;", + ordinal = 127), + index = 0) + private static float cosmiccore$modifyNetherrackHardness(float originalHardness) { + return 2.5f; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/CoilWorkableElectricMultiblockMachineMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/CoilWorkableElectricMultiblockMachineMixin.java new file mode 100644 index 000000000..b8a3bc621 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/CoilWorkableElectricMultiblockMachineMixin.java @@ -0,0 +1,112 @@ +package com.ghostipedia.cosmiccore.mixin; + +import com.ghostipedia.cosmiccore.api.capability.HeatCapability; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.block.ICoilType; +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.multiblock.CoilWorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; + +import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; +import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; +import net.minecraft.server.level.ServerLevel; + +import com.mojang.blaze3d.MethodsReturnNonnullByDefault; +import org.spongepowered.asm.mixin.Debug; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; + +import javax.annotation.ParametersAreNonnullByDefault; + +@Debug +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault +@Mixin(value = CoilWorkableElectricMultiblockMachine.class, remap = false) +public abstract class CoilWorkableElectricMultiblockMachineMixin extends WorkableElectricMultiblockMachine { + + + @Shadow + private ICoilType coilType; + + @Shadow + public abstract int getCoilTier(); + + @Shadow + public abstract ICoilType getCoilType(); + + // Temperature, in Kelvin (because GT uses kelvin instead of celsius.) + @Unique + @Persisted(key = "currentTemp") + @DescSynced + private float frontiers$currentTemp = 273; + @Unique + private TickableSubscription frontiers$temperatureTick = null; + + public CoilWorkableElectricMultiblockMachineMixin(BlockEntityCreationInfo holder) { + super(holder); + } + + public float getTemperature() { + return frontiers$currentTemp - 273; + } + + public void setTemperature(float temp) { + frontiers$currentTemp = temp + 273; + this.markAsChanged(); + } + + @Override + public void onLoad() { + super.onLoad(); + if (getTemperature() == 0 && this.getLevel() instanceof ServerLevel level) { + setTemperature(level.getBiome(this.getBlockPos()).value().getBaseTemperature()); + } + if (frontiers$temperatureTick == null) { + frontiers$temperatureTick = subscribeServerTick(this::frontiers$temperatureTick); + } + } + + @Override + public void onUnload() { + super.onUnload(); + if (frontiers$temperatureTick != null) { + frontiers$temperatureTick.unsubscribe(); + frontiers$temperatureTick = null; + } + } + + @Unique + private void frontiers$temperatureTick() { + if (this.getLevel() instanceof ServerLevel level) { + setTemperature(HeatCapability.adjustTempTowards(getTemperature(), + level.getBiome(this.getBlockPos()).value().getBaseTemperature(), 0.5f)); + } + } + + @Override + public boolean onWorking() { + System.out.println("TESTHELP"); + GTRecipe recipe = recipeLogic.getLastRecipe(); + this.setTemperature(HeatCapability.adjustTempTowards(getTemperature(), + (coilType.getCoilTemperature() + 100 * Math.max(0, this.getTier() - GTValues.MV)) - 273, + (getCoilTier() + 1) / 1.5f)); + /* + * nah too evil. + * if (getTemperature() <= getCoilType().getCoilTemperature()) { + * if (!this.getCapabilitiesProxy().contains(IO.IN, EURecipeCapability.CAP)) return; + * + * if (getRecipeLogic().getLastRecipe() == null) return; + * long EUt = RecipeHelper.getInputEUt(getRecipeLogic().getLastRecipe()); + * GTRecipe recipe = GTRecipeBuilder.ofRaw().EUt(EUt).buildRawRecipe(); + * getRecipeLogic().handleTickRecipe(recipe); + * } + */ + return super.onWorking(); + } + +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/ComponentItemMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/ComponentItemMixin.java new file mode 100644 index 000000000..86d9f6e8d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/ComponentItemMixin.java @@ -0,0 +1,36 @@ +package com.ghostipedia.cosmiccore.mixin; + +import com.ghostipedia.cosmiccore.client.renderer.item.CosmicCoreItemRendererProvider; + +import com.gregtechceu.gtceu.api.item.ComponentItem; +import com.gregtechceu.gtceu.api.item.component.ICustomRenderer; +import com.gregtechceu.gtceu.api.item.component.IItemComponent; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.List; + +@Mixin(value = ComponentItem.class, remap = false) +public abstract class ComponentItemMixin extends Item implements CosmicCoreItemRendererProvider { + + @Shadow + protected List components; + + public ComponentItemMixin(Properties properties) { + super(properties); + } + + @Override + public ICustomRenderer getRenderInfo(ItemStack itemStack) { + for (IItemComponent component : components) { + if (component instanceof ICustomRenderer customRenderer) { + return customRenderer; + } + } + return null; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/CosmicCoreMixinPlugin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/CosmicCoreMixinPlugin.java new file mode 100644 index 000000000..bb227fa62 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/CosmicCoreMixinPlugin.java @@ -0,0 +1,63 @@ +package com.ghostipedia.cosmiccore.mixin; + +import org.objectweb.asm.tree.ClassNode; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import java.util.List; +import java.util.Set; + +/** + * Mixin plugin to conditionally load mixins based on mod presence. + * Prevents EMI mixins from loading when EMI is not present. + */ +public class CosmicCoreMixinPlugin implements IMixinConfigPlugin { + + private static final boolean EMI_LOADED; + private static final boolean JEI_LOADED; + + static { + // Check if EMI is present by looking for a resource file, not a class + // This avoids loading any class too early which would break mixins + EMI_LOADED = CosmicCoreMixinPlugin.class.getClassLoader() + .getResource("dev/emi/emi/api/EmiApi.class") != null; + JEI_LOADED = CosmicCoreMixinPlugin.class.getClassLoader() + .getResource("mezz/jei/library/plugins/jei/tags/TagInfoRecipeCategory.class") != null; + } + + @Override + public void onLoad(String mixinPackage) {} + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + // Skip EMI mixins if EMI is not loaded + if (mixinClassName.contains(".emi.") && !EMI_LOADED) { + return false; + } + // Skip JEI mixins if JEI is not loaded + if (mixinClassName.contains(".jei.") && !JEI_LOADED) { + return false; + } + + return true; + } + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) {} + + @Override + public List getMixins() { + return null; + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {} + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) {} +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/DivingHelmetItemMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/DivingHelmetItemMixin.java index daa8908ff..88302ba82 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/DivingHelmetItemMixin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/DivingHelmetItemMixin.java @@ -1,20 +1,31 @@ package com.ghostipedia.cosmiccore.mixin; import com.ghostipedia.cosmiccore.common.breath.OxygenHelper; + import net.minecraft.world.entity.LivingEntity; -import net.minecraftforge.fluids.FluidType; +import net.neoforged.neoforge.event.entity.living.LivingBreatheEvent; + +import com.simibubi.create.content.equipment.armor.DivingHelmetItem; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -import com.simibubi.create.content.equipment.armor.DivingHelmetItem; -@Mixin(value = DivingHelmetItem.class, remap = false) +@Mixin(value = DivingHelmetItem.class, remap = false) public class DivingHelmetItemMixin { + /** - * Activate helmet "if in water or lava" -> "if in water or bad air or lava" + * Activate helmet "if can't breathe or in lava" -> "if can't breathe or bad air or in lava" + * Redirects the event.canBreathe() check to also consider bad air quality. */ - @Redirect(method = "breatheUnderwater(Lnet/minecraftforge/event/entity/living/LivingEvent$LivingTickEvent;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/entity/LivingEntity;canDrownInFluidType(Lnet/minecraftforge/fluids/FluidType;)Z")) - private static boolean redirectCanDrownInFluidType(LivingEntity entity, FluidType fluidtype) { - return entity.isInFluidType() || (fluidtype == (entity.getEyeInFluidType()) && OxygenHelper.airQualityActivatesHelmet(entity)); + @Redirect(method = "breatheUnderwater", + at = @At(value = "INVOKE", + target = "Lnet/neoforged/neoforge/event/entity/living/LivingBreatheEvent;canBreathe()Z")) + private static boolean cosmicCore$redirectCanBreathe(LivingBreatheEvent event) { + LivingEntity entity = event.getEntity(); + // Return false (can't breathe) if air quality is bad, so helmet activates + if (OxygenHelper.airQualityActivatesHelmet(entity)) { + return false; + } + return event.canBreathe(); } } diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/GTRecipeModifiersMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/GTRecipeModifiersMixin.java new file mode 100644 index 000000000..390fae0bf --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/GTRecipeModifiersMixin.java @@ -0,0 +1,42 @@ +package com.ghostipedia.cosmiccore.mixin; + +import com.ghostipedia.cosmiccore.api.capability.HeatCapability; +import com.ghostipedia.cosmiccore.api.capability.IHeatBlock; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.CoilWorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; + +import org.jetbrains.annotations.NotNull; +import org.spongepowered.asm.mixin.Debug; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +@Debug +@Mixin(value = GTRecipeModifiers.class, remap = false) +public abstract class GTRecipeModifiersMixin { + + // make EBF need heating up, instead of immediately being at target temperature. + // god this is evil. I love it. + @SuppressWarnings({ "MixinAnnotationTarget", "InvalidInjectorMethodSignature" }) // it works anyway, MCDev just + // doesn't know that + @ModifyVariable(method = "ebfOverclock", at = @At(value = "STORE"), ordinal = 0) // target = + // "Lcom/gregtechceu/gtceu/api/block/ICoilType;getCoilTemperature()I", + private static int frontiers$modifyEbfHeatValue(int originalCoilTemp, MetaMachine machine, + @NotNull GTRecipe recipe) { + int coilTier = 1; + if (machine instanceof CoilWorkableElectricMultiblockMachine coilMachine) { + System.out.println("COILBLOCKHIT"); + coilTier = coilMachine.getCoilTier() + 1; + } + if (machine instanceof IHeatBlock heatBlock) { + System.out.println("HEATBLOCKHIT"); + heatBlock.setTemperature( + HeatCapability.adjustTempTowards(heatBlock.getTemperature(), originalCoilTemp - 273, coilTier)); + return Math.round(heatBlock.getTemperature() + 273); + } + return originalCoilTemp; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/GTValuesMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/GTValuesMixin.java new file mode 100644 index 000000000..c5d4d0e99 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/GTValuesMixin.java @@ -0,0 +1,23 @@ +package com.ghostipedia.cosmiccore.mixin; + +import com.gregtechceu.gtceu.api.GTValues; + +import org.spongepowered.asm.mixin.*; + +@Debug +@Mixin(value = GTValues.class, remap = false) +public class GTValuesMixin { + + @Final + @Mutable + @Shadow(remap = false) + public static int[] VC; + + static { + VC[2] = 0x03c2fc; + VC[3] = 0x33ff5c; + // 4 Doesn't need modification, it's already gray + VC[5] = 0x6f42cf; + VC[6] = 0xd5a5d6; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/PlayerBreathingMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/PlayerBreathingMixin.java index b89db299f..715ceaf8b 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/PlayerBreathingMixin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/PlayerBreathingMixin.java @@ -1,21 +1,14 @@ package com.ghostipedia.cosmiccore.mixin; -import fuzs.thinair.api.v1.AirQualityLevel; -import fuzs.thinair.helper.AirQualityHelperImpl; import net.minecraft.tags.FluidTags; -import net.minecraft.tags.TagKey; import net.minecraft.world.effect.MobEffectInstance; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.level.material.Fluid; + import org.spongepowered.asm.mixin.*; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Player.class) public class PlayerBreathingMixin { @@ -32,7 +25,7 @@ public class PlayerBreathingMixin { */ @Overwrite protected boolean updateIsUnderwater() { - var isInWater = ((Player)(Object)this).isEyeInFluid(FluidTags.WATER); + var isInWater = ((Player) (Object) this).isEyeInFluid(FluidTags.WATER); if (isInWater != this.wasUnderwater) { this.wasUnderwater = isInWater; if (!isInWater) _$didTurtleEffect = false; @@ -46,11 +39,11 @@ protected boolean updateIsUnderwater() { */ @Overwrite private void turtleHelmetTick() { - ItemStack itemstack = ((Player)(Object)this).getItemBySlot(EquipmentSlot.HEAD); + ItemStack itemstack = ((Player) (Object) this).getItemBySlot(EquipmentSlot.HEAD); if (itemstack.is(Items.TURTLE_HELMET) && this.wasUnderwater && !_$didTurtleEffect) { _$didTurtleEffect = true; - ((Player)(Object)this).addEffect(new MobEffectInstance(MobEffects.WATER_BREATHING, 200, 0, false, false, true)); + ((Player) (Object) this) + .addEffect(new MobEffectInstance(MobEffects.WATER_BREATHING, 200, 0, false, false, true)); } } - } diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/StarKillerMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/StarKillerMixin.java new file mode 100644 index 000000000..96a5f50ec --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/StarKillerMixin.java @@ -0,0 +1,59 @@ +package com.ghostipedia.cosmiccore.mixin; + +import com.ghostipedia.cosmiccore.common.data.CosmicItems; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; + +import com.mojang.blaze3d.systems.RenderSystem; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(LevelRenderer.class) +public class StarKillerMixin { + + @Shadow + @Final + private Minecraft minecraft; + @Shadow + @Final + private static ResourceLocation SUN_LOCATION; + + private static final ResourceLocation COSMIC_SUN = ResourceLocation.fromNamespaceAndPath("cosmiccore", + "textures/environment/blackhole.png"); + + // Redirect the exact moment vanilla binds a sky texture; swap only when it's the sun + @Redirect( + method = "renderSky", + at = @At( + value = "INVOKE", + target = "Lcom/mojang/blaze3d/systems/RenderSystem;setShaderTexture(ILnet/minecraft/resources/ResourceLocation;)V")) + private void cosmiccore$swapSunTexture(int unit, ResourceLocation original) { + // Only replace the SUN texture, leave MOON/stars/etc. alone + if (original.equals(SUN_LOCATION) && shouldUseCosmicSun()) { + RenderSystem.setShaderTexture(unit, COSMIC_SUN); + RenderSystem.setShaderColor(1f, 1f, 1f, 1f); + + RenderSystem.defaultBlendFunc(); + } else { + RenderSystem.setShaderTexture(unit, original); + } + } + + private boolean shouldUseCosmicSun() { + Player p = minecraft.player; + if (p == null) return false; + + ItemStack main = p.getMainHandItem(); + ItemStack off = p.getOffhandItem(); + var special = CosmicItems.ABERRANT_ESSENCE.get(); + + return main.is(special) || off.is(special); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/TagPrefixItemMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/TagPrefixItemMixin.java new file mode 100644 index 000000000..2a797cd24 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/TagPrefixItemMixin.java @@ -0,0 +1,67 @@ +package com.ghostipedia.cosmiccore.mixin; + +import com.ghostipedia.cosmiccore.api.data.material.property.CCoreMaterialIconSet; +import com.ghostipedia.cosmiccore.client.renderer.item.CosmicCoreItemRendererProvider; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.data.chemical.material.Material; +import com.gregtechceu.gtceu.api.data.tag.TagPrefix; +import com.gregtechceu.gtceu.api.item.TagPrefixItem; +import com.gregtechceu.gtceu.api.item.component.ICustomRenderer; + +import com.lowdragmc.lowdraglib.client.renderer.IRenderer; + +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; + +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = TagPrefixItem.class, remap = false) +public class TagPrefixItemMixin extends Item implements CosmicCoreItemRendererProvider { + + @Shadow + @Final + public TagPrefix tagPrefix; + @Shadow + @Final + public Material material; + + @Unique + private ICustomRenderer cosmicCore$customRenderer; + + public TagPrefixItemMixin(Properties properties) { + super(properties); + } + + @Inject(method = "(Lnet/minecraft/world/item/Item$Properties;Lcom/gregtechceu/gtceu/api/data/tag/TagPrefix;Lcom/gregtechceu/gtceu/api/data/chemical/material/Material;)V", + at = @At(value = "RETURN"), + remap = false) + private void TagPrefixItem(Item.Properties properties, TagPrefix tagPrefix, Material material, CallbackInfo ci) { + if (GTCEu.isClientSide()) { + if (material.getMaterialIconSet() instanceof CCoreMaterialIconSet iconSet) { + cosmicCore$customRenderer = iconSet.getCustomRender(); + } + + } + } + + @Override + public ICustomRenderer getRenderInfo(ItemStack itemStack) { + return cosmicCore$customRenderer; + } + + @Override + public @Nullable IRenderer getRenderer(ItemStack stack) { + if (cosmicCore$customRenderer != null) { + return cosmicCore$customRenderer.getRenderer(); + } + return null; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/accessor/CubicSplineMultipointAccessor.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/accessor/CubicSplineMultipointAccessor.java new file mode 100644 index 000000000..c324a0f33 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/accessor/CubicSplineMultipointAccessor.java @@ -0,0 +1,22 @@ +package com.ghostipedia.cosmiccore.mixin.accessor; + +import net.minecraft.util.CubicSpline; +import net.minecraft.util.ToFloatFunction; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +import java.util.List; + +@Mixin(CubicSpline.Multipoint.class) +public interface CubicSplineMultipointAccessor> { + + @Invoker("create") + static > CubicSpline.Multipoint cosmiccore$create( + I coordinate, + float[] locations, + List> values, + float[] derivatives) { + throw new AssertionError(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/accessor/GTMMEBufferAccessor.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/accessor/GTMMEBufferAccessor.java new file mode 100644 index 000000000..35f3d4fc9 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/accessor/GTMMEBufferAccessor.java @@ -0,0 +1,17 @@ +package com.ghostipedia.cosmiccore.mixin.accessor; + +import com.gregtechceu.gtceu.integration.ae2.machine.MEPatternBufferPartMachine; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(MEPatternBufferPartMachine.class) +public interface GTMMEBufferAccessor { + + @Accessor("MAX_PATTERN_COUNT") + @Mutable + static void setMaxPatternCount(int value) { + throw new AssertionError(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/accessor/LivingEntityAccessor.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/accessor/LivingEntityAccessor.java new file mode 100644 index 000000000..49bbdcc4d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/accessor/LivingEntityAccessor.java @@ -0,0 +1,13 @@ +package com.ghostipedia.cosmiccore.mixin.accessor; + +import net.minecraft.world.entity.LivingEntity; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(LivingEntity.class) +public interface LivingEntityAccessor { + + @Invoker + void callRemoveEffectParticles(); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/accessor/LootTableAccessor.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/accessor/LootTableAccessor.java new file mode 100644 index 000000000..c25ce681e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/accessor/LootTableAccessor.java @@ -0,0 +1,16 @@ +package com.ghostipedia.cosmiccore.mixin.accessor; + +import net.minecraft.world.level.storage.loot.LootPool; +import net.minecraft.world.level.storage.loot.LootTable; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; + +@Mixin(LootTable.class) +public interface LootTableAccessor { + + @Accessor(value = "pools") + List getPools(); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/accessor/MBPatternAccessor.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/accessor/MBPatternAccessor.java new file mode 100644 index 000000000..4a9f5a16b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/accessor/MBPatternAccessor.java @@ -0,0 +1,21 @@ +package com.ghostipedia.cosmiccore.mixin.accessor; + +import com.gregtechceu.gtceu.api.gui.widget.PatternPreviewWidget; +import com.gregtechceu.gtceu.api.pattern.TraceabilityPredicate; + +import net.minecraft.core.BlockPos; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.Map; + +/** + * Accessor mixin to access package-private fields in MBPattern inner class. + */ +@Mixin(value = PatternPreviewWidget.MBPattern.class, remap = false) +public interface MBPatternAccessor { + + @Accessor("predicateMap") + Map cosmiccore$getPredicateMap(); +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/client/CosmicCoreRemainingAirOverlayMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/client/CosmicCoreRemainingAirOverlayMixin.java index 80f7a67d1..bb7087ff4 100644 --- a/src/main/java/com/ghostipedia/cosmiccore/mixin/client/CosmicCoreRemainingAirOverlayMixin.java +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/client/CosmicCoreRemainingAirOverlayMixin.java @@ -1,22 +1,32 @@ package com.ghostipedia.cosmiccore.mixin.client; -import com.simibubi.create.content.equipment.armor.RemainingAirOverlay; +import com.ghostipedia.cosmiccore.common.breath.OxygenHelper; + import net.minecraft.client.player.LocalPlayer; -import net.minecraft.tags.FluidTags; -import net.minecraft.tags.TagKey; +import net.neoforged.neoforge.fluids.FluidType; + +import com.simibubi.create.content.equipment.armor.RemainingAirOverlay; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; -import com.ghostipedia.cosmiccore.common.breath.OxygenHelper; - -@Mixin(value=RemainingAirOverlay.class) +@Mixin(value = RemainingAirOverlay.class, remap = false) public class CosmicCoreRemainingAirOverlayMixin { - - @Redirect(method="render", at=@At(value="INVOKE", target="Lnet/minecraft/client/player/LocalPlayer;isEyeInFluid(Lnet/minecraft/tags/TagKey;)Z")) - private boolean render(LocalPlayer instance, TagKey tagKey) { - return instance.isEyeInFluid(FluidTags.WATER) || OxygenHelper.airQualityActivatesHelmet(instance); + /** + * Make the air overlay show when air quality is bad, even if not in fluid. + * Redirects the fluidType.isAir() check to return false when bad air activates helmet. + */ + @Redirect(method = "render", + at = @At(value = "INVOKE", + target = "Lnet/neoforged/neoforge/fluids/FluidType;isAir()Z"), + remap = false) + private boolean cosmicCore$redirectIsAir(FluidType fluidType) { + LocalPlayer player = net.minecraft.client.Minecraft.getInstance().player; + // If air quality is bad, pretend we're NOT in air so overlay shows + if (player != null && OxygenHelper.airQualityActivatesHelmet(player)) { + return false; + } + return fluidType.isAir(); } - } diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/client/CosmicLegendOverhaulMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/client/CosmicLegendOverhaulMixin.java new file mode 100644 index 000000000..8e5fe397f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/client/CosmicLegendOverhaulMixin.java @@ -0,0 +1,33 @@ +package com.ghostipedia.cosmiccore.mixin.client; + +// import sfiomn.legendarysurvivaloverhaul.client.events.ClientModBusEvents; +// +// import static sfiomn.legendarysurvivaloverhaul.client.integration.sereneseasons.RenderSeasonCards.SEASON_CARD_GUI; +// import static sfiomn.legendarysurvivaloverhaul.client.render.RenderBodyDamageGui.BODY_DAMAGE_GUI; +// import static sfiomn.legendarysurvivaloverhaul.client.render.RenderTemperatureGui.FOOD_BAR_COLD_EFFECT_GUI; +// import static sfiomn.legendarysurvivaloverhaul.client.render.RenderTemperatureOverlay.TEMPERATURE_OVERLAY; +// import static sfiomn.legendarysurvivaloverhaul.client.render.RenderThirstGui.THIRST_GUI; +// import static sfiomn.legendarysurvivaloverhaul.client.render.RenderTooltipFrame.TOOLTIP_ITEM_FRAME; + +public abstract class CosmicLegendOverhaulMixin { + /** + * @author God + * @reason FUK + * don't ask why HEALTH_GUI marks itself as red, i can't get it to import but it works on the overwrite so + * SHRUG + */ + // @Overwrite + // @SubscribeEvent + // public static void registerGuiOverlays(RegisterGuiOverlaysEvent event) { + // event.registerBelow(VanillaGuiOverlay.FOOD_LEVEL.id(), "cold_hunger", FOOD_BAR_COLD_EFFECT_GUI); + // + // event.registerAbove(VanillaGuiOverlay.FOOD_LEVEL.id(), "thirst", THIRST_GUI); + // + // event.registerAbove(VanillaGuiOverlay.FOOD_LEVEL.id(), "body_damage", BODY_DAMAGE_GUI); + // + // event.registerAbove(VanillaGuiOverlay.ITEM_NAME.id(), "item_frame_tooltip", TOOLTIP_ITEM_FRAME); + // + // event.registerAbove(VanillaGuiOverlay.ITEM_NAME.id(), "season_card", SEASON_CARD_GUI); + // } + +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/client/MinecraftMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/client/MinecraftMixin.java new file mode 100644 index 000000000..da61a5769 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/client/MinecraftMixin.java @@ -0,0 +1,27 @@ +package com.ghostipedia.cosmiccore.mixin.client; + +import com.ghostipedia.cosmiccore.CosmicUtils; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.world.entity.Entity; + +import com.llamalad7.mixinextras.injector.ModifyReturnValue; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; + +import javax.annotation.Nullable; + +@Mixin(Minecraft.class) +public class MinecraftMixin { + + @Shadow + @Nullable + public LocalPlayer player; + + @ModifyReturnValue(method = "shouldEntityAppearGlowing", at = @At("RETURN")) + private boolean cosmiccore$makeRingGlow(boolean original, Entity entity) { + return original || (CosmicUtils.hasTheOneRing(player) && CosmicUtils.hasTheOneRing(entity)); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/client/PatternPreviewWidgetMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/client/PatternPreviewWidgetMixin.java new file mode 100644 index 000000000..4b59ff006 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/client/PatternPreviewWidgetMixin.java @@ -0,0 +1,53 @@ +package com.ghostipedia.cosmiccore.mixin.client; + +import com.ghostipedia.cosmiccore.mixin.accessor.MBPatternAccessor; + +import com.gregtechceu.gtceu.api.gui.widget.PatternPreviewWidget; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * Mixin to fix NPE crash when clicking on blocks in EMI multiblock preview + * when the pattern uses predicates that accept air (for tiered multiblocks). + * + * The crash occurs because patterns[index].predicateMap is null when the + * pattern's checkPatternAt() fails during preview generation (which happens + * when tier-detecting predicates accept air instead of actual blocks). + */ +@Mixin(value = PatternPreviewWidget.class, remap = false) +public abstract class PatternPreviewWidgetMixin { + + @Shadow + @Final + public PatternPreviewWidget.MBPattern[] patterns; + + @Shadow + private int index; + + /** + * Inject at the head of onPosSelected to bail out early if predicateMap is null. + * This prevents the NPE crash while still allowing the preview to render. + */ + @Inject(method = "onPosSelected", at = @At("HEAD"), cancellable = true) + private void cosmiccore$preventNullPredicateMapCrash(BlockPos pos, Direction facing, CallbackInfo ci) { + if (patterns != null && index >= 0 && index < patterns.length) { + PatternPreviewWidget.MBPattern pattern = patterns[index]; + if (pattern != null) { + // Use accessor to check if predicateMap is null + var predicateMap = ((MBPatternAccessor) (Object) pattern).cosmiccore$getPredicateMap(); + if (predicateMap == null) { + // predicateMap is null, bail out to prevent NPE + ci.cancel(); + } + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/client/SoundManagerMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/client/SoundManagerMixin.java new file mode 100644 index 000000000..3651930be --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/client/SoundManagerMixin.java @@ -0,0 +1,64 @@ +package com.ghostipedia.cosmiccore.mixin.client; + +import com.ghostipedia.cosmiccore.CosmicUtils; +import com.ghostipedia.cosmiccore.common.data.CosmicItems; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.player.LocalPlayer; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.client.resources.sounds.SoundInstance; +import net.minecraft.client.sounds.SoundEngine; +import net.minecraft.client.sounds.SoundManager; +import net.minecraft.sounds.SoundSource; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = SoundManager.class, priority = 999) +public abstract class SoundManagerMixin { + + @Shadow + @Final + private SoundEngine soundEngine; + + @Inject(method = "play", at = @At("HEAD"), cancellable = true) + private void onPlay(SoundInstance sound, CallbackInfo callbackInfo) { + if (cosmicCore$checkForSpaceRadio()) { + callbackInfo.cancel(); // Early exits Ad Astra's mixin from being called. Hopefully + ClientLevel level = Minecraft.getInstance().level; + if (level != null) { + SoundSource source = sound.getSource(); + Minecraft.getInstance().execute(() -> { + float volume = 1.0F; + SoundInstance newSound = new SimpleSoundInstance(sound.getLocation(), source, volume, 0F, + Minecraft.getInstance().level.random, sound.isLooping(), 0, sound.getAttenuation(), + sound.getX(), sound.getY(), sound.getZ(), sound.isRelative()); + this.soundEngine.play(newSound); + + }); + } + } + } + + @Inject(method = "playDelayed", at = @At("HEAD"), cancellable = true) + private void onPlayDelayed(SoundInstance sound, int delay, CallbackInfo callbackInfo) { + if (cosmicCore$checkForSpaceRadio()) { + callbackInfo.cancel(); + } + } + + @Unique + private boolean cosmicCore$checkForSpaceRadio() { + LocalPlayer player = Minecraft.getInstance().player; + if (player != null) { + return CosmicUtils.hasCurio(player, "head", CosmicItems.SPACE_RADIO.asItem()); + } + return false; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/EmiFavoritesMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/EmiFavoritesMixin.java new file mode 100644 index 000000000..e4250f110 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/EmiFavoritesMixin.java @@ -0,0 +1,103 @@ +package com.ghostipedia.cosmiccore.mixin.emi; + +import com.ghostipedia.cosmiccore.integration.emi.CosmicFavorite; +import com.ghostipedia.cosmiccore.integration.emi.CosmicRecipeFavorite; +import com.ghostipedia.cosmiccore.integration.emi.favorites.CosmicBookmarkManager; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.api.stack.serializer.EmiIngredientSerializer; +import dev.emi.emi.runtime.EmiFavorite; +import dev.emi.emi.runtime.EmiFavorites; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.ArrayList; +import java.util.List; + +/** + * Persists CosmicFavorite amounts through EMI's save/load cycle, + * and hooks into EMI's save/load to trigger our bookmark group persistence. + */ +@Mixin(value = EmiFavorites.class, remap = false) +public class EmiFavoritesMixin { + + @Shadow + public static List favorites; + + @Inject(method = "save", at = @At("RETURN")) + private static void cosmiccore$saveAmounts(CallbackInfoReturnable cir) { + JsonArray arr = cir.getReturnValue(); + if (arr == null) return; + + for (int i = 0; i < favorites.size() && i < arr.size(); i++) { + EmiFavorite fav = favorites.get(i); + JsonElement el = arr.get(i); + if (!el.isJsonObject()) continue; + JsonObject obj = el.getAsJsonObject(); + + if (fav instanceof CosmicRecipeFavorite recipe) { + obj.addProperty("cosmicType", "recipe"); + obj.addProperty("cosmicOutputAmount", recipe.getOutputAmount()); + + JsonArray inputsArr = new JsonArray(); + for (CosmicRecipeFavorite.InputEntry input : recipe.getInputs()) { + JsonObject inputObj = new JsonObject(); + inputObj.add("stack", EmiIngredientSerializer.getSerialized(input.stack())); + inputObj.addProperty("amount", input.amount()); + inputsArr.add(inputObj); + } + obj.add("cosmicInputs", inputsArr); + } else if (fav instanceof CosmicFavorite cosmic) { + obj.addProperty("cosmicAmount", cosmic.getAmount()); + } + } + + CosmicBookmarkManager.getInstance().save(); + } + + @Inject(method = "load", at = @At("RETURN")) + private static void cosmiccore$loadAmounts(JsonArray arr, CallbackInfo ci) { + CosmicBookmarkManager.getInstance().load(); + + if (arr == null) return; + + for (int i = 0; i < arr.size() && i < favorites.size(); i++) { + JsonElement el = arr.get(i); + if (!el.isJsonObject()) continue; + + JsonObject obj = el.getAsJsonObject(); + EmiFavorite existing = favorites.get(i); + + if (obj.has("cosmicType") && "recipe".equals(obj.get("cosmicType").getAsString())) { + long outputAmount = obj.has("cosmicOutputAmount") ? obj.get("cosmicOutputAmount").getAsLong() : 1; + List inputs = new ArrayList<>(); + + if (obj.has("cosmicInputs")) { + for (JsonElement inputEl : obj.getAsJsonArray("cosmicInputs")) { + if (!inputEl.isJsonObject()) continue; + JsonObject inputObj = inputEl.getAsJsonObject(); + if (!inputObj.has("stack")) continue; + + EmiIngredient stack = EmiIngredientSerializer.getDeserialized(inputObj.get("stack")); + long amount = inputObj.has("amount") ? inputObj.get("amount").getAsLong() : 1; + if (!stack.isEmpty()) { + inputs.add(new CosmicRecipeFavorite.InputEntry(stack, amount)); + } + } + } + + favorites.set(i, new CosmicRecipeFavorite(existing.getStack(), outputAmount, inputs)); + } else if (obj.has("cosmicAmount")) { + long amount = obj.get("cosmicAmount").getAsLong(); + favorites.set(i, new CosmicFavorite(existing.getStack(), amount)); + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/EmiScreenManagerMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/EmiScreenManagerMixin.java new file mode 100644 index 000000000..816705082 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/EmiScreenManagerMixin.java @@ -0,0 +1,329 @@ +package com.ghostipedia.cosmiccore.mixin.emi; + +import com.ghostipedia.cosmiccore.integration.emi.CosmicFavorite; +import com.ghostipedia.cosmiccore.integration.emi.CosmicRecipeFavorite; +import com.ghostipedia.cosmiccore.integration.emi.RecipeScreenAccessor; +import com.ghostipedia.cosmiccore.integration.emi.favorites.CosmicBookmarkGroup; +import com.ghostipedia.cosmiccore.integration.emi.favorites.CosmicBookmarkManager; + +import net.minecraft.client.Minecraft; + +import dev.emi.emi.api.recipe.EmiRecipe; +import dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.api.stack.EmiStack; +import dev.emi.emi.api.stack.EmiStackInteraction; +import dev.emi.emi.config.EmiConfig; +import dev.emi.emi.config.SidebarType; +import dev.emi.emi.input.EmiInput; +import dev.emi.emi.registry.EmiStackProviders; +import dev.emi.emi.runtime.EmiFavorites; +import dev.emi.emi.screen.EmiScreenManager; +import dev.emi.emi.screen.EmiScreenManager.SidebarPanel; +import org.lwjgl.glfw.GLFW; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.ArrayList; +import java.util.List; + +/** + * Adds CTRL+A to pin stacks with their amount, CTRL+scroll to adjust pinned amounts, + * and [ / ] keys to cycle bookmark groups. + */ +@Mixin(value = EmiScreenManager.class, remap = false) +public abstract class EmiScreenManagerMixin { + + @Shadow + private static int lastMouseX; + @Shadow + private static int lastMouseY; + + @Shadow + public static EmiStackInteraction getHoveredStack(int mouseX, int mouseY, boolean notClick) { + throw new AssertionError(); + } + + @Shadow + public static void repopulatePanels(SidebarType type) { + throw new AssertionError(); + } + + @Shadow + private static List panels; + + // SHIFT+click on page arrows to cycle groups, MMB to create/delete groups + @Inject(method = "mouseClicked", at = @At("HEAD"), cancellable = true) + private static void cosmiccore$groupMouseControls(double mouseX, double mouseY, int button, + CallbackInfoReturnable cir) { + CosmicBookmarkManager manager = CosmicBookmarkManager.getInstance(); + + // Block CTRL+click drag reordering for recipe groups - EMI's slot-based drag doesn't work + // with our multi-slot recipe layout + if (button == 0 && EmiInput.isControlDown() && manager.getActiveGroup().isRecipeGroup()) { + for (SidebarPanel panel : panels) { + if (panel.getType() != SidebarType.FAVORITES) continue; + if (panel.space == null) continue; + + int px = panel.space.tx; + int py = panel.space.ty; + int pw = panel.space.tw * 18; + int ph = panel.space.th * 18; + + if (mouseX >= px && mouseX < px + pw && mouseY >= py && mouseY < py + ph) { + // Consume the click to prevent EMI's drag from starting + cir.setReturnValue(true); + return; + } + } + } + + // Middle mouse button on favorites panel header: + // MMB = create regular group + // SHIFT+MMB = create recipe group + // CTRL+SHIFT+MMB = delete group + if (button == 2) { + for (SidebarPanel panel : panels) { + if (panel.getType() != SidebarType.FAVORITES) continue; + if (!cosmiccore$isOverFavoritesHeader(panel, mouseX, mouseY)) continue; + + if (EmiInput.isControlDown() && EmiInput.isShiftDown()) { + manager.removeGroup(manager.getActiveIndex()); + } else if (EmiInput.isShiftDown()) { + manager.addGroup("Recipe " + (manager.getGroupCount() + 1), CosmicBookmarkGroup.GroupType.RECIPE); + } else { + manager.addGroup("Group " + (manager.getGroupCount() + 1)); + } + repopulatePanels(SidebarType.FAVORITES); + cir.setReturnValue(true); + return; + } + } + + // SHIFT+left click on page arrows to cycle groups + if (button == 0 && EmiInput.isShiftDown() && !EmiInput.isControlDown()) { + for (SidebarPanel panel : panels) { + if (panel.getType() != SidebarType.FAVORITES) continue; + + if (panel.pageLeft.isMouseOver(mouseX, mouseY)) { + manager.prevGroup(); + repopulatePanels(SidebarType.FAVORITES); + cir.setReturnValue(true); + return; + } else if (panel.pageRight.isMouseOver(mouseX, mouseY)) { + manager.nextGroup(); + repopulatePanels(SidebarType.FAVORITES); + cir.setReturnValue(true); + return; + } + } + } + } + + @Unique + private static boolean cosmiccore$isOverFavoritesHeader(SidebarPanel panel, double mouseX, double mouseY) { + if (panel.space == null) return false; + int headerY = panel.space.ty - 18; + int headerHeight = 18; + int headerX = panel.space.tx; + int headerWidth = panel.space.tw * 18; + return mouseX >= headerX && mouseX < headerX + headerWidth && mouseY >= headerY && + mouseY < headerY + headerHeight; + } + + // [ and ] keys to cycle bookmark groups + @Inject(method = "keyPressed", at = @At("HEAD"), cancellable = true) + private static void cosmiccore$cycleGroups(int keyCode, int scanCode, int modifiers, + CallbackInfoReturnable cir) { + CosmicBookmarkManager manager = CosmicBookmarkManager.getInstance(); + + if (keyCode == GLFW.GLFW_KEY_RIGHT_BRACKET) { + manager.nextGroup(); + repopulatePanels(SidebarType.FAVORITES); + cir.setReturnValue(true); + } else if (keyCode == GLFW.GLFW_KEY_LEFT_BRACKET) { + manager.prevGroup(); + repopulatePanels(SidebarType.FAVORITES); + cir.setReturnValue(true); + } else if (keyCode == GLFW.GLFW_KEY_BACKSLASH && EmiInput.isControlDown()) { + if (EmiInput.isShiftDown()) { + manager.addGroup("Recipe " + (manager.getGroupCount() + 1), CosmicBookmarkGroup.GroupType.RECIPE); + } else { + manager.addGroup("Group " + (manager.getGroupCount() + 1)); + } + repopulatePanels(SidebarType.FAVORITES); + cir.setReturnValue(true); + } + } + + // Handle favorite key: plain A removes CosmicRecipeFavorite, CTRL+A pins with amount, CTRL+SHIFT+A pins recipe + @Inject(method = "keyPressed", at = @At("HEAD"), cancellable = true) + private static void cosmiccore$ctrlAPin(int keyCode, int scanCode, int modifiers, + CallbackInfoReturnable cir) { + boolean ctrl = EmiInput.isControlDown(); + boolean shift = EmiInput.isShiftDown(); + boolean isFavKey = cosmiccore$isFavoriteKey(keyCode); + + if (!isFavKey) return; + + CosmicBookmarkManager manager = CosmicBookmarkManager.getInstance(); + + // Plain A on recipe group: find and remove the hovered recipe + if (!ctrl && !shift && manager.getActiveGroup().isRecipeGroup()) { + CosmicRecipeFavorite recipe = cosmiccore$getHoveredRecipeFavorite(); + if (recipe != null) { + EmiFavorites.favorites.remove(recipe); + repopulatePanels(SidebarType.FAVORITES); + cir.setReturnValue(true); + return; + } + } + + // Plain A on regular favorites: let EMI handle it + if (!ctrl && !shift) { + return; + } + + if (!ctrl) return; + + var screen = Minecraft.getInstance().screen; + + // CTRL+SHIFT+A: Toggle recipe favorite (add or remove) + if (shift && screen instanceof RecipeScreenAccessor recipeScreen) { + EmiRecipe recipe = recipeScreen.getHoveredRecipe(lastMouseX, lastMouseY); + if (recipe != null && !recipe.getOutputs().isEmpty()) { + EmiStack output = recipe.getOutputs().get(0); + + // Check if a matching recipe favorite already exists - remove it if so + int existingIndex = cosmiccore$findRecipeFavoriteIndex(output); + if (existingIndex >= 0) { + EmiFavorites.favorites.remove(existingIndex); + repopulatePanels(SidebarType.FAVORITES); + cir.setReturnValue(true); + return; + } + + // Switch to recipe group if needed + if (!manager.getActiveGroup().isRecipeGroup()) { + int recipeGroupIndex = cosmiccore$findOrCreateRecipeGroup(manager); + manager.setActiveIndex(recipeGroupIndex); + } + + long outputAmount = output.getAmount(); + if (outputAmount <= 0) outputAmount = 1; + + // Build input list + List inputs = new ArrayList<>(); + for (EmiIngredient input : recipe.getInputs()) { + if (input.isEmpty()) continue; + long inputAmount = input.getEmiStacks().isEmpty() ? 1 : input.getEmiStacks().get(0).getAmount(); + if (inputAmount <= 0) inputAmount = 1; + inputs.add(new CosmicRecipeFavorite.InputEntry(input, inputAmount)); + } + + CosmicRecipeFavorite recipeFav = new CosmicRecipeFavorite(output, outputAmount, inputs); + EmiFavorites.favorites.add(recipeFav); + + repopulatePanels(SidebarType.FAVORITES); + cir.setReturnValue(true); + return; + } + } + + // CTRL+A: Pin stack with amount (existing behavior) + EmiIngredient hoveredIngredient = EmiStack.EMPTY; + + EmiStackInteraction sidebarHovered = getHoveredStack(lastMouseX, lastMouseY, true); + if (!sidebarHovered.getStack().isEmpty()) { + hoveredIngredient = sidebarHovered.getStack(); + } else { + if (screen instanceof RecipeScreenAccessor recipeScreen) { + hoveredIngredient = recipeScreen.getHoveredStack(lastMouseX, lastMouseY); + } + if (hoveredIngredient.isEmpty() && screen != null) { + hoveredIngredient = EmiStackProviders.getStackAt(screen, lastMouseX, lastMouseY, true).getStack(); + } + } + + if (hoveredIngredient.isEmpty()) return; + + long amount = hoveredIngredient.getEmiStacks().isEmpty() ? 1 : + hoveredIngredient.getEmiStacks().get(0).getAmount(); + if (amount <= 0) amount = 1; + + EmiFavorites.addFavorite(new CosmicFavorite(hoveredIngredient, amount), null); + repopulatePanels(SidebarType.FAVORITES); + cir.setReturnValue(true); + } + + @Unique + private static int cosmiccore$findOrCreateRecipeGroup(CosmicBookmarkManager manager) { + for (int i = 0; i < manager.getGroupCount(); i++) { + if (manager.getGroupAt(i).isRecipeGroup()) { + return i; + } + } + manager.addGroup("Recipe " + (manager.getGroupCount() + 1), CosmicBookmarkGroup.GroupType.RECIPE); + return manager.getGroupCount() - 1; + } + + @Unique + private static int cosmiccore$findRecipeFavoriteIndex(EmiIngredient output) { + for (int i = 0; i < EmiFavorites.favorites.size(); i++) { + if (EmiFavorites.favorites.get(i) instanceof CosmicRecipeFavorite recipeFav) { + if (recipeFav.strictEquals(output)) { + return i; + } + } + } + return -1; + } + + @Inject(method = "mouseScrolled", at = @At("HEAD"), cancellable = true) + private static void cosmiccore$ctrlScrollAdjust(double mouseX, double mouseY, double scrollDelta, + CallbackInfoReturnable cir) { + if (!EmiInput.isControlDown()) return; + + EmiStackInteraction hovered = getHoveredStack((int) mouseX, (int) mouseY, true); + if (!(hovered.getStack() instanceof CosmicFavorite fav)) return; + + long step = fav.getScrollStep(EmiInput.isShiftDown()); + fav.adjustAmount((long) scrollDelta * step); + + repopulatePanels(SidebarType.FAVORITES); + cir.setReturnValue(true); + } + + @Unique + private static boolean cosmiccore$isFavoriteKey(int keyCode) { + return EmiConfig.favorite.boundKeys.stream() + .anyMatch(k -> k.key().getValue() == keyCode); + } + + @Unique + private static CosmicRecipeFavorite cosmiccore$getHoveredRecipeFavorite() { + CosmicBookmarkManager manager = CosmicBookmarkManager.getInstance(); + if (!manager.getActiveGroup().isRecipeGroup()) return null; + + for (SidebarPanel panel : panels) { + if (panel.getType() != SidebarType.FAVORITES) continue; + if (panel.space == null) continue; + + int tx = panel.space.tx; + int ty = panel.space.ty; + int tw = panel.space.tw; + int th = panel.space.th; + + CosmicRecipeFavorite recipe = manager.getRecipeAtPosition( + lastMouseX, lastMouseY, tx, ty, tw, th, manager.getCurrentRecipePage()); + if (recipe != null) { + return recipe; + } + } + + return null; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/RecipeScreenMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/RecipeScreenMixin.java new file mode 100644 index 000000000..e5c172fed --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/RecipeScreenMixin.java @@ -0,0 +1,196 @@ +package com.ghostipedia.cosmiccore.mixin.emi; + +import com.ghostipedia.cosmiccore.integration.emi.RecipeScreenAccessor; + +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; + +import dev.emi.emi.EmiRenderHelper; +import dev.emi.emi.api.EmiApi; +import dev.emi.emi.api.recipe.EmiRecipe; +import dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.api.stack.EmiStack; +import dev.emi.emi.api.widget.Bounds; +import dev.emi.emi.api.widget.SlotWidget; +import dev.emi.emi.api.widget.Widget; +import dev.emi.emi.config.EmiConfig; +import dev.emi.emi.config.SidebarSide; +import dev.emi.emi.runtime.EmiDrawContext; +import dev.emi.emi.screen.RecipeScreen; +import dev.emi.emi.screen.RecipeTab; +import dev.emi.emi.screen.WidgetGroup; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.List; + +@Mixin(value = RecipeScreen.class, remap = false) +public abstract class RecipeScreenMixin extends Screen implements RecipeScreenAccessor { + + @Shadow(remap = false) + int x; + + @Shadow(remap = false) + int backgroundHeight; + + @Shadow(remap = false) + int backgroundWidth; + + protected RecipeScreenMixin(Component title) { + super(title); + } + + @Shadow(remap = false) + public abstract int getResolveOffset(); + + @Shadow(remap = false) + int y; + + @Shadow(remap = false) + private List tabs; + + @Shadow(remap = false) + private int tab; + + @Shadow(remap = false) + private List currentPage; + + /** + * @author CosmicCore + * @reason Multi-column workstation layout for categories with many workstations + */ + @Overwrite(remap = false) + public Bounds getWorkstationBounds(int i) { + int offset = 0; + boolean isBackground = (i == -1); + if (isBackground) { + i = 0; + offset = -getResolveOffset(); + } + + int maxPerColumn = cosmicCore$maxWorkstations(); + int column = maxPerColumn > 0 ? i / maxPerColumn : 0; + int row = maxPerColumn > 0 ? i % maxPerColumn : i; + + if (EmiConfig.workstationLocation == SidebarSide.LEFT) { + int slotX = isBackground ? x - 18 : x - 18 * (column + 1); + return new Bounds(slotX, y + 9 + getResolveOffset() + row * 18 + offset, 18, 18); + } else if (EmiConfig.workstationLocation == SidebarSide.RIGHT) { + int slotX = isBackground ? x + backgroundWidth : x + backgroundWidth + 18 * column; + return new Bounds(slotX, y + 9 + getResolveOffset() + row * 18 + offset, 18, 18); + } else if (EmiConfig.workstationLocation == SidebarSide.BOTTOM) { + return new Bounds(x + 5 + getResolveOffset() + i * 18 + offset, y + backgroundHeight - 23, 18, 18); + } + return Bounds.EMPTY; + } + + /** + * @author CosmicCore + * @reason Increase max workstations for multi-column layout + */ + @Overwrite(remap = false) + public int getMaxWorkstations() { + return 23; + } + + @Unique + private int cosmicCore$getWorkstationAmount() { + int total = EmiApi.getRecipeManager().getWorkstations(tabs.get(tab).category).size(); + return Math.min(total, getMaxWorkstations()); + } + + @Unique + private int cosmicCore$maxWorkstations() { + return switch (EmiConfig.workstationLocation) { + case LEFT, RIGHT -> (backgroundHeight - getResolveOffset() - 18) / 18; + case BOTTOM -> (backgroundWidth - getResolveOffset() - 18) / 18; + default -> 0; + }; + } + + @Unique + private int cosmicCore$getColumnCount() { + int workstations = cosmicCore$getWorkstationAmount(); + int maxPerColumn = cosmicCore$maxWorkstations(); + if (maxPerColumn <= 0) return 1; + return (workstations + maxPerColumn - 1) / maxPerColumn; + } + + @Redirect( + method = { "render(Lnet/minecraft/client/gui/GuiGraphics;IIF)V", + "m_88315_(Lnet/minecraft/client/gui/GuiGraphics;IIF)V" }, + at = @At(value = "INVOKE", + target = "Ldev/emi/emi/EmiRenderHelper;drawNinePatch(Ldev/emi/emi/runtime/EmiDrawContext;Lnet/minecraft/resources/ResourceLocation;IIIIIIII)V"), + remap = false, + require = 0) + private void cosmicCore$widenWorkstationBackground(EmiDrawContext context, ResourceLocation texture, int x, int y, + int width, int height, int u, int v, int cornerSize, + int centerSize) { + if (v == 0 && (u == 36 || u == 47 || u == 58)) { + int columns = cosmicCore$getColumnCount(); + if (columns > 1) { + int maxPerColumn = cosmicCore$maxWorkstations(); + int workstations = cosmicCore$getWorkstationAmount(); + int resolveOffset = (workstations > 0) ? 0 : getResolveOffset(); + int correctHeight = 10 + 18 * maxPerColumn + resolveOffset; + + if (u == 36) { + x -= 18 * (columns - 1); + width += 18 * (columns - 1); + height = correctHeight; + } else if (u == 47) { + width += 18 * (columns - 1); + height = correctHeight; + } + } + } + EmiRenderHelper.drawNinePatch(context, texture, x, y, width, height, u, v, cornerSize, centerSize); + } + + @Unique + public EmiIngredient getHoveredStack(int mouseX, int mouseY) { + if (currentPage == null) return EmiStack.EMPTY; + + for (WidgetGroup group : currentPage) { + for (Widget widget : group.widgets) { + if (widget instanceof SlotWidget slot) { + Bounds bounds = slot.getBounds(); + if (mouseX >= bounds.x() && mouseX < bounds.x() + bounds.width() && + mouseY >= bounds.y() && mouseY < bounds.y() + bounds.height()) { + return slot.getStack(); + } + } + } + } + return EmiStack.EMPTY; + } + + @Unique + @Nullable + public EmiRecipe getHoveredRecipe(int mouseX, int mouseY) { + if (currentPage == null) return null; + + EmiRecipe fallback = null; + + for (WidgetGroup group : currentPage) { + if (group.recipe == null) continue; + + if (fallback == null) { + fallback = group.recipe; + } + + if (mouseX >= group.x && mouseX < group.x + group.width && + mouseY >= group.y && mouseY < group.y + group.height) { + return group.recipe; + } + } + + return fallback; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/ScreenSpaceMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/ScreenSpaceMixin.java new file mode 100644 index 000000000..84c8d2981 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/ScreenSpaceMixin.java @@ -0,0 +1,315 @@ +package com.ghostipedia.cosmiccore.mixin.emi; + +import com.ghostipedia.cosmiccore.integration.emi.CosmicRecipeFavorite; +import com.ghostipedia.cosmiccore.integration.emi.favorites.CosmicBookmarkManager; +import com.ghostipedia.cosmiccore.integration.emi.favorites.RecipeRenderInfo; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.network.chat.Component; +import net.minecraft.world.level.material.Fluid; + +import dev.emi.emi.EmiRenderHelper; +import dev.emi.emi.api.stack.EmiIngredient; +import dev.emi.emi.api.stack.EmiStack; +import dev.emi.emi.config.SidebarType; +import dev.emi.emi.runtime.EmiDrawContext; +import dev.emi.emi.runtime.EmiFavorites; +import dev.emi.emi.screen.EmiScreenManager; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.ArrayList; +import java.util.List; + +/** + * Custom rendering for recipe-type bookmark groups. + * Recipe favorites display: [output with gold border] [input1] [input2] ... + * Wraps to next row when out of horizontal space. + */ +@Mixin(value = EmiScreenManager.ScreenSpace.class, remap = false) +public abstract class ScreenSpaceMixin { + + @Shadow + @Final + public int tx; + @Shadow + @Final + public int ty; + @Shadow + @Final + public int tw; + @Shadow + @Final + public int th; + @Shadow + @Final + public int pageSize; + + @Shadow + public abstract SidebarType getType(); + + @Shadow + public abstract List getStacks(); + + @Unique + private static final int SLOT_SIZE = 18; + + /** + * Override getStacks for recipe groups to return a fake list sized for proper pagination. + * EMI calculates page count as stacks.size() / pageSize, so we need enough "stacks" + * to create the right number of pages based on our row-based layout. + */ + @Inject(method = "getStacks", at = @At("HEAD"), cancellable = true) + private void cosmiccore$getStacksForRecipeGroup(CallbackInfoReturnable> cir) { + if (getType() != SidebarType.FAVORITES) return; + + CosmicBookmarkManager manager = CosmicBookmarkManager.getInstance(); + if (!manager.getActiveGroup().isRecipeGroup()) return; + + int recipePageCount = manager.getRecipePageCount(tw, th); + + // Return a list sized so EMI calculates the correct page count + // EMI does: (stacks.size() + pageSize - 1) / pageSize for total pages + // We want: recipePageCount pages + // So we need: recipePageCount * pageSize stacks (approximately) + int neededSize = recipePageCount * pageSize; + + // Create a list with the right size - contents don't matter since we override render + List fakeList = new ArrayList<>(neededSize); + for (int i = 0; i < neededSize; i++) { + fakeList.add(EmiStack.EMPTY); + } + cir.setReturnValue(fakeList); + } + + @Inject(method = "render", at = @At("HEAD"), cancellable = true) + private void cosmiccore$renderRecipeGroup(EmiDrawContext context, int mouseX, int mouseY, float delta, + int startIndex, CallbackInfo ci) { + if (getType() != SidebarType.FAVORITES) return; + + CosmicBookmarkManager manager = CosmicBookmarkManager.getInstance(); + if (!manager.getActiveGroup().isRecipeGroup()) return; + + ci.cancel(); + + if (Minecraft.getInstance() == null || Minecraft.getInstance().screen == null) return; + + Minecraft mc = Minecraft.getInstance(); + Font font = mc.font; + GuiGraphics gui = context.raw(); + + // Get recipes directly from EmiFavorites, not getStacks() which may filter them + List recipes = EmiFavorites.favorites.stream() + .filter(f -> f instanceof CosmicRecipeFavorite) + .map(f -> (CosmicRecipeFavorite) f) + .toList(); + + if (recipes.isEmpty()) { + String hint = "CTRL+SHIFT+A on recipe"; + int textX = tx + (tw * SLOT_SIZE - font.width(hint)) / 2; + int textY = ty + (th * SLOT_SIZE) / 2 - font.lineHeight / 2; + context.drawTextWithShadow(Component.literal(hint), textX, textY, 0xFF888888); + return; + } + + int gridWidth = tw; + int gridHeight = th; + int totalRows = gridHeight; + + // Calculate which recipes fit on current page with wrapping + // EMI's startIndex is slot-based, convert to recipe page number + // pageSize = tw * th (e.g., 81 for 9x9), startIndex increments by pageSize per page + int emiPage = pageSize > 0 ? startIndex / pageSize : 0; + // Use EMI's page directly - we've set up the page count to match + int currentPage = emiPage; + List renderList = cosmiccore$calculatePageLayout(recipes, gridWidth, totalRows, currentPage); + + // Find hovered slot for highlight + int hoveredRow = -1; + int hoveredCol = -1; + if (mouseX >= tx && mouseX < tx + tw * SLOT_SIZE && mouseY >= ty && mouseY < ty + th * SLOT_SIZE) { + hoveredRow = (mouseY - ty) / SLOT_SIZE; + hoveredCol = (mouseX - tx) / SLOT_SIZE; + } + + // FIRST PASS: Render items and borders + for (RecipeRenderInfo info : renderList) { + CosmicRecipeFavorite recipe = info.recipe(); + int currentRow = info.startRow(); + int currentCol = 0; + + // Draw hover highlight if mouse is over any slot of this recipe + if (hoveredRow >= info.startRow() && hoveredRow < info.startRow() + info.rowCount()) { + int relativeRow = hoveredRow - info.startRow(); + int slotIndex = relativeRow * gridWidth + hoveredCol; + if (slotIndex >= 0 && slotIndex < recipe.getTotalSlots()) { + int slotX = tx + hoveredCol * SLOT_SIZE; + int slotY = ty + hoveredRow * SLOT_SIZE; + EmiRenderHelper.drawSlotHightlight(context, slotX, slotY, SLOT_SIZE, SLOT_SIZE, 0); + } + } + + // Render OUTPUT + EmiIngredient output = recipe.getStack(); + int outputX = tx + currentCol * SLOT_SIZE; + int outputY = ty + currentRow * SLOT_SIZE; + if (!output.isEmpty()) { + output.render(gui, outputX + 1, outputY + 1, delta, EmiIngredient.RENDER_ICON); + } + cosmiccore$drawOutputBorder(context, outputX, outputY); + currentCol++; + + // Render INPUTS with wrapping + for (CosmicRecipeFavorite.InputEntry input : recipe.getInputs()) { + if (currentCol >= gridWidth) { + currentCol = 0; + currentRow++; + if (currentRow >= info.startRow() + info.rowCount()) break; + } + + int inputX = tx + currentCol * SLOT_SIZE; + int inputY = ty + currentRow * SLOT_SIZE; + if (!input.stack().isEmpty()) { + input.stack().render(gui, inputX + 1, inputY + 1, delta, EmiIngredient.RENDER_ICON); + } + currentCol++; + } + } + + // SECOND PASS: Render amount overlays ON TOP (z=200) + for (RecipeRenderInfo info : renderList) { + CosmicRecipeFavorite recipe = info.recipe(); + int currentRow = info.startRow(); + int currentCol = 0; + + // Output amount + EmiIngredient output = recipe.getStack(); + int outputX = tx + currentCol * SLOT_SIZE; + int outputY = ty + currentRow * SLOT_SIZE; + if (!output.isEmpty()) { + long outputAmount = recipe.getOutputAmount(); + if (outputAmount > 1) { + cosmiccore$renderCompactAmount(context, outputX, outputY, outputAmount, output); + } + } + currentCol++; + + // Input amounts with wrapping + for (CosmicRecipeFavorite.InputEntry input : recipe.getInputs()) { + if (currentCol >= gridWidth) { + currentCol = 0; + currentRow++; + if (currentRow >= info.startRow() + info.rowCount()) break; + } + + int inputX = tx + currentCol * SLOT_SIZE; + int inputY = ty + currentRow * SLOT_SIZE; + if (!input.stack().isEmpty()) { + long inputAmount = input.amount(); + if (inputAmount > 1) { + cosmiccore$renderCompactAmount(context, inputX, inputY, inputAmount, input.stack()); + } + } + currentCol++; + } + } + } + + @Unique + private List cosmiccore$calculatePageLayout(List recipes, int gridWidth, + int totalRows, int page) { + List result = new ArrayList<>(); + + // Calculate total rows needed for all recipes + List recipeRowCounts = new ArrayList<>(); + for (CosmicRecipeFavorite recipe : recipes) { + recipeRowCounts.add(recipe.getRowCount(gridWidth)); + } + + // Find which recipes belong on this page + int rowsUsed = 0; + int pageStartRow = 0; + int currentPage = 0; + + for (int i = 0; i < recipes.size(); i++) { + int rowsNeeded = recipeRowCounts.get(i); + + // Check if this recipe would overflow the page + if (rowsUsed + rowsNeeded > totalRows && rowsUsed > 0) { + currentPage++; + pageStartRow = rowsUsed; + rowsUsed = 0; + } + + if (currentPage == page) { + result.add(new RecipeRenderInfo(recipes.get(i), rowsUsed, rowsNeeded)); + } else if (currentPage > page) { + break; + } + + rowsUsed += rowsNeeded; + } + + return result; + } + + @Unique + private void cosmiccore$drawOutputBorder(EmiDrawContext context, int x, int y) { + int color = 0x80FFD700; // Semi-transparent gold + context.fill(x, y, SLOT_SIZE, 1, color); + context.fill(x, y + SLOT_SIZE - 1, SLOT_SIZE, 1, color); + context.fill(x, y, 1, SLOT_SIZE, color); + context.fill(x + SLOT_SIZE - 1, y, 1, SLOT_SIZE, color); + } + + @Unique + private void cosmiccore$renderCompactAmount(EmiDrawContext context, int slotX, int slotY, long amount, + EmiIngredient ingredient) { + String text = cosmiccore$formatCompact(amount, ingredient); + Minecraft client = Minecraft.getInstance(); + int textWidth = client.font.width(text); + + context.push(); + context.matrices().translate(0, 0, 200); + + float scale = 0.5f; + context.matrices().translate(slotX + SLOT_SIZE, slotY + SLOT_SIZE, 0); + context.matrices().scale(scale, scale, 1); + + int tx = -textWidth; + int ty = -client.font.lineHeight; + + context.drawTextWithShadow(Component.literal(text), tx, ty, 0xFFFFFF); + context.pop(); + } + + @Unique + private String cosmiccore$formatCompact(long amount, EmiIngredient ingredient) { + if (!ingredient.getEmiStacks().isEmpty()) { + EmiStack first = ingredient.getEmiStacks().get(0); + if (first.getKey() instanceof Fluid) { + if (amount >= 1000) { + double buckets = amount / 1000.0; + if (buckets >= 1_000_000_000) return String.format("%.1fBB", buckets / 1_000_000_000); + if (buckets >= 1_000_000) return String.format("%.1fMB", buckets / 1_000_000); + if (buckets >= 1_000) return String.format("%.1fKB", buckets / 1_000); + return String.format("%.1fB", buckets); + } + return amount + "mB"; + } + } + + if (amount >= 1_000_000_000) return String.format("%.1fB", amount / 1_000_000_000.0); + if (amount >= 1_000_000) return String.format("%.1fM", amount / 1_000_000.0); + if (amount >= 1_000) return String.format("%.1fK", amount / 1_000.0); + return String.valueOf(amount); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/SidebarPanelMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/SidebarPanelMixin.java new file mode 100644 index 000000000..4592796e5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/emi/SidebarPanelMixin.java @@ -0,0 +1,106 @@ +package com.ghostipedia.cosmiccore.mixin.emi; + +import com.ghostipedia.cosmiccore.integration.emi.favorites.CosmicBookmarkManager; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; + +import dev.emi.emi.EmiPort; +import dev.emi.emi.EmiRenderHelper; +import dev.emi.emi.config.SidebarType; +import dev.emi.emi.screen.EmiScreenManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +/** + * Modifies the favorites sidebar header to show "Group X/Y | Page A/B" + * and enables page arrows when multiple groups/recipe pages exist. + */ +@Mixin(value = EmiScreenManager.SidebarPanel.class, remap = false) +public abstract class SidebarPanelMixin { + + @Shadow + public abstract SidebarType getType(); + + @Shadow + public EmiScreenManager.ScreenSpace space; + + @Inject(method = "hasMultiplePages", at = @At("RETURN"), cancellable = true) + private void cosmiccore$enableArrowsForGroups(CallbackInfoReturnable cir) { + if (getType() == SidebarType.FAVORITES && !cir.getReturnValue()) { + CosmicBookmarkManager manager = CosmicBookmarkManager.getInstance(); + if (manager.getGroupCount() > 1) { + cir.setReturnValue(true); + } else if (manager.getActiveGroup().isRecipeGroup() && space != null) { + int pageCount = manager.getRecipePageCount(space.tw, space.th); + if (pageCount > 1) { + cir.setReturnValue(true); + } + } + } + } + + @Unique + private int cosmiccore$recipePageCount = 1; + + @Unique + private int cosmiccore$currentRecipePage = 0; + + @Redirect( + method = "drawHeader", + at = @At( + value = "INVOKE", + target = "Ldev/emi/emi/EmiRenderHelper;getPageText(III)Lnet/minecraft/network/chat/Component;")) + private Component cosmiccore$modifyPageText(int page, int total, int maxWidth) { + CosmicBookmarkManager manager = CosmicBookmarkManager.getInstance(); + + if (getType() == SidebarType.FAVORITES) { + int groupIndex = manager.getActiveIndex() + 1; + int groupCount = manager.getGroupCount(); + + // For recipe groups, calculate our own page count + int displayPage = page; + int displayTotal = total; + if (manager.getActiveGroup().isRecipeGroup() && space != null) { + cosmiccore$recipePageCount = manager.getRecipePageCount(space.tw, space.th); + displayTotal = cosmiccore$recipePageCount; + // EMI's page is 0-indexed based on slot count, convert to recipe pages + cosmiccore$currentRecipePage = space.pageSize > 0 ? + page * space.pageSize / Math.max(1, space.tw * space.th) : 0; + if (cosmiccore$currentRecipePage >= cosmiccore$recipePageCount) { + cosmiccore$currentRecipePage = cosmiccore$recipePageCount - 1; + } + displayPage = cosmiccore$currentRecipePage; + manager.setCurrentRecipePage(cosmiccore$currentRecipePage); + } + + Component pageText = EmiRenderHelper.getPageText(displayPage, displayTotal, maxWidth); + + if (groupCount > 1) { + ChatFormatting color = manager.getActiveGroup().isRecipeGroup() ? ChatFormatting.YELLOW : + ChatFormatting.AQUA; + String groupPrefix = "Group " + groupIndex + "/" + groupCount + " | "; + return EmiPort.literal(groupPrefix).withStyle(color).append(pageText); + } + + return pageText; + } + + return EmiRenderHelper.getPageText(page, total, maxWidth); + } + + @Unique + public int cosmiccore$getRecipePageCount() { + return cosmiccore$recipePageCount; + } + + @Unique + public int cosmiccore$getCurrentRecipePage() { + return cosmiccore$currentRecipePage; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/frontiers/MinecraftRemoveOxygenMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/frontiers/MinecraftRemoveOxygenMixin.java new file mode 100644 index 000000000..1b0007d0b --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/frontiers/MinecraftRemoveOxygenMixin.java @@ -0,0 +1,33 @@ +package com.ghostipedia.cosmiccore.mixin.frontiers; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +/** + * Disables vanilla Minecraft's air/drowning system for players. + * CosmicCore's oxygen system handles all breathing mechanics instead. + */ +@Mixin(LivingEntity.class) +public class MinecraftRemoveOxygenMixin { + + @Inject(method = "decreaseAirSupply", at = @At("HEAD"), cancellable = true) + private void cosmiccore$noPlayerAirDecrease(int currentAir, CallbackInfoReturnable cir) { + LivingEntity self = (LivingEntity) (Object) this; + if (self instanceof Player) { + cir.setReturnValue(self.getMaxAirSupply()); // stays full + } + } + + @Inject(method = "increaseAirSupply", at = @At("HEAD"), cancellable = true) + private void cosmiccore$noPlayerAirIncrease(int currentAir, CallbackInfoReturnable cir) { + LivingEntity self = (LivingEntity) (Object) this; + if (self instanceof Player) { + cir.setReturnValue(self.getMaxAirSupply()); // stays full + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/ElectricContainerBlockProviderMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/ElectricContainerBlockProviderMixin.java new file mode 100644 index 000000000..a32c4a9e9 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/ElectricContainerBlockProviderMixin.java @@ -0,0 +1,27 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; + +import com.gregtechceu.gtceu.api.capability.IEnergyInfoProvider; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.integration.jade.provider.ElectricContainerBlockProvider; + +import net.minecraft.nbt.CompoundTag; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = ElectricContainerBlockProvider.class, remap = false) +public class ElectricContainerBlockProviderMixin { + + @Inject(method = "write", at = @At("HEAD"), cancellable = true) + private void cosmicCore$skipStellarModule(CompoundTag data, IEnergyInfoProvider capability, CallbackInfo ci) { + if (capability instanceof NotifiableEnergyContainer container) { + if (container.getMachine() instanceof StellarBaseModule) { + ci.cancel(); + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/GTOreDefinitionMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/GTOreDefinitionMixin.java new file mode 100644 index 000000000..03a53b56e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/GTOreDefinitionMixin.java @@ -0,0 +1,27 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.gregtechceu.gtceu.api.data.worldgen.GTOreDefinition; +import com.gregtechceu.gtceu.api.data.worldgen.generator.VeinGenerator; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +/** + * Adds an unambiguous method for setting vein generators from KubeJS. + * The existing veinGenerator() method is ambiguous between VeinGenerator and ResourceLocation + * which causes KubeJS/Rhino to fail with custom vein generator subclasses. + */ +@Mixin(value = GTOreDefinition.class, remap = false) +public abstract class GTOreDefinitionMixin { + + @Shadow + public abstract GTOreDefinition veinGenerator(VeinGenerator generator); + + /** + * Unambiguous method for KubeJS to set a VeinGenerator. + * Use this instead of veinGenerator() to avoid Rhino's method ambiguity issues. + */ + public GTOreDefinition generator(VeinGenerator gen) { + return this.veinGenerator(gen); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachinePaintMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachinePaintMixin.java new file mode 100644 index 000000000..534e7c5c5 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/MetaMachinePaintMixin.java @@ -0,0 +1,34 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.MultithreadedMachine; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = MetaMachine.class, remap = false) +public abstract class MetaMachinePaintMixin { + + @Inject(method = "setPaintingColor", at = @At("TAIL")) + private void cosmiccore$onPaintChange(int paintingColor, CallbackInfo ci) { + if (!(((Object) this) instanceof IMultiPart part)) return; + + // Each part lazy-caches its RecipeHandlerList with the painting color at first access and + // never updates after. Sync the cached color so anything reading it (GTM handler-group + // routing, our partition logic) sees the new paint. + for (RecipeHandlerList rhl : part.getRecipeHandlers()) { + rhl.setColor(paintingColor); + } + + for (var controller : part.getControllers()) { + if (controller instanceof MultithreadedMachine mt) { + mt.refreshThreadPartitioning(); + } + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/ParallelProviderMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/ParallelProviderMixin.java new file mode 100644 index 000000000..2e468e65f --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/ParallelProviderMixin.java @@ -0,0 +1,101 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; +import com.ghostipedia.cosmiccore.common.machine.multiblock.multi.logic.PCBFoundryMachine; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; + +import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; +import com.gregtechceu.gtceu.integration.jade.provider.ParallelProvider; + +import net.minecraft.nbt.CompoundTag; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; +import snownee.jade.api.BlockAccessor; + +@Mixin(value = ParallelProvider.class, remap = false) +public abstract class ParallelProviderMixin { + + @Inject(method = "appendServerData", at = @At("HEAD"), cancellable = true) + private void cosmicCore$skipStellarModule(CompoundTag compoundTag, BlockAccessor blockAccessor, CallbackInfo ci) { + if (cosmicCore$shouldSkip(blockAccessor)) { + ci.cancel(); + } + } + + @Inject(method = "appendServerData", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/nbt/CompoundTag;putInt(Ljava/lang/String;I)V", + ordinal = 0), + locals = LocalCapture.CAPTURE_FAILSOFT, + cancellable = true, + require = 0) + private void cosmicCore$skipPCBFoundryHatch(CompoundTag compoundTag, BlockAccessor blockAccessor, CallbackInfo ci) { + if (cosmicCore$isPCBFoundryParallelHatch(blockAccessor)) { + ci.cancel(); + } + } + + @Inject(method = "appendServerData", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/nbt/CompoundTag;putInt(Ljava/lang/String;I)V", + ordinal = 1), + locals = LocalCapture.CAPTURE_FAILSOFT, + cancellable = true, + require = 0) + private void cosmicCore$skipPCBFoundryController(CompoundTag compoundTag, BlockAccessor blockAccessor, + CallbackInfo ci) { + if (cosmicCore$isPCBFoundryController(blockAccessor)) { + ci.cancel(); + } + } + + @Inject(method = "appendServerData", + at = @At(value = "INVOKE", + target = "Lcom/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine;getParallelHatch()Ljava/util/Optional;"), + locals = LocalCapture.CAPTURE_FAILSOFT, + cancellable = true, + require = 0) + private void cosmicCore$skipPCBFoundryGetParallel(CompoundTag compoundTag, BlockAccessor blockAccessor, + CallbackInfo ci) { + if (cosmicCore$isPCBFoundryController(blockAccessor)) { + ci.cancel(); + } + } + + @Unique + private boolean cosmicCore$shouldSkip(BlockAccessor blockAccessor) { + MetaMachine machine = cosmicCore$getMachine(blockAccessor); + return machine instanceof StellarBaseModule; + } + + @Unique + private boolean cosmicCore$isPCBFoundryController(BlockAccessor blockAccessor) { + MetaMachine machine = cosmicCore$getMachine(blockAccessor); + return machine instanceof PCBFoundryMachine; + } + + @Unique + private boolean cosmicCore$isPCBFoundryParallelHatch(BlockAccessor blockAccessor) { + MetaMachine machine = cosmicCore$getMachine(blockAccessor); + if (machine instanceof ParallelHatchPartMachine hatch) { + if (hatch.getControllers().size() == 1) { + return hatch.getControllers().first() instanceof PCBFoundryMachine; + } + } + return false; + } + + @Unique + private MetaMachine cosmicCore$getMachine(BlockAccessor blockAccessor) { + if (blockAccessor.getBlockEntity() instanceof MetaMachine blockEntity) { + return blockEntity; + } + return null; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/RecipeLogicProviderMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/RecipeLogicProviderMixin.java new file mode 100644 index 000000000..3b81aee82 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/RecipeLogicProviderMixin.java @@ -0,0 +1,27 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; + +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.integration.jade.provider.RecipeLogicProvider; + +import net.minecraft.nbt.CompoundTag; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import snownee.jade.api.BlockAccessor; + +@Mixin(value = RecipeLogicProvider.class, remap = false) +public class RecipeLogicProviderMixin { + + @Inject(method = "write", at = @At("HEAD"), cancellable = true) + private void cosmicCore$skipStellarModuleWrite(CompoundTag data, BlockAccessor blockAccessor, RecipeLogic capability, + CallbackInfo ci) { + if (capability.getMachine() instanceof StellarBaseModule) { + data.putBoolean("Working", capability.isWorking()); + ci.cancel(); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/RecipeOutputProviderMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/RecipeOutputProviderMixin.java new file mode 100644 index 000000000..d3e0eb2f9 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/RecipeOutputProviderMixin.java @@ -0,0 +1,24 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; + +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.integration.jade.provider.RecipeOutputProvider; + +import net.minecraft.nbt.CompoundTag; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = RecipeOutputProvider.class, remap = false) +public class RecipeOutputProviderMixin { + + @Inject(method = "write", at = @At("HEAD"), cancellable = true) + private void cosmicCore$skipStellarModule(CompoundTag data, RecipeLogic capability, CallbackInfo ci) { + if (capability.getMachine() instanceof StellarBaseModule) { + ci.cancel(); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/WorkableBlockProviderMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/WorkableBlockProviderMixin.java new file mode 100644 index 000000000..f5c197e17 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/gtceu/WorkableBlockProviderMixin.java @@ -0,0 +1,24 @@ +package com.ghostipedia.cosmiccore.mixin.gtceu; + +import com.ghostipedia.cosmiccore.api.machine.multiblock.StellarBaseModule; + +import com.gregtechceu.gtceu.api.capability.IWorkable; +import com.gregtechceu.gtceu.integration.jade.provider.WorkableBlockProvider; + +import net.minecraft.nbt.CompoundTag; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = WorkableBlockProvider.class, remap = false) +public class WorkableBlockProviderMixin { + + @Inject(method = "write", at = @At("HEAD"), cancellable = true) + private void cosmicCore$skipStellarModule(CompoundTag data, IWorkable capability, CallbackInfo ci) { + if (capability instanceof StellarBaseModule) { + ci.cancel(); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/jei/TagInfoRecipeCategoryMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/jei/TagInfoRecipeCategoryMixin.java new file mode 100644 index 000000000..f2084ca4d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/jei/TagInfoRecipeCategoryMixin.java @@ -0,0 +1,33 @@ +package com.ghostipedia.cosmiccore.mixin.jei; + +import mezz.jei.api.gui.widgets.IRecipeExtrasBuilder; +import mezz.jei.api.recipe.IFocusGroup; +import mezz.jei.library.plugins.jei.tags.ITagInfoRecipe; +import mezz.jei.library.plugins.jei.tags.TagInfoRecipeCategory; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * Defensive guard for JEI's tag-info category when it is driven through EMI's JEMI bridge. EMI's extras builder + * supplies no recipe-slots view, so {@link IRecipeExtrasBuilder#getRecipeSlots()} returns null and JEI's + * createRecipeExtras NPEs for every tag recipe shown in EMI, spamming "Exception adding JEMI extras" (EMI catches + * it, so it is log noise rather than a crash, but it floods the GTM recipe screens). Skip the extras when there is + * no slot view; native JEI always provides one, so this never triggers outside the JEMI path. + */ +@Mixin(value = TagInfoRecipeCategory.class, remap = false) +public class TagInfoRecipeCategoryMixin { + + @Inject( + method = "createRecipeExtras(Lmezz/jei/api/gui/widgets/IRecipeExtrasBuilder;Lmezz/jei/library/plugins/jei/tags/ITagInfoRecipe;Lmezz/jei/api/recipe/IFocusGroup;)V", + at = @At("HEAD"), + cancellable = true, + remap = false) + private void cosmiccore$skipExtrasWhenNoSlots(IRecipeExtrasBuilder builder, ITagInfoRecipe recipe, + IFocusGroup focuses, CallbackInfo ci) { + if (builder.getRecipeSlots() == null) { + ci.cancel(); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/lso/FrostbiteEffectMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/lso/FrostbiteEffectMixin.java new file mode 100644 index 000000000..88c736827 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/lso/FrostbiteEffectMixin.java @@ -0,0 +1,33 @@ +package com.ghostipedia.cosmiccore.mixin.lso; + +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectCategory; + +import com.llamalad7.mixinextras.sugar.Local; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import sfiomn.legendarysurvivaloverhaul.common.effects.FrostbiteEffect; + +@Mixin(value = FrostbiteEffect.class) +public abstract class FrostbiteEffectMixin extends MobEffect { + + protected FrostbiteEffectMixin(MobEffectCategory category, int color) { + super(MobEffectCategory.HARMFUL, 9164281); + } + + @ModifyArg(method = "applyEffectTick", + at = @At( + value = "INVOKE", + target = "Lsfiomn/legendarysurvivaloverhaul/api/ModDamageTypes;hypothermia(Lnet/minecraft/world/entity/Entity;F)V"), + index = 1) + private float cosmiccore$changeDamageAmount(float amount, @Local(argsOnly = true) int amplifier) { + return amount + amplifier; + } + + @ModifyVariable(method = "shouldApplyEffectTickThisTick", at = @At(value = "STORE"), ordinal = 2, name = "time") + private int cosmiccore$modifyDamageIncrement(int time) { + return 50; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/lso/HeatstrokeEffectMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/lso/HeatstrokeEffectMixin.java new file mode 100644 index 000000000..7d21248c0 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/lso/HeatstrokeEffectMixin.java @@ -0,0 +1,33 @@ +package com.ghostipedia.cosmiccore.mixin.lso; + +import net.minecraft.world.effect.MobEffect; +import net.minecraft.world.effect.MobEffectCategory; + +import com.llamalad7.mixinextras.sugar.Local; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; +import org.spongepowered.asm.mixin.injection.ModifyVariable; +import sfiomn.legendarysurvivaloverhaul.common.effects.HeatStrokeEffect; + +@Mixin(value = HeatStrokeEffect.class) +public abstract class HeatstrokeEffectMixin extends MobEffect { + + protected HeatstrokeEffectMixin(MobEffectCategory category, int color) { + super(MobEffectCategory.HARMFUL, 16756041); + } + + @ModifyArg(method = "applyEffectTick", + at = @At( + value = "INVOKE", + target = "Lsfiomn/legendarysurvivaloverhaul/api/ModDamageTypes;hyperthermia(Lnet/minecraft/world/entity/Entity;F)V"), + index = 1) + private float cosmiccore$changeDamageAmount(float amount, @Local(argsOnly = true) int amplifier) { + return amount + amplifier; + } + + @ModifyVariable(method = "shouldApplyEffectTickThisTick", at = @At(value = "STORE"), ordinal = 2, name = "time") + private int cosmiccore$modifyDamageIncrement(int time) { + return 50; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/quake/QuakeMovementMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/quake/QuakeMovementMixin.java new file mode 100644 index 000000000..26661698c --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/quake/QuakeMovementMixin.java @@ -0,0 +1,152 @@ +package com.ghostipedia.cosmiccore.mixin.quake; + +import com.ghostipedia.cosmiccore.common.reflection.bargain.impl.QuakeMovementHandler; + +import net.minecraft.world.entity.LivingEntity; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.Vec3; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(LivingEntity.class) +public abstract class QuakeMovementMixin { + + @Unique + private Vec3 cosmiccore$preTravelVelocity = null; + + @Unique + private int cosmiccore$airStrafeActiveTicks = 0; + + @Unique + private static final int AIR_STRAFE_GRACE_TICKS = 10; + + @Inject(method = "travel", at = @At("HEAD")) + private void cosmiccore$beforeTravel(Vec3 movementInput, CallbackInfo ci) { + LivingEntity entity = (LivingEntity) (Object) this; + + if (!(entity instanceof Player player)) { + cosmiccore$preTravelVelocity = null; + return; + } + + if (!player.level().isClientSide()) { + cosmiccore$preTravelVelocity = null; + return; + } + + if (!QuakeMovementHandler.getClientHasQuakeMovement()) { + cosmiccore$preTravelVelocity = null; + return; + } + + if (player.isInWater() || player.isInLava() || player.getAbilities().flying || player.isFallFlying()) { + cosmiccore$preTravelVelocity = null; + return; + } + + cosmiccore$preTravelVelocity = player.getDeltaMovement(); + } + + @Inject(method = "travel", at = @At("RETURN")) + private void cosmiccore$afterTravel(Vec3 movementInput, CallbackInfo ci) { + if (cosmiccore$preTravelVelocity == null) return; + + LivingEntity entity = (LivingEntity) (Object) this; + if (!(entity instanceof Player player)) return; + + Vec3 preVel = cosmiccore$preTravelVelocity; + Vec3 postVel = player.getDeltaMovement(); + + double preSpeed = Math.sqrt(preVel.x * preVel.x + preVel.z * preVel.z); + double postSpeed = Math.sqrt(postVel.x * postVel.x + postVel.z * postVel.z); + + cosmiccore$preTravelVelocity = null; + + float forwardInput = player.zza; + float strafeInput = player.xxa; + boolean hasMovementInput = Math.abs(forwardInput) > 0.01 || Math.abs(strafeInput) > 0.01; + boolean hasStrafeInput = Math.abs(strafeInput) > 0.01; + boolean onGroundNow = player.onGround(); + + // Air strafe detection + if (!onGroundNow && hasStrafeInput) { + cosmiccore$airStrafeActiveTicks = AIR_STRAFE_GRACE_TICKS; + } else if (cosmiccore$airStrafeActiveTicks > 0) { + cosmiccore$airStrafeActiveTicks--; + } + boolean isAirStrafing = cosmiccore$airStrafeActiveTicks > 0; + + // Braking detection + boolean isBraking = false; + if (hasMovementInput && preSpeed > 0.1) { + float yaw = player.getYRot() * ((float) Math.PI / 180f); + double wishX = -Math.sin(yaw) * forwardInput + Math.cos(yaw) * strafeInput; + double wishZ = Math.cos(yaw) * forwardInput + Math.sin(yaw) * strafeInput; + double velX = preVel.x / preSpeed; + double velZ = preVel.z / preSpeed; + double dot = wishX * velX + wishZ * velZ; + isBraking = dot < -0.3; + } + + boolean wantsToStop = onGroundNow && !hasMovementInput; + if (isBraking || wantsToStop) return; + + // Tiered speed cap system + double bhopSoftCap = QuakeMovementHandler.getBhopSoftCap(); + double hardCap = QuakeMovementHandler.getHardCapSpeed(); + double effectiveCap = isAirStrafing ? hardCap : bhopSoftCap; + + double targetSpeed; + + if (postSpeed >= preSpeed) { + targetSpeed = Math.min(postSpeed, effectiveCap); + } else { + double speedLost = preSpeed - postSpeed; + + if (preSpeed <= bhopSoftCap) { + double restorationFactor = 0.95; + targetSpeed = postSpeed + (speedLost * restorationFactor); + targetSpeed = Math.min(targetSpeed, bhopSoftCap); + } else if (isAirStrafing) { + double restorationFactor = 0.97; + targetSpeed = postSpeed + (speedLost * restorationFactor); + targetSpeed = Math.min(targetSpeed, hardCap); + } else { + double decayRate = 0.92; + double excessSpeed = preSpeed - bhopSoftCap; + double newExcess = excessSpeed * decayRate; + targetSpeed = bhopSoftCap + newExcess; + + double frictionRestore = speedLost * 0.5; + targetSpeed = Math.max(targetSpeed, postSpeed + frictionRestore); + targetSpeed = Math.min(targetSpeed, preSpeed); + } + } + + if (targetSpeed < 0.36) return; + if (Math.abs(targetSpeed - postSpeed) < 0.001) return; + + if (postSpeed > 0.001) { + double effectiveTarget = targetSpeed; + + if (player.horizontalCollision && preSpeed > 0.001) { + double dot = (preVel.x / preSpeed) * (postVel.x / postSpeed) + + (preVel.z / preSpeed) * (postVel.z / postSpeed); + dot = Math.max(dot, 0.0); + effectiveTarget = targetSpeed * dot; + } + + if (effectiveTarget > 0.001) { + double scale = effectiveTarget / postSpeed; + player.setDeltaMovement(postVel.x * scale, postVel.y, postVel.z * scale); + } + } else if (preSpeed > 0.001 && !player.horizontalCollision) { + double scale = targetSpeed / preSpeed; + player.setDeltaMovement(preVel.x * scale, postVel.y, preVel.z * scale); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/mixin/worldgen/CubicSplineMultipointMixin.java b/src/main/java/com/ghostipedia/cosmiccore/mixin/worldgen/CubicSplineMultipointMixin.java new file mode 100644 index 000000000..a827b79f6 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/mixin/worldgen/CubicSplineMultipointMixin.java @@ -0,0 +1,123 @@ +package com.ghostipedia.cosmiccore.mixin.worldgen; + +import com.ghostipedia.cosmiccore.mixin.accessor.CubicSplineMultipointAccessor; + +import net.minecraft.util.CubicSpline; +import net.minecraft.util.ToFloatFunction; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +/** + * Optimizes CubicSpline.Multipoint which is the single hottest worldgen code path. + * + * Three optimizations: + * 1. Replace stream-based mapAll() with a plain array loop (eliminates Stream/Iterator/Spliterator allocation) + * 2. Cache hashCode since Multipoint instances are used as HashMap keys in NoiseChunk and are immutable. + * The record-generated hashCode recursively hashes all values (which are nested Multipoints), + * making it O(tree_size) on every call. Caching makes subsequent calls O(1). + * 3. Short-circuit equals() using cached hashCode - if hashes differ, objects differ. + * Also adds reference equality check and avoids deep comparison when unnecessary. + */ +@Mixin(CubicSpline.Multipoint.class) +public abstract class CubicSplineMultipointMixin> { + + @Shadow + @Final + private I coordinate; + @Shadow + @Final + private float[] locations; + @Shadow + @Final + private List> values; + @Shadow + @Final + private float[] derivatives; + @Shadow + @Final + private float minValue; + @Shadow + @Final + private float maxValue; + + @Unique + private int cosmiccore$cachedHashCode; + @Unique + private boolean cosmiccore$hashCached; + + /** + * @author CosmicCore + * @reason Replace stream-based mapAll with a plain loop to eliminate Stream/Iterator overhead. + * The original uses .stream().map().toList() which allocates Stream, Spliterator, and collector objects + * on every call. A plain ArrayList loop produces identical results with zero allocation overhead. + */ + @Overwrite + public CubicSpline mapAll(CubicSpline.CoordinateVisitor visitor) { + I visited = visitor.visit(this.coordinate); + List> mappedValues = new ArrayList<>(this.values.size()); + for (CubicSpline value : this.values) { + mappedValues.add(value.mapAll(visitor)); + } + return CubicSplineMultipointAccessor.cosmiccore$create(visited, this.locations, mappedValues, this.derivatives); + } + + /** + * @author CosmicCore + * @reason Cache the hashCode computation. The record-generated hashCode for Multipoint calls + * Objects.hashCode() on each component field. For the 'values' List field, this recursively + * hashes every nested CubicSpline (which may themselves be Multipoints), making each call + * O(tree_size). Since all fields are final, the result never changes - cache it. + * + * We reproduce the exact record hashCode algorithm: for each component in declaration order, + * result = 31 * result + Objects.hashCode(component). + * For primitive float fields, Objects.hashCode autoboxes to Float.hashCode (Float.floatToIntBits). + */ + @Overwrite + public int hashCode() { + if (!this.cosmiccore$hashCached) { + // Record hashCode: for each component in order, result = 31 * result + hash(component) + // Component order: coordinate, locations, values, derivatives, minValue, maxValue + int result = Objects.hashCode(this.coordinate); + result = 31 * result + Objects.hashCode(this.locations); + result = 31 * result + Objects.hashCode(this.values); + result = 31 * result + Objects.hashCode(this.derivatives); + result = 31 * result + Float.hashCode(this.minValue); + result = 31 * result + Float.hashCode(this.maxValue); + this.cosmiccore$cachedHashCode = result; + this.cosmiccore$hashCached = true; + } + return this.cosmiccore$cachedHashCode; + } + + /** + * @author CosmicCore + * @reason Short-circuit equals using cached hashCode. The record-generated equals + * does deep structural comparison on all fields including nested Lists of + * CubicSplines. By checking hashCode first (O(1) when cached), we can + * reject most non-equal comparisons without any deep traversal. + * Also adds reference equality check as a fast path. + */ + @Overwrite + public boolean equals(Object obj) { + if (this == obj) return true; + if (!(obj instanceof CubicSpline.Multipoint other)) return false; + // Hash check: if cached hashes differ, objects are definitely not equal + if (this.hashCode() != other.hashCode()) return false; + // Full structural comparison (matching record equals behavior) + return Objects.equals(this.coordinate, ((CubicSplineMultipointMixin) (Object) other).coordinate) && + Arrays.equals(this.locations, ((CubicSplineMultipointMixin) (Object) other).locations) && + Objects.equals(this.values, ((CubicSplineMultipointMixin) (Object) other).values) && + Arrays.equals(this.derivatives, ((CubicSplineMultipointMixin) (Object) other).derivatives) && + Float.compare(this.minValue, ((CubicSplineMultipointMixin) (Object) other).minValue) == 0 && + Float.compare(this.maxValue, ((CubicSplineMultipointMixin) (Object) other).maxValue) == 0; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/utils/ColorUtil.java b/src/main/java/com/ghostipedia/cosmiccore/utils/ColorUtil.java new file mode 100644 index 000000000..c6913c838 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/utils/ColorUtil.java @@ -0,0 +1,19 @@ +package com.ghostipedia.cosmiccore.utils; + +public class ColorUtil { + + public static int lerpColorRGB(int color1, int color2, float t) { + int r1 = (color1 >> 16) & 0xff; + int g1 = (color1 >> 8) & 0xff; + int b1 = (color1) & 0xff; + int r2 = (color2 >> 16) & 0xff; + int g2 = (color2 >> 8) & 0xff; + int b2 = (color2) & 0xff; + + int r = (int) (r1 + t * (r2 - r1)); + int g = (int) (g1 + t * (g2 - g1)); + int b = (int) (b1 + t * (b2 - b1)); + + return (r << 16) | (g << 8) | b; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/utils/CosmicFormattingUtil.java b/src/main/java/com/ghostipedia/cosmiccore/utils/CosmicFormattingUtil.java new file mode 100644 index 000000000..c8263ece9 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/utils/CosmicFormattingUtil.java @@ -0,0 +1,46 @@ +package com.ghostipedia.cosmiccore.utils; + +import com.gregtechceu.gtceu.utils.FormattingUtil; + +import net.minecraft.ChatFormatting; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; + +import java.math.BigInteger; +import java.text.DecimalFormat; + +public class CosmicFormattingUtil { + + public static String formatNumberWithCharacterLimit(BigInteger number, int characterLimit) { + String formattedNumber = FormattingUtil.formatNumbers(number); + if (formattedNumber.length() <= characterLimit) return formattedNumber; + else return (new DecimalFormat("0.000E0")).format(number); + } + + public static MutableComponent formatWithConstantWidth(String labelKey, Component body, int width) { + var tmp = Component.translatable(labelKey, body); + var baseLength = getComponentLength(tmp); + var spaceLength = width - baseLength; + if (spaceLength <= 0) return Component.literal("Err: Too long"); + var spacerCount = (spaceLength / 2) - 4; + var spacer = spacerCount > 0 ? (".".repeat((spaceLength / 2) - 4) + " ") : ""; + var spacerComponent = Component.literal(spacer).withStyle(ChatFormatting.DARK_GRAY); + return Component.translatable(labelKey, spacerComponent.append(body)); + } + + public static MutableComponent combineWithConstantWidth(Component comp1, Component comp2, int width) { + var tmp = Component.empty().append(comp1).append(comp2); + var baseLength = getComponentLength(tmp); + var spaceLength = width - baseLength; + if (spaceLength <= 0) return Component.literal("Err: Too long"); + var spacerCount = (spaceLength / 2) - 4; + var spacer = spacerCount > 0 ? (".".repeat((spaceLength / 2) - 4) + " ") : ""; + var spacerComponent = Component.literal(spacer).withStyle(ChatFormatting.DARK_GRAY); + return Component.empty().append(comp1).append(spacerComponent).append(comp2); + } + + private static int getComponentLength(Component component) { + var util = new StupidFontUtils(); + return util.getStringWidth(component.getString()); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/utils/FluidUtilities.java b/src/main/java/com/ghostipedia/cosmiccore/utils/FluidUtilities.java new file mode 100644 index 000000000..aa4535896 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/utils/FluidUtilities.java @@ -0,0 +1,14 @@ +package com.ghostipedia.cosmiccore.utils; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.material.Fluid; +import net.minecraft.world.level.material.Fluids; +import net.minecraft.core.registries.BuiltInRegistries; + +public class FluidUtilities { + + public static Fluid getFluid(String fluidResloc) { + Fluid fluid = BuiltInRegistries.FLUID.get(ResourceLocation.parse(fluidResloc)); + return fluid == null ? Fluids.EMPTY : fluid; + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/utils/ItemData.java b/src/main/java/com/ghostipedia/cosmiccore/utils/ItemData.java new file mode 100644 index 000000000..05d7e6bf1 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/utils/ItemData.java @@ -0,0 +1,41 @@ +package com.ghostipedia.cosmiccore.utils; + +import net.minecraft.core.component.DataComponents; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.component.CustomData; + +import java.util.function.Consumer; + +/** + * Bridges the removed 1.20.1 ItemStack NBT API onto 1.21 DataComponents.CUSTOM_DATA. + * readTag returns a copy (never null); mutateTag applies changes and writes back. + */ +public final class ItemData { + + private ItemData() {} + + public static CompoundTag readTag(ItemStack stack) { + return stack.getOrDefault(DataComponents.CUSTOM_DATA, CustomData.EMPTY).copyTag(); + } + + public static void mutateTag(ItemStack stack, Consumer mutator) { + stack.update(DataComponents.CUSTOM_DATA, CustomData.EMPTY, data -> data.update(mutator)); + } + + public static void writeTag(ItemStack stack, CompoundTag tag) { + stack.set(DataComponents.CUSTOM_DATA, CustomData.of(tag)); + } + + public static CompoundTag readElement(ItemStack stack, String key) { + return readTag(stack).getCompound(key); + } + + public static void mutateElement(ItemStack stack, String key, Consumer mutator) { + mutateTag(stack, root -> { + CompoundTag element = root.getCompound(key); + mutator.accept(element); + root.put(key, element); + }); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/utils/NBTUtils.java b/src/main/java/com/ghostipedia/cosmiccore/utils/NBTUtils.java new file mode 100644 index 000000000..3131866f4 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/utils/NBTUtils.java @@ -0,0 +1,21 @@ +package com.ghostipedia.cosmiccore.utils; + +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Tuple; + +public abstract class NBTUtils { + + public static CompoundTag toNBT(Tuple tuple) { + var tag = new CompoundTag(); + tag.putString("A", tuple.getA()); + tag.putLong("B", tuple.getB().asLong()); + return tag; + } + + public static Tuple fromNBT(CompoundTag tag) { + var A = tag.getString("A"); + var B = BlockPos.of(tag.getLong("B")); + return new Tuple<>(A, B); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/utils/NumberUtils.java b/src/main/java/com/ghostipedia/cosmiccore/utils/NumberUtils.java new file mode 100644 index 000000000..62f8110c2 --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/utils/NumberUtils.java @@ -0,0 +1,50 @@ +package com.ghostipedia.cosmiccore.utils; + +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; + +import java.text.DecimalFormat; + +public class NumberUtils { + + private static final DecimalFormat DF = new DecimalFormat("#.##"); + + public static MutableComponent numberFormat(long number) { + return Component.literal(formatLong(number)); + } + + public static String formatLong(long number) { + if (number < 1_000) { + return DF.format(number); + } else if (number < 1_000_000) { + return DF.format((double) number / 1_000.0) + "K"; + } else if (number < 1_000_000_000) { + return DF.format((double) number / 1_000_000.0) + "M"; + } else if (number < 1_000_000_000_000L) { + return DF.format((double) number / 1_000_000_000.0) + "G"; + } else if (number < 1_000_000_000_000_000L) { + return DF.format((double) number / 1_000_000_000_000.0) + "T"; + } else { + return DF.format((double) number / 1_000_000_000_000_000.0) + "P"; + } + } + + public static String formatThousandsSeparators(double number) { + int num_int = (int) number; + double decimal = number - (int) number; + StringBuilder res = new StringBuilder(); + if (0d != decimal) { + if (0d != (int) ((100 * decimal) % 10)) { + res.insert(0, String.format("%.2f", decimal)).deleteCharAt(0); + } else { + res.insert(0, String.format("%.1f", decimal)).deleteCharAt(0); + } + } + while (num_int > 999) { + res.insert(0, "," + String.format("%03d", num_int % 1000)); + num_int /= 1000; + } + res.insert(0, num_int); + return res.toString(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/utils/OwnershipUtils.java b/src/main/java/com/ghostipedia/cosmiccore/utils/OwnershipUtils.java new file mode 100644 index 000000000..5e90d130d --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/utils/OwnershipUtils.java @@ -0,0 +1,30 @@ +package com.ghostipedia.cosmiccore.utils; + +import com.gregtechceu.gtceu.common.machine.owner.FTBOwner; +import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; +import com.gregtechceu.gtceu.common.machine.owner.PlayerOwner; + +import net.minecraft.network.chat.Component; +import net.neoforged.neoforge.common.UsernameCache; + +import java.util.List; + +public class OwnershipUtils { + + public static String getName(MachineOwner owner) { + if (owner instanceof PlayerOwner playerOwner) { + return UsernameCache.getLastKnownUsername(playerOwner.getUUID()); + } else if (owner instanceof FTBOwner ftOwner) { + return ftOwner.getTeam().getName().getString(); + } else return "NaN"; + } + + public static void addOwnerLine(List textList, MachineOwner owner, boolean withNetworkOwner) { + if (owner instanceof PlayerOwner playerOwner) { + var name = UsernameCache.getLastKnownUsername(playerOwner.getUUID()); + textList.add(Component.translatable("behavior.wireless_data.owner.player").append(name)); + } else if (owner instanceof FTBOwner ftOwner) { + textList.add(Component.translatable("behavior.wireless_data.owner.team").append(ftOwner.getName())); + } + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/utils/StringUtil.java b/src/main/java/com/ghostipedia/cosmiccore/utils/StringUtil.java new file mode 100644 index 000000000..071bc57cf --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/utils/StringUtil.java @@ -0,0 +1,56 @@ +package com.ghostipedia.cosmiccore.utils; + +import net.minecraft.ChatFormatting; + +import static net.minecraft.ChatFormatting.*; + +// CREDITS ; GTOCORE +public class StringUtil { + + private static String formatting(String input, ChatFormatting[] colours, double delay) { + StringBuilder sb = new StringBuilder(input.length() * 3); + if (delay <= 0.0D) + delay = 0.001D; + int offset = (int) Math.floor((System.currentTimeMillis() & 0x3FFFL) / delay) % colours.length; + for (int i = 0; i < input.length(); i++) { + char c = input.charAt(i); + sb.append(colours[(colours.length + i - offset) % colours.length].toString()); + sb.append(c); + } + return sb.toString(); + } + + public static String midnightOscillation(String input) { + return formatting(input, new ChatFormatting[] { DARK_PURPLE, DARK_RED }, 160.0D); + } + + public static String rainbowDancing(String input) { + return formatting(input, new ChatFormatting[] { RED, GOLD, YELLOW, GREEN, AQUA, BLUE, LIGHT_PURPLE }, 80.0D); + } + + public static String goldFlicker(String input) { + return formatting(input, new ChatFormatting[] { YELLOW, GOLD }, 240.0D); + } + + public static String iceCold(String input) { + return formatting(input, new ChatFormatting[] { BLUE, BLUE, BLUE, BLUE, WHITE, BLUE, WHITE, WHITE, BLUE, + WHITE, WHITE, BLUE, AQUA, WHITE }, 360); + } + + /** + * Converts snake_case to Title Case (e.g., "hungering_void" -> "Hungering Void") + */ + public static String toTitleCase(String snakeCase) { + if (snakeCase == null || snakeCase.isEmpty()) return snakeCase; + + StringBuilder result = new StringBuilder(); + for (String word : snakeCase.split("_")) { + if (!word.isEmpty()) { + if (result.length() > 0) result.append(" "); + result.append(Character.toUpperCase(word.charAt(0))); + if (word.length() > 1) result.append(word.substring(1)); + } + } + return result.toString(); + } +} diff --git a/src/main/java/com/ghostipedia/cosmiccore/utils/StupidFontUtils.java b/src/main/java/com/ghostipedia/cosmiccore/utils/StupidFontUtils.java new file mode 100644 index 000000000..6a1052a7e --- /dev/null +++ b/src/main/java/com/ghostipedia/cosmiccore/utils/StupidFontUtils.java @@ -0,0 +1,110 @@ +package com.ghostipedia.cosmiccore.utils; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +public class StupidFontUtils { + + // The constant map directly populated with Character to Integer mappings. + // It's declared as public static final, making it a constant accessible throughout your application. + // Collections.unmodifiableMap ensures that its contents cannot be changed after initialization. + public static final Map CHARACTER_VALUES; + + // A static initializer block to populate the map when the class is loaded. + // This runs only once. + static { + Map tempMap = new HashMap<>(); + + // Hardcoding all the character-to-integer mappings + tempMap.put('A', 6); + tempMap.put('B', 6); + tempMap.put('C', 6); + tempMap.put('D', 6); + tempMap.put('E', 6); + tempMap.put('F', 6); + tempMap.put('G', 6); + tempMap.put('H', 6); + tempMap.put('I', 4); + tempMap.put('J', 6); + tempMap.put('K', 6); + tempMap.put('L', 6); + tempMap.put('M', 6); + tempMap.put('N', 6); + tempMap.put('O', 6); + tempMap.put('P', 6); + tempMap.put('Q', 6); + tempMap.put('R', 6); + tempMap.put('S', 6); + tempMap.put('T', 6); + tempMap.put('U', 6); + tempMap.put('V', 6); + tempMap.put('W', 6); + tempMap.put('X', 6); + tempMap.put('Y', 6); + tempMap.put('Z', 6); + + tempMap.put('a', 6); + tempMap.put('b', 6); + tempMap.put('c', 6); + tempMap.put('d', 6); + tempMap.put('e', 6); + tempMap.put('f', 5); + tempMap.put('g', 6); + tempMap.put('h', 6); + tempMap.put('i', 2); + tempMap.put('j', 6); + tempMap.put('k', 5); + tempMap.put('l', 3); + tempMap.put('m', 6); + tempMap.put('n', 6); + tempMap.put('o', 6); + tempMap.put('p', 6); + tempMap.put('q', 6); + tempMap.put('r', 6); + tempMap.put('s', 6); + tempMap.put('t', 4); + tempMap.put('u', 6); + tempMap.put('v', 6); + tempMap.put('w', 6); + tempMap.put('x', 6); + tempMap.put('y', 6); + tempMap.put('z', 6); + + tempMap.put('0', 6); + tempMap.put('1', 6); + tempMap.put('2', 6); + tempMap.put('3', 6); + tempMap.put('4', 6); + tempMap.put('5', 6); + tempMap.put('6', 6); + tempMap.put('7', 6); + tempMap.put('8', 6); + tempMap.put('9', 6); + + tempMap.put(' ', 4); + tempMap.put(',', 2); + tempMap.put('.', 2); + tempMap.put(':', 2); + tempMap.put('/', 6); + tempMap.put('[', 6); + tempMap.put(']', 6); + tempMap.put('+', 6); + tempMap.put('-', 6); + + // Make the map unmodifiable to ensure it cannot be changed after this point. + CHARACTER_VALUES = Collections.unmodifiableMap(tempMap); + } + + int getStringWidth(String string) { + int width = 0; + for (var character : string.toCharArray()) { + if (CHARACTER_VALUES.containsKey(character)) { + width += CHARACTER_VALUES.get(character); + } else { + // throw new IllegalArgumentException("Character " + character + " is not supported"); + } + } + return width; + } +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index e69de29bb..2081a7b08 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1,5 @@ + +public-f net.minecraft.network.chat.TextColor +public net.minecraft.network.chat.TextColor (ILjava/lang/String;)V +public-f net.minecraft.network.chat.TextColor f_131256_ # NAMED_COLORS +public thedarkcolour.gendustry.blockentity.IndustrialApiaryBeeModifier diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml deleted file mode 100644 index bfdc09eb2..000000000 --- a/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,65 +0,0 @@ -# This is an example mods.toml file. -# Any fields that aren't annotated with #optional are *required*! -modLoader = "javafml" -loaderVersion = "[47,)" -license = "All rights reserved" # Want to make your mod open source? Check out https://choosealicense.com/! - -# This is a URL to e.g. your GitHub or CurseForge issues page. -# It will appear in any crash reports this mod is directly involved in. -# issueTrackerURL="https://github.com/invalid/pleasechangeme/issues" #optional -# A list of mods - how many allowed here is determined by the individual mod loader - -[[mods]] -modId = "cosmiccore" -# The version number of the mod - unlike in the Forge MDK, -# we'll use the processResources task to replace this for us -version = "${version}" -displayName = "Cosmic Core" -# This URL will be queried by the Forge update checker in order to find the latest version of your mod. -# If an update is found, you'll see a little blinking "emerald" symbol on your Mods button! -# updateJSONURL="https://changeme.dev/updates.json" #optional -# This is your mod's "homepage" and will be displayed on the mod's information screen in the Mods panel. -# displayURL="https://changeme.dev/" #optional -# This will be displayed as your mod's logo in the Mods panel. -# logoFile="icon.png" #optional -# Some more fluff displayed in the Mods panel. Feel free to issue your special thanks here! -# credits="Thanks to Mojang for making this great game" #optional -# Some more fluff displayed in the Mods panel. Plug your stuff here! -# authors="Me!" #optional -# A multi-line description for your mod. This has no minimum length, but it *is* required! -description = ''' -This is a very cool mod that does... things. - -...and stuff. - -Have I reached 280 characters yet? -''' - -# An (optional) dependency for your mod. Though technically not required, -# it's always helpful to add these to stop your mod from loading when something is missing -# rather than erroring out later -[[dependencies.cosmiccore]] -modId = "forge" -mandatory = true # do you **need** this mod to be able to launch? -# A version range using interval notation. -# Brackets mean "inclusive" bounds, while parentheses mean "exclusive". -versionRange = "[47,)" # This essentially means any forge >= 47 -ordering = "NONE" # Use this if you want your mod to be loaded specifically BEFORE or AFTER another mod -side = "BOTH" # Specify where this mod is required: can be BOTH, CLIENT or SERVER - -# And another dependency, use this if you want to require a certain Minecraft version. -[[dependencies.cosmiccore]] -modId = "minecraft" -mandatory = true -# See above for how to read this notation, this essentially means any -# version of Minecraft from 1.20.1 (inclusive). -versionRange = "[1.20.1]" -ordering = "NONE" -side = "BOTH" - -[[dependencies.cosmiccore]] -modId="gtceu" -mandatory=true -versionRange="[1.2.2,)" -ordering="AFTER" -side="BOTH" \ No newline at end of file diff --git a/src/main/resources/META-INF/services/forestry.api.plugin.IForestryPlugin b/src/main/resources/META-INF/services/forestry.api.plugin.IForestryPlugin new file mode 100644 index 000000000..80ee41073 --- /dev/null +++ b/src/main/resources/META-INF/services/forestry.api.plugin.IForestryPlugin @@ -0,0 +1 @@ +com.ghostipedia.cosmiccore.client.CosmicBeesPlugin \ No newline at end of file diff --git a/src/main/resources/assets/ad_astra/blockstates/sun_globe.json b/src/main/resources/assets/ad_astra/blockstates/sun_globe.json new file mode 100644 index 000000000..e2321345a --- /dev/null +++ b/src/main/resources/assets/ad_astra/blockstates/sun_globe.json @@ -0,0 +1,16 @@ +{ + "variants": { + "powered=false,waterlogged=false": { + "model": "ad_astra:block/sun_globe" + }, + "powered=false,waterlogged=true": { + "model": "ad_astra:block/sun_globe" + }, + "powered=true,waterlogged=false": { + "model": "ad_astra:block/sun_globe" + }, + "powered=true,waterlogged=true": { + "model": "ad_astra:block/sun_globe" + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ad_astra/models/block/globe.json b/src/main/resources/assets/ad_astra/models/block/globe.json new file mode 100644 index 000000000..33911587e --- /dev/null +++ b/src/main/resources/assets/ad_astra/models/block/globe.json @@ -0,0 +1,47 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "render_type": "cutout", + "texture_size": [64, 64], + "elements": [ + { + "from": [6, 1, 6], + "to": [10, 6, 10], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 13, 8]}, + "faces": { + "north": {"uv": [9.75, 12, 10.75, 13.25], "texture": "#0"}, + "east": {"uv": [8.75, 12, 9.75, 13.25], "texture": "#0"}, + "south": {"uv": [7.75, 12, 8.75, 13.25], "texture": "#0"}, + "west": {"uv": [6.75, 12, 7.75, 13.25], "texture": "#0"}, + "up": {"uv": [7.75, 13.25, 8.75, 14.25], "texture": "#0"}, + "down": {"uv": [6.75, 13.25, 7.75, 14.25], "texture": "#0"} + } + }, + { + "from": [4, 0, 4], + "to": [12, 1, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [8, 13, 8]}, + "faces": { + "north": {"uv": [0, 14, 2, 14.25], "texture": "#0"}, + "east": {"uv": [0, 14, 2, 14.25], "texture": "#0"}, + "south": {"uv": [0, 14, 2, 14.25], "texture": "#0"}, + "west": {"uv": [0, 14, 2, 14.25], "texture": "#0"}, + "up": {"uv": [0, 12, 2, 14], "texture": "#0"}, + "down": {"uv": [2, 12, 4, 14], "texture": "#0"} + } + }, + { + "from": [8, 4, 7.5], + "to": [8, 20, 18.5], + "rotation": {"angle": 45, "axis": "y", "origin": [8, 12, 8]}, + "faces": { + "north": {"uv": [4, 12, 4, 16], "texture": "#0"}, + "east": {"uv": [6.75, 12, 4, 16], "texture": "#0"}, + "south": {"uv": [6.75, 12, 6.75, 16], "texture": "#0"}, + "west": {"uv": [4, 12, 6.75, 16], "texture": "#0"}, + "up": {"uv": [4, 12, 6.75, 12], "texture": "#0"}, + "down": {"uv": [4, 16, 6.75, 16], "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/ad_astra/models/block/globe_cube.json b/src/main/resources/assets/ad_astra/models/block/globe_cube.json new file mode 100644 index 000000000..d21355e69 --- /dev/null +++ b/src/main/resources/assets/ad_astra/models/block/globe_cube.json @@ -0,0 +1,19 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [64, 64], + "elements": [ + { + "from": [2, 6, 2], + "to": [14, 18, 14], + "rotation": {"angle": 0, "axis": "y", "origin": [2, 12, 2]}, + "faces": { + "north": {"uv": [3.75, 3.75, 7.5, 7.5], "texture": "#0"}, + "east": {"uv": [0, 3.75, 3.75, 7.5], "texture": "#0"}, + "south": {"uv": [11.25, 3.75, 15, 7.5], "texture": "#0"}, + "west": {"uv": [7.5, 3.75, 11.25, 7.5], "texture": "#0"}, + "up": {"uv": [3.75, 0, 7.5, 3.75], "rotation": 180, "texture": "#0"}, + "down": {"uv": [0, 7.5, 3.75, 11.25], "rotation": 90, "texture": "#0"} + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/ad_astra/models/block/sun_globe.json b/src/main/resources/assets/ad_astra/models/block/sun_globe.json new file mode 100644 index 000000000..81bef5082 --- /dev/null +++ b/src/main/resources/assets/ad_astra/models/block/sun_globe.json @@ -0,0 +1,7 @@ +{ + "parent": "ad_astra:block/globe", + "textures": { + "0": "ad_astra:block/globe/sun_globe", + "particle": "ad_astra:block/globe/sun_globe" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ad_astra/models/block/sun_globe_cube.json b/src/main/resources/assets/ad_astra/models/block/sun_globe_cube.json new file mode 100644 index 000000000..a14772131 --- /dev/null +++ b/src/main/resources/assets/ad_astra/models/block/sun_globe_cube.json @@ -0,0 +1,6 @@ +{ + "parent": "ad_astra:block/globe_cube", + "textures": { + "0": "ad_astra:block/globe/sun_globe" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/ad_astra/models/item/sun_globe.json b/src/main/resources/assets/ad_astra/models/item/sun_globe.json new file mode 100644 index 000000000..a31029609 --- /dev/null +++ b/src/main/resources/assets/ad_astra/models/item/sun_globe.json @@ -0,0 +1,3 @@ +{ + "parent": "ad_astra:item/rendered_item" +} \ No newline at end of file diff --git a/src/main/resources/assets/ad_astra/textures/block/globe/sun_globe.png b/src/main/resources/assets/ad_astra/textures/block/globe/sun_globe.png new file mode 100644 index 000000000..c9d92bbea Binary files /dev/null and b/src/main/resources/assets/ad_astra/textures/block/globe/sun_globe.png differ diff --git a/src/main/resources/assets/cosmiccore/models/block/ev_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/ev_ember_emitter.json new file mode 100644 index 000000000..9f6936f2e --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/ev_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_ev", + "1": "cosmiccore:block/puff_tex_ev", + "particle": "cosmiccore:block/puff_tex_ev" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/ev_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/ev_ember_receptor.json new file mode 100644 index 000000000..1fac3bcd2 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/ev_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_ev", + "particle": "cosmiccore:block/puff_tex_ev" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/hv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/hv_ember_emitter.json new file mode 100644 index 000000000..4c42b1626 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/hv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_hv", + "1": "cosmiccore:block/puff_tex_hv", + "particle": "cosmiccore:block/puff_tex_hv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/hv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/hv_ember_receptor.json new file mode 100644 index 000000000..561f19c92 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/hv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_hv", + "particle": "cosmiccore:block/puff_tex_hv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/beam_box.mtl b/src/main/resources/assets/cosmiccore/models/block/iris/beam_box.mtl new file mode 100644 index 000000000..2ea424a83 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/beam_box.mtl @@ -0,0 +1,13 @@ +# Blender 4.0.2 MTL File: 'None' +# www.blender.org + +newmtl Material +Ns 250.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd #texture0 \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/beam_box.obj b/src/main/resources/assets/cosmiccore/models/block/iris/beam_box.obj new file mode 100644 index 000000000..10e3eba3b --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/beam_box.obj @@ -0,0 +1,40 @@ +# Blender 4.0.2 +# www.blender.org +mtllib beam_box.mtl +o Cube +v 1.000000 1.000000 -1.000000 +v 1.000000 -1.000000 -1.000000 +v 1.000000 1.000000 1.000000 +v 1.000000 -1.000000 1.000000 +v -1.000000 1.000000 -1.000000 +v -1.000000 -1.000000 -1.000000 +v -1.000000 1.000000 1.000000 +v -1.000000 -1.000000 1.000000 +vn -0.0000 1.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -1.0000 -0.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 -1.0000 +vt 0.625000 0.500000 +vt 0.875000 0.500000 +vt 0.875000 0.750000 +vt 0.625000 0.750000 +vt 0.375000 0.750000 +vt 0.625000 1.000000 +vt 0.375000 1.000000 +vt 0.375000 0.000000 +vt 0.625000 0.000000 +vt 0.625000 0.250000 +vt 0.375000 0.250000 +vt 0.125000 0.500000 +vt 0.375000 0.500000 +vt 0.125000 0.750000 +s 0 +usemtl Material +f 1/1/1 5/2/1 7/3/1 3/4/1 +f 4/5/2 3/4/2 7/6/2 8/7/2 +f 8/8/3 7/9/3 5/10/3 6/11/3 +f 6/12/4 2/13/4 4/5/4 8/14/4 +f 2/13/5 1/1/5 3/4/5 4/5/5 +f 6/11/6 5/10/6 1/1/6 2/13/6 diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/iris_ring.json b/src/main/resources/assets/cosmiccore/models/block/iris/iris_ring.json new file mode 100644 index 000000000..0d0cef1ca --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/iris_ring.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "model": "cosmiccore:models/block/iris/the_ring.obj", + "textures": { + "texture0": "cosmiccore:block/iris/the_ring", + "particle":"cosmiccore:block/iris/the_ring" + }, + "automatic_culling": false + } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/iris_ring_white.json b/src/main/resources/assets/cosmiccore/models/block/iris/iris_ring_white.json new file mode 100644 index 000000000..55232fc86 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/iris_ring_white.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "model": "cosmiccore:models/block/iris/the_ring_white.obj", + "textures": { + "texture0": "cosmiccore:block/iris/the_ring_white", + "particle":"cosmiccore:block/iris/the_ring_white" + }, + "automatic_culling": false + } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/iris_sphere.json b/src/main/resources/assets/cosmiccore/models/block/iris/iris_sphere.json new file mode 100644 index 000000000..492e4bf8d --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/iris_sphere.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "model": "cosmiccore:models/block/iris/the_hole.obj", + "textures": { + "texture0": "cosmiccore:block/iris/the_hole", + "particle":"cosmiccore:block/iris/the_hole" + }, + "automatic_culling": false + } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/star_beam.json b/src/main/resources/assets/cosmiccore/models/block/iris/star_beam.json new file mode 100644 index 000000000..b557e15f7 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/star_beam.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "model": "cosmiccore:models/block/iris/beam_box.obj", + "textures": { + "texture0": "cosmiccore:block/iris/beam_box", + "particle":"cosmiccore:block/iris/beam_box" + }, + "automatic_culling": false + } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/star_core.mtl b/src/main/resources/assets/cosmiccore/models/block/iris/star_core.mtl new file mode 100644 index 000000000..9961318ab --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/star_core.mtl @@ -0,0 +1,13 @@ +# Blender 4.0.2 MTL File: 'None' +# www.blender.org + +newmtl Material +map_Kd #texture0 +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 1.000000 1.000000 1.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 10.650000 +d 0.700000 +illum 3 diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/star_core.obj b/src/main/resources/assets/cosmiccore/models/block/iris/star_core.obj new file mode 100644 index 000000000..d96a6e5f4 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/star_core.obj @@ -0,0 +1,2479 @@ +# Blender 4.0.2 +# www.blender.org +mtllib star_core.mtl +o Cube +v 0.742856 0.742856 -0.742856 +v 0.742856 -0.742856 -0.742856 +v 0.742856 0.742856 0.742856 +v 0.742856 -0.742856 0.742856 +v -0.742856 0.742856 -0.742856 +v -0.742856 -0.742856 -0.742856 +v -0.742856 0.742856 0.742856 +v -0.742856 -0.742856 0.742856 +v -0.909809 -0.909809 0.000000 +v 0.000000 -0.909809 -0.909809 +v 0.909809 0.000000 -0.909809 +v -0.909809 0.000000 0.909809 +v 0.909809 0.000000 0.909809 +v -0.909809 0.000000 -0.909809 +v 0.000000 0.909809 0.909809 +v 0.909809 0.909809 0.000000 +v 0.000000 -0.909809 0.909809 +v -0.909809 0.909809 0.000000 +v 0.000000 0.909809 -0.909809 +v 0.909809 -0.909809 0.000000 +v -0.000000 -0.000000 -1.286664 +v 1.286664 -0.000000 -0.000000 +v -0.000000 -1.286664 -0.000000 +v -1.286664 -0.000000 -0.000000 +v -0.000000 -0.000000 1.286664 +v -0.000000 1.286664 -0.000000 +v -0.900845 -0.900845 0.180169 +v -0.875464 -0.875464 0.350186 +v -0.837547 -0.837547 0.502528 +v -0.791887 -0.791887 0.633510 +v -0.180169 -0.900845 -0.900845 +v -0.350186 -0.875464 -0.875464 +v -0.502528 -0.837547 -0.837547 +v -0.633510 -0.791887 -0.791887 +v 0.900845 -0.180169 -0.900845 +v 0.875464 -0.350186 -0.875464 +v 0.837547 -0.502528 -0.837547 +v 0.791887 -0.633510 -0.791887 +v -0.900845 0.180169 0.900845 +v -0.875464 0.350186 0.875464 +v -0.837547 0.502528 0.837547 +v -0.791887 0.633510 0.791887 +v 0.900845 -0.180169 0.900845 +v 0.875464 -0.350186 0.875464 +v 0.837547 -0.502528 0.837547 +v 0.791887 -0.633510 0.791887 +v -0.900845 -0.180169 -0.900845 +v -0.875464 -0.350186 -0.875464 +v -0.837547 -0.502528 -0.837547 +v -0.791887 -0.633510 -0.791887 +v -0.180169 0.900845 0.900845 +v -0.350186 0.875464 0.875464 +v -0.502528 0.837547 0.837547 +v -0.633510 0.791887 0.791887 +v 0.900845 0.900845 0.180169 +v 0.875464 0.875464 0.350186 +v 0.837547 0.837547 0.502528 +v 0.791887 0.791887 0.633510 +v 0.180169 -0.900845 0.900845 +v 0.350186 -0.875464 0.875464 +v 0.502528 -0.837547 0.837547 +v 0.633510 -0.791887 0.791887 +v -0.900845 0.900845 -0.180169 +v -0.875464 0.875464 -0.350186 +v -0.837547 0.837547 -0.502528 +v -0.791887 0.791887 -0.633510 +v 0.180169 0.900845 -0.900845 +v 0.350186 0.875464 -0.875464 +v 0.502528 0.837547 -0.837547 +v 0.633510 0.791887 -0.791887 +v 0.900845 -0.900845 -0.180169 +v 0.875464 -0.875464 -0.350186 +v 0.837547 -0.837547 -0.502528 +v 0.791887 -0.791887 -0.633510 +v -0.791887 -0.791887 -0.633510 +v -0.837547 -0.837547 -0.502528 +v -0.875464 -0.875464 -0.350186 +v -0.900845 -0.900845 -0.180169 +v 0.633510 -0.791887 -0.791887 +v 0.502528 -0.837547 -0.837547 +v 0.350186 -0.875464 -0.875464 +v 0.180169 -0.900845 -0.900845 +v 0.791887 0.633510 -0.791887 +v 0.837547 0.502528 -0.837547 +v 0.875464 0.350186 -0.875464 +v 0.900845 0.180169 -0.900845 +v -0.791887 -0.633510 0.791887 +v -0.837547 -0.502528 0.837547 +v -0.875464 -0.350186 0.875464 +v -0.900845 -0.180169 0.900845 +v 0.791887 0.633510 0.791887 +v 0.837547 0.502528 0.837547 +v 0.875464 0.350186 0.875464 +v 0.900845 0.180169 0.900845 +v -0.791887 0.633510 -0.791887 +v -0.837547 0.502528 -0.837547 +v -0.875464 0.350186 -0.875464 +v -0.900845 0.180169 -0.900845 +v 0.633510 0.791887 0.791887 +v 0.502528 0.837547 0.837547 +v 0.350186 0.875464 0.875464 +v 0.180169 0.900845 0.900845 +v 0.791887 0.791887 -0.633510 +v 0.837547 0.837547 -0.502528 +v 0.875464 0.875464 -0.350186 +v 0.900845 0.900845 -0.180169 +v -0.633510 -0.791887 0.791887 +v -0.502528 -0.837547 0.837547 +v -0.350186 -0.875464 0.875464 +v -0.180169 -0.900845 0.900845 +v -0.791887 0.791887 0.633510 +v -0.837547 0.837547 0.502528 +v -0.875464 0.875464 0.350186 +v -0.900845 0.900845 0.180169 +v -0.633510 0.791887 -0.791887 +v -0.502528 0.837547 -0.837547 +v -0.350186 0.875464 -0.875464 +v -0.180169 0.900845 -0.900845 +v 0.791887 -0.791887 0.633510 +v 0.837547 -0.837547 0.502528 +v 0.875464 -0.875464 0.350186 +v 0.900845 -0.900845 0.180169 +v 0.252336 -0.000000 -1.261678 +v 0.477855 -0.000000 -1.194638 +v 0.661983 -0.000000 -1.103306 +v 0.803773 -0.000000 -1.004716 +v -0.803773 -0.000000 -1.004716 +v -0.661983 -0.000000 -1.103306 +v -0.477855 -0.000000 -1.194638 +v -0.252336 -0.000000 -1.261678 +v -0.000000 -0.252336 -1.261678 +v -0.000000 -0.477855 -1.194638 +v -0.000000 -0.661983 -1.103306 +v -0.000000 -0.803773 -1.004716 +v -0.000000 0.803773 -1.004716 +v -0.000000 0.661983 -1.103306 +v -0.000000 0.477855 -1.194638 +v -0.000000 0.252336 -1.261678 +v 1.261678 -0.000000 0.252336 +v 1.194638 -0.000000 0.477855 +v 1.103306 -0.000000 0.661983 +v 1.004716 -0.000000 0.803773 +v 1.004716 -0.000000 -0.803773 +v 1.103306 -0.000000 -0.661983 +v 1.194638 -0.000000 -0.477855 +v 1.261678 -0.000000 -0.252336 +v 1.261678 -0.252336 -0.000000 +v 1.194638 -0.477855 -0.000000 +v 1.103306 -0.661983 -0.000000 +v 1.004716 -0.803773 -0.000000 +v 1.004716 0.803773 -0.000000 +v 1.103306 0.661983 -0.000000 +v 1.194638 0.477855 -0.000000 +v 1.261678 0.252336 -0.000000 +v -0.000000 -1.261678 0.252336 +v -0.000000 -1.194638 0.477855 +v -0.000000 -1.103306 0.661983 +v -0.000000 -1.004716 0.803773 +v -0.000000 -1.004716 -0.803773 +v -0.000000 -1.103306 -0.661983 +v -0.000000 -1.194638 -0.477855 +v -0.000000 -1.261678 -0.252336 +v -0.252336 -1.261678 -0.000000 +v -0.477855 -1.194638 -0.000000 +v -0.661983 -1.103306 -0.000000 +v -0.803773 -1.004716 -0.000000 +v 0.803773 -1.004716 -0.000000 +v 0.661983 -1.103306 -0.000000 +v 0.477855 -1.194638 -0.000000 +v 0.252336 -1.261678 -0.000000 +v -1.261678 -0.000000 -0.252336 +v -1.194638 -0.000000 -0.477855 +v -1.103306 -0.000000 -0.661983 +v -1.004716 -0.000000 -0.803773 +v -1.004716 -0.000000 0.803773 +v -1.103306 -0.000000 0.661983 +v -1.194638 -0.000000 0.477855 +v -1.261678 -0.000000 0.252336 +v -1.261678 -0.252336 -0.000000 +v -1.194638 -0.477855 -0.000000 +v -1.103306 -0.661983 -0.000000 +v -1.004716 -0.803773 -0.000000 +v -1.004716 0.803773 -0.000000 +v -1.103306 0.661983 -0.000000 +v -1.194638 0.477855 -0.000000 +v -1.261678 0.252336 -0.000000 +v -0.252336 -0.000000 1.261678 +v -0.477855 -0.000000 1.194638 +v -0.661983 -0.000000 1.103306 +v -0.803773 -0.000000 1.004716 +v 0.803773 -0.000000 1.004716 +v 0.661983 -0.000000 1.103306 +v 0.477855 -0.000000 1.194638 +v 0.252336 -0.000000 1.261678 +v -0.000000 -0.252336 1.261678 +v -0.000000 -0.477855 1.194638 +v -0.000000 -0.661983 1.103306 +v -0.000000 -0.803773 1.004716 +v -0.000000 0.803773 1.004716 +v -0.000000 0.661983 1.103306 +v -0.000000 0.477855 1.194638 +v -0.000000 0.252336 1.261678 +v -0.000000 1.261678 0.252336 +v -0.000000 1.194638 0.477855 +v -0.000000 1.103306 0.661983 +v -0.000000 1.004716 0.803773 +v -0.000000 1.004716 -0.803773 +v -0.000000 1.103306 -0.661983 +v -0.000000 1.194638 -0.477855 +v -0.000000 1.261678 -0.252336 +v 0.252336 1.261678 -0.000000 +v 0.477855 1.194638 -0.000000 +v 0.661983 1.103306 -0.000000 +v 0.803773 1.004716 -0.000000 +v -0.803773 1.004716 -0.000000 +v -0.661983 1.103306 -0.000000 +v -0.477855 1.194638 -0.000000 +v -0.252336 1.261678 -0.000000 +v -0.198537 0.992683 -0.794147 +v -0.217486 1.087430 -0.652458 +v -0.234912 1.174559 -0.469823 +v -0.247619 1.238093 -0.247619 +v -0.383609 0.959023 -0.767218 +v -0.417449 1.043623 -0.626174 +v -0.447959 1.119898 -0.447959 +v -0.469823 1.174559 -0.234912 +v -0.545886 0.909809 -0.727847 +v -0.588644 0.981073 -0.588644 +v -0.626174 1.043623 -0.417449 +v -0.652458 1.087430 -0.217486 +v -0.681691 0.852114 -0.681691 +v -0.727847 0.909809 -0.545886 +v -0.767218 0.959023 -0.383609 +v -0.794147 0.992683 -0.198537 +v 0.681691 0.852114 -0.681691 +v 0.727847 0.909809 -0.545886 +v 0.767218 0.959023 -0.383609 +v 0.794147 0.992683 -0.198537 +v 0.545886 0.909809 -0.727847 +v 0.588644 0.981073 -0.588644 +v 0.626174 1.043623 -0.417449 +v 0.652458 1.087430 -0.217486 +v 0.383609 0.959023 -0.767218 +v 0.417449 1.043623 -0.626174 +v 0.447959 1.119898 -0.447959 +v 0.469823 1.174559 -0.234912 +v 0.198537 0.992683 -0.794147 +v 0.217486 1.087430 -0.652458 +v 0.234912 1.174559 -0.469823 +v 0.247619 1.238093 -0.247619 +v 0.794147 0.992683 0.198537 +v 0.767218 0.959023 0.383609 +v 0.727847 0.909809 0.545886 +v 0.681691 0.852114 0.681691 +v 0.652458 1.087430 0.217486 +v 0.626174 1.043623 0.417449 +v 0.588644 0.981073 0.588644 +v 0.545886 0.909809 0.727847 +v 0.469823 1.174559 0.234912 +v 0.447959 1.119898 0.447959 +v 0.417449 1.043623 0.626174 +v 0.383609 0.959023 0.767218 +v 0.247619 1.238093 0.247619 +v 0.234912 1.174559 0.469823 +v 0.217486 1.087430 0.652458 +v 0.198537 0.992683 0.794147 +v 0.794147 0.198537 0.992683 +v 0.652458 0.217486 1.087430 +v 0.469823 0.234912 1.174559 +v 0.247619 0.247619 1.238093 +v 0.767218 0.383609 0.959023 +v 0.626174 0.417449 1.043623 +v 0.447959 0.447959 1.119898 +v 0.234912 0.469823 1.174559 +v 0.727847 0.545886 0.909809 +v 0.588644 0.588644 0.981073 +v 0.417449 0.626174 1.043623 +v 0.217486 0.652458 1.087430 +v 0.681691 0.681691 0.852114 +v 0.545886 0.727847 0.909809 +v 0.383609 0.767218 0.959023 +v 0.198537 0.794147 0.992683 +v 0.681691 -0.681691 0.852114 +v 0.545886 -0.727847 0.909809 +v 0.383609 -0.767218 0.959023 +v 0.198537 -0.794147 0.992683 +v 0.727847 -0.545886 0.909809 +v 0.588644 -0.588644 0.981073 +v 0.417449 -0.626174 1.043623 +v 0.217486 -0.652458 1.087430 +v 0.767218 -0.383609 0.959023 +v 0.626174 -0.417449 1.043623 +v 0.447959 -0.447959 1.119898 +v 0.234912 -0.469823 1.174559 +v 0.794147 -0.198537 0.992683 +v 0.652458 -0.217486 1.087430 +v 0.469823 -0.234912 1.174559 +v 0.247619 -0.247619 1.238093 +v -0.198537 -0.794147 0.992683 +v -0.383609 -0.767218 0.959023 +v -0.545886 -0.727847 0.909809 +v -0.681691 -0.681691 0.852114 +v -0.217486 -0.652458 1.087430 +v -0.417449 -0.626174 1.043623 +v -0.588644 -0.588644 0.981073 +v -0.727847 -0.545886 0.909809 +v -0.234912 -0.469823 1.174559 +v -0.447959 -0.447959 1.119898 +v -0.626174 -0.417449 1.043623 +v -0.767218 -0.383609 0.959023 +v -0.247619 -0.247619 1.238093 +v -0.469823 -0.234912 1.174559 +v -0.652458 -0.217486 1.087430 +v -0.794147 -0.198537 0.992683 +v -0.992683 0.198537 0.794147 +v -1.087430 0.217486 0.652458 +v -1.174559 0.234912 0.469823 +v -1.238093 0.247619 0.247619 +v -0.959023 0.383609 0.767218 +v -1.043623 0.417449 0.626174 +v -1.119898 0.447959 0.447959 +v -1.174559 0.469823 0.234912 +v -0.909809 0.545886 0.727847 +v -0.981073 0.588644 0.588644 +v -1.043623 0.626174 0.417449 +v -1.087430 0.652458 0.217486 +v -0.852114 0.681691 0.681691 +v -0.909809 0.727847 0.545886 +v -0.959023 0.767218 0.383609 +v -0.992683 0.794147 0.198537 +v -0.852114 -0.681691 0.681691 +v -0.909809 -0.727847 0.545886 +v -0.959023 -0.767218 0.383609 +v -0.992683 -0.794147 0.198537 +v -0.909809 -0.545886 0.727847 +v -0.981073 -0.588644 0.588644 +v -1.043623 -0.626174 0.417449 +v -1.087430 -0.652458 0.217486 +v -0.959023 -0.383609 0.767218 +v -1.043623 -0.417449 0.626174 +v -1.119898 -0.447959 0.447959 +v -1.174559 -0.469823 0.234912 +v -0.992683 -0.198537 0.794147 +v -1.087430 -0.217486 0.652458 +v -1.174559 -0.234912 0.469823 +v -1.238093 -0.247619 0.247619 +v -0.992683 -0.794147 -0.198537 +v -0.959023 -0.767218 -0.383609 +v -0.909809 -0.727847 -0.545886 +v -0.852114 -0.681691 -0.681691 +v -1.087430 -0.652458 -0.217486 +v -1.043623 -0.626174 -0.417449 +v -0.981073 -0.588644 -0.588644 +v -0.909809 -0.545886 -0.727847 +v -1.174559 -0.469823 -0.234912 +v -1.119898 -0.447959 -0.447959 +v -1.043623 -0.417449 -0.626174 +v -0.959023 -0.383609 -0.767218 +v -1.238093 -0.247619 -0.247619 +v -1.174559 -0.234912 -0.469823 +v -1.087430 -0.217486 -0.652458 +v -0.992683 -0.198537 -0.794147 +v 0.198537 -0.992683 -0.794147 +v 0.217486 -1.087430 -0.652458 +v 0.234912 -1.174559 -0.469823 +v 0.247619 -1.238093 -0.247619 +v 0.383609 -0.959023 -0.767218 +v 0.417449 -1.043623 -0.626174 +v 0.447959 -1.119898 -0.447959 +v 0.469823 -1.174559 -0.234912 +v 0.545886 -0.909809 -0.727847 +v 0.588644 -0.981073 -0.588644 +v 0.626174 -1.043623 -0.417449 +v 0.652458 -1.087430 -0.217486 +v 0.681691 -0.852114 -0.681691 +v 0.727847 -0.909809 -0.545886 +v 0.767218 -0.959023 -0.383609 +v 0.794147 -0.992683 -0.198537 +v -0.681691 -0.852114 -0.681691 +v -0.727847 -0.909809 -0.545886 +v -0.767218 -0.959023 -0.383609 +v -0.794147 -0.992683 -0.198537 +v -0.545886 -0.909809 -0.727847 +v -0.588644 -0.981073 -0.588644 +v -0.626174 -1.043623 -0.417449 +v -0.652458 -1.087430 -0.217486 +v -0.383609 -0.959023 -0.767218 +v -0.417449 -1.043623 -0.626174 +v -0.447959 -1.119898 -0.447959 +v -0.469823 -1.174559 -0.234912 +v -0.198537 -0.992683 -0.794147 +v -0.217486 -1.087430 -0.652458 +v -0.234912 -1.174559 -0.469823 +v -0.247619 -1.238093 -0.247619 +v -0.794147 -0.992683 0.198537 +v -0.767218 -0.959023 0.383609 +v -0.727847 -0.909809 0.545886 +v -0.681691 -0.852114 0.681691 +v -0.652458 -1.087430 0.217486 +v -0.626174 -1.043623 0.417449 +v -0.588644 -0.981073 0.588644 +v -0.545886 -0.909809 0.727847 +v -0.469823 -1.174559 0.234912 +v -0.447959 -1.119898 0.447959 +v -0.417449 -1.043623 0.626174 +v -0.383609 -0.959023 0.767218 +v -0.247619 -1.238093 0.247619 +v -0.234912 -1.174559 0.469823 +v -0.217486 -1.087430 0.652458 +v -0.198537 -0.992683 0.794147 +v 0.992683 0.198537 -0.794147 +v 1.087430 0.217486 -0.652458 +v 1.174559 0.234912 -0.469823 +v 1.238093 0.247619 -0.247619 +v 0.959023 0.383609 -0.767218 +v 1.043623 0.417449 -0.626174 +v 1.119898 0.447959 -0.447959 +v 1.174559 0.469823 -0.234912 +v 0.909809 0.545886 -0.727847 +v 0.981073 0.588644 -0.588644 +v 1.043623 0.626174 -0.417449 +v 1.087430 0.652458 -0.217486 +v 0.852114 0.681691 -0.681691 +v 0.909809 0.727847 -0.545886 +v 0.959023 0.767218 -0.383609 +v 0.992683 0.794147 -0.198537 +v 0.852114 -0.681691 -0.681691 +v 0.909809 -0.727847 -0.545886 +v 0.959023 -0.767218 -0.383609 +v 0.992683 -0.794147 -0.198537 +v 0.909809 -0.545886 -0.727847 +v 0.981073 -0.588644 -0.588644 +v 1.043623 -0.626174 -0.417449 +v 1.087430 -0.652458 -0.217486 +v 0.959023 -0.383609 -0.767218 +v 1.043623 -0.417449 -0.626174 +v 1.119898 -0.447959 -0.447959 +v 1.174559 -0.469823 -0.234912 +v 0.992683 -0.198537 -0.794147 +v 1.087430 -0.217486 -0.652458 +v 1.174559 -0.234912 -0.469823 +v 1.238093 -0.247619 -0.247619 +v 0.992683 -0.794147 0.198537 +v 0.959023 -0.767218 0.383609 +v 0.909809 -0.727847 0.545886 +v 0.852114 -0.681691 0.681691 +v 1.087430 -0.652458 0.217486 +v 1.043623 -0.626174 0.417449 +v 0.981073 -0.588644 0.588644 +v 0.909809 -0.545886 0.727847 +v 1.174559 -0.469823 0.234912 +v 1.119898 -0.447959 0.447959 +v 1.043623 -0.417449 0.626174 +v 0.959023 -0.383609 0.767218 +v 1.238093 -0.247619 0.247619 +v 1.174559 -0.234912 0.469823 +v 1.087430 -0.217486 0.652458 +v 0.992683 -0.198537 0.794147 +v -0.794147 0.198537 -0.992683 +v -0.652458 0.217486 -1.087430 +v -0.469823 0.234912 -1.174559 +v -0.247619 0.247619 -1.238093 +v -0.767218 0.383609 -0.959023 +v -0.626174 0.417449 -1.043623 +v -0.447959 0.447959 -1.119898 +v -0.234912 0.469823 -1.174559 +v -0.727847 0.545886 -0.909809 +v -0.588644 0.588644 -0.981073 +v -0.417449 0.626174 -1.043623 +v -0.217486 0.652458 -1.087430 +v -0.681691 0.681691 -0.852114 +v -0.545886 0.727847 -0.909809 +v -0.383609 0.767218 -0.959023 +v -0.198537 0.794147 -0.992683 +v -0.681691 -0.681691 -0.852114 +v -0.545886 -0.727847 -0.909809 +v -0.383609 -0.767218 -0.959023 +v -0.198537 -0.794147 -0.992683 +v -0.727847 -0.545886 -0.909809 +v -0.588644 -0.588644 -0.981073 +v -0.417449 -0.626174 -1.043623 +v -0.217486 -0.652458 -1.087430 +v -0.767218 -0.383609 -0.959023 +v -0.626174 -0.417449 -1.043623 +v -0.447959 -0.447959 -1.119898 +v -0.234912 -0.469823 -1.174559 +v -0.794147 -0.198537 -0.992683 +v -0.652458 -0.217486 -1.087430 +v -0.469823 -0.234912 -1.174559 +v -0.247619 -0.247619 -1.238093 +v 0.198537 -0.794147 -0.992683 +v 0.383609 -0.767218 -0.959023 +v 0.545886 -0.727847 -0.909809 +v 0.681691 -0.681691 -0.852114 +v 0.217486 -0.652458 -1.087430 +v 0.417449 -0.626174 -1.043623 +v 0.588644 -0.588644 -0.981073 +v 0.727847 -0.545886 -0.909809 +v 0.234912 -0.469823 -1.174559 +v 0.447959 -0.447959 -1.119898 +v 0.626174 -0.417449 -1.043623 +v 0.767218 -0.383609 -0.959023 +v 0.247619 -0.247619 -1.238093 +v 0.469823 -0.234912 -1.174559 +v 0.652458 -0.217486 -1.087430 +v 0.794147 -0.198537 -0.992683 +v 0.247619 0.247619 -1.238093 +v 0.469823 0.234912 -1.174559 +v 0.652458 0.217486 -1.087430 +v 0.794147 0.198537 -0.992683 +v 0.234912 0.469823 -1.174559 +v 0.447959 0.447959 -1.119898 +v 0.626174 0.417449 -1.043623 +v 0.767218 0.383609 -0.959023 +v 0.217486 0.652458 -1.087430 +v 0.417449 0.626174 -1.043623 +v 0.588644 0.588644 -0.981073 +v 0.727847 0.545886 -0.909809 +v 0.198537 0.794147 -0.992683 +v 0.383609 0.767218 -0.959023 +v 0.545886 0.727847 -0.909809 +v 0.681691 0.681691 -0.852114 +v 1.238093 0.247619 0.247619 +v 1.174559 0.234912 0.469823 +v 1.087430 0.217486 0.652458 +v 0.992683 0.198537 0.794147 +v 1.174559 0.469823 0.234912 +v 1.119898 0.447959 0.447959 +v 1.043623 0.417449 0.626174 +v 0.959023 0.383609 0.767218 +v 1.087430 0.652458 0.217486 +v 1.043623 0.626174 0.417449 +v 0.981073 0.588644 0.588644 +v 0.909809 0.545886 0.727847 +v 0.992683 0.794147 0.198537 +v 0.959023 0.767218 0.383609 +v 0.909809 0.727847 0.545886 +v 0.852114 0.681691 0.681691 +v 0.247619 -1.238093 0.247619 +v 0.234912 -1.174559 0.469823 +v 0.217486 -1.087430 0.652458 +v 0.198537 -0.992683 0.794147 +v 0.469823 -1.174559 0.234912 +v 0.447959 -1.119898 0.447959 +v 0.417449 -1.043623 0.626174 +v 0.383609 -0.959023 0.767218 +v 0.652458 -1.087430 0.217486 +v 0.626174 -1.043623 0.417449 +v 0.588644 -0.981073 0.588644 +v 0.545886 -0.909809 0.727847 +v 0.794147 -0.992683 0.198537 +v 0.767218 -0.959023 0.383609 +v 0.727847 -0.909809 0.545886 +v 0.681691 -0.852114 0.681691 +v -1.238093 0.247619 -0.247619 +v -1.174559 0.234912 -0.469823 +v -1.087430 0.217486 -0.652458 +v -0.992683 0.198537 -0.794147 +v -1.174559 0.469823 -0.234912 +v -1.119898 0.447959 -0.447959 +v -1.043623 0.417449 -0.626174 +v -0.959023 0.383609 -0.767218 +v -1.087430 0.652458 -0.217486 +v -1.043623 0.626174 -0.417449 +v -0.981073 0.588644 -0.588644 +v -0.909809 0.545886 -0.727847 +v -0.992683 0.794147 -0.198537 +v -0.959023 0.767218 -0.383609 +v -0.909809 0.727847 -0.545886 +v -0.852114 0.681691 -0.681691 +v -0.247619 0.247619 1.238093 +v -0.469823 0.234912 1.174559 +v -0.652458 0.217486 1.087430 +v -0.794147 0.198537 0.992683 +v -0.234912 0.469823 1.174559 +v -0.447959 0.447959 1.119898 +v -0.626174 0.417449 1.043623 +v -0.767218 0.383609 0.959023 +v -0.217486 0.652458 1.087430 +v -0.417449 0.626174 1.043623 +v -0.588644 0.588644 0.981073 +v -0.727847 0.545886 0.909809 +v -0.198537 0.794147 0.992683 +v -0.383609 0.767218 0.959023 +v -0.545886 0.727847 0.909809 +v -0.681691 0.681691 0.852114 +v -0.247619 1.238093 0.247619 +v -0.234912 1.174559 0.469823 +v -0.217486 1.087430 0.652458 +v -0.198537 0.992683 0.794147 +v -0.469823 1.174559 0.234912 +v -0.447959 1.119898 0.447959 +v -0.417449 1.043623 0.626174 +v -0.383609 0.959023 0.767218 +v -0.652458 1.087430 0.217486 +v -0.626174 1.043623 0.417449 +v -0.588644 0.981073 0.588644 +v -0.545886 0.909809 0.727847 +v -0.794147 0.992683 0.198537 +v -0.767218 0.959023 0.383609 +v -0.727847 0.909809 0.545886 +v -0.681691 0.852114 0.681691 +vn -0.5544 0.6207 0.5544 +vn -0.5544 0.5544 0.6207 +vn -0.6207 0.5544 -0.5544 +vn 0.5544 -0.6207 0.5544 +vn 0.6207 0.5544 0.5544 +vn 0.5544 0.5544 -0.6207 +vn 0.6615 -0.0738 -0.7463 +vn -0.0971 -0.0971 -0.9905 +vn -0.0738 0.6615 -0.7463 +vn 0.7463 -0.0738 0.6615 +vn 0.9905 -0.0971 -0.0971 +vn 0.7463 0.6615 -0.0738 +vn -0.0738 -0.7463 0.6615 +vn -0.0971 -0.9905 -0.0971 +vn 0.6615 -0.7463 -0.0738 +vn -0.7463 -0.0738 -0.6615 +vn -0.9905 -0.0971 0.0971 +vn -0.7463 0.6615 0.0738 +vn -0.6615 -0.0738 0.7463 +vn 0.0971 -0.0971 0.9905 +vn 0.0738 0.6615 0.7463 +vn 0.0738 0.7463 0.6615 +vn 0.0971 0.9905 -0.0971 +vn -0.6615 0.7463 -0.0738 +vn -0.0971 0.9905 -0.0971 +vn -0.2812 0.9550 -0.0939 +vn -0.4392 0.8941 -0.0881 +vn -0.5653 0.8209 -0.0811 +vn -0.0738 0.7463 -0.6615 +vn -0.0811 0.8209 -0.5653 +vn -0.0881 0.8941 -0.4392 +vn -0.0939 0.9550 -0.2812 +vn -0.2169 0.7301 -0.6480 +vn -0.2371 0.7997 -0.5516 +vn -0.2565 0.8672 -0.4268 +vn -0.2722 0.9229 -0.2722 +vn -0.3472 0.7007 -0.6233 +vn -0.3768 0.7619 -0.5267 +vn -0.4046 0.8201 -0.4046 +vn -0.4268 0.8672 -0.2565 +vn -0.4601 0.6627 -0.5908 +vn -0.4949 0.7142 -0.4949 +vn -0.5267 0.7619 -0.3768 +vn -0.5516 0.7997 -0.2371 +vn -0.5544 0.6207 -0.5544 +vn -0.5908 0.6627 -0.4601 +vn -0.6233 0.7007 -0.3472 +vn -0.6480 0.7301 -0.2169 +vn 0.6615 0.7463 -0.0738 +vn 0.5653 0.8209 -0.0811 +vn 0.4392 0.8941 -0.0881 +vn 0.2812 0.9550 -0.0939 +vn 0.5544 0.6207 -0.5544 +vn 0.5908 0.6627 -0.4601 +vn 0.6233 0.7007 -0.3472 +vn 0.6480 0.7301 -0.2169 +vn 0.4601 0.6627 -0.5908 +vn 0.4949 0.7142 -0.4949 +vn 0.5267 0.7619 -0.3768 +vn 0.5516 0.7997 -0.2371 +vn 0.3472 0.7007 -0.6233 +vn 0.3768 0.7619 -0.5267 +vn 0.4046 0.8201 -0.4046 +vn 0.4268 0.8672 -0.2565 +vn 0.2169 0.7301 -0.6480 +vn 0.2371 0.7997 -0.5516 +vn 0.2565 0.8672 -0.4268 +vn 0.2722 0.9229 -0.2722 +vn 0.0738 0.7463 -0.6615 +vn 0.0811 0.8209 -0.5653 +vn 0.0881 0.8941 -0.4392 +vn 0.0939 0.9550 -0.2812 +vn 0.5544 0.6207 0.5544 +vn 0.4601 0.6627 0.5908 +vn 0.3472 0.7007 0.6233 +vn 0.2169 0.7301 0.6480 +vn 0.6615 0.7463 0.0738 +vn 0.6480 0.7301 0.2169 +vn 0.6233 0.7007 0.3472 +vn 0.5908 0.6627 0.4601 +vn 0.5653 0.8209 0.0811 +vn 0.5516 0.7997 0.2371 +vn 0.5267 0.7619 0.3768 +vn 0.4949 0.7142 0.4949 +vn 0.4392 0.8941 0.0881 +vn 0.4268 0.8672 0.2565 +vn 0.4046 0.8201 0.4046 +vn 0.3768 0.7619 0.5267 +vn 0.2812 0.9550 0.0939 +vn 0.2722 0.9229 0.2722 +vn 0.2565 0.8672 0.4268 +vn 0.2371 0.7997 0.5516 +vn 0.0971 0.9905 0.0971 +vn 0.0939 0.9550 0.2812 +vn 0.0881 0.8941 0.4392 +vn 0.0811 0.8209 0.5653 +vn 0.0971 0.0971 0.9905 +vn 0.0939 0.2812 0.9551 +vn 0.0881 0.4392 0.8941 +vn 0.0811 0.5653 0.8209 +vn 0.6615 0.0738 0.7463 +vn 0.5653 0.0811 0.8209 +vn 0.4392 0.0881 0.8941 +vn 0.2812 0.0939 0.9551 +vn 0.6480 0.2169 0.7301 +vn 0.5516 0.2371 0.7997 +vn 0.4268 0.2565 0.8672 +vn 0.2722 0.2722 0.9229 +vn 0.6233 0.3472 0.7007 +vn 0.5267 0.3768 0.7619 +vn 0.4046 0.4046 0.8201 +vn 0.2565 0.4268 0.8672 +vn 0.5908 0.4601 0.6627 +vn 0.4949 0.4949 0.7142 +vn 0.3768 0.5267 0.7619 +vn 0.2371 0.5516 0.7997 +vn 0.5544 0.5544 0.6207 +vn 0.4601 0.5908 0.6627 +vn 0.3472 0.6233 0.7007 +vn 0.2169 0.6480 0.7301 +vn 0.0738 -0.6615 0.7463 +vn 0.0811 -0.5653 0.8209 +vn 0.0881 -0.4392 0.8941 +vn 0.0939 -0.2812 0.9551 +vn 0.5544 -0.5544 0.6207 +vn 0.4601 -0.5908 0.6627 +vn 0.3472 -0.6233 0.7007 +vn 0.2169 -0.6480 0.7301 +vn 0.5908 -0.4601 0.6627 +vn 0.4949 -0.4949 0.7142 +vn 0.3768 -0.5267 0.7619 +vn 0.2371 -0.5516 0.7997 +vn 0.6233 -0.3472 0.7007 +vn 0.5267 -0.3768 0.7619 +vn 0.4046 -0.4046 0.8201 +vn 0.2565 -0.4268 0.8672 +vn 0.6480 -0.2169 0.7301 +vn 0.5516 -0.2371 0.7997 +vn 0.4268 -0.2565 0.8672 +vn 0.2722 -0.2722 0.9229 +vn 0.6615 -0.0738 0.7463 +vn 0.5653 -0.0811 0.8209 +vn 0.4392 -0.0881 0.8941 +vn 0.2812 -0.0939 0.9551 +vn -0.5544 -0.5544 0.6207 +vn -0.5908 -0.4601 0.6627 +vn -0.6233 -0.3472 0.7007 +vn -0.6480 -0.2169 0.7301 +vn -0.0738 -0.6615 0.7463 +vn -0.2169 -0.6480 0.7301 +vn -0.3472 -0.6233 0.7007 +vn -0.4601 -0.5908 0.6627 +vn -0.0811 -0.5653 0.8209 +vn -0.2371 -0.5516 0.7997 +vn -0.3768 -0.5267 0.7619 +vn -0.4949 -0.4949 0.7142 +vn -0.0881 -0.4392 0.8941 +vn -0.2565 -0.4268 0.8672 +vn -0.4046 -0.4046 0.8201 +vn -0.5267 -0.3768 0.7619 +vn -0.0939 -0.2812 0.9551 +vn -0.2722 -0.2722 0.9229 +vn -0.4268 -0.2565 0.8672 +vn -0.5516 -0.2371 0.7997 +vn -0.0971 -0.0971 0.9905 +vn -0.2812 -0.0939 0.9551 +vn -0.4392 -0.0881 0.8941 +vn -0.5653 -0.0811 0.8209 +vn -0.9905 0.0971 0.0971 +vn -0.9551 0.2812 0.0939 +vn -0.8941 0.4392 0.0881 +vn -0.8209 0.5653 0.0811 +vn -0.7463 0.0738 0.6615 +vn -0.8209 0.0811 0.5653 +vn -0.8941 0.0881 0.4392 +vn -0.9551 0.0939 0.2812 +vn -0.7301 0.2169 0.6480 +vn -0.7997 0.2371 0.5516 +vn -0.8672 0.2565 0.4268 +vn -0.9229 0.2722 0.2722 +vn -0.7007 0.3472 0.6233 +vn -0.7619 0.3768 0.5267 +vn -0.8201 0.4046 0.4046 +vn -0.8672 0.4268 0.2565 +vn -0.6627 0.4601 0.5908 +vn -0.7142 0.4949 0.4949 +vn -0.7619 0.5267 0.3768 +vn -0.7997 0.5516 0.2371 +vn -0.6207 0.5544 0.5544 +vn -0.6627 0.5908 0.4601 +vn -0.7007 0.6233 0.3472 +vn -0.7301 0.6480 0.2169 +vn -0.7463 -0.6615 0.0738 +vn -0.8209 -0.5653 0.0811 +vn -0.8941 -0.4392 0.0881 +vn -0.9551 -0.2812 0.0939 +vn -0.6207 -0.5544 0.5544 +vn -0.6627 -0.5908 0.4601 +vn -0.7007 -0.6233 0.3472 +vn -0.7301 -0.6480 0.2169 +vn -0.6627 -0.4601 0.5908 +vn -0.7142 -0.4949 0.4949 +vn -0.7619 -0.5267 0.3768 +vn -0.7997 -0.5516 0.2371 +vn -0.7007 -0.3472 0.6233 +vn -0.7619 -0.3768 0.5267 +vn -0.8201 -0.4046 0.4046 +vn -0.8672 -0.4268 0.2565 +vn -0.7301 -0.2169 0.6480 +vn -0.7997 -0.2371 0.5516 +vn -0.8672 -0.2565 0.4268 +vn -0.9229 -0.2722 0.2722 +vn -0.7463 -0.0738 0.6615 +vn -0.8209 -0.0811 0.5653 +vn -0.8941 -0.0881 0.4392 +vn -0.9551 -0.0939 0.2812 +vn -0.6207 -0.5544 -0.5544 +vn -0.6627 -0.4601 -0.5908 +vn -0.7007 -0.3472 -0.6233 +vn -0.7301 -0.2169 -0.6480 +vn -0.7463 -0.6615 -0.0738 +vn -0.7301 -0.6480 -0.2169 +vn -0.7007 -0.6233 -0.3472 +vn -0.6627 -0.5908 -0.4601 +vn -0.8209 -0.5653 -0.0811 +vn -0.7997 -0.5516 -0.2371 +vn -0.7619 -0.5267 -0.3768 +vn -0.7142 -0.4949 -0.4949 +vn -0.8941 -0.4392 -0.0881 +vn -0.8672 -0.4268 -0.2565 +vn -0.8201 -0.4046 -0.4046 +vn -0.7619 -0.3768 -0.5267 +vn -0.9551 -0.2812 -0.0939 +vn -0.9229 -0.2722 -0.2722 +vn -0.8672 -0.2565 -0.4268 +vn -0.7997 -0.2371 -0.5516 +vn -0.9905 -0.0971 -0.0971 +vn -0.9551 -0.0939 -0.2812 +vn -0.8941 -0.0881 -0.4392 +vn -0.8209 -0.0811 -0.5653 +vn 0.0971 -0.9905 -0.0971 +vn 0.2812 -0.9550 -0.0939 +vn 0.4392 -0.8941 -0.0881 +vn 0.5653 -0.8209 -0.0811 +vn 0.0738 -0.7463 -0.6615 +vn 0.0811 -0.8209 -0.5653 +vn 0.0881 -0.8941 -0.4392 +vn 0.0939 -0.9550 -0.2812 +vn 0.2169 -0.7301 -0.6480 +vn 0.2371 -0.7997 -0.5516 +vn 0.2565 -0.8672 -0.4268 +vn 0.2722 -0.9229 -0.2722 +vn 0.3472 -0.7007 -0.6233 +vn 0.3768 -0.7619 -0.5267 +vn 0.4046 -0.8201 -0.4046 +vn 0.4268 -0.8672 -0.2565 +vn 0.4601 -0.6627 -0.5908 +vn 0.4949 -0.7142 -0.4949 +vn 0.5267 -0.7619 -0.3768 +vn 0.5516 -0.7997 -0.2371 +vn 0.5544 -0.6207 -0.5544 +vn 0.5908 -0.6627 -0.4601 +vn 0.6233 -0.7007 -0.3472 +vn 0.6480 -0.7301 -0.2169 +vn -0.6615 -0.7463 -0.0738 +vn -0.5653 -0.8209 -0.0811 +vn -0.4392 -0.8941 -0.0881 +vn -0.2812 -0.9550 -0.0939 +vn -0.5544 -0.6207 -0.5544 +vn -0.5908 -0.6627 -0.4601 +vn -0.6233 -0.7007 -0.3472 +vn -0.6480 -0.7301 -0.2169 +vn -0.4601 -0.6627 -0.5908 +vn -0.4949 -0.7142 -0.4949 +vn -0.5267 -0.7619 -0.3768 +vn -0.5516 -0.7997 -0.2371 +vn -0.3472 -0.7007 -0.6233 +vn -0.3768 -0.7619 -0.5267 +vn -0.4046 -0.8201 -0.4046 +vn -0.4268 -0.8672 -0.2565 +vn -0.2169 -0.7301 -0.6480 +vn -0.2371 -0.7997 -0.5516 +vn -0.2565 -0.8672 -0.4268 +vn -0.2722 -0.9229 -0.2722 +vn -0.0738 -0.7463 -0.6615 +vn -0.0811 -0.8209 -0.5653 +vn -0.0881 -0.8941 -0.4392 +vn -0.0939 -0.9550 -0.2812 +vn -0.5544 -0.6207 0.5544 +vn -0.4601 -0.6627 0.5908 +vn -0.3472 -0.7007 0.6233 +vn -0.2169 -0.7301 0.6480 +vn -0.6615 -0.7463 0.0738 +vn -0.6480 -0.7301 0.2169 +vn -0.6233 -0.7007 0.3472 +vn -0.5908 -0.6627 0.4601 +vn -0.5653 -0.8209 0.0811 +vn -0.5516 -0.7997 0.2371 +vn -0.5267 -0.7619 0.3768 +vn -0.4949 -0.7142 0.4949 +vn -0.4392 -0.8941 0.0881 +vn -0.4268 -0.8672 0.2565 +vn -0.4046 -0.8201 0.4046 +vn -0.3768 -0.7619 0.5267 +vn -0.2812 -0.9551 0.0939 +vn -0.2722 -0.9229 0.2722 +vn -0.2565 -0.8672 0.4268 +vn -0.2371 -0.7997 0.5516 +vn -0.0971 -0.9905 0.0971 +vn -0.0939 -0.9550 0.2812 +vn -0.0881 -0.8941 0.4392 +vn -0.0811 -0.8209 0.5653 +vn 0.9905 0.0971 -0.0971 +vn 0.9551 0.2812 -0.0939 +vn 0.8941 0.4392 -0.0881 +vn 0.8209 0.5653 -0.0811 +vn 0.7463 0.0738 -0.6615 +vn 0.8209 0.0811 -0.5653 +vn 0.8941 0.0881 -0.4392 +vn 0.9551 0.0939 -0.2812 +vn 0.7301 0.2169 -0.6480 +vn 0.7997 0.2371 -0.5516 +vn 0.8672 0.2565 -0.4268 +vn 0.9229 0.2722 -0.2722 +vn 0.7007 0.3472 -0.6233 +vn 0.7619 0.3768 -0.5267 +vn 0.8201 0.4046 -0.4046 +vn 0.8672 0.4268 -0.2565 +vn 0.6627 0.4601 -0.5908 +vn 0.7142 0.4949 -0.4949 +vn 0.7619 0.5267 -0.3768 +vn 0.7997 0.5516 -0.2371 +vn 0.6207 0.5544 -0.5544 +vn 0.6627 0.5908 -0.4601 +vn 0.7007 0.6233 -0.3472 +vn 0.7301 0.6480 -0.2169 +vn 0.7463 -0.6615 -0.0738 +vn 0.8209 -0.5653 -0.0811 +vn 0.8941 -0.4392 -0.0881 +vn 0.9551 -0.2812 -0.0939 +vn 0.6207 -0.5544 -0.5544 +vn 0.6627 -0.5908 -0.4601 +vn 0.7007 -0.6233 -0.3472 +vn 0.7301 -0.6480 -0.2169 +vn 0.6627 -0.4601 -0.5908 +vn 0.7142 -0.4949 -0.4949 +vn 0.7619 -0.5267 -0.3768 +vn 0.7997 -0.5516 -0.2371 +vn 0.7007 -0.3472 -0.6233 +vn 0.7619 -0.3768 -0.5267 +vn 0.8201 -0.4046 -0.4046 +vn 0.8672 -0.4268 -0.2565 +vn 0.7301 -0.2169 -0.6480 +vn 0.7997 -0.2371 -0.5516 +vn 0.8672 -0.2565 -0.4268 +vn 0.9229 -0.2722 -0.2722 +vn 0.7463 -0.0738 -0.6615 +vn 0.8209 -0.0811 -0.5653 +vn 0.8941 -0.0881 -0.4392 +vn 0.9551 -0.0939 -0.2812 +vn 0.6207 -0.5544 0.5544 +vn 0.6627 -0.4601 0.5908 +vn 0.7007 -0.3472 0.6233 +vn 0.7301 -0.2169 0.6480 +vn 0.7463 -0.6615 0.0738 +vn 0.7301 -0.6480 0.2169 +vn 0.7007 -0.6233 0.3472 +vn 0.6627 -0.5908 0.4601 +vn 0.8209 -0.5653 0.0811 +vn 0.7997 -0.5516 0.2371 +vn 0.7619 -0.5267 0.3768 +vn 0.7142 -0.4949 0.4949 +vn 0.8941 -0.4392 0.0881 +vn 0.8672 -0.4268 0.2565 +vn 0.8201 -0.4046 0.4046 +vn 0.7619 -0.3768 0.5267 +vn 0.9551 -0.2812 0.0939 +vn 0.9229 -0.2722 0.2722 +vn 0.8672 -0.2565 0.4268 +vn 0.7997 -0.2371 0.5516 +vn 0.9905 -0.0971 0.0971 +vn 0.9551 -0.0939 0.2812 +vn 0.8941 -0.0881 0.4392 +vn 0.8209 -0.0811 0.5653 +vn -0.0971 0.0971 -0.9905 +vn -0.0939 0.2812 -0.9551 +vn -0.0881 0.4392 -0.8941 +vn -0.0811 0.5653 -0.8209 +vn -0.6615 0.0738 -0.7463 +vn -0.5653 0.0811 -0.8209 +vn -0.4392 0.0881 -0.8941 +vn -0.2812 0.0939 -0.9551 +vn -0.6480 0.2169 -0.7301 +vn -0.5516 0.2371 -0.7997 +vn -0.4268 0.2565 -0.8672 +vn -0.2722 0.2722 -0.9229 +vn -0.6233 0.3472 -0.7007 +vn -0.5267 0.3768 -0.7619 +vn -0.4046 0.4046 -0.8201 +vn -0.2565 0.4268 -0.8672 +vn -0.5908 0.4601 -0.6627 +vn -0.4949 0.4949 -0.7142 +vn -0.3768 0.5267 -0.7619 +vn -0.2371 0.5516 -0.7997 +vn -0.5544 0.5544 -0.6207 +vn -0.4601 0.5908 -0.6627 +vn -0.3472 0.6233 -0.7007 +vn -0.2169 0.6480 -0.7301 +vn -0.0738 -0.6615 -0.7463 +vn -0.0811 -0.5653 -0.8209 +vn -0.0881 -0.4392 -0.8941 +vn -0.0939 -0.2812 -0.9551 +vn -0.5544 -0.5544 -0.6207 +vn -0.4601 -0.5908 -0.6627 +vn -0.3472 -0.6233 -0.7007 +vn -0.2169 -0.6480 -0.7301 +vn -0.5908 -0.4601 -0.6627 +vn -0.4949 -0.4949 -0.7142 +vn -0.3768 -0.5267 -0.7619 +vn -0.2371 -0.5516 -0.7997 +vn -0.6233 -0.3472 -0.7007 +vn -0.5267 -0.3768 -0.7619 +vn -0.4046 -0.4046 -0.8201 +vn -0.2565 -0.4268 -0.8672 +vn -0.6480 -0.2169 -0.7301 +vn -0.5516 -0.2371 -0.7997 +vn -0.4268 -0.2565 -0.8672 +vn -0.2722 -0.2722 -0.9229 +vn -0.6615 -0.0738 -0.7463 +vn -0.5653 -0.0811 -0.8209 +vn -0.4392 -0.0881 -0.8941 +vn -0.2812 -0.0939 -0.9551 +vn 0.5544 -0.5544 -0.6207 +vn 0.5908 -0.4601 -0.6627 +vn 0.6233 -0.3472 -0.7007 +vn 0.6480 -0.2169 -0.7301 +vn 0.0738 -0.6615 -0.7463 +vn 0.2169 -0.6480 -0.7301 +vn 0.3472 -0.6233 -0.7007 +vn 0.4601 -0.5908 -0.6627 +vn 0.0811 -0.5653 -0.8209 +vn 0.2371 -0.5516 -0.7997 +vn 0.3768 -0.5267 -0.7619 +vn 0.4949 -0.4949 -0.7142 +vn 0.0881 -0.4392 -0.8941 +vn 0.2565 -0.4268 -0.8672 +vn 0.4046 -0.4046 -0.8201 +vn 0.5267 -0.3768 -0.7619 +vn 0.0939 -0.2812 -0.9551 +vn 0.2722 -0.2722 -0.9229 +vn 0.4268 -0.2565 -0.8672 +vn 0.5516 -0.2371 -0.7997 +vn 0.0971 -0.0971 -0.9905 +vn 0.2812 -0.0939 -0.9551 +vn 0.4392 -0.0881 -0.8941 +vn 0.5653 -0.0811 -0.8209 +vn 0.6615 0.0738 -0.7463 +vn 0.6480 0.2169 -0.7301 +vn 0.6233 0.3472 -0.7007 +vn 0.5908 0.4601 -0.6627 +vn 0.0971 0.0971 -0.9905 +vn 0.2812 0.0939 -0.9551 +vn 0.4392 0.0881 -0.8941 +vn 0.5653 0.0811 -0.8209 +vn 0.0939 0.2812 -0.9551 +vn 0.2722 0.2722 -0.9229 +vn 0.4268 0.2565 -0.8672 +vn 0.5516 0.2371 -0.7997 +vn 0.0881 0.4392 -0.8941 +vn 0.2565 0.4268 -0.8672 +vn 0.4046 0.4046 -0.8201 +vn 0.5267 0.3768 -0.7619 +vn 0.0811 0.5653 -0.8209 +vn 0.2371 0.5516 -0.7997 +vn 0.3768 0.5267 -0.7619 +vn 0.4949 0.4949 -0.7142 +vn 0.0738 0.6615 -0.7463 +vn 0.2169 0.6480 -0.7301 +vn 0.3472 0.6233 -0.7007 +vn 0.4601 0.5908 -0.6627 +vn 0.7463 0.0738 0.6615 +vn 0.7301 0.2169 0.6480 +vn 0.7007 0.3472 0.6233 +vn 0.6627 0.4601 0.5908 +vn 0.9905 0.0971 0.0971 +vn 0.9551 0.0939 0.2812 +vn 0.8941 0.0881 0.4392 +vn 0.8209 0.0811 0.5653 +vn 0.9551 0.2812 0.0939 +vn 0.9229 0.2722 0.2722 +vn 0.8672 0.2565 0.4268 +vn 0.7997 0.2371 0.5516 +vn 0.8941 0.4392 0.0881 +vn 0.8672 0.4268 0.2565 +vn 0.8201 0.4046 0.4046 +vn 0.7619 0.3768 0.5267 +vn 0.8209 0.5653 0.0811 +vn 0.7997 0.5516 0.2371 +vn 0.7619 0.5267 0.3768 +vn 0.7142 0.4949 0.4949 +vn 0.7463 0.6615 0.0738 +vn 0.7301 0.6480 0.2169 +vn 0.7007 0.6233 0.3472 +vn 0.6627 0.5908 0.4601 +vn 0.0738 -0.7463 0.6615 +vn 0.2169 -0.7301 0.6480 +vn 0.3472 -0.7007 0.6233 +vn 0.4601 -0.6627 0.5908 +vn 0.0971 -0.9905 0.0971 +vn 0.0939 -0.9550 0.2812 +vn 0.0881 -0.8941 0.4392 +vn 0.0811 -0.8209 0.5653 +vn 0.2812 -0.9550 0.0939 +vn 0.2722 -0.9229 0.2722 +vn 0.2565 -0.8672 0.4268 +vn 0.2371 -0.7997 0.5516 +vn 0.4392 -0.8941 0.0881 +vn 0.4268 -0.8672 0.2565 +vn 0.4046 -0.8201 0.4046 +vn 0.3768 -0.7619 0.5267 +vn 0.5653 -0.8209 0.0811 +vn 0.5516 -0.7997 0.2371 +vn 0.5267 -0.7619 0.3768 +vn 0.4949 -0.7142 0.4949 +vn 0.6615 -0.7463 0.0738 +vn 0.6480 -0.7301 0.2169 +vn 0.6233 -0.7007 0.3472 +vn 0.5908 -0.6627 0.4601 +vn -0.7463 0.0738 -0.6615 +vn -0.7301 0.2169 -0.6480 +vn -0.7007 0.3472 -0.6233 +vn -0.6627 0.4601 -0.5908 +vn -0.9905 0.0971 -0.0971 +vn -0.9551 0.0939 -0.2812 +vn -0.8941 0.0881 -0.4392 +vn -0.8209 0.0811 -0.5653 +vn -0.9551 0.2812 -0.0939 +vn -0.9229 0.2722 -0.2722 +vn -0.8672 0.2565 -0.4268 +vn -0.7997 0.2371 -0.5516 +vn -0.8941 0.4392 -0.0881 +vn -0.8672 0.4268 -0.2565 +vn -0.8201 0.4046 -0.4046 +vn -0.7619 0.3768 -0.5267 +vn -0.8209 0.5653 -0.0811 +vn -0.7997 0.5516 -0.2371 +vn -0.7619 0.5267 -0.3768 +vn -0.7142 0.4949 -0.4949 +vn -0.7463 0.6615 -0.0738 +vn -0.7301 0.6480 -0.2169 +vn -0.7007 0.6233 -0.3472 +vn -0.6627 0.5908 -0.4601 +vn -0.6615 0.0738 0.7463 +vn -0.6480 0.2169 0.7301 +vn -0.6233 0.3472 0.7007 +vn -0.5908 0.4601 0.6627 +vn -0.0971 0.0971 0.9905 +vn -0.2812 0.0939 0.9551 +vn -0.4392 0.0881 0.8941 +vn -0.5653 0.0811 0.8209 +vn -0.0939 0.2812 0.9551 +vn -0.2722 0.2722 0.9229 +vn -0.4268 0.2565 0.8672 +vn -0.5516 0.2371 0.7997 +vn -0.0881 0.4392 0.8941 +vn -0.2565 0.4268 0.8672 +vn -0.4046 0.4046 0.8201 +vn -0.5267 0.3768 0.7619 +vn -0.0811 0.5653 0.8209 +vn -0.2371 0.5516 0.7997 +vn -0.3768 0.5267 0.7619 +vn -0.4949 0.4949 0.7142 +vn -0.0738 0.6615 0.7463 +vn -0.2169 0.6480 0.7301 +vn -0.3472 0.6233 0.7007 +vn -0.4601 0.5908 0.6627 +vn -0.0738 0.7463 0.6615 +vn -0.2169 0.7301 0.6480 +vn -0.3472 0.7007 0.6233 +vn -0.4601 0.6627 0.5908 +vn -0.0971 0.9905 0.0971 +vn -0.0939 0.9550 0.2812 +vn -0.0881 0.8941 0.4392 +vn -0.0811 0.8209 0.5653 +vn -0.2812 0.9550 0.0939 +vn -0.2722 0.9229 0.2722 +vn -0.2565 0.8672 0.4268 +vn -0.2371 0.7997 0.5516 +vn -0.4392 0.8941 0.0881 +vn -0.4268 0.8672 0.2565 +vn -0.4046 0.8201 0.4046 +vn -0.3768 0.7619 0.5267 +vn -0.5653 0.8209 0.0811 +vn -0.5516 0.7997 0.2371 +vn -0.5267 0.7619 0.3768 +vn -0.4949 0.7142 0.4949 +vn -0.6615 0.7463 0.0738 +vn -0.6480 0.7301 0.2169 +vn -0.6233 0.7007 0.3472 +vn -0.5908 0.6627 0.4601 +vt 0.850000 0.725000 +vt 0.875000 0.725000 +vt 0.875000 0.750000 +vt 0.850000 0.750000 +vt 0.600000 0.975000 +vt 0.625000 0.975000 +vt 0.625000 1.000000 +vt 0.600000 1.000000 +vt 0.600000 0.225000 +vt 0.625000 0.225000 +vt 0.625000 0.250000 +vt 0.600000 0.250000 +vt 0.350000 0.725000 +vt 0.375000 0.725000 +vt 0.375000 0.750000 +vt 0.350000 0.750000 +vt 0.600000 0.725000 +vt 0.625000 0.725000 +vt 0.625000 0.750000 +vt 0.600000 0.750000 +vt 0.600000 0.475000 +vt 0.625000 0.475000 +vt 0.625000 0.500000 +vt 0.600000 0.500000 +vt 0.475000 0.475000 +vt 0.500000 0.475000 +vt 0.500000 0.500000 +vt 0.475000 0.500000 +vt 0.475000 0.350000 +vt 0.500000 0.350000 +vt 0.500000 0.375000 +vt 0.475000 0.375000 +vt 0.600000 0.350000 +vt 0.625000 0.350000 +vt 0.625000 0.375000 +vt 0.600000 0.375000 +vt 0.475000 0.725000 +vt 0.500000 0.725000 +vt 0.500000 0.750000 +vt 0.475000 0.750000 +vt 0.475000 0.600000 +vt 0.500000 0.600000 +vt 0.500000 0.625000 +vt 0.475000 0.625000 +vt 0.600000 0.600000 +vt 0.625000 0.600000 +vt 0.625000 0.625000 +vt 0.600000 0.625000 +vt 0.225000 0.725000 +vt 0.250000 0.725000 +vt 0.250000 0.750000 +vt 0.225000 0.750000 +vt 0.225000 0.600000 +vt 0.250000 0.600000 +vt 0.250000 0.625000 +vt 0.225000 0.625000 +vt 0.350000 0.600000 +vt 0.375000 0.600000 +vt 0.375000 0.625000 +vt 0.350000 0.625000 +vt 0.475000 0.225000 +vt 0.500000 0.225000 +vt 0.500000 0.250000 +vt 0.475000 0.250000 +vt 0.475000 0.100000 +vt 0.500000 0.100000 +vt 0.500000 0.125000 +vt 0.475000 0.125000 +vt 0.600000 0.100000 +vt 0.625000 0.100000 +vt 0.625000 0.125000 +vt 0.600000 0.125000 +vt 0.475000 0.975000 +vt 0.500000 0.975000 +vt 0.500000 1.000000 +vt 0.475000 1.000000 +vt 0.475000 0.850000 +vt 0.500000 0.850000 +vt 0.500000 0.875000 +vt 0.475000 0.875000 +vt 0.600000 0.850000 +vt 0.625000 0.850000 +vt 0.625000 0.875000 +vt 0.600000 0.875000 +vt 0.725000 0.725000 +vt 0.750000 0.725000 +vt 0.750000 0.750000 +vt 0.725000 0.750000 +vt 0.725000 0.600000 +vt 0.750000 0.600000 +vt 0.750000 0.625000 +vt 0.725000 0.625000 +vt 0.850000 0.600000 +vt 0.875000 0.600000 +vt 0.875000 0.625000 +vt 0.850000 0.625000 +vt 0.775000 0.600000 +vt 0.775000 0.625000 +vt 0.800000 0.600000 +vt 0.800000 0.625000 +vt 0.825000 0.600000 +vt 0.825000 0.625000 +vt 0.750000 0.500000 +vt 0.775000 0.500000 +vt 0.775000 0.525000 +vt 0.750000 0.525000 +vt 0.775000 0.550000 +vt 0.750000 0.550000 +vt 0.775000 0.575000 +vt 0.750000 0.575000 +vt 0.800000 0.500000 +vt 0.800000 0.525000 +vt 0.800000 0.550000 +vt 0.800000 0.575000 +vt 0.825000 0.500000 +vt 0.825000 0.525000 +vt 0.825000 0.550000 +vt 0.825000 0.575000 +vt 0.850000 0.500000 +vt 0.850000 0.525000 +vt 0.850000 0.550000 +vt 0.850000 0.575000 +vt 0.875000 0.500000 +vt 0.875000 0.525000 +vt 0.875000 0.550000 +vt 0.875000 0.575000 +vt 0.650000 0.600000 +vt 0.650000 0.625000 +vt 0.675000 0.600000 +vt 0.675000 0.625000 +vt 0.700000 0.600000 +vt 0.700000 0.625000 +vt 0.650000 0.500000 +vt 0.650000 0.525000 +vt 0.625000 0.525000 +vt 0.650000 0.550000 +vt 0.625000 0.550000 +vt 0.650000 0.575000 +vt 0.625000 0.575000 +vt 0.675000 0.500000 +vt 0.675000 0.525000 +vt 0.675000 0.550000 +vt 0.675000 0.575000 +vt 0.700000 0.500000 +vt 0.700000 0.525000 +vt 0.700000 0.550000 +vt 0.700000 0.575000 +vt 0.725000 0.500000 +vt 0.725000 0.525000 +vt 0.725000 0.550000 +vt 0.725000 0.575000 +vt 0.650000 0.725000 +vt 0.650000 0.750000 +vt 0.675000 0.725000 +vt 0.675000 0.750000 +vt 0.700000 0.725000 +vt 0.700000 0.750000 +vt 0.650000 0.650000 +vt 0.625000 0.650000 +vt 0.650000 0.675000 +vt 0.625000 0.675000 +vt 0.650000 0.700000 +vt 0.625000 0.700000 +vt 0.675000 0.650000 +vt 0.675000 0.675000 +vt 0.675000 0.700000 +vt 0.700000 0.650000 +vt 0.700000 0.675000 +vt 0.700000 0.700000 +vt 0.725000 0.650000 +vt 0.725000 0.675000 +vt 0.725000 0.700000 +vt 0.750000 0.650000 +vt 0.750000 0.675000 +vt 0.750000 0.700000 +vt 0.525000 0.850000 +vt 0.525000 0.875000 +vt 0.550000 0.850000 +vt 0.550000 0.875000 +vt 0.575000 0.850000 +vt 0.575000 0.875000 +vt 0.525000 0.750000 +vt 0.525000 0.775000 +vt 0.500000 0.775000 +vt 0.525000 0.800000 +vt 0.500000 0.800000 +vt 0.525000 0.825000 +vt 0.500000 0.825000 +vt 0.550000 0.750000 +vt 0.550000 0.775000 +vt 0.550000 0.800000 +vt 0.550000 0.825000 +vt 0.575000 0.750000 +vt 0.575000 0.775000 +vt 0.575000 0.800000 +vt 0.575000 0.825000 +vt 0.600000 0.775000 +vt 0.600000 0.800000 +vt 0.600000 0.825000 +vt 0.625000 0.775000 +vt 0.625000 0.800000 +vt 0.625000 0.825000 +vt 0.375000 0.850000 +vt 0.400000 0.850000 +vt 0.400000 0.875000 +vt 0.375000 0.875000 +vt 0.425000 0.850000 +vt 0.425000 0.875000 +vt 0.450000 0.850000 +vt 0.450000 0.875000 +vt 0.400000 0.750000 +vt 0.400000 0.775000 +vt 0.375000 0.775000 +vt 0.400000 0.800000 +vt 0.375000 0.800000 +vt 0.400000 0.825000 +vt 0.375000 0.825000 +vt 0.425000 0.750000 +vt 0.425000 0.775000 +vt 0.425000 0.800000 +vt 0.425000 0.825000 +vt 0.450000 0.750000 +vt 0.450000 0.775000 +vt 0.450000 0.800000 +vt 0.450000 0.825000 +vt 0.475000 0.775000 +vt 0.475000 0.800000 +vt 0.475000 0.825000 +vt 0.375000 0.975000 +vt 0.400000 0.975000 +vt 0.400000 1.000000 +vt 0.375000 1.000000 +vt 0.425000 0.975000 +vt 0.425000 1.000000 +vt 0.450000 0.975000 +vt 0.450000 1.000000 +vt 0.400000 0.900000 +vt 0.375000 0.900000 +vt 0.400000 0.925000 +vt 0.375000 0.925000 +vt 0.400000 0.950000 +vt 0.375000 0.950000 +vt 0.425000 0.900000 +vt 0.425000 0.925000 +vt 0.425000 0.950000 +vt 0.450000 0.900000 +vt 0.450000 0.925000 +vt 0.450000 0.950000 +vt 0.475000 0.900000 +vt 0.475000 0.925000 +vt 0.475000 0.950000 +vt 0.500000 0.900000 +vt 0.500000 0.925000 +vt 0.500000 0.950000 +vt 0.525000 0.100000 +vt 0.525000 0.125000 +vt 0.550000 0.100000 +vt 0.550000 0.125000 +vt 0.575000 0.100000 +vt 0.575000 0.125000 +vt 0.500000 0.000000 +vt 0.525000 0.000000 +vt 0.525000 0.025000 +vt 0.500000 0.025000 +vt 0.525000 0.050000 +vt 0.500000 0.050000 +vt 0.525000 0.075000 +vt 0.500000 0.075000 +vt 0.550000 0.000000 +vt 0.550000 0.025000 +vt 0.550000 0.050000 +vt 0.550000 0.075000 +vt 0.575000 0.000000 +vt 0.575000 0.025000 +vt 0.575000 0.050000 +vt 0.575000 0.075000 +vt 0.600000 0.000000 +vt 0.600000 0.025000 +vt 0.600000 0.050000 +vt 0.600000 0.075000 +vt 0.625000 0.000000 +vt 0.625000 0.025000 +vt 0.625000 0.050000 +vt 0.625000 0.075000 +vt 0.375000 0.100000 +vt 0.400000 0.100000 +vt 0.400000 0.125000 +vt 0.375000 0.125000 +vt 0.425000 0.100000 +vt 0.425000 0.125000 +vt 0.450000 0.100000 +vt 0.450000 0.125000 +vt 0.375000 0.000000 +vt 0.400000 0.000000 +vt 0.400000 0.025000 +vt 0.375000 0.025000 +vt 0.400000 0.050000 +vt 0.375000 0.050000 +vt 0.400000 0.075000 +vt 0.375000 0.075000 +vt 0.425000 0.000000 +vt 0.425000 0.025000 +vt 0.425000 0.050000 +vt 0.425000 0.075000 +vt 0.450000 0.000000 +vt 0.450000 0.025000 +vt 0.450000 0.050000 +vt 0.450000 0.075000 +vt 0.475000 0.000000 +vt 0.475000 0.025000 +vt 0.475000 0.050000 +vt 0.475000 0.075000 +vt 0.375000 0.225000 +vt 0.400000 0.225000 +vt 0.400000 0.250000 +vt 0.375000 0.250000 +vt 0.425000 0.225000 +vt 0.425000 0.250000 +vt 0.450000 0.225000 +vt 0.450000 0.250000 +vt 0.400000 0.150000 +vt 0.375000 0.150000 +vt 0.400000 0.175000 +vt 0.375000 0.175000 +vt 0.400000 0.200000 +vt 0.375000 0.200000 +vt 0.425000 0.150000 +vt 0.425000 0.175000 +vt 0.425000 0.200000 +vt 0.450000 0.150000 +vt 0.450000 0.175000 +vt 0.450000 0.200000 +vt 0.475000 0.150000 +vt 0.475000 0.175000 +vt 0.475000 0.200000 +vt 0.500000 0.150000 +vt 0.500000 0.175000 +vt 0.500000 0.200000 +vt 0.275000 0.600000 +vt 0.275000 0.625000 +vt 0.300000 0.600000 +vt 0.300000 0.625000 +vt 0.325000 0.600000 +vt 0.325000 0.625000 +vt 0.250000 0.500000 +vt 0.275000 0.500000 +vt 0.275000 0.525000 +vt 0.250000 0.525000 +vt 0.275000 0.550000 +vt 0.250000 0.550000 +vt 0.275000 0.575000 +vt 0.250000 0.575000 +vt 0.300000 0.500000 +vt 0.300000 0.525000 +vt 0.300000 0.550000 +vt 0.300000 0.575000 +vt 0.325000 0.500000 +vt 0.325000 0.525000 +vt 0.325000 0.550000 +vt 0.325000 0.575000 +vt 0.350000 0.500000 +vt 0.350000 0.525000 +vt 0.350000 0.550000 +vt 0.350000 0.575000 +vt 0.375000 0.500000 +vt 0.375000 0.525000 +vt 0.375000 0.550000 +vt 0.375000 0.575000 +vt 0.125000 0.600000 +vt 0.150000 0.600000 +vt 0.150000 0.625000 +vt 0.125000 0.625000 +vt 0.175000 0.600000 +vt 0.175000 0.625000 +vt 0.200000 0.600000 +vt 0.200000 0.625000 +vt 0.125000 0.500000 +vt 0.150000 0.500000 +vt 0.150000 0.525000 +vt 0.125000 0.525000 +vt 0.150000 0.550000 +vt 0.125000 0.550000 +vt 0.150000 0.575000 +vt 0.125000 0.575000 +vt 0.175000 0.500000 +vt 0.175000 0.525000 +vt 0.175000 0.550000 +vt 0.175000 0.575000 +vt 0.200000 0.500000 +vt 0.200000 0.525000 +vt 0.200000 0.550000 +vt 0.200000 0.575000 +vt 0.225000 0.500000 +vt 0.225000 0.525000 +vt 0.225000 0.550000 +vt 0.225000 0.575000 +vt 0.125000 0.725000 +vt 0.150000 0.725000 +vt 0.150000 0.750000 +vt 0.125000 0.750000 +vt 0.175000 0.725000 +vt 0.175000 0.750000 +vt 0.200000 0.725000 +vt 0.200000 0.750000 +vt 0.150000 0.650000 +vt 0.125000 0.650000 +vt 0.150000 0.675000 +vt 0.125000 0.675000 +vt 0.150000 0.700000 +vt 0.125000 0.700000 +vt 0.175000 0.650000 +vt 0.175000 0.675000 +vt 0.175000 0.700000 +vt 0.200000 0.650000 +vt 0.200000 0.675000 +vt 0.200000 0.700000 +vt 0.225000 0.650000 +vt 0.225000 0.675000 +vt 0.225000 0.700000 +vt 0.250000 0.650000 +vt 0.250000 0.675000 +vt 0.250000 0.700000 +vt 0.525000 0.600000 +vt 0.525000 0.625000 +vt 0.550000 0.600000 +vt 0.550000 0.625000 +vt 0.575000 0.600000 +vt 0.575000 0.625000 +vt 0.525000 0.500000 +vt 0.525000 0.525000 +vt 0.500000 0.525000 +vt 0.525000 0.550000 +vt 0.500000 0.550000 +vt 0.525000 0.575000 +vt 0.500000 0.575000 +vt 0.550000 0.500000 +vt 0.550000 0.525000 +vt 0.550000 0.550000 +vt 0.550000 0.575000 +vt 0.575000 0.500000 +vt 0.575000 0.525000 +vt 0.575000 0.550000 +vt 0.575000 0.575000 +vt 0.600000 0.525000 +vt 0.600000 0.550000 +vt 0.600000 0.575000 +vt 0.400000 0.600000 +vt 0.400000 0.625000 +vt 0.425000 0.600000 +vt 0.425000 0.625000 +vt 0.450000 0.600000 +vt 0.450000 0.625000 +vt 0.400000 0.500000 +vt 0.400000 0.525000 +vt 0.400000 0.550000 +vt 0.400000 0.575000 +vt 0.425000 0.500000 +vt 0.425000 0.525000 +vt 0.425000 0.550000 +vt 0.425000 0.575000 +vt 0.450000 0.500000 +vt 0.450000 0.525000 +vt 0.450000 0.550000 +vt 0.450000 0.575000 +vt 0.475000 0.525000 +vt 0.475000 0.550000 +vt 0.475000 0.575000 +vt 0.400000 0.725000 +vt 0.425000 0.725000 +vt 0.450000 0.725000 +vt 0.400000 0.650000 +vt 0.375000 0.650000 +vt 0.400000 0.675000 +vt 0.375000 0.675000 +vt 0.400000 0.700000 +vt 0.375000 0.700000 +vt 0.425000 0.650000 +vt 0.425000 0.675000 +vt 0.425000 0.700000 +vt 0.450000 0.650000 +vt 0.450000 0.675000 +vt 0.450000 0.700000 +vt 0.475000 0.650000 +vt 0.475000 0.675000 +vt 0.475000 0.700000 +vt 0.500000 0.650000 +vt 0.500000 0.675000 +vt 0.500000 0.700000 +vt 0.525000 0.350000 +vt 0.525000 0.375000 +vt 0.550000 0.350000 +vt 0.550000 0.375000 +vt 0.575000 0.350000 +vt 0.575000 0.375000 +vt 0.525000 0.250000 +vt 0.525000 0.275000 +vt 0.500000 0.275000 +vt 0.525000 0.300000 +vt 0.500000 0.300000 +vt 0.525000 0.325000 +vt 0.500000 0.325000 +vt 0.550000 0.250000 +vt 0.550000 0.275000 +vt 0.550000 0.300000 +vt 0.550000 0.325000 +vt 0.575000 0.250000 +vt 0.575000 0.275000 +vt 0.575000 0.300000 +vt 0.575000 0.325000 +vt 0.600000 0.275000 +vt 0.600000 0.300000 +vt 0.600000 0.325000 +vt 0.625000 0.275000 +vt 0.625000 0.300000 +vt 0.625000 0.325000 +vt 0.375000 0.350000 +vt 0.400000 0.350000 +vt 0.400000 0.375000 +vt 0.375000 0.375000 +vt 0.425000 0.350000 +vt 0.425000 0.375000 +vt 0.450000 0.350000 +vt 0.450000 0.375000 +vt 0.400000 0.275000 +vt 0.375000 0.275000 +vt 0.400000 0.300000 +vt 0.375000 0.300000 +vt 0.400000 0.325000 +vt 0.375000 0.325000 +vt 0.425000 0.275000 +vt 0.425000 0.300000 +vt 0.425000 0.325000 +vt 0.450000 0.275000 +vt 0.450000 0.300000 +vt 0.450000 0.325000 +vt 0.475000 0.275000 +vt 0.475000 0.300000 +vt 0.475000 0.325000 +vt 0.375000 0.475000 +vt 0.400000 0.475000 +vt 0.425000 0.475000 +vt 0.450000 0.475000 +vt 0.400000 0.400000 +vt 0.375000 0.400000 +vt 0.400000 0.425000 +vt 0.375000 0.425000 +vt 0.400000 0.450000 +vt 0.375000 0.450000 +vt 0.425000 0.400000 +vt 0.425000 0.425000 +vt 0.425000 0.450000 +vt 0.450000 0.400000 +vt 0.450000 0.425000 +vt 0.450000 0.450000 +vt 0.475000 0.400000 +vt 0.475000 0.425000 +vt 0.475000 0.450000 +vt 0.500000 0.400000 +vt 0.500000 0.425000 +vt 0.500000 0.450000 +vt 0.525000 0.475000 +vt 0.550000 0.475000 +vt 0.575000 0.475000 +vt 0.525000 0.400000 +vt 0.525000 0.425000 +vt 0.525000 0.450000 +vt 0.550000 0.400000 +vt 0.550000 0.425000 +vt 0.550000 0.450000 +vt 0.575000 0.400000 +vt 0.575000 0.425000 +vt 0.575000 0.450000 +vt 0.600000 0.400000 +vt 0.600000 0.425000 +vt 0.600000 0.450000 +vt 0.625000 0.400000 +vt 0.625000 0.425000 +vt 0.625000 0.450000 +vt 0.525000 0.725000 +vt 0.550000 0.725000 +vt 0.575000 0.725000 +vt 0.525000 0.650000 +vt 0.525000 0.675000 +vt 0.525000 0.700000 +vt 0.550000 0.650000 +vt 0.550000 0.675000 +vt 0.550000 0.700000 +vt 0.575000 0.650000 +vt 0.575000 0.675000 +vt 0.575000 0.700000 +vt 0.600000 0.650000 +vt 0.600000 0.675000 +vt 0.600000 0.700000 +vt 0.275000 0.725000 +vt 0.275000 0.750000 +vt 0.300000 0.725000 +vt 0.300000 0.750000 +vt 0.325000 0.725000 +vt 0.325000 0.750000 +vt 0.275000 0.650000 +vt 0.275000 0.675000 +vt 0.275000 0.700000 +vt 0.300000 0.650000 +vt 0.300000 0.675000 +vt 0.300000 0.700000 +vt 0.325000 0.650000 +vt 0.325000 0.675000 +vt 0.325000 0.700000 +vt 0.350000 0.650000 +vt 0.350000 0.675000 +vt 0.350000 0.700000 +vt 0.525000 0.225000 +vt 0.550000 0.225000 +vt 0.575000 0.225000 +vt 0.525000 0.150000 +vt 0.525000 0.175000 +vt 0.525000 0.200000 +vt 0.550000 0.150000 +vt 0.550000 0.175000 +vt 0.550000 0.200000 +vt 0.575000 0.150000 +vt 0.575000 0.175000 +vt 0.575000 0.200000 +vt 0.600000 0.150000 +vt 0.600000 0.175000 +vt 0.600000 0.200000 +vt 0.625000 0.150000 +vt 0.625000 0.175000 +vt 0.625000 0.200000 +vt 0.525000 0.975000 +vt 0.525000 1.000000 +vt 0.550000 0.975000 +vt 0.550000 1.000000 +vt 0.575000 0.975000 +vt 0.575000 1.000000 +vt 0.525000 0.900000 +vt 0.525000 0.925000 +vt 0.525000 0.950000 +vt 0.550000 0.900000 +vt 0.550000 0.925000 +vt 0.550000 0.950000 +vt 0.575000 0.900000 +vt 0.575000 0.925000 +vt 0.575000 0.950000 +vt 0.600000 0.900000 +vt 0.600000 0.925000 +vt 0.600000 0.950000 +vt 0.625000 0.900000 +vt 0.625000 0.925000 +vt 0.625000 0.950000 +vt 0.775000 0.725000 +vt 0.775000 0.750000 +vt 0.800000 0.725000 +vt 0.800000 0.750000 +vt 0.825000 0.725000 +vt 0.825000 0.750000 +vt 0.775000 0.650000 +vt 0.775000 0.675000 +vt 0.775000 0.700000 +vt 0.800000 0.650000 +vt 0.800000 0.675000 +vt 0.800000 0.700000 +vt 0.825000 0.650000 +vt 0.825000 0.675000 +vt 0.825000 0.700000 +vt 0.850000 0.650000 +vt 0.850000 0.675000 +vt 0.850000 0.700000 +vt 0.875000 0.650000 +vt 0.875000 0.675000 +vt 0.875000 0.700000 +s 0 +usemtl Material +f 602/1/1 111/2/1 7/3/1 54/4/1 +f 586/5/2 54/6/2 7/7/2 42/8/2 +f 570/9/3 66/10/3 5/11/3 95/12/3 +f 554/13/4 119/14/4 4/15/4 62/16/4 +f 538/17/5 58/18/5 3/19/5 91/20/5 +f 522/21/6 70/22/6 1/23/6 83/24/6 +f 506/25/7 126/26/7 11/27/7 35/28/7 +f 490/29/8 130/30/8 21/31/8 131/32/8 +f 474/33/9 118/34/9 19/35/9 135/36/9 +f 458/37/10 142/38/10 13/39/10 43/40/10 +f 442/41/11 146/42/11 22/43/11 147/44/11 +f 426/45/12 106/46/12 16/47/12 151/48/12 +f 410/49/13 158/50/13 17/51/13 110/52/13 +f 394/53/14 162/54/14 23/55/14 163/56/14 +f 378/57/15 71/58/15 20/59/15 167/60/15 +f 362/61/16 174/62/16 14/63/16 47/64/16 +f 346/65/17 178/66/17 24/67/17 179/68/17 +f 330/69/18 114/70/18 18/71/18 183/72/18 +f 314/73/19 190/74/19 12/75/19 90/76/19 +f 298/77/20 194/78/20 25/79/20 195/80/20 +f 282/81/21 102/82/21 15/83/21 199/84/21 +f 266/85/22 206/86/22 15/87/22 102/88/22 +f 250/89/23 210/90/23 26/91/23 211/92/23 +f 234/93/24 63/94/24 18/95/24 215/96/24 +f 210/90/25 222/97/25 218/98/25 26/91/25 +f 222/97/26 226/99/26 217/100/26 218/98/26 +f 226/99/27 230/101/27 216/102/27 217/100/27 +f 230/101/28 234/93/28 215/96/28 216/102/28 +f 19/103/29 118/104/29 219/105/29 207/106/29 +f 207/106/30 219/105/30 220/107/30 208/108/30 +f 208/108/31 220/107/31 221/109/31 209/110/31 +f 209/110/32 221/109/32 222/97/32 210/90/32 +f 118/104/33 117/111/33 223/112/33 219/105/33 +f 219/105/34 223/112/34 224/113/34 220/107/34 +f 220/107/35 224/113/35 225/114/35 221/109/35 +f 221/109/36 225/114/36 226/99/36 222/97/36 +f 117/111/37 116/115/37 227/116/37 223/112/37 +f 223/112/38 227/116/38 228/117/38 224/113/38 +f 224/113/39 228/117/39 229/118/39 225/114/39 +f 225/114/40 229/118/40 230/101/40 226/99/40 +f 116/115/41 115/119/41 231/120/41 227/116/41 +f 227/116/42 231/120/42 232/121/42 228/117/42 +f 228/117/43 232/121/43 233/122/43 229/118/43 +f 229/118/44 233/122/44 234/93/44 230/101/44 +f 115/119/45 5/123/45 66/124/45 231/120/45 +f 231/120/46 66/124/46 65/125/46 232/121/46 +f 232/121/47 65/125/47 64/126/47 233/122/47 +f 233/122/48 64/126/48 63/94/48 234/93/48 +f 106/46/49 238/127/49 214/128/49 16/47/49 +f 238/127/50 242/129/50 213/130/50 214/128/50 +f 242/129/51 246/131/51 212/132/51 213/130/51 +f 246/131/52 250/89/52 211/92/52 212/132/52 +f 1/23/53 70/133/53 235/134/53 103/135/53 +f 103/135/54 235/134/54 236/136/54 104/137/54 +f 104/137/55 236/136/55 237/138/55 105/139/55 +f 105/139/56 237/138/56 238/127/56 106/46/56 +f 70/133/57 69/140/57 239/141/57 235/134/57 +f 235/134/58 239/141/58 240/142/58 236/136/58 +f 236/136/59 240/142/59 241/143/59 237/138/59 +f 237/138/60 241/143/60 242/129/60 238/127/60 +f 69/140/61 68/144/61 243/145/61 239/141/61 +f 239/141/62 243/145/62 244/146/62 240/142/62 +f 240/142/63 244/146/63 245/147/63 241/143/63 +f 241/143/64 245/147/64 246/131/64 242/129/64 +f 68/144/65 67/148/65 247/149/65 243/145/65 +f 243/145/66 247/149/66 248/150/66 244/146/66 +f 244/146/67 248/150/67 249/151/67 245/147/67 +f 245/147/68 249/151/68 250/89/68 246/131/68 +f 67/148/69 19/103/69 207/106/69 247/149/69 +f 247/149/70 207/106/70 208/108/70 248/150/70 +f 248/150/71 208/108/71 209/110/71 249/151/71 +f 249/151/72 209/110/72 210/90/72 250/89/72 +f 58/18/73 254/152/73 99/153/73 3/19/73 +f 254/152/74 258/154/74 100/155/74 99/153/74 +f 258/154/75 262/156/75 101/157/75 100/155/75 +f 262/156/76 266/85/76 102/88/76 101/157/76 +f 16/47/77 214/128/77 251/158/77 55/159/77 +f 55/159/78 251/158/78 252/160/78 56/161/78 +f 56/161/79 252/160/79 253/162/79 57/163/79 +f 57/163/80 253/162/80 254/152/80 58/18/80 +f 214/128/81 213/130/81 255/164/81 251/158/81 +f 251/158/82 255/164/82 256/165/82 252/160/82 +f 252/160/83 256/165/83 257/166/83 253/162/83 +f 253/162/84 257/166/84 258/154/84 254/152/84 +f 213/130/85 212/132/85 259/167/85 255/164/85 +f 255/164/86 259/167/86 260/168/86 256/165/86 +f 256/165/87 260/168/87 261/169/87 257/166/87 +f 257/166/88 261/169/88 262/156/88 258/154/88 +f 212/132/89 211/92/89 263/170/89 259/167/89 +f 259/167/90 263/170/90 264/171/90 260/168/90 +f 260/168/91 264/171/91 265/172/91 261/169/91 +f 261/169/92 265/172/92 266/85/92 262/156/92 +f 211/92/93 26/91/93 203/173/93 263/170/93 +f 263/170/94 203/173/94 204/174/94 264/171/94 +f 264/171/95 204/174/95 205/175/95 265/172/95 +f 265/172/96 205/175/96 206/86/96 266/85/96 +f 194/78/97 270/176/97 202/177/97 25/79/97 +f 270/176/98 274/178/98 201/179/98 202/177/98 +f 274/178/99 278/180/99 200/181/99 201/179/99 +f 278/180/100 282/81/100 199/84/100 200/181/100 +f 13/39/101 94/182/101 267/183/101 191/184/101 +f 191/184/102 267/183/102 268/185/102 192/186/102 +f 192/186/103 268/185/103 269/187/103 193/188/103 +f 193/188/104 269/187/104 270/176/104 194/78/104 +f 94/182/105 93/189/105 271/190/105 267/183/105 +f 267/183/106 271/190/106 272/191/106 268/185/106 +f 268/185/107 272/191/107 273/192/107 269/187/107 +f 269/187/108 273/192/108 274/178/108 270/176/108 +f 93/189/109 92/193/109 275/194/109 271/190/109 +f 271/190/110 275/194/110 276/195/110 272/191/110 +f 272/191/111 276/195/111 277/196/111 273/192/111 +f 273/192/112 277/196/112 278/180/112 274/178/112 +f 92/193/113 91/20/113 279/197/113 275/194/113 +f 275/194/114 279/197/114 280/198/114 276/195/114 +f 276/195/115 280/198/115 281/199/115 277/196/115 +f 277/196/116 281/199/116 282/81/116 278/180/116 +f 91/20/117 3/19/117 99/200/117 279/197/117 +f 279/197/118 99/200/118 100/201/118 280/198/118 +f 280/198/119 100/201/119 101/202/119 281/199/119 +f 281/199/120 101/202/120 102/82/120 282/81/120 +f 59/203/121 286/204/121 198/205/121 17/206/121 +f 286/204/122 290/207/122 197/208/122 198/205/122 +f 290/207/123 294/209/123 196/210/123 197/208/123 +f 294/209/124 298/77/124 195/80/124 196/210/124 +f 4/15/125 46/211/125 283/212/125 62/213/125 +f 62/213/126 283/212/126 284/214/126 61/215/126 +f 61/215/127 284/214/127 285/216/127 60/217/127 +f 60/217/128 285/216/128 286/204/128 59/203/128 +f 46/211/129 45/218/129 287/219/129 283/212/129 +f 283/212/130 287/219/130 288/220/130 284/214/130 +f 284/214/131 288/220/131 289/221/131 285/216/131 +f 285/216/132 289/221/132 290/207/132 286/204/132 +f 45/218/133 44/222/133 291/223/133 287/219/133 +f 287/219/134 291/223/134 292/224/134 288/220/134 +f 288/220/135 292/224/135 293/225/135 289/221/135 +f 289/221/136 293/225/136 294/209/136 290/207/136 +f 44/222/137 43/40/137 295/226/137 291/223/137 +f 291/223/138 295/226/138 296/227/138 292/224/138 +f 292/224/139 296/227/139 297/228/139 293/225/139 +f 293/225/140 297/228/140 298/77/140 294/209/140 +f 43/40/141 13/39/141 191/184/141 295/226/141 +f 295/226/142 191/184/142 192/186/142 296/227/142 +f 296/227/143 192/186/143 193/188/143 297/228/143 +f 297/228/144 193/188/144 194/78/144 298/77/144 +f 107/229/145 302/230/145 87/231/145 8/232/145 +f 302/230/146 306/233/146 88/234/146 87/231/146 +f 306/233/147 310/235/147 89/236/147 88/234/147 +f 310/235/148 314/73/148 90/76/148 89/236/148 +f 17/206/149 198/205/149 299/237/149 110/238/149 +f 110/238/150 299/237/150 300/239/150 109/240/150 +f 109/240/151 300/239/151 301/241/151 108/242/151 +f 108/242/152 301/241/152 302/230/152 107/229/152 +f 198/205/153 197/208/153 303/243/153 299/237/153 +f 299/237/154 303/243/154 304/244/154 300/239/154 +f 300/239/155 304/244/155 305/245/155 301/241/155 +f 301/241/156 305/245/156 306/233/156 302/230/156 +f 197/208/157 196/210/157 307/246/157 303/243/157 +f 303/243/158 307/246/158 308/247/158 304/244/158 +f 304/244/159 308/247/159 309/248/159 305/245/159 +f 305/245/160 309/248/160 310/235/160 306/233/160 +f 196/210/161 195/80/161 311/249/161 307/246/161 +f 307/246/162 311/249/162 312/250/162 308/247/162 +f 308/247/163 312/250/163 313/251/163 309/248/163 +f 309/248/164 313/251/164 314/73/164 310/235/164 +f 195/80/165 25/79/165 187/252/165 311/249/165 +f 311/249/166 187/252/166 188/253/166 312/250/166 +f 312/250/167 188/253/167 189/254/167 313/251/167 +f 313/251/168 189/254/168 190/74/168 314/73/168 +f 178/66/169 318/255/169 186/256/169 24/67/169 +f 318/255/170 322/257/170 185/258/170 186/256/170 +f 322/257/171 326/259/171 184/260/171 185/258/171 +f 326/259/172 330/69/172 183/72/172 184/260/172 +f 12/261/173 39/262/173 315/263/173 175/264/173 +f 175/264/174 315/263/174 316/265/174 176/266/174 +f 176/266/175 316/265/175 317/267/175 177/268/175 +f 177/268/176 317/267/176 318/255/176 178/66/176 +f 39/262/177 40/269/177 319/270/177 315/263/177 +f 315/263/178 319/270/178 320/271/178 316/265/178 +f 316/265/179 320/271/179 321/272/179 317/267/179 +f 317/267/180 321/272/180 322/257/180 318/255/180 +f 40/269/181 41/273/181 323/274/181 319/270/181 +f 319/270/182 323/274/182 324/275/182 320/271/182 +f 320/271/183 324/275/183 325/276/183 321/272/183 +f 321/272/184 325/276/184 326/259/184 322/257/184 +f 41/273/185 42/277/185 327/278/185 323/274/185 +f 323/274/186 327/278/186 328/279/186 324/275/186 +f 324/275/187 328/279/187 329/280/187 325/276/187 +f 325/276/188 329/280/188 330/69/188 326/259/188 +f 42/277/189 7/281/189 111/282/189 327/278/189 +f 327/278/190 111/282/190 112/283/190 328/279/190 +f 328/279/191 112/283/191 113/284/191 329/280/191 +f 329/280/192 113/284/192 114/70/192 330/69/192 +f 27/285/193 334/286/193 182/287/193 9/288/193 +f 334/286/194 338/289/194 181/290/194 182/287/194 +f 338/289/195 342/291/195 180/292/195 181/290/195 +f 342/291/196 346/65/196 179/68/196 180/292/196 +f 8/293/197 87/294/197 331/295/197 30/296/197 +f 30/296/198 331/295/198 332/297/198 29/298/198 +f 29/298/199 332/297/199 333/299/199 28/300/199 +f 28/300/200 333/299/200 334/286/200 27/285/200 +f 87/294/201 88/301/201 335/302/201 331/295/201 +f 331/295/202 335/302/202 336/303/202 332/297/202 +f 332/297/203 336/303/203 337/304/203 333/299/203 +f 333/299/204 337/304/204 338/289/204 334/286/204 +f 88/301/205 89/305/205 339/306/205 335/302/205 +f 335/302/206 339/306/206 340/307/206 336/303/206 +f 336/303/207 340/307/207 341/308/207 337/304/207 +f 337/304/208 341/308/208 342/291/208 338/289/208 +f 89/305/209 90/309/209 343/310/209 339/306/209 +f 339/306/210 343/310/210 344/311/210 340/307/210 +f 340/307/211 344/311/211 345/312/211 341/308/211 +f 341/308/212 345/312/212 346/65/212 342/291/212 +f 90/309/213 12/261/213 175/264/213 343/310/213 +f 343/310/214 175/264/214 176/266/214 344/311/214 +f 344/311/215 176/266/215 177/268/215 345/312/215 +f 345/312/216 177/268/216 178/66/216 346/65/216 +f 75/313/217 350/314/217 50/315/217 6/316/217 +f 350/314/218 354/317/218 49/318/218 50/315/218 +f 354/317/219 358/319/219 48/320/219 49/318/219 +f 358/319/220 362/61/220 47/64/220 48/320/220 +f 9/288/221 182/287/221 347/321/221 78/322/221 +f 78/322/222 347/321/222 348/323/222 77/324/222 +f 77/324/223 348/323/223 349/325/223 76/326/223 +f 76/326/224 349/325/224 350/314/224 75/313/224 +f 182/287/225 181/290/225 351/327/225 347/321/225 +f 347/321/226 351/327/226 352/328/226 348/323/226 +f 348/323/227 352/328/227 353/329/227 349/325/227 +f 349/325/228 353/329/228 354/317/228 350/314/228 +f 181/290/229 180/292/229 355/330/229 351/327/229 +f 351/327/230 355/330/230 356/331/230 352/328/230 +f 352/328/231 356/331/231 357/332/231 353/329/231 +f 353/329/232 357/332/232 358/319/232 354/317/232 +f 180/292/233 179/68/233 359/333/233 355/330/233 +f 355/330/234 359/333/234 360/334/234 356/331/234 +f 356/331/235 360/334/235 361/335/235 357/332/235 +f 357/332/236 361/335/236 362/61/236 358/319/236 +f 179/68/237 24/67/237 171/336/237 359/333/237 +f 359/333/238 171/336/238 172/337/238 360/334/238 +f 360/334/239 172/337/239 173/338/239 361/335/239 +f 361/335/240 173/338/240 174/62/240 362/61/240 +f 162/54/241 366/339/241 170/340/241 23/55/241 +f 366/339/242 370/341/242 169/342/242 170/340/242 +f 370/341/243 374/343/243 168/344/243 169/342/243 +f 374/343/244 378/57/244 167/60/244 168/344/244 +f 10/345/245 82/346/245 363/347/245 159/348/245 +f 159/348/246 363/347/246 364/349/246 160/350/246 +f 160/350/247 364/349/247 365/351/247 161/352/247 +f 161/352/248 365/351/248 366/339/248 162/54/248 +f 82/346/249 81/353/249 367/354/249 363/347/249 +f 363/347/250 367/354/250 368/355/250 364/349/250 +f 364/349/251 368/355/251 369/356/251 365/351/251 +f 365/351/252 369/356/252 370/341/252 366/339/252 +f 81/353/253 80/357/253 371/358/253 367/354/253 +f 367/354/254 371/358/254 372/359/254 368/355/254 +f 368/355/255 372/359/255 373/360/255 369/356/255 +f 369/356/256 373/360/256 374/343/256 370/341/256 +f 80/357/257 79/361/257 375/362/257 371/358/257 +f 371/358/258 375/362/258 376/363/258 372/359/258 +f 372/359/259 376/363/259 377/364/259 373/360/259 +f 373/360/260 377/364/260 378/57/260 374/343/260 +f 79/361/261 2/365/261 74/366/261 375/362/261 +f 375/362/262 74/366/262 73/367/262 376/363/262 +f 376/363/263 73/367/263 72/368/263 377/364/263 +f 377/364/264 72/368/264 71/58/264 378/57/264 +f 78/369/265 382/370/265 166/371/265 9/372/265 +f 382/370/266 386/373/266 165/374/266 166/371/266 +f 386/373/267 390/375/267 164/376/267 165/374/267 +f 390/375/268 394/53/268 163/56/268 164/376/268 +f 6/377/269 34/378/269 379/379/269 75/380/269 +f 75/380/270 379/379/270 380/381/270 76/382/270 +f 76/382/271 380/381/271 381/383/271 77/384/271 +f 77/384/272 381/383/272 382/370/272 78/369/272 +f 34/378/273 33/385/273 383/386/273 379/379/273 +f 379/379/274 383/386/274 384/387/274 380/381/274 +f 380/381/275 384/387/275 385/388/275 381/383/275 +f 381/383/276 385/388/276 386/373/276 382/370/276 +f 33/385/277 32/389/277 387/390/277 383/386/277 +f 383/386/278 387/390/278 388/391/278 384/387/278 +f 384/387/279 388/391/279 389/392/279 385/388/279 +f 385/388/280 389/392/280 390/375/280 386/373/280 +f 32/389/281 31/393/281 391/394/281 387/390/281 +f 387/390/282 391/394/282 392/395/282 388/391/282 +f 388/391/283 392/395/283 393/396/283 389/392/283 +f 389/392/284 393/396/284 394/53/284 390/375/284 +f 31/393/285 10/345/285 159/348/285 391/394/285 +f 391/394/286 159/348/286 160/350/286 392/395/286 +f 392/395/287 160/350/287 161/352/287 393/396/287 +f 393/396/288 161/352/288 162/54/288 394/53/288 +f 30/397/289 398/398/289 107/399/289 8/400/289 +f 398/398/290 402/401/290 108/402/290 107/399/290 +f 402/401/291 406/403/291 109/404/291 108/402/291 +f 406/403/292 410/49/292 110/52/292 109/404/292 +f 9/372/293 166/371/293 395/405/293 27/406/293 +f 27/406/294 395/405/294 396/407/294 28/408/294 +f 28/408/295 396/407/295 397/409/295 29/410/295 +f 29/410/296 397/409/296 398/398/296 30/397/296 +f 166/371/297 165/374/297 399/411/297 395/405/297 +f 395/405/298 399/411/298 400/412/298 396/407/298 +f 396/407/299 400/412/299 401/413/299 397/409/299 +f 397/409/300 401/413/300 402/401/300 398/398/300 +f 165/374/301 164/376/301 403/414/301 399/411/301 +f 399/411/302 403/414/302 404/415/302 400/412/302 +f 400/412/303 404/415/303 405/416/303 401/413/303 +f 401/413/304 405/416/304 406/403/304 402/401/304 +f 164/376/305 163/56/305 407/417/305 403/414/305 +f 403/414/306 407/417/306 408/418/306 404/415/306 +f 404/415/307 408/418/307 409/419/307 405/416/307 +f 405/416/308 409/419/308 410/49/308 406/403/308 +f 163/56/309 23/55/309 155/420/309 407/417/309 +f 407/417/310 155/420/310 156/421/310 408/418/310 +f 408/418/311 156/421/311 157/422/311 409/419/311 +f 409/419/312 157/422/312 158/50/312 410/49/312 +f 146/42/313 414/423/313 154/424/313 22/43/313 +f 414/423/314 418/425/314 153/426/314 154/424/314 +f 418/425/315 422/427/315 152/428/315 153/426/315 +f 422/427/316 426/45/316 151/48/316 152/428/316 +f 11/27/317 86/429/317 411/430/317 143/431/317 +f 143/431/318 411/430/318 412/432/318 144/433/318 +f 144/433/319 412/432/319 413/434/319 145/435/319 +f 145/435/320 413/434/320 414/423/320 146/42/320 +f 86/429/321 85/436/321 415/437/321 411/430/321 +f 411/430/322 415/437/322 416/438/322 412/432/322 +f 412/432/323 416/438/323 417/439/323 413/434/323 +f 413/434/324 417/439/324 418/425/324 414/423/324 +f 85/436/325 84/440/325 419/441/325 415/437/325 +f 415/437/326 419/441/326 420/442/326 416/438/326 +f 416/438/327 420/442/327 421/443/327 417/439/327 +f 417/439/328 421/443/328 422/427/328 418/425/328 +f 84/440/329 83/24/329 423/444/329 419/441/329 +f 419/441/330 423/444/330 424/445/330 420/442/330 +f 420/442/331 424/445/331 425/446/331 421/443/331 +f 421/443/332 425/446/332 426/45/332 422/427/332 +f 83/24/333 1/23/333 103/135/333 423/444/333 +f 423/444/334 103/135/334 104/137/334 424/445/334 +f 424/445/335 104/137/335 105/139/335 425/446/335 +f 425/446/336 105/139/336 106/46/336 426/45/336 +f 71/58/337 430/447/337 150/448/337 20/59/337 +f 430/447/338 434/449/338 149/450/338 150/448/338 +f 434/449/339 438/451/339 148/452/339 149/450/339 +f 438/451/340 442/41/340 147/44/340 148/452/340 +f 2/365/341 38/453/341 427/454/341 74/366/341 +f 74/366/342 427/454/342 428/455/342 73/367/342 +f 73/367/343 428/455/343 429/456/343 72/368/343 +f 72/368/344 429/456/344 430/447/344 71/58/344 +f 38/453/345 37/457/345 431/458/345 427/454/345 +f 427/454/346 431/458/346 432/459/346 428/455/346 +f 428/455/347 432/459/347 433/460/347 429/456/347 +f 429/456/348 433/460/348 434/449/348 430/447/348 +f 37/457/349 36/461/349 435/462/349 431/458/349 +f 431/458/350 435/462/350 436/463/350 432/459/350 +f 432/459/351 436/463/351 437/464/351 433/460/351 +f 433/460/352 437/464/352 438/451/352 434/449/352 +f 36/461/353 35/28/353 439/465/353 435/462/353 +f 435/462/354 439/465/354 440/466/354 436/463/354 +f 436/463/355 440/466/355 441/467/355 437/464/355 +f 437/464/356 441/467/356 442/41/356 438/451/356 +f 35/28/357 11/27/357 143/431/357 439/465/357 +f 439/465/358 143/431/358 144/433/358 440/466/358 +f 440/466/359 144/433/359 145/435/359 441/467/359 +f 441/467/360 145/435/360 146/42/360 442/41/360 +f 119/14/361 446/468/361 46/211/361 4/15/361 +f 446/468/362 450/469/362 45/218/362 46/211/362 +f 450/469/363 454/470/363 44/222/363 45/218/363 +f 454/470/364 458/37/364 43/40/364 44/222/364 +f 20/59/365 150/448/365 443/471/365 122/472/365 +f 122/472/366 443/471/366 444/473/366 121/474/366 +f 121/474/367 444/473/367 445/475/367 120/476/367 +f 120/476/368 445/475/368 446/468/368 119/14/368 +f 150/448/369 149/450/369 447/477/369 443/471/369 +f 443/471/370 447/477/370 448/478/370 444/473/370 +f 444/473/371 448/478/371 449/479/371 445/475/371 +f 445/475/372 449/479/372 450/469/372 446/468/372 +f 149/450/373 148/452/373 451/480/373 447/477/373 +f 447/477/374 451/480/374 452/481/374 448/478/374 +f 448/478/375 452/481/375 453/482/375 449/479/375 +f 449/479/376 453/482/376 454/470/376 450/469/376 +f 148/452/377 147/44/377 455/483/377 451/480/377 +f 451/480/378 455/483/378 456/484/378 452/481/378 +f 452/481/379 456/484/379 457/485/379 453/482/379 +f 453/482/380 457/485/380 458/37/380 454/470/380 +f 147/44/381 22/43/381 139/486/381 455/483/381 +f 455/483/382 139/486/382 140/487/382 456/484/382 +f 456/484/383 140/487/383 141/488/383 457/485/383 +f 457/485/384 141/488/384 142/38/384 458/37/384 +f 130/30/385 462/489/385 138/490/385 21/31/385 +f 462/489/386 466/491/386 137/492/386 138/490/386 +f 466/491/387 470/493/387 136/494/387 137/492/387 +f 470/493/388 474/33/388 135/36/388 136/494/388 +f 14/63/389 98/495/389 459/496/389 127/497/389 +f 127/497/390 459/496/390 460/498/390 128/499/390 +f 128/499/391 460/498/391 461/500/391 129/501/391 +f 129/501/392 461/500/392 462/489/392 130/30/392 +f 98/495/393 97/502/393 463/503/393 459/496/393 +f 459/496/394 463/503/394 464/504/394 460/498/394 +f 460/498/395 464/504/395 465/505/395 461/500/395 +f 461/500/396 465/505/396 466/491/396 462/489/396 +f 97/502/397 96/506/397 467/507/397 463/503/397 +f 463/503/398 467/507/398 468/508/398 464/504/398 +f 464/504/399 468/508/399 469/509/399 465/505/399 +f 465/505/400 469/509/400 470/493/400 466/491/400 +f 96/506/401 95/12/401 471/510/401 467/507/401 +f 467/507/402 471/510/402 472/511/402 468/508/402 +f 468/508/403 472/511/403 473/512/403 469/509/403 +f 469/509/404 473/512/404 474/33/404 470/493/404 +f 95/12/405 5/11/405 115/513/405 471/510/405 +f 471/510/406 115/513/406 116/514/406 472/511/406 +f 472/511/407 116/514/407 117/515/407 473/512/407 +f 473/512/408 117/515/408 118/34/408 474/33/408 +f 31/516/409 478/517/409 134/518/409 10/519/409 +f 478/517/410 482/520/410 133/521/410 134/518/410 +f 482/520/411 486/522/411 132/523/411 133/521/411 +f 486/522/412 490/29/412 131/32/412 132/523/412 +f 6/316/413 50/315/413 475/524/413 34/525/413 +f 34/525/414 475/524/414 476/526/414 33/527/414 +f 33/527/415 476/526/415 477/528/415 32/529/415 +f 32/529/416 477/528/416 478/517/416 31/516/416 +f 50/315/417 49/318/417 479/530/417 475/524/417 +f 475/524/418 479/530/418 480/531/418 476/526/418 +f 476/526/419 480/531/419 481/532/419 477/528/419 +f 477/528/420 481/532/420 482/520/420 478/517/420 +f 49/318/421 48/320/421 483/533/421 479/530/421 +f 479/530/422 483/533/422 484/534/422 480/531/422 +f 480/531/423 484/534/423 485/535/423 481/532/423 +f 481/532/424 485/535/424 486/522/424 482/520/424 +f 48/320/425 47/64/425 487/536/425 483/533/425 +f 483/533/426 487/536/426 488/537/426 484/534/426 +f 484/534/427 488/537/427 489/538/427 485/535/427 +f 485/535/428 489/538/428 490/29/428 486/522/428 +f 47/64/429 14/63/429 127/497/429 487/536/429 +f 487/536/430 127/497/430 128/499/430 488/537/430 +f 488/537/431 128/499/431 129/501/431 489/538/431 +f 489/538/432 129/501/432 130/30/432 490/29/432 +f 79/539/433 494/540/433 38/453/433 2/365/433 +f 494/540/434 498/541/434 37/457/434 38/453/434 +f 498/541/435 502/542/435 36/461/435 37/457/435 +f 502/542/436 506/25/436 35/28/436 36/461/436 +f 10/519/437 134/518/437 491/543/437 82/544/437 +f 82/544/438 491/543/438 492/545/438 81/546/438 +f 81/546/439 492/545/439 493/547/439 80/548/439 +f 80/548/440 493/547/440 494/540/440 79/539/440 +f 134/518/441 133/521/441 495/549/441 491/543/441 +f 491/543/442 495/549/442 496/550/442 492/545/442 +f 492/545/443 496/550/443 497/551/443 493/547/443 +f 493/547/444 497/551/444 498/541/444 494/540/444 +f 133/521/445 132/523/445 499/552/445 495/549/445 +f 495/549/446 499/552/446 500/553/446 496/550/446 +f 496/550/447 500/553/447 501/554/447 497/551/447 +f 497/551/448 501/554/448 502/542/448 498/541/448 +f 132/523/449 131/32/449 503/555/449 499/552/449 +f 499/552/450 503/555/450 504/556/450 500/553/450 +f 500/553/451 504/556/451 505/557/451 501/554/451 +f 501/554/452 505/557/452 506/25/452 502/542/452 +f 131/32/453 21/31/453 123/558/453 503/555/453 +f 503/555/454 123/558/454 124/559/454 504/556/454 +f 504/556/455 124/559/455 125/560/455 505/557/455 +f 505/557/456 125/560/456 126/26/456 506/25/456 +f 126/26/457 510/561/457 86/429/457 11/27/457 +f 510/561/458 514/562/458 85/436/458 86/429/458 +f 514/562/459 518/563/459 84/440/459 85/436/459 +f 518/563/460 522/21/460 83/24/460 84/440/460 +f 21/31/461 138/490/461 507/564/461 123/558/461 +f 123/558/462 507/564/462 508/565/462 124/559/462 +f 124/559/463 508/565/463 509/566/463 125/560/463 +f 125/560/464 509/566/464 510/561/464 126/26/464 +f 138/490/465 137/492/465 511/567/465 507/564/465 +f 507/564/466 511/567/466 512/568/466 508/565/466 +f 508/565/467 512/568/467 513/569/467 509/566/467 +f 509/566/468 513/569/468 514/562/468 510/561/468 +f 137/492/469 136/494/469 515/570/469 511/567/469 +f 511/567/470 515/570/470 516/571/470 512/568/470 +f 512/568/471 516/571/471 517/572/471 513/569/471 +f 513/569/472 517/572/472 518/563/472 514/562/472 +f 136/494/473 135/36/473 519/573/473 515/570/473 +f 515/570/474 519/573/474 520/574/474 516/571/474 +f 516/571/475 520/574/475 521/575/475 517/572/475 +f 517/572/476 521/575/476 522/21/476 518/563/476 +f 135/36/477 19/35/477 67/576/477 519/573/477 +f 519/573/478 67/576/478 68/577/478 520/574/478 +f 520/574/479 68/577/479 69/578/479 521/575/479 +f 521/575/480 69/578/480 70/22/480 522/21/480 +f 142/38/481 526/579/481 94/182/481 13/39/481 +f 526/579/482 530/580/482 93/189/482 94/182/482 +f 530/580/483 534/581/483 92/193/483 93/189/483 +f 534/581/484 538/17/484 91/20/484 92/193/484 +f 22/43/485 154/424/485 523/582/485 139/486/485 +f 139/486/486 523/582/486 524/583/486 140/487/486 +f 140/487/487 524/583/487 525/584/487 141/488/487 +f 141/488/488 525/584/488 526/579/488 142/38/488 +f 154/424/489 153/426/489 527/585/489 523/582/489 +f 523/582/490 527/585/490 528/586/490 524/583/490 +f 524/583/491 528/586/491 529/587/491 525/584/491 +f 525/584/492 529/587/492 530/580/492 526/579/492 +f 153/426/493 152/428/493 531/588/493 527/585/493 +f 527/585/494 531/588/494 532/589/494 528/586/494 +f 528/586/495 532/589/495 533/590/495 529/587/495 +f 529/587/496 533/590/496 534/581/496 530/580/496 +f 152/428/497 151/48/497 535/591/497 531/588/497 +f 531/588/498 535/591/498 536/592/498 532/589/498 +f 532/589/499 536/592/499 537/593/499 533/590/499 +f 533/590/500 537/593/500 538/17/500 534/581/500 +f 151/48/501 16/47/501 55/159/501 535/591/501 +f 535/591/502 55/159/502 56/161/502 536/592/502 +f 536/592/503 56/161/503 57/163/503 537/593/503 +f 537/593/504 57/163/504 58/18/504 538/17/504 +f 158/50/505 542/594/505 59/595/505 17/51/505 +f 542/594/506 546/596/506 60/597/506 59/595/506 +f 546/596/507 550/598/507 61/599/507 60/597/507 +f 550/598/508 554/13/508 62/16/508 61/599/508 +f 23/55/509 170/340/509 539/600/509 155/420/509 +f 155/420/510 539/600/510 540/601/510 156/421/510 +f 156/421/511 540/601/511 541/602/511 157/422/511 +f 157/422/512 541/602/512 542/594/512 158/50/512 +f 170/340/513 169/342/513 543/603/513 539/600/513 +f 539/600/514 543/603/514 544/604/514 540/601/514 +f 540/601/515 544/604/515 545/605/515 541/602/515 +f 541/602/516 545/605/516 546/596/516 542/594/516 +f 169/342/517 168/344/517 547/606/517 543/603/517 +f 543/603/518 547/606/518 548/607/518 544/604/518 +f 544/604/519 548/607/519 549/608/519 545/605/519 +f 545/605/520 549/608/520 550/598/520 546/596/520 +f 168/344/521 167/60/521 551/609/521 547/606/521 +f 547/606/522 551/609/522 552/610/522 548/607/522 +f 548/607/523 552/610/523 553/611/523 549/608/523 +f 549/608/524 553/611/524 554/13/524 550/598/524 +f 167/60/525 20/59/525 122/472/525 551/609/525 +f 551/609/526 122/472/526 121/474/526 552/610/526 +f 552/610/527 121/474/527 120/476/527 553/611/527 +f 553/611/528 120/476/528 119/14/528 554/13/528 +f 174/62/529 558/612/529 98/495/529 14/63/529 +f 558/612/530 562/613/530 97/502/530 98/495/530 +f 562/613/531 566/614/531 96/506/531 97/502/531 +f 566/614/532 570/9/532 95/12/532 96/506/532 +f 24/67/533 186/256/533 555/615/533 171/336/533 +f 171/336/534 555/615/534 556/616/534 172/337/534 +f 172/337/535 556/616/535 557/617/535 173/338/535 +f 173/338/536 557/617/536 558/612/536 174/62/536 +f 186/256/537 185/258/537 559/618/537 555/615/537 +f 555/615/538 559/618/538 560/619/538 556/616/538 +f 556/616/539 560/619/539 561/620/539 557/617/539 +f 557/617/540 561/620/540 562/613/540 558/612/540 +f 185/258/541 184/260/541 563/621/541 559/618/541 +f 559/618/542 563/621/542 564/622/542 560/619/542 +f 560/619/543 564/622/543 565/623/543 561/620/543 +f 561/620/544 565/623/544 566/614/544 562/613/544 +f 184/260/545 183/72/545 567/624/545 563/621/545 +f 563/621/546 567/624/546 568/625/546 564/622/546 +f 564/622/547 568/625/547 569/626/547 565/623/547 +f 565/623/548 569/626/548 570/9/548 566/614/548 +f 183/72/549 18/71/549 63/627/549 567/624/549 +f 567/624/550 63/627/550 64/628/550 568/625/550 +f 568/625/551 64/628/551 65/629/551 569/626/551 +f 569/626/552 65/629/552 66/10/552 570/9/552 +f 190/74/553 574/630/553 39/631/553 12/75/553 +f 574/630/554 578/632/554 40/633/554 39/631/554 +f 578/632/555 582/634/555 41/635/555 40/633/555 +f 582/634/556 586/5/556 42/8/556 41/635/556 +f 25/79/557 202/177/557 571/636/557 187/252/557 +f 187/252/558 571/636/558 572/637/558 188/253/558 +f 188/253/559 572/637/559 573/638/559 189/254/559 +f 189/254/560 573/638/560 574/630/560 190/74/560 +f 202/177/561 201/179/561 575/639/561 571/636/561 +f 571/636/562 575/639/562 576/640/562 572/637/562 +f 572/637/563 576/640/563 577/641/563 573/638/563 +f 573/638/564 577/641/564 578/632/564 574/630/564 +f 201/179/565 200/181/565 579/642/565 575/639/565 +f 575/639/566 579/642/566 580/643/566 576/640/566 +f 576/640/567 580/643/567 581/644/567 577/641/567 +f 577/641/568 581/644/568 582/634/568 578/632/568 +f 200/181/569 199/84/569 583/645/569 579/642/569 +f 579/642/570 583/645/570 584/646/570 580/643/570 +f 580/643/571 584/646/571 585/647/571 581/644/571 +f 581/644/572 585/647/572 586/5/572 582/634/572 +f 199/84/573 15/83/573 51/648/573 583/645/573 +f 583/645/574 51/648/574 52/649/574 584/646/574 +f 584/646/575 52/649/575 53/650/575 585/647/575 +f 585/647/576 53/650/576 54/6/576 586/5/576 +f 206/86/577 590/651/577 51/652/577 15/87/577 +f 590/651/578 594/653/578 52/654/578 51/652/578 +f 594/653/579 598/655/579 53/656/579 52/654/579 +f 598/655/580 602/1/580 54/4/580 53/656/580 +f 26/91/581 218/98/581 587/657/581 203/173/581 +f 203/173/582 587/657/582 588/658/582 204/174/582 +f 204/174/583 588/658/583 589/659/583 205/175/583 +f 205/175/584 589/659/584 590/651/584 206/86/584 +f 218/98/585 217/100/585 591/660/585 587/657/585 +f 587/657/586 591/660/586 592/661/586 588/658/586 +f 588/658/587 592/661/587 593/662/587 589/659/587 +f 589/659/588 593/662/588 594/653/588 590/651/588 +f 217/100/589 216/102/589 595/663/589 591/660/589 +f 591/660/590 595/663/590 596/664/590 592/661/590 +f 592/661/591 596/664/591 597/665/591 593/662/591 +f 593/662/592 597/665/592 598/655/592 594/653/592 +f 216/102/593 215/96/593 599/666/593 595/663/593 +f 595/663/594 599/666/594 600/667/594 596/664/594 +f 596/664/595 600/667/595 601/668/595 597/665/595 +f 597/665/596 601/668/596 602/1/596 598/655/596 +f 215/96/597 18/95/597 114/669/597 599/666/597 +f 599/666/598 114/669/598 113/670/598 600/667/598 +f 600/667/599 113/670/599 112/671/599 601/668/599 +f 601/668/600 112/671/600 111/2/600 602/1/600 diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/star_shell.mtl b/src/main/resources/assets/cosmiccore/models/block/iris/star_shell.mtl new file mode 100644 index 000000000..a3827f0ce --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/star_shell.mtl @@ -0,0 +1,13 @@ +# Blender 4.0.2 MTL File: 'None' +# www.blender.org + +newmtl Material +map_Kd #texture0 +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 1.000000 1.000000 1.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 10.650000 +d 0.650000 +illum 3 diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/star_shell.obj b/src/main/resources/assets/cosmiccore/models/block/iris/star_shell.obj new file mode 100644 index 000000000..e9f1aca88 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/star_shell.obj @@ -0,0 +1,2479 @@ +# Blender 4.0.2 +# www.blender.org +mtllib star_shell.mtl +o Cube +v 0.742856 0.742856 -0.742856 +v 0.742856 -0.742856 -0.742856 +v 0.742856 0.742856 0.742856 +v 0.742856 -0.742856 0.742856 +v -0.742856 0.742856 -0.742856 +v -0.742856 -0.742856 -0.742856 +v -0.742856 0.742856 0.742856 +v -0.742856 -0.742856 0.742856 +v -0.909809 -0.909809 0.000000 +v 0.000000 -0.909809 -0.909809 +v 0.909809 0.000000 -0.909809 +v -0.909809 0.000000 0.909809 +v 0.909809 0.000000 0.909809 +v -0.909809 0.000000 -0.909809 +v 0.000000 0.909809 0.909809 +v 0.909809 0.909809 0.000000 +v 0.000000 -0.909809 0.909809 +v -0.909809 0.909809 0.000000 +v 0.000000 0.909809 -0.909809 +v 0.909809 -0.909809 0.000000 +v -0.000000 -0.000000 -1.286664 +v 1.286664 -0.000000 -0.000000 +v -0.000000 -1.286664 -0.000000 +v -1.286664 -0.000000 -0.000000 +v -0.000000 -0.000000 1.286664 +v -0.000000 1.286664 -0.000000 +v -0.900845 -0.900845 0.180169 +v -0.875464 -0.875464 0.350186 +v -0.837547 -0.837547 0.502528 +v -0.791887 -0.791887 0.633510 +v -0.180169 -0.900845 -0.900845 +v -0.350186 -0.875464 -0.875464 +v -0.502528 -0.837547 -0.837547 +v -0.633510 -0.791887 -0.791887 +v 0.900845 -0.180169 -0.900845 +v 0.875464 -0.350186 -0.875464 +v 0.837547 -0.502528 -0.837547 +v 0.791887 -0.633510 -0.791887 +v -0.900845 0.180169 0.900845 +v -0.875464 0.350186 0.875464 +v -0.837547 0.502528 0.837547 +v -0.791887 0.633510 0.791887 +v 0.900845 -0.180169 0.900845 +v 0.875464 -0.350186 0.875464 +v 0.837547 -0.502528 0.837547 +v 0.791887 -0.633510 0.791887 +v -0.900845 -0.180169 -0.900845 +v -0.875464 -0.350186 -0.875464 +v -0.837547 -0.502528 -0.837547 +v -0.791887 -0.633510 -0.791887 +v -0.180169 0.900845 0.900845 +v -0.350186 0.875464 0.875464 +v -0.502528 0.837547 0.837547 +v -0.633510 0.791887 0.791887 +v 0.900845 0.900845 0.180169 +v 0.875464 0.875464 0.350186 +v 0.837547 0.837547 0.502528 +v 0.791887 0.791887 0.633510 +v 0.180169 -0.900845 0.900845 +v 0.350186 -0.875464 0.875464 +v 0.502528 -0.837547 0.837547 +v 0.633510 -0.791887 0.791887 +v -0.900845 0.900845 -0.180169 +v -0.875464 0.875464 -0.350186 +v -0.837547 0.837547 -0.502528 +v -0.791887 0.791887 -0.633510 +v 0.180169 0.900845 -0.900845 +v 0.350186 0.875464 -0.875464 +v 0.502528 0.837547 -0.837547 +v 0.633510 0.791887 -0.791887 +v 0.900845 -0.900845 -0.180169 +v 0.875464 -0.875464 -0.350186 +v 0.837547 -0.837547 -0.502528 +v 0.791887 -0.791887 -0.633510 +v -0.791887 -0.791887 -0.633510 +v -0.837547 -0.837547 -0.502528 +v -0.875464 -0.875464 -0.350186 +v -0.900845 -0.900845 -0.180169 +v 0.633510 -0.791887 -0.791887 +v 0.502528 -0.837547 -0.837547 +v 0.350186 -0.875464 -0.875464 +v 0.180169 -0.900845 -0.900845 +v 0.791887 0.633510 -0.791887 +v 0.837547 0.502528 -0.837547 +v 0.875464 0.350186 -0.875464 +v 0.900845 0.180169 -0.900845 +v -0.791887 -0.633510 0.791887 +v -0.837547 -0.502528 0.837547 +v -0.875464 -0.350186 0.875464 +v -0.900845 -0.180169 0.900845 +v 0.791887 0.633510 0.791887 +v 0.837547 0.502528 0.837547 +v 0.875464 0.350186 0.875464 +v 0.900845 0.180169 0.900845 +v -0.791887 0.633510 -0.791887 +v -0.837547 0.502528 -0.837547 +v -0.875464 0.350186 -0.875464 +v -0.900845 0.180169 -0.900845 +v 0.633510 0.791887 0.791887 +v 0.502528 0.837547 0.837547 +v 0.350186 0.875464 0.875464 +v 0.180169 0.900845 0.900845 +v 0.791887 0.791887 -0.633510 +v 0.837547 0.837547 -0.502528 +v 0.875464 0.875464 -0.350186 +v 0.900845 0.900845 -0.180169 +v -0.633510 -0.791887 0.791887 +v -0.502528 -0.837547 0.837547 +v -0.350186 -0.875464 0.875464 +v -0.180169 -0.900845 0.900845 +v -0.791887 0.791887 0.633510 +v -0.837547 0.837547 0.502528 +v -0.875464 0.875464 0.350186 +v -0.900845 0.900845 0.180169 +v -0.633510 0.791887 -0.791887 +v -0.502528 0.837547 -0.837547 +v -0.350186 0.875464 -0.875464 +v -0.180169 0.900845 -0.900845 +v 0.791887 -0.791887 0.633510 +v 0.837547 -0.837547 0.502528 +v 0.875464 -0.875464 0.350186 +v 0.900845 -0.900845 0.180169 +v 0.252336 -0.000000 -1.261678 +v 0.477855 -0.000000 -1.194638 +v 0.661983 -0.000000 -1.103306 +v 0.803773 -0.000000 -1.004716 +v -0.803773 -0.000000 -1.004716 +v -0.661983 -0.000000 -1.103306 +v -0.477855 -0.000000 -1.194638 +v -0.252336 -0.000000 -1.261678 +v -0.000000 -0.252336 -1.261678 +v -0.000000 -0.477855 -1.194638 +v -0.000000 -0.661983 -1.103306 +v -0.000000 -0.803773 -1.004716 +v -0.000000 0.803773 -1.004716 +v -0.000000 0.661983 -1.103306 +v -0.000000 0.477855 -1.194638 +v -0.000000 0.252336 -1.261678 +v 1.261678 -0.000000 0.252336 +v 1.194638 -0.000000 0.477855 +v 1.103306 -0.000000 0.661983 +v 1.004716 -0.000000 0.803773 +v 1.004716 -0.000000 -0.803773 +v 1.103306 -0.000000 -0.661983 +v 1.194638 -0.000000 -0.477855 +v 1.261678 -0.000000 -0.252336 +v 1.261678 -0.252336 -0.000000 +v 1.194638 -0.477855 -0.000000 +v 1.103306 -0.661983 -0.000000 +v 1.004716 -0.803773 -0.000000 +v 1.004716 0.803773 -0.000000 +v 1.103306 0.661983 -0.000000 +v 1.194638 0.477855 -0.000000 +v 1.261678 0.252336 -0.000000 +v -0.000000 -1.261678 0.252336 +v -0.000000 -1.194638 0.477855 +v -0.000000 -1.103306 0.661983 +v -0.000000 -1.004716 0.803773 +v -0.000000 -1.004716 -0.803773 +v -0.000000 -1.103306 -0.661983 +v -0.000000 -1.194638 -0.477855 +v -0.000000 -1.261678 -0.252336 +v -0.252336 -1.261678 -0.000000 +v -0.477855 -1.194638 -0.000000 +v -0.661983 -1.103306 -0.000000 +v -0.803773 -1.004716 -0.000000 +v 0.803773 -1.004716 -0.000000 +v 0.661983 -1.103306 -0.000000 +v 0.477855 -1.194638 -0.000000 +v 0.252336 -1.261678 -0.000000 +v -1.261678 -0.000000 -0.252336 +v -1.194638 -0.000000 -0.477855 +v -1.103306 -0.000000 -0.661983 +v -1.004716 -0.000000 -0.803773 +v -1.004716 -0.000000 0.803773 +v -1.103306 -0.000000 0.661983 +v -1.194638 -0.000000 0.477855 +v -1.261678 -0.000000 0.252336 +v -1.261678 -0.252336 -0.000000 +v -1.194638 -0.477855 -0.000000 +v -1.103306 -0.661983 -0.000000 +v -1.004716 -0.803773 -0.000000 +v -1.004716 0.803773 -0.000000 +v -1.103306 0.661983 -0.000000 +v -1.194638 0.477855 -0.000000 +v -1.261678 0.252336 -0.000000 +v -0.252336 -0.000000 1.261678 +v -0.477855 -0.000000 1.194638 +v -0.661983 -0.000000 1.103306 +v -0.803773 -0.000000 1.004716 +v 0.803773 -0.000000 1.004716 +v 0.661983 -0.000000 1.103306 +v 0.477855 -0.000000 1.194638 +v 0.252336 -0.000000 1.261678 +v -0.000000 -0.252336 1.261678 +v -0.000000 -0.477855 1.194638 +v -0.000000 -0.661983 1.103306 +v -0.000000 -0.803773 1.004716 +v -0.000000 0.803773 1.004716 +v -0.000000 0.661983 1.103306 +v -0.000000 0.477855 1.194638 +v -0.000000 0.252336 1.261678 +v -0.000000 1.261678 0.252336 +v -0.000000 1.194638 0.477855 +v -0.000000 1.103306 0.661983 +v -0.000000 1.004716 0.803773 +v -0.000000 1.004716 -0.803773 +v -0.000000 1.103306 -0.661983 +v -0.000000 1.194638 -0.477855 +v -0.000000 1.261678 -0.252336 +v 0.252336 1.261678 -0.000000 +v 0.477855 1.194638 -0.000000 +v 0.661983 1.103306 -0.000000 +v 0.803773 1.004716 -0.000000 +v -0.803773 1.004716 -0.000000 +v -0.661983 1.103306 -0.000000 +v -0.477855 1.194638 -0.000000 +v -0.252336 1.261678 -0.000000 +v -0.198537 0.992683 -0.794147 +v -0.217486 1.087430 -0.652458 +v -0.234912 1.174559 -0.469823 +v -0.247619 1.238093 -0.247619 +v -0.383609 0.959023 -0.767218 +v -0.417449 1.043623 -0.626174 +v -0.447959 1.119898 -0.447959 +v -0.469823 1.174559 -0.234912 +v -0.545886 0.909809 -0.727847 +v -0.588644 0.981073 -0.588644 +v -0.626174 1.043623 -0.417449 +v -0.652458 1.087430 -0.217486 +v -0.681691 0.852114 -0.681691 +v -0.727847 0.909809 -0.545886 +v -0.767218 0.959023 -0.383609 +v -0.794147 0.992683 -0.198537 +v 0.681691 0.852114 -0.681691 +v 0.727847 0.909809 -0.545886 +v 0.767218 0.959023 -0.383609 +v 0.794147 0.992683 -0.198537 +v 0.545886 0.909809 -0.727847 +v 0.588644 0.981073 -0.588644 +v 0.626174 1.043623 -0.417449 +v 0.652458 1.087430 -0.217486 +v 0.383609 0.959023 -0.767218 +v 0.417449 1.043623 -0.626174 +v 0.447959 1.119898 -0.447959 +v 0.469823 1.174559 -0.234912 +v 0.198537 0.992683 -0.794147 +v 0.217486 1.087430 -0.652458 +v 0.234912 1.174559 -0.469823 +v 0.247619 1.238093 -0.247619 +v 0.794147 0.992683 0.198537 +v 0.767218 0.959023 0.383609 +v 0.727847 0.909809 0.545886 +v 0.681691 0.852114 0.681691 +v 0.652458 1.087430 0.217486 +v 0.626174 1.043623 0.417449 +v 0.588644 0.981073 0.588644 +v 0.545886 0.909809 0.727847 +v 0.469823 1.174559 0.234912 +v 0.447959 1.119898 0.447959 +v 0.417449 1.043623 0.626174 +v 0.383609 0.959023 0.767218 +v 0.247619 1.238093 0.247619 +v 0.234912 1.174559 0.469823 +v 0.217486 1.087430 0.652458 +v 0.198537 0.992683 0.794147 +v 0.794147 0.198537 0.992683 +v 0.652458 0.217486 1.087430 +v 0.469823 0.234912 1.174559 +v 0.247619 0.247619 1.238093 +v 0.767218 0.383609 0.959023 +v 0.626174 0.417449 1.043623 +v 0.447959 0.447959 1.119898 +v 0.234912 0.469823 1.174559 +v 0.727847 0.545886 0.909809 +v 0.588644 0.588644 0.981073 +v 0.417449 0.626174 1.043623 +v 0.217486 0.652458 1.087430 +v 0.681691 0.681691 0.852114 +v 0.545886 0.727847 0.909809 +v 0.383609 0.767218 0.959023 +v 0.198537 0.794147 0.992683 +v 0.681691 -0.681691 0.852114 +v 0.545886 -0.727847 0.909809 +v 0.383609 -0.767218 0.959023 +v 0.198537 -0.794147 0.992683 +v 0.727847 -0.545886 0.909809 +v 0.588644 -0.588644 0.981073 +v 0.417449 -0.626174 1.043623 +v 0.217486 -0.652458 1.087430 +v 0.767218 -0.383609 0.959023 +v 0.626174 -0.417449 1.043623 +v 0.447959 -0.447959 1.119898 +v 0.234912 -0.469823 1.174559 +v 0.794147 -0.198537 0.992683 +v 0.652458 -0.217486 1.087430 +v 0.469823 -0.234912 1.174559 +v 0.247619 -0.247619 1.238093 +v -0.198537 -0.794147 0.992683 +v -0.383609 -0.767218 0.959023 +v -0.545886 -0.727847 0.909809 +v -0.681691 -0.681691 0.852114 +v -0.217486 -0.652458 1.087430 +v -0.417449 -0.626174 1.043623 +v -0.588644 -0.588644 0.981073 +v -0.727847 -0.545886 0.909809 +v -0.234912 -0.469823 1.174559 +v -0.447959 -0.447959 1.119898 +v -0.626174 -0.417449 1.043623 +v -0.767218 -0.383609 0.959023 +v -0.247619 -0.247619 1.238093 +v -0.469823 -0.234912 1.174559 +v -0.652458 -0.217486 1.087430 +v -0.794147 -0.198537 0.992683 +v -0.992683 0.198537 0.794147 +v -1.087430 0.217486 0.652458 +v -1.174559 0.234912 0.469823 +v -1.238093 0.247619 0.247619 +v -0.959023 0.383609 0.767218 +v -1.043623 0.417449 0.626174 +v -1.119898 0.447959 0.447959 +v -1.174559 0.469823 0.234912 +v -0.909809 0.545886 0.727847 +v -0.981073 0.588644 0.588644 +v -1.043623 0.626174 0.417449 +v -1.087430 0.652458 0.217486 +v -0.852114 0.681691 0.681691 +v -0.909809 0.727847 0.545886 +v -0.959023 0.767218 0.383609 +v -0.992683 0.794147 0.198537 +v -0.852114 -0.681691 0.681691 +v -0.909809 -0.727847 0.545886 +v -0.959023 -0.767218 0.383609 +v -0.992683 -0.794147 0.198537 +v -0.909809 -0.545886 0.727847 +v -0.981073 -0.588644 0.588644 +v -1.043623 -0.626174 0.417449 +v -1.087430 -0.652458 0.217486 +v -0.959023 -0.383609 0.767218 +v -1.043623 -0.417449 0.626174 +v -1.119898 -0.447959 0.447959 +v -1.174559 -0.469823 0.234912 +v -0.992683 -0.198537 0.794147 +v -1.087430 -0.217486 0.652458 +v -1.174559 -0.234912 0.469823 +v -1.238093 -0.247619 0.247619 +v -0.992683 -0.794147 -0.198537 +v -0.959023 -0.767218 -0.383609 +v -0.909809 -0.727847 -0.545886 +v -0.852114 -0.681691 -0.681691 +v -1.087430 -0.652458 -0.217486 +v -1.043623 -0.626174 -0.417449 +v -0.981073 -0.588644 -0.588644 +v -0.909809 -0.545886 -0.727847 +v -1.174559 -0.469823 -0.234912 +v -1.119898 -0.447959 -0.447959 +v -1.043623 -0.417449 -0.626174 +v -0.959023 -0.383609 -0.767218 +v -1.238093 -0.247619 -0.247619 +v -1.174559 -0.234912 -0.469823 +v -1.087430 -0.217486 -0.652458 +v -0.992683 -0.198537 -0.794147 +v 0.198537 -0.992683 -0.794147 +v 0.217486 -1.087430 -0.652458 +v 0.234912 -1.174559 -0.469823 +v 0.247619 -1.238093 -0.247619 +v 0.383609 -0.959023 -0.767218 +v 0.417449 -1.043623 -0.626174 +v 0.447959 -1.119898 -0.447959 +v 0.469823 -1.174559 -0.234912 +v 0.545886 -0.909809 -0.727847 +v 0.588644 -0.981073 -0.588644 +v 0.626174 -1.043623 -0.417449 +v 0.652458 -1.087430 -0.217486 +v 0.681691 -0.852114 -0.681691 +v 0.727847 -0.909809 -0.545886 +v 0.767218 -0.959023 -0.383609 +v 0.794147 -0.992683 -0.198537 +v -0.681691 -0.852114 -0.681691 +v -0.727847 -0.909809 -0.545886 +v -0.767218 -0.959023 -0.383609 +v -0.794147 -0.992683 -0.198537 +v -0.545886 -0.909809 -0.727847 +v -0.588644 -0.981073 -0.588644 +v -0.626174 -1.043623 -0.417449 +v -0.652458 -1.087430 -0.217486 +v -0.383609 -0.959023 -0.767218 +v -0.417449 -1.043623 -0.626174 +v -0.447959 -1.119898 -0.447959 +v -0.469823 -1.174559 -0.234912 +v -0.198537 -0.992683 -0.794147 +v -0.217486 -1.087430 -0.652458 +v -0.234912 -1.174559 -0.469823 +v -0.247619 -1.238093 -0.247619 +v -0.794147 -0.992683 0.198537 +v -0.767218 -0.959023 0.383609 +v -0.727847 -0.909809 0.545886 +v -0.681691 -0.852114 0.681691 +v -0.652458 -1.087430 0.217486 +v -0.626174 -1.043623 0.417449 +v -0.588644 -0.981073 0.588644 +v -0.545886 -0.909809 0.727847 +v -0.469823 -1.174559 0.234912 +v -0.447959 -1.119898 0.447959 +v -0.417449 -1.043623 0.626174 +v -0.383609 -0.959023 0.767218 +v -0.247619 -1.238093 0.247619 +v -0.234912 -1.174559 0.469823 +v -0.217486 -1.087430 0.652458 +v -0.198537 -0.992683 0.794147 +v 0.992683 0.198537 -0.794147 +v 1.087430 0.217486 -0.652458 +v 1.174559 0.234912 -0.469823 +v 1.238093 0.247619 -0.247619 +v 0.959023 0.383609 -0.767218 +v 1.043623 0.417449 -0.626174 +v 1.119898 0.447959 -0.447959 +v 1.174559 0.469823 -0.234912 +v 0.909809 0.545886 -0.727847 +v 0.981073 0.588644 -0.588644 +v 1.043623 0.626174 -0.417449 +v 1.087430 0.652458 -0.217486 +v 0.852114 0.681691 -0.681691 +v 0.909809 0.727847 -0.545886 +v 0.959023 0.767218 -0.383609 +v 0.992683 0.794147 -0.198537 +v 0.852114 -0.681691 -0.681691 +v 0.909809 -0.727847 -0.545886 +v 0.959023 -0.767218 -0.383609 +v 0.992683 -0.794147 -0.198537 +v 0.909809 -0.545886 -0.727847 +v 0.981073 -0.588644 -0.588644 +v 1.043623 -0.626174 -0.417449 +v 1.087430 -0.652458 -0.217486 +v 0.959023 -0.383609 -0.767218 +v 1.043623 -0.417449 -0.626174 +v 1.119898 -0.447959 -0.447959 +v 1.174559 -0.469823 -0.234912 +v 0.992683 -0.198537 -0.794147 +v 1.087430 -0.217486 -0.652458 +v 1.174559 -0.234912 -0.469823 +v 1.238093 -0.247619 -0.247619 +v 0.992683 -0.794147 0.198537 +v 0.959023 -0.767218 0.383609 +v 0.909809 -0.727847 0.545886 +v 0.852114 -0.681691 0.681691 +v 1.087430 -0.652458 0.217486 +v 1.043623 -0.626174 0.417449 +v 0.981073 -0.588644 0.588644 +v 0.909809 -0.545886 0.727847 +v 1.174559 -0.469823 0.234912 +v 1.119898 -0.447959 0.447959 +v 1.043623 -0.417449 0.626174 +v 0.959023 -0.383609 0.767218 +v 1.238093 -0.247619 0.247619 +v 1.174559 -0.234912 0.469823 +v 1.087430 -0.217486 0.652458 +v 0.992683 -0.198537 0.794147 +v -0.794147 0.198537 -0.992683 +v -0.652458 0.217486 -1.087430 +v -0.469823 0.234912 -1.174559 +v -0.247619 0.247619 -1.238093 +v -0.767218 0.383609 -0.959023 +v -0.626174 0.417449 -1.043623 +v -0.447959 0.447959 -1.119898 +v -0.234912 0.469823 -1.174559 +v -0.727847 0.545886 -0.909809 +v -0.588644 0.588644 -0.981073 +v -0.417449 0.626174 -1.043623 +v -0.217486 0.652458 -1.087430 +v -0.681691 0.681691 -0.852114 +v -0.545886 0.727847 -0.909809 +v -0.383609 0.767218 -0.959023 +v -0.198537 0.794147 -0.992683 +v -0.681691 -0.681691 -0.852114 +v -0.545886 -0.727847 -0.909809 +v -0.383609 -0.767218 -0.959023 +v -0.198537 -0.794147 -0.992683 +v -0.727847 -0.545886 -0.909809 +v -0.588644 -0.588644 -0.981073 +v -0.417449 -0.626174 -1.043623 +v -0.217486 -0.652458 -1.087430 +v -0.767218 -0.383609 -0.959023 +v -0.626174 -0.417449 -1.043623 +v -0.447959 -0.447959 -1.119898 +v -0.234912 -0.469823 -1.174559 +v -0.794147 -0.198537 -0.992683 +v -0.652458 -0.217486 -1.087430 +v -0.469823 -0.234912 -1.174559 +v -0.247619 -0.247619 -1.238093 +v 0.198537 -0.794147 -0.992683 +v 0.383609 -0.767218 -0.959023 +v 0.545886 -0.727847 -0.909809 +v 0.681691 -0.681691 -0.852114 +v 0.217486 -0.652458 -1.087430 +v 0.417449 -0.626174 -1.043623 +v 0.588644 -0.588644 -0.981073 +v 0.727847 -0.545886 -0.909809 +v 0.234912 -0.469823 -1.174559 +v 0.447959 -0.447959 -1.119898 +v 0.626174 -0.417449 -1.043623 +v 0.767218 -0.383609 -0.959023 +v 0.247619 -0.247619 -1.238093 +v 0.469823 -0.234912 -1.174559 +v 0.652458 -0.217486 -1.087430 +v 0.794147 -0.198537 -0.992683 +v 0.247619 0.247619 -1.238093 +v 0.469823 0.234912 -1.174559 +v 0.652458 0.217486 -1.087430 +v 0.794147 0.198537 -0.992683 +v 0.234912 0.469823 -1.174559 +v 0.447959 0.447959 -1.119898 +v 0.626174 0.417449 -1.043623 +v 0.767218 0.383609 -0.959023 +v 0.217486 0.652458 -1.087430 +v 0.417449 0.626174 -1.043623 +v 0.588644 0.588644 -0.981073 +v 0.727847 0.545886 -0.909809 +v 0.198537 0.794147 -0.992683 +v 0.383609 0.767218 -0.959023 +v 0.545886 0.727847 -0.909809 +v 0.681691 0.681691 -0.852114 +v 1.238093 0.247619 0.247619 +v 1.174559 0.234912 0.469823 +v 1.087430 0.217486 0.652458 +v 0.992683 0.198537 0.794147 +v 1.174559 0.469823 0.234912 +v 1.119898 0.447959 0.447959 +v 1.043623 0.417449 0.626174 +v 0.959023 0.383609 0.767218 +v 1.087430 0.652458 0.217486 +v 1.043623 0.626174 0.417449 +v 0.981073 0.588644 0.588644 +v 0.909809 0.545886 0.727847 +v 0.992683 0.794147 0.198537 +v 0.959023 0.767218 0.383609 +v 0.909809 0.727847 0.545886 +v 0.852114 0.681691 0.681691 +v 0.247619 -1.238093 0.247619 +v 0.234912 -1.174559 0.469823 +v 0.217486 -1.087430 0.652458 +v 0.198537 -0.992683 0.794147 +v 0.469823 -1.174559 0.234912 +v 0.447959 -1.119898 0.447959 +v 0.417449 -1.043623 0.626174 +v 0.383609 -0.959023 0.767218 +v 0.652458 -1.087430 0.217486 +v 0.626174 -1.043623 0.417449 +v 0.588644 -0.981073 0.588644 +v 0.545886 -0.909809 0.727847 +v 0.794147 -0.992683 0.198537 +v 0.767218 -0.959023 0.383609 +v 0.727847 -0.909809 0.545886 +v 0.681691 -0.852114 0.681691 +v -1.238093 0.247619 -0.247619 +v -1.174559 0.234912 -0.469823 +v -1.087430 0.217486 -0.652458 +v -0.992683 0.198537 -0.794147 +v -1.174559 0.469823 -0.234912 +v -1.119898 0.447959 -0.447959 +v -1.043623 0.417449 -0.626174 +v -0.959023 0.383609 -0.767218 +v -1.087430 0.652458 -0.217486 +v -1.043623 0.626174 -0.417449 +v -0.981073 0.588644 -0.588644 +v -0.909809 0.545886 -0.727847 +v -0.992683 0.794147 -0.198537 +v -0.959023 0.767218 -0.383609 +v -0.909809 0.727847 -0.545886 +v -0.852114 0.681691 -0.681691 +v -0.247619 0.247619 1.238093 +v -0.469823 0.234912 1.174559 +v -0.652458 0.217486 1.087430 +v -0.794147 0.198537 0.992683 +v -0.234912 0.469823 1.174559 +v -0.447959 0.447959 1.119898 +v -0.626174 0.417449 1.043623 +v -0.767218 0.383609 0.959023 +v -0.217486 0.652458 1.087430 +v -0.417449 0.626174 1.043623 +v -0.588644 0.588644 0.981073 +v -0.727847 0.545886 0.909809 +v -0.198537 0.794147 0.992683 +v -0.383609 0.767218 0.959023 +v -0.545886 0.727847 0.909809 +v -0.681691 0.681691 0.852114 +v -0.247619 1.238093 0.247619 +v -0.234912 1.174559 0.469823 +v -0.217486 1.087430 0.652458 +v -0.198537 0.992683 0.794147 +v -0.469823 1.174559 0.234912 +v -0.447959 1.119898 0.447959 +v -0.417449 1.043623 0.626174 +v -0.383609 0.959023 0.767218 +v -0.652458 1.087430 0.217486 +v -0.626174 1.043623 0.417449 +v -0.588644 0.981073 0.588644 +v -0.545886 0.909809 0.727847 +v -0.794147 0.992683 0.198537 +v -0.767218 0.959023 0.383609 +v -0.727847 0.909809 0.545886 +v -0.681691 0.852114 0.681691 +vn -0.5544 0.6207 0.5544 +vn -0.5544 0.5544 0.6207 +vn -0.6207 0.5544 -0.5544 +vn 0.5544 -0.6207 0.5544 +vn 0.6207 0.5544 0.5544 +vn 0.5544 0.5544 -0.6207 +vn 0.6615 -0.0738 -0.7463 +vn -0.0971 -0.0971 -0.9905 +vn -0.0738 0.6615 -0.7463 +vn 0.7463 -0.0738 0.6615 +vn 0.9905 -0.0971 -0.0971 +vn 0.7463 0.6615 -0.0738 +vn -0.0738 -0.7463 0.6615 +vn -0.0971 -0.9905 -0.0971 +vn 0.6615 -0.7463 -0.0738 +vn -0.7463 -0.0738 -0.6615 +vn -0.9905 -0.0971 0.0971 +vn -0.7463 0.6615 0.0738 +vn -0.6615 -0.0738 0.7463 +vn 0.0971 -0.0971 0.9905 +vn 0.0738 0.6615 0.7463 +vn 0.0738 0.7463 0.6615 +vn 0.0971 0.9905 -0.0971 +vn -0.6615 0.7463 -0.0738 +vn -0.0971 0.9905 -0.0971 +vn -0.2812 0.9550 -0.0939 +vn -0.4392 0.8941 -0.0881 +vn -0.5653 0.8209 -0.0811 +vn -0.0738 0.7463 -0.6615 +vn -0.0811 0.8209 -0.5653 +vn -0.0881 0.8941 -0.4392 +vn -0.0939 0.9550 -0.2812 +vn -0.2169 0.7301 -0.6480 +vn -0.2371 0.7997 -0.5516 +vn -0.2565 0.8672 -0.4268 +vn -0.2722 0.9229 -0.2722 +vn -0.3472 0.7007 -0.6233 +vn -0.3768 0.7619 -0.5267 +vn -0.4046 0.8201 -0.4046 +vn -0.4268 0.8672 -0.2565 +vn -0.4601 0.6627 -0.5908 +vn -0.4949 0.7142 -0.4949 +vn -0.5267 0.7619 -0.3768 +vn -0.5516 0.7997 -0.2371 +vn -0.5544 0.6207 -0.5544 +vn -0.5908 0.6627 -0.4601 +vn -0.6233 0.7007 -0.3472 +vn -0.6480 0.7301 -0.2169 +vn 0.6615 0.7463 -0.0738 +vn 0.5653 0.8209 -0.0811 +vn 0.4392 0.8941 -0.0881 +vn 0.2812 0.9550 -0.0939 +vn 0.5544 0.6207 -0.5544 +vn 0.5908 0.6627 -0.4601 +vn 0.6233 0.7007 -0.3472 +vn 0.6480 0.7301 -0.2169 +vn 0.4601 0.6627 -0.5908 +vn 0.4949 0.7142 -0.4949 +vn 0.5267 0.7619 -0.3768 +vn 0.5516 0.7997 -0.2371 +vn 0.3472 0.7007 -0.6233 +vn 0.3768 0.7619 -0.5267 +vn 0.4046 0.8201 -0.4046 +vn 0.4268 0.8672 -0.2565 +vn 0.2169 0.7301 -0.6480 +vn 0.2371 0.7997 -0.5516 +vn 0.2565 0.8672 -0.4268 +vn 0.2722 0.9229 -0.2722 +vn 0.0738 0.7463 -0.6615 +vn 0.0811 0.8209 -0.5653 +vn 0.0881 0.8941 -0.4392 +vn 0.0939 0.9550 -0.2812 +vn 0.5544 0.6207 0.5544 +vn 0.4601 0.6627 0.5908 +vn 0.3472 0.7007 0.6233 +vn 0.2169 0.7301 0.6480 +vn 0.6615 0.7463 0.0738 +vn 0.6480 0.7301 0.2169 +vn 0.6233 0.7007 0.3472 +vn 0.5908 0.6627 0.4601 +vn 0.5653 0.8209 0.0811 +vn 0.5516 0.7997 0.2371 +vn 0.5267 0.7619 0.3768 +vn 0.4949 0.7142 0.4949 +vn 0.4392 0.8941 0.0881 +vn 0.4268 0.8672 0.2565 +vn 0.4046 0.8201 0.4046 +vn 0.3768 0.7619 0.5267 +vn 0.2812 0.9550 0.0939 +vn 0.2722 0.9229 0.2722 +vn 0.2565 0.8672 0.4268 +vn 0.2371 0.7997 0.5516 +vn 0.0971 0.9905 0.0971 +vn 0.0939 0.9550 0.2812 +vn 0.0881 0.8941 0.4392 +vn 0.0811 0.8209 0.5653 +vn 0.0971 0.0971 0.9905 +vn 0.0939 0.2812 0.9551 +vn 0.0881 0.4392 0.8941 +vn 0.0811 0.5653 0.8209 +vn 0.6615 0.0738 0.7463 +vn 0.5653 0.0811 0.8209 +vn 0.4392 0.0881 0.8941 +vn 0.2812 0.0939 0.9551 +vn 0.6480 0.2169 0.7301 +vn 0.5516 0.2371 0.7997 +vn 0.4268 0.2565 0.8672 +vn 0.2722 0.2722 0.9229 +vn 0.6233 0.3472 0.7007 +vn 0.5267 0.3768 0.7619 +vn 0.4046 0.4046 0.8201 +vn 0.2565 0.4268 0.8672 +vn 0.5908 0.4601 0.6627 +vn 0.4949 0.4949 0.7142 +vn 0.3768 0.5267 0.7619 +vn 0.2371 0.5516 0.7997 +vn 0.5544 0.5544 0.6207 +vn 0.4601 0.5908 0.6627 +vn 0.3472 0.6233 0.7007 +vn 0.2169 0.6480 0.7301 +vn 0.0738 -0.6615 0.7463 +vn 0.0811 -0.5653 0.8209 +vn 0.0881 -0.4392 0.8941 +vn 0.0939 -0.2812 0.9551 +vn 0.5544 -0.5544 0.6207 +vn 0.4601 -0.5908 0.6627 +vn 0.3472 -0.6233 0.7007 +vn 0.2169 -0.6480 0.7301 +vn 0.5908 -0.4601 0.6627 +vn 0.4949 -0.4949 0.7142 +vn 0.3768 -0.5267 0.7619 +vn 0.2371 -0.5516 0.7997 +vn 0.6233 -0.3472 0.7007 +vn 0.5267 -0.3768 0.7619 +vn 0.4046 -0.4046 0.8201 +vn 0.2565 -0.4268 0.8672 +vn 0.6480 -0.2169 0.7301 +vn 0.5516 -0.2371 0.7997 +vn 0.4268 -0.2565 0.8672 +vn 0.2722 -0.2722 0.9229 +vn 0.6615 -0.0738 0.7463 +vn 0.5653 -0.0811 0.8209 +vn 0.4392 -0.0881 0.8941 +vn 0.2812 -0.0939 0.9551 +vn -0.5544 -0.5544 0.6207 +vn -0.5908 -0.4601 0.6627 +vn -0.6233 -0.3472 0.7007 +vn -0.6480 -0.2169 0.7301 +vn -0.0738 -0.6615 0.7463 +vn -0.2169 -0.6480 0.7301 +vn -0.3472 -0.6233 0.7007 +vn -0.4601 -0.5908 0.6627 +vn -0.0811 -0.5653 0.8209 +vn -0.2371 -0.5516 0.7997 +vn -0.3768 -0.5267 0.7619 +vn -0.4949 -0.4949 0.7142 +vn -0.0881 -0.4392 0.8941 +vn -0.2565 -0.4268 0.8672 +vn -0.4046 -0.4046 0.8201 +vn -0.5267 -0.3768 0.7619 +vn -0.0939 -0.2812 0.9551 +vn -0.2722 -0.2722 0.9229 +vn -0.4268 -0.2565 0.8672 +vn -0.5516 -0.2371 0.7997 +vn -0.0971 -0.0971 0.9905 +vn -0.2812 -0.0939 0.9551 +vn -0.4392 -0.0881 0.8941 +vn -0.5653 -0.0811 0.8209 +vn -0.9905 0.0971 0.0971 +vn -0.9551 0.2812 0.0939 +vn -0.8941 0.4392 0.0881 +vn -0.8209 0.5653 0.0811 +vn -0.7463 0.0738 0.6615 +vn -0.8209 0.0811 0.5653 +vn -0.8941 0.0881 0.4392 +vn -0.9551 0.0939 0.2812 +vn -0.7301 0.2169 0.6480 +vn -0.7997 0.2371 0.5516 +vn -0.8672 0.2565 0.4268 +vn -0.9229 0.2722 0.2722 +vn -0.7007 0.3472 0.6233 +vn -0.7619 0.3768 0.5267 +vn -0.8201 0.4046 0.4046 +vn -0.8672 0.4268 0.2565 +vn -0.6627 0.4601 0.5908 +vn -0.7142 0.4949 0.4949 +vn -0.7619 0.5267 0.3768 +vn -0.7997 0.5516 0.2371 +vn -0.6207 0.5544 0.5544 +vn -0.6627 0.5908 0.4601 +vn -0.7007 0.6233 0.3472 +vn -0.7301 0.6480 0.2169 +vn -0.7463 -0.6615 0.0738 +vn -0.8209 -0.5653 0.0811 +vn -0.8941 -0.4392 0.0881 +vn -0.9551 -0.2812 0.0939 +vn -0.6207 -0.5544 0.5544 +vn -0.6627 -0.5908 0.4601 +vn -0.7007 -0.6233 0.3472 +vn -0.7301 -0.6480 0.2169 +vn -0.6627 -0.4601 0.5908 +vn -0.7142 -0.4949 0.4949 +vn -0.7619 -0.5267 0.3768 +vn -0.7997 -0.5516 0.2371 +vn -0.7007 -0.3472 0.6233 +vn -0.7619 -0.3768 0.5267 +vn -0.8201 -0.4046 0.4046 +vn -0.8672 -0.4268 0.2565 +vn -0.7301 -0.2169 0.6480 +vn -0.7997 -0.2371 0.5516 +vn -0.8672 -0.2565 0.4268 +vn -0.9229 -0.2722 0.2722 +vn -0.7463 -0.0738 0.6615 +vn -0.8209 -0.0811 0.5653 +vn -0.8941 -0.0881 0.4392 +vn -0.9551 -0.0939 0.2812 +vn -0.6207 -0.5544 -0.5544 +vn -0.6627 -0.4601 -0.5908 +vn -0.7007 -0.3472 -0.6233 +vn -0.7301 -0.2169 -0.6480 +vn -0.7463 -0.6615 -0.0738 +vn -0.7301 -0.6480 -0.2169 +vn -0.7007 -0.6233 -0.3472 +vn -0.6627 -0.5908 -0.4601 +vn -0.8209 -0.5653 -0.0811 +vn -0.7997 -0.5516 -0.2371 +vn -0.7619 -0.5267 -0.3768 +vn -0.7142 -0.4949 -0.4949 +vn -0.8941 -0.4392 -0.0881 +vn -0.8672 -0.4268 -0.2565 +vn -0.8201 -0.4046 -0.4046 +vn -0.7619 -0.3768 -0.5267 +vn -0.9551 -0.2812 -0.0939 +vn -0.9229 -0.2722 -0.2722 +vn -0.8672 -0.2565 -0.4268 +vn -0.7997 -0.2371 -0.5516 +vn -0.9905 -0.0971 -0.0971 +vn -0.9551 -0.0939 -0.2812 +vn -0.8941 -0.0881 -0.4392 +vn -0.8209 -0.0811 -0.5653 +vn 0.0971 -0.9905 -0.0971 +vn 0.2812 -0.9550 -0.0939 +vn 0.4392 -0.8941 -0.0881 +vn 0.5653 -0.8209 -0.0811 +vn 0.0738 -0.7463 -0.6615 +vn 0.0811 -0.8209 -0.5653 +vn 0.0881 -0.8941 -0.4392 +vn 0.0939 -0.9550 -0.2812 +vn 0.2169 -0.7301 -0.6480 +vn 0.2371 -0.7997 -0.5516 +vn 0.2565 -0.8672 -0.4268 +vn 0.2722 -0.9229 -0.2722 +vn 0.3472 -0.7007 -0.6233 +vn 0.3768 -0.7619 -0.5267 +vn 0.4046 -0.8201 -0.4046 +vn 0.4268 -0.8672 -0.2565 +vn 0.4601 -0.6627 -0.5908 +vn 0.4949 -0.7142 -0.4949 +vn 0.5267 -0.7619 -0.3768 +vn 0.5516 -0.7997 -0.2371 +vn 0.5544 -0.6207 -0.5544 +vn 0.5908 -0.6627 -0.4601 +vn 0.6233 -0.7007 -0.3472 +vn 0.6480 -0.7301 -0.2169 +vn -0.6615 -0.7463 -0.0738 +vn -0.5653 -0.8209 -0.0811 +vn -0.4392 -0.8941 -0.0881 +vn -0.2812 -0.9550 -0.0939 +vn -0.5544 -0.6207 -0.5544 +vn -0.5908 -0.6627 -0.4601 +vn -0.6233 -0.7007 -0.3472 +vn -0.6480 -0.7301 -0.2169 +vn -0.4601 -0.6627 -0.5908 +vn -0.4949 -0.7142 -0.4949 +vn -0.5267 -0.7619 -0.3768 +vn -0.5516 -0.7997 -0.2371 +vn -0.3472 -0.7007 -0.6233 +vn -0.3768 -0.7619 -0.5267 +vn -0.4046 -0.8201 -0.4046 +vn -0.4268 -0.8672 -0.2565 +vn -0.2169 -0.7301 -0.6480 +vn -0.2371 -0.7997 -0.5516 +vn -0.2565 -0.8672 -0.4268 +vn -0.2722 -0.9229 -0.2722 +vn -0.0738 -0.7463 -0.6615 +vn -0.0811 -0.8209 -0.5653 +vn -0.0881 -0.8941 -0.4392 +vn -0.0939 -0.9550 -0.2812 +vn -0.5544 -0.6207 0.5544 +vn -0.4601 -0.6627 0.5908 +vn -0.3472 -0.7007 0.6233 +vn -0.2169 -0.7301 0.6480 +vn -0.6615 -0.7463 0.0738 +vn -0.6480 -0.7301 0.2169 +vn -0.6233 -0.7007 0.3472 +vn -0.5908 -0.6627 0.4601 +vn -0.5653 -0.8209 0.0811 +vn -0.5516 -0.7997 0.2371 +vn -0.5267 -0.7619 0.3768 +vn -0.4949 -0.7142 0.4949 +vn -0.4392 -0.8941 0.0881 +vn -0.4268 -0.8672 0.2565 +vn -0.4046 -0.8201 0.4046 +vn -0.3768 -0.7619 0.5267 +vn -0.2812 -0.9551 0.0939 +vn -0.2722 -0.9229 0.2722 +vn -0.2565 -0.8672 0.4268 +vn -0.2371 -0.7997 0.5516 +vn -0.0971 -0.9905 0.0971 +vn -0.0939 -0.9550 0.2812 +vn -0.0881 -0.8941 0.4392 +vn -0.0811 -0.8209 0.5653 +vn 0.9905 0.0971 -0.0971 +vn 0.9551 0.2812 -0.0939 +vn 0.8941 0.4392 -0.0881 +vn 0.8209 0.5653 -0.0811 +vn 0.7463 0.0738 -0.6615 +vn 0.8209 0.0811 -0.5653 +vn 0.8941 0.0881 -0.4392 +vn 0.9551 0.0939 -0.2812 +vn 0.7301 0.2169 -0.6480 +vn 0.7997 0.2371 -0.5516 +vn 0.8672 0.2565 -0.4268 +vn 0.9229 0.2722 -0.2722 +vn 0.7007 0.3472 -0.6233 +vn 0.7619 0.3768 -0.5267 +vn 0.8201 0.4046 -0.4046 +vn 0.8672 0.4268 -0.2565 +vn 0.6627 0.4601 -0.5908 +vn 0.7142 0.4949 -0.4949 +vn 0.7619 0.5267 -0.3768 +vn 0.7997 0.5516 -0.2371 +vn 0.6207 0.5544 -0.5544 +vn 0.6627 0.5908 -0.4601 +vn 0.7007 0.6233 -0.3472 +vn 0.7301 0.6480 -0.2169 +vn 0.7463 -0.6615 -0.0738 +vn 0.8209 -0.5653 -0.0811 +vn 0.8941 -0.4392 -0.0881 +vn 0.9551 -0.2812 -0.0939 +vn 0.6207 -0.5544 -0.5544 +vn 0.6627 -0.5908 -0.4601 +vn 0.7007 -0.6233 -0.3472 +vn 0.7301 -0.6480 -0.2169 +vn 0.6627 -0.4601 -0.5908 +vn 0.7142 -0.4949 -0.4949 +vn 0.7619 -0.5267 -0.3768 +vn 0.7997 -0.5516 -0.2371 +vn 0.7007 -0.3472 -0.6233 +vn 0.7619 -0.3768 -0.5267 +vn 0.8201 -0.4046 -0.4046 +vn 0.8672 -0.4268 -0.2565 +vn 0.7301 -0.2169 -0.6480 +vn 0.7997 -0.2371 -0.5516 +vn 0.8672 -0.2565 -0.4268 +vn 0.9229 -0.2722 -0.2722 +vn 0.7463 -0.0738 -0.6615 +vn 0.8209 -0.0811 -0.5653 +vn 0.8941 -0.0881 -0.4392 +vn 0.9551 -0.0939 -0.2812 +vn 0.6207 -0.5544 0.5544 +vn 0.6627 -0.4601 0.5908 +vn 0.7007 -0.3472 0.6233 +vn 0.7301 -0.2169 0.6480 +vn 0.7463 -0.6615 0.0738 +vn 0.7301 -0.6480 0.2169 +vn 0.7007 -0.6233 0.3472 +vn 0.6627 -0.5908 0.4601 +vn 0.8209 -0.5653 0.0811 +vn 0.7997 -0.5516 0.2371 +vn 0.7619 -0.5267 0.3768 +vn 0.7142 -0.4949 0.4949 +vn 0.8941 -0.4392 0.0881 +vn 0.8672 -0.4268 0.2565 +vn 0.8201 -0.4046 0.4046 +vn 0.7619 -0.3768 0.5267 +vn 0.9551 -0.2812 0.0939 +vn 0.9229 -0.2722 0.2722 +vn 0.8672 -0.2565 0.4268 +vn 0.7997 -0.2371 0.5516 +vn 0.9905 -0.0971 0.0971 +vn 0.9551 -0.0939 0.2812 +vn 0.8941 -0.0881 0.4392 +vn 0.8209 -0.0811 0.5653 +vn -0.0971 0.0971 -0.9905 +vn -0.0939 0.2812 -0.9551 +vn -0.0881 0.4392 -0.8941 +vn -0.0811 0.5653 -0.8209 +vn -0.6615 0.0738 -0.7463 +vn -0.5653 0.0811 -0.8209 +vn -0.4392 0.0881 -0.8941 +vn -0.2812 0.0939 -0.9551 +vn -0.6480 0.2169 -0.7301 +vn -0.5516 0.2371 -0.7997 +vn -0.4268 0.2565 -0.8672 +vn -0.2722 0.2722 -0.9229 +vn -0.6233 0.3472 -0.7007 +vn -0.5267 0.3768 -0.7619 +vn -0.4046 0.4046 -0.8201 +vn -0.2565 0.4268 -0.8672 +vn -0.5908 0.4601 -0.6627 +vn -0.4949 0.4949 -0.7142 +vn -0.3768 0.5267 -0.7619 +vn -0.2371 0.5516 -0.7997 +vn -0.5544 0.5544 -0.6207 +vn -0.4601 0.5908 -0.6627 +vn -0.3472 0.6233 -0.7007 +vn -0.2169 0.6480 -0.7301 +vn -0.0738 -0.6615 -0.7463 +vn -0.0811 -0.5653 -0.8209 +vn -0.0881 -0.4392 -0.8941 +vn -0.0939 -0.2812 -0.9551 +vn -0.5544 -0.5544 -0.6207 +vn -0.4601 -0.5908 -0.6627 +vn -0.3472 -0.6233 -0.7007 +vn -0.2169 -0.6480 -0.7301 +vn -0.5908 -0.4601 -0.6627 +vn -0.4949 -0.4949 -0.7142 +vn -0.3768 -0.5267 -0.7619 +vn -0.2371 -0.5516 -0.7997 +vn -0.6233 -0.3472 -0.7007 +vn -0.5267 -0.3768 -0.7619 +vn -0.4046 -0.4046 -0.8201 +vn -0.2565 -0.4268 -0.8672 +vn -0.6480 -0.2169 -0.7301 +vn -0.5516 -0.2371 -0.7997 +vn -0.4268 -0.2565 -0.8672 +vn -0.2722 -0.2722 -0.9229 +vn -0.6615 -0.0738 -0.7463 +vn -0.5653 -0.0811 -0.8209 +vn -0.4392 -0.0881 -0.8941 +vn -0.2812 -0.0939 -0.9551 +vn 0.5544 -0.5544 -0.6207 +vn 0.5908 -0.4601 -0.6627 +vn 0.6233 -0.3472 -0.7007 +vn 0.6480 -0.2169 -0.7301 +vn 0.0738 -0.6615 -0.7463 +vn 0.2169 -0.6480 -0.7301 +vn 0.3472 -0.6233 -0.7007 +vn 0.4601 -0.5908 -0.6627 +vn 0.0811 -0.5653 -0.8209 +vn 0.2371 -0.5516 -0.7997 +vn 0.3768 -0.5267 -0.7619 +vn 0.4949 -0.4949 -0.7142 +vn 0.0881 -0.4392 -0.8941 +vn 0.2565 -0.4268 -0.8672 +vn 0.4046 -0.4046 -0.8201 +vn 0.5267 -0.3768 -0.7619 +vn 0.0939 -0.2812 -0.9551 +vn 0.2722 -0.2722 -0.9229 +vn 0.4268 -0.2565 -0.8672 +vn 0.5516 -0.2371 -0.7997 +vn 0.0971 -0.0971 -0.9905 +vn 0.2812 -0.0939 -0.9551 +vn 0.4392 -0.0881 -0.8941 +vn 0.5653 -0.0811 -0.8209 +vn 0.6615 0.0738 -0.7463 +vn 0.6480 0.2169 -0.7301 +vn 0.6233 0.3472 -0.7007 +vn 0.5908 0.4601 -0.6627 +vn 0.0971 0.0971 -0.9905 +vn 0.2812 0.0939 -0.9551 +vn 0.4392 0.0881 -0.8941 +vn 0.5653 0.0811 -0.8209 +vn 0.0939 0.2812 -0.9551 +vn 0.2722 0.2722 -0.9229 +vn 0.4268 0.2565 -0.8672 +vn 0.5516 0.2371 -0.7997 +vn 0.0881 0.4392 -0.8941 +vn 0.2565 0.4268 -0.8672 +vn 0.4046 0.4046 -0.8201 +vn 0.5267 0.3768 -0.7619 +vn 0.0811 0.5653 -0.8209 +vn 0.2371 0.5516 -0.7997 +vn 0.3768 0.5267 -0.7619 +vn 0.4949 0.4949 -0.7142 +vn 0.0738 0.6615 -0.7463 +vn 0.2169 0.6480 -0.7301 +vn 0.3472 0.6233 -0.7007 +vn 0.4601 0.5908 -0.6627 +vn 0.7463 0.0738 0.6615 +vn 0.7301 0.2169 0.6480 +vn 0.7007 0.3472 0.6233 +vn 0.6627 0.4601 0.5908 +vn 0.9905 0.0971 0.0971 +vn 0.9551 0.0939 0.2812 +vn 0.8941 0.0881 0.4392 +vn 0.8209 0.0811 0.5653 +vn 0.9551 0.2812 0.0939 +vn 0.9229 0.2722 0.2722 +vn 0.8672 0.2565 0.4268 +vn 0.7997 0.2371 0.5516 +vn 0.8941 0.4392 0.0881 +vn 0.8672 0.4268 0.2565 +vn 0.8201 0.4046 0.4046 +vn 0.7619 0.3768 0.5267 +vn 0.8209 0.5653 0.0811 +vn 0.7997 0.5516 0.2371 +vn 0.7619 0.5267 0.3768 +vn 0.7142 0.4949 0.4949 +vn 0.7463 0.6615 0.0738 +vn 0.7301 0.6480 0.2169 +vn 0.7007 0.6233 0.3472 +vn 0.6627 0.5908 0.4601 +vn 0.0738 -0.7463 0.6615 +vn 0.2169 -0.7301 0.6480 +vn 0.3472 -0.7007 0.6233 +vn 0.4601 -0.6627 0.5908 +vn 0.0971 -0.9905 0.0971 +vn 0.0939 -0.9550 0.2812 +vn 0.0881 -0.8941 0.4392 +vn 0.0811 -0.8209 0.5653 +vn 0.2812 -0.9550 0.0939 +vn 0.2722 -0.9229 0.2722 +vn 0.2565 -0.8672 0.4268 +vn 0.2371 -0.7997 0.5516 +vn 0.4392 -0.8941 0.0881 +vn 0.4268 -0.8672 0.2565 +vn 0.4046 -0.8201 0.4046 +vn 0.3768 -0.7619 0.5267 +vn 0.5653 -0.8209 0.0811 +vn 0.5516 -0.7997 0.2371 +vn 0.5267 -0.7619 0.3768 +vn 0.4949 -0.7142 0.4949 +vn 0.6615 -0.7463 0.0738 +vn 0.6480 -0.7301 0.2169 +vn 0.6233 -0.7007 0.3472 +vn 0.5908 -0.6627 0.4601 +vn -0.7463 0.0738 -0.6615 +vn -0.7301 0.2169 -0.6480 +vn -0.7007 0.3472 -0.6233 +vn -0.6627 0.4601 -0.5908 +vn -0.9905 0.0971 -0.0971 +vn -0.9551 0.0939 -0.2812 +vn -0.8941 0.0881 -0.4392 +vn -0.8209 0.0811 -0.5653 +vn -0.9551 0.2812 -0.0939 +vn -0.9229 0.2722 -0.2722 +vn -0.8672 0.2565 -0.4268 +vn -0.7997 0.2371 -0.5516 +vn -0.8941 0.4392 -0.0881 +vn -0.8672 0.4268 -0.2565 +vn -0.8201 0.4046 -0.4046 +vn -0.7619 0.3768 -0.5267 +vn -0.8209 0.5653 -0.0811 +vn -0.7997 0.5516 -0.2371 +vn -0.7619 0.5267 -0.3768 +vn -0.7142 0.4949 -0.4949 +vn -0.7463 0.6615 -0.0738 +vn -0.7301 0.6480 -0.2169 +vn -0.7007 0.6233 -0.3472 +vn -0.6627 0.5908 -0.4601 +vn -0.6615 0.0738 0.7463 +vn -0.6480 0.2169 0.7301 +vn -0.6233 0.3472 0.7007 +vn -0.5908 0.4601 0.6627 +vn -0.0971 0.0971 0.9905 +vn -0.2812 0.0939 0.9551 +vn -0.4392 0.0881 0.8941 +vn -0.5653 0.0811 0.8209 +vn -0.0939 0.2812 0.9551 +vn -0.2722 0.2722 0.9229 +vn -0.4268 0.2565 0.8672 +vn -0.5516 0.2371 0.7997 +vn -0.0881 0.4392 0.8941 +vn -0.2565 0.4268 0.8672 +vn -0.4046 0.4046 0.8201 +vn -0.5267 0.3768 0.7619 +vn -0.0811 0.5653 0.8209 +vn -0.2371 0.5516 0.7997 +vn -0.3768 0.5267 0.7619 +vn -0.4949 0.4949 0.7142 +vn -0.0738 0.6615 0.7463 +vn -0.2169 0.6480 0.7301 +vn -0.3472 0.6233 0.7007 +vn -0.4601 0.5908 0.6627 +vn -0.0738 0.7463 0.6615 +vn -0.2169 0.7301 0.6480 +vn -0.3472 0.7007 0.6233 +vn -0.4601 0.6627 0.5908 +vn -0.0971 0.9905 0.0971 +vn -0.0939 0.9550 0.2812 +vn -0.0881 0.8941 0.4392 +vn -0.0811 0.8209 0.5653 +vn -0.2812 0.9550 0.0939 +vn -0.2722 0.9229 0.2722 +vn -0.2565 0.8672 0.4268 +vn -0.2371 0.7997 0.5516 +vn -0.4392 0.8941 0.0881 +vn -0.4268 0.8672 0.2565 +vn -0.4046 0.8201 0.4046 +vn -0.3768 0.7619 0.5267 +vn -0.5653 0.8209 0.0811 +vn -0.5516 0.7997 0.2371 +vn -0.5267 0.7619 0.3768 +vn -0.4949 0.7142 0.4949 +vn -0.6615 0.7463 0.0738 +vn -0.6480 0.7301 0.2169 +vn -0.6233 0.7007 0.3472 +vn -0.5908 0.6627 0.4601 +vt 0.850000 0.725000 +vt 0.875000 0.725000 +vt 0.875000 0.750000 +vt 0.850000 0.750000 +vt 0.600000 0.975000 +vt 0.625000 0.975000 +vt 0.625000 1.000000 +vt 0.600000 1.000000 +vt 0.600000 0.225000 +vt 0.625000 0.225000 +vt 0.625000 0.250000 +vt 0.600000 0.250000 +vt 0.350000 0.725000 +vt 0.375000 0.725000 +vt 0.375000 0.750000 +vt 0.350000 0.750000 +vt 0.600000 0.725000 +vt 0.625000 0.725000 +vt 0.625000 0.750000 +vt 0.600000 0.750000 +vt 0.600000 0.475000 +vt 0.625000 0.475000 +vt 0.625000 0.500000 +vt 0.600000 0.500000 +vt 0.475000 0.475000 +vt 0.500000 0.475000 +vt 0.500000 0.500000 +vt 0.475000 0.500000 +vt 0.475000 0.350000 +vt 0.500000 0.350000 +vt 0.500000 0.375000 +vt 0.475000 0.375000 +vt 0.600000 0.350000 +vt 0.625000 0.350000 +vt 0.625000 0.375000 +vt 0.600000 0.375000 +vt 0.475000 0.725000 +vt 0.500000 0.725000 +vt 0.500000 0.750000 +vt 0.475000 0.750000 +vt 0.475000 0.600000 +vt 0.500000 0.600000 +vt 0.500000 0.625000 +vt 0.475000 0.625000 +vt 0.600000 0.600000 +vt 0.625000 0.600000 +vt 0.625000 0.625000 +vt 0.600000 0.625000 +vt 0.225000 0.725000 +vt 0.250000 0.725000 +vt 0.250000 0.750000 +vt 0.225000 0.750000 +vt 0.225000 0.600000 +vt 0.250000 0.600000 +vt 0.250000 0.625000 +vt 0.225000 0.625000 +vt 0.350000 0.600000 +vt 0.375000 0.600000 +vt 0.375000 0.625000 +vt 0.350000 0.625000 +vt 0.475000 0.225000 +vt 0.500000 0.225000 +vt 0.500000 0.250000 +vt 0.475000 0.250000 +vt 0.475000 0.100000 +vt 0.500000 0.100000 +vt 0.500000 0.125000 +vt 0.475000 0.125000 +vt 0.600000 0.100000 +vt 0.625000 0.100000 +vt 0.625000 0.125000 +vt 0.600000 0.125000 +vt 0.475000 0.975000 +vt 0.500000 0.975000 +vt 0.500000 1.000000 +vt 0.475000 1.000000 +vt 0.475000 0.850000 +vt 0.500000 0.850000 +vt 0.500000 0.875000 +vt 0.475000 0.875000 +vt 0.600000 0.850000 +vt 0.625000 0.850000 +vt 0.625000 0.875000 +vt 0.600000 0.875000 +vt 0.725000 0.725000 +vt 0.750000 0.725000 +vt 0.750000 0.750000 +vt 0.725000 0.750000 +vt 0.725000 0.600000 +vt 0.750000 0.600000 +vt 0.750000 0.625000 +vt 0.725000 0.625000 +vt 0.850000 0.600000 +vt 0.875000 0.600000 +vt 0.875000 0.625000 +vt 0.850000 0.625000 +vt 0.775000 0.600000 +vt 0.775000 0.625000 +vt 0.800000 0.600000 +vt 0.800000 0.625000 +vt 0.825000 0.600000 +vt 0.825000 0.625000 +vt 0.750000 0.500000 +vt 0.775000 0.500000 +vt 0.775000 0.525000 +vt 0.750000 0.525000 +vt 0.775000 0.550000 +vt 0.750000 0.550000 +vt 0.775000 0.575000 +vt 0.750000 0.575000 +vt 0.800000 0.500000 +vt 0.800000 0.525000 +vt 0.800000 0.550000 +vt 0.800000 0.575000 +vt 0.825000 0.500000 +vt 0.825000 0.525000 +vt 0.825000 0.550000 +vt 0.825000 0.575000 +vt 0.850000 0.500000 +vt 0.850000 0.525000 +vt 0.850000 0.550000 +vt 0.850000 0.575000 +vt 0.875000 0.500000 +vt 0.875000 0.525000 +vt 0.875000 0.550000 +vt 0.875000 0.575000 +vt 0.650000 0.600000 +vt 0.650000 0.625000 +vt 0.675000 0.600000 +vt 0.675000 0.625000 +vt 0.700000 0.600000 +vt 0.700000 0.625000 +vt 0.650000 0.500000 +vt 0.650000 0.525000 +vt 0.625000 0.525000 +vt 0.650000 0.550000 +vt 0.625000 0.550000 +vt 0.650000 0.575000 +vt 0.625000 0.575000 +vt 0.675000 0.500000 +vt 0.675000 0.525000 +vt 0.675000 0.550000 +vt 0.675000 0.575000 +vt 0.700000 0.500000 +vt 0.700000 0.525000 +vt 0.700000 0.550000 +vt 0.700000 0.575000 +vt 0.725000 0.500000 +vt 0.725000 0.525000 +vt 0.725000 0.550000 +vt 0.725000 0.575000 +vt 0.650000 0.725000 +vt 0.650000 0.750000 +vt 0.675000 0.725000 +vt 0.675000 0.750000 +vt 0.700000 0.725000 +vt 0.700000 0.750000 +vt 0.650000 0.650000 +vt 0.625000 0.650000 +vt 0.650000 0.675000 +vt 0.625000 0.675000 +vt 0.650000 0.700000 +vt 0.625000 0.700000 +vt 0.675000 0.650000 +vt 0.675000 0.675000 +vt 0.675000 0.700000 +vt 0.700000 0.650000 +vt 0.700000 0.675000 +vt 0.700000 0.700000 +vt 0.725000 0.650000 +vt 0.725000 0.675000 +vt 0.725000 0.700000 +vt 0.750000 0.650000 +vt 0.750000 0.675000 +vt 0.750000 0.700000 +vt 0.525000 0.850000 +vt 0.525000 0.875000 +vt 0.550000 0.850000 +vt 0.550000 0.875000 +vt 0.575000 0.850000 +vt 0.575000 0.875000 +vt 0.525000 0.750000 +vt 0.525000 0.775000 +vt 0.500000 0.775000 +vt 0.525000 0.800000 +vt 0.500000 0.800000 +vt 0.525000 0.825000 +vt 0.500000 0.825000 +vt 0.550000 0.750000 +vt 0.550000 0.775000 +vt 0.550000 0.800000 +vt 0.550000 0.825000 +vt 0.575000 0.750000 +vt 0.575000 0.775000 +vt 0.575000 0.800000 +vt 0.575000 0.825000 +vt 0.600000 0.775000 +vt 0.600000 0.800000 +vt 0.600000 0.825000 +vt 0.625000 0.775000 +vt 0.625000 0.800000 +vt 0.625000 0.825000 +vt 0.375000 0.850000 +vt 0.400000 0.850000 +vt 0.400000 0.875000 +vt 0.375000 0.875000 +vt 0.425000 0.850000 +vt 0.425000 0.875000 +vt 0.450000 0.850000 +vt 0.450000 0.875000 +vt 0.400000 0.750000 +vt 0.400000 0.775000 +vt 0.375000 0.775000 +vt 0.400000 0.800000 +vt 0.375000 0.800000 +vt 0.400000 0.825000 +vt 0.375000 0.825000 +vt 0.425000 0.750000 +vt 0.425000 0.775000 +vt 0.425000 0.800000 +vt 0.425000 0.825000 +vt 0.450000 0.750000 +vt 0.450000 0.775000 +vt 0.450000 0.800000 +vt 0.450000 0.825000 +vt 0.475000 0.775000 +vt 0.475000 0.800000 +vt 0.475000 0.825000 +vt 0.375000 0.975000 +vt 0.400000 0.975000 +vt 0.400000 1.000000 +vt 0.375000 1.000000 +vt 0.425000 0.975000 +vt 0.425000 1.000000 +vt 0.450000 0.975000 +vt 0.450000 1.000000 +vt 0.400000 0.900000 +vt 0.375000 0.900000 +vt 0.400000 0.925000 +vt 0.375000 0.925000 +vt 0.400000 0.950000 +vt 0.375000 0.950000 +vt 0.425000 0.900000 +vt 0.425000 0.925000 +vt 0.425000 0.950000 +vt 0.450000 0.900000 +vt 0.450000 0.925000 +vt 0.450000 0.950000 +vt 0.475000 0.900000 +vt 0.475000 0.925000 +vt 0.475000 0.950000 +vt 0.500000 0.900000 +vt 0.500000 0.925000 +vt 0.500000 0.950000 +vt 0.525000 0.100000 +vt 0.525000 0.125000 +vt 0.550000 0.100000 +vt 0.550000 0.125000 +vt 0.575000 0.100000 +vt 0.575000 0.125000 +vt 0.500000 0.000000 +vt 0.525000 0.000000 +vt 0.525000 0.025000 +vt 0.500000 0.025000 +vt 0.525000 0.050000 +vt 0.500000 0.050000 +vt 0.525000 0.075000 +vt 0.500000 0.075000 +vt 0.550000 0.000000 +vt 0.550000 0.025000 +vt 0.550000 0.050000 +vt 0.550000 0.075000 +vt 0.575000 0.000000 +vt 0.575000 0.025000 +vt 0.575000 0.050000 +vt 0.575000 0.075000 +vt 0.600000 0.000000 +vt 0.600000 0.025000 +vt 0.600000 0.050000 +vt 0.600000 0.075000 +vt 0.625000 0.000000 +vt 0.625000 0.025000 +vt 0.625000 0.050000 +vt 0.625000 0.075000 +vt 0.375000 0.100000 +vt 0.400000 0.100000 +vt 0.400000 0.125000 +vt 0.375000 0.125000 +vt 0.425000 0.100000 +vt 0.425000 0.125000 +vt 0.450000 0.100000 +vt 0.450000 0.125000 +vt 0.375000 0.000000 +vt 0.400000 0.000000 +vt 0.400000 0.025000 +vt 0.375000 0.025000 +vt 0.400000 0.050000 +vt 0.375000 0.050000 +vt 0.400000 0.075000 +vt 0.375000 0.075000 +vt 0.425000 0.000000 +vt 0.425000 0.025000 +vt 0.425000 0.050000 +vt 0.425000 0.075000 +vt 0.450000 0.000000 +vt 0.450000 0.025000 +vt 0.450000 0.050000 +vt 0.450000 0.075000 +vt 0.475000 0.000000 +vt 0.475000 0.025000 +vt 0.475000 0.050000 +vt 0.475000 0.075000 +vt 0.375000 0.225000 +vt 0.400000 0.225000 +vt 0.400000 0.250000 +vt 0.375000 0.250000 +vt 0.425000 0.225000 +vt 0.425000 0.250000 +vt 0.450000 0.225000 +vt 0.450000 0.250000 +vt 0.400000 0.150000 +vt 0.375000 0.150000 +vt 0.400000 0.175000 +vt 0.375000 0.175000 +vt 0.400000 0.200000 +vt 0.375000 0.200000 +vt 0.425000 0.150000 +vt 0.425000 0.175000 +vt 0.425000 0.200000 +vt 0.450000 0.150000 +vt 0.450000 0.175000 +vt 0.450000 0.200000 +vt 0.475000 0.150000 +vt 0.475000 0.175000 +vt 0.475000 0.200000 +vt 0.500000 0.150000 +vt 0.500000 0.175000 +vt 0.500000 0.200000 +vt 0.275000 0.600000 +vt 0.275000 0.625000 +vt 0.300000 0.600000 +vt 0.300000 0.625000 +vt 0.325000 0.600000 +vt 0.325000 0.625000 +vt 0.250000 0.500000 +vt 0.275000 0.500000 +vt 0.275000 0.525000 +vt 0.250000 0.525000 +vt 0.275000 0.550000 +vt 0.250000 0.550000 +vt 0.275000 0.575000 +vt 0.250000 0.575000 +vt 0.300000 0.500000 +vt 0.300000 0.525000 +vt 0.300000 0.550000 +vt 0.300000 0.575000 +vt 0.325000 0.500000 +vt 0.325000 0.525000 +vt 0.325000 0.550000 +vt 0.325000 0.575000 +vt 0.350000 0.500000 +vt 0.350000 0.525000 +vt 0.350000 0.550000 +vt 0.350000 0.575000 +vt 0.375000 0.500000 +vt 0.375000 0.525000 +vt 0.375000 0.550000 +vt 0.375000 0.575000 +vt 0.125000 0.600000 +vt 0.150000 0.600000 +vt 0.150000 0.625000 +vt 0.125000 0.625000 +vt 0.175000 0.600000 +vt 0.175000 0.625000 +vt 0.200000 0.600000 +vt 0.200000 0.625000 +vt 0.125000 0.500000 +vt 0.150000 0.500000 +vt 0.150000 0.525000 +vt 0.125000 0.525000 +vt 0.150000 0.550000 +vt 0.125000 0.550000 +vt 0.150000 0.575000 +vt 0.125000 0.575000 +vt 0.175000 0.500000 +vt 0.175000 0.525000 +vt 0.175000 0.550000 +vt 0.175000 0.575000 +vt 0.200000 0.500000 +vt 0.200000 0.525000 +vt 0.200000 0.550000 +vt 0.200000 0.575000 +vt 0.225000 0.500000 +vt 0.225000 0.525000 +vt 0.225000 0.550000 +vt 0.225000 0.575000 +vt 0.125000 0.725000 +vt 0.150000 0.725000 +vt 0.150000 0.750000 +vt 0.125000 0.750000 +vt 0.175000 0.725000 +vt 0.175000 0.750000 +vt 0.200000 0.725000 +vt 0.200000 0.750000 +vt 0.150000 0.650000 +vt 0.125000 0.650000 +vt 0.150000 0.675000 +vt 0.125000 0.675000 +vt 0.150000 0.700000 +vt 0.125000 0.700000 +vt 0.175000 0.650000 +vt 0.175000 0.675000 +vt 0.175000 0.700000 +vt 0.200000 0.650000 +vt 0.200000 0.675000 +vt 0.200000 0.700000 +vt 0.225000 0.650000 +vt 0.225000 0.675000 +vt 0.225000 0.700000 +vt 0.250000 0.650000 +vt 0.250000 0.675000 +vt 0.250000 0.700000 +vt 0.525000 0.600000 +vt 0.525000 0.625000 +vt 0.550000 0.600000 +vt 0.550000 0.625000 +vt 0.575000 0.600000 +vt 0.575000 0.625000 +vt 0.525000 0.500000 +vt 0.525000 0.525000 +vt 0.500000 0.525000 +vt 0.525000 0.550000 +vt 0.500000 0.550000 +vt 0.525000 0.575000 +vt 0.500000 0.575000 +vt 0.550000 0.500000 +vt 0.550000 0.525000 +vt 0.550000 0.550000 +vt 0.550000 0.575000 +vt 0.575000 0.500000 +vt 0.575000 0.525000 +vt 0.575000 0.550000 +vt 0.575000 0.575000 +vt 0.600000 0.525000 +vt 0.600000 0.550000 +vt 0.600000 0.575000 +vt 0.400000 0.600000 +vt 0.400000 0.625000 +vt 0.425000 0.600000 +vt 0.425000 0.625000 +vt 0.450000 0.600000 +vt 0.450000 0.625000 +vt 0.400000 0.500000 +vt 0.400000 0.525000 +vt 0.400000 0.550000 +vt 0.400000 0.575000 +vt 0.425000 0.500000 +vt 0.425000 0.525000 +vt 0.425000 0.550000 +vt 0.425000 0.575000 +vt 0.450000 0.500000 +vt 0.450000 0.525000 +vt 0.450000 0.550000 +vt 0.450000 0.575000 +vt 0.475000 0.525000 +vt 0.475000 0.550000 +vt 0.475000 0.575000 +vt 0.400000 0.725000 +vt 0.425000 0.725000 +vt 0.450000 0.725000 +vt 0.400000 0.650000 +vt 0.375000 0.650000 +vt 0.400000 0.675000 +vt 0.375000 0.675000 +vt 0.400000 0.700000 +vt 0.375000 0.700000 +vt 0.425000 0.650000 +vt 0.425000 0.675000 +vt 0.425000 0.700000 +vt 0.450000 0.650000 +vt 0.450000 0.675000 +vt 0.450000 0.700000 +vt 0.475000 0.650000 +vt 0.475000 0.675000 +vt 0.475000 0.700000 +vt 0.500000 0.650000 +vt 0.500000 0.675000 +vt 0.500000 0.700000 +vt 0.525000 0.350000 +vt 0.525000 0.375000 +vt 0.550000 0.350000 +vt 0.550000 0.375000 +vt 0.575000 0.350000 +vt 0.575000 0.375000 +vt 0.525000 0.250000 +vt 0.525000 0.275000 +vt 0.500000 0.275000 +vt 0.525000 0.300000 +vt 0.500000 0.300000 +vt 0.525000 0.325000 +vt 0.500000 0.325000 +vt 0.550000 0.250000 +vt 0.550000 0.275000 +vt 0.550000 0.300000 +vt 0.550000 0.325000 +vt 0.575000 0.250000 +vt 0.575000 0.275000 +vt 0.575000 0.300000 +vt 0.575000 0.325000 +vt 0.600000 0.275000 +vt 0.600000 0.300000 +vt 0.600000 0.325000 +vt 0.625000 0.275000 +vt 0.625000 0.300000 +vt 0.625000 0.325000 +vt 0.375000 0.350000 +vt 0.400000 0.350000 +vt 0.400000 0.375000 +vt 0.375000 0.375000 +vt 0.425000 0.350000 +vt 0.425000 0.375000 +vt 0.450000 0.350000 +vt 0.450000 0.375000 +vt 0.400000 0.275000 +vt 0.375000 0.275000 +vt 0.400000 0.300000 +vt 0.375000 0.300000 +vt 0.400000 0.325000 +vt 0.375000 0.325000 +vt 0.425000 0.275000 +vt 0.425000 0.300000 +vt 0.425000 0.325000 +vt 0.450000 0.275000 +vt 0.450000 0.300000 +vt 0.450000 0.325000 +vt 0.475000 0.275000 +vt 0.475000 0.300000 +vt 0.475000 0.325000 +vt 0.375000 0.475000 +vt 0.400000 0.475000 +vt 0.425000 0.475000 +vt 0.450000 0.475000 +vt 0.400000 0.400000 +vt 0.375000 0.400000 +vt 0.400000 0.425000 +vt 0.375000 0.425000 +vt 0.400000 0.450000 +vt 0.375000 0.450000 +vt 0.425000 0.400000 +vt 0.425000 0.425000 +vt 0.425000 0.450000 +vt 0.450000 0.400000 +vt 0.450000 0.425000 +vt 0.450000 0.450000 +vt 0.475000 0.400000 +vt 0.475000 0.425000 +vt 0.475000 0.450000 +vt 0.500000 0.400000 +vt 0.500000 0.425000 +vt 0.500000 0.450000 +vt 0.525000 0.475000 +vt 0.550000 0.475000 +vt 0.575000 0.475000 +vt 0.525000 0.400000 +vt 0.525000 0.425000 +vt 0.525000 0.450000 +vt 0.550000 0.400000 +vt 0.550000 0.425000 +vt 0.550000 0.450000 +vt 0.575000 0.400000 +vt 0.575000 0.425000 +vt 0.575000 0.450000 +vt 0.600000 0.400000 +vt 0.600000 0.425000 +vt 0.600000 0.450000 +vt 0.625000 0.400000 +vt 0.625000 0.425000 +vt 0.625000 0.450000 +vt 0.525000 0.725000 +vt 0.550000 0.725000 +vt 0.575000 0.725000 +vt 0.525000 0.650000 +vt 0.525000 0.675000 +vt 0.525000 0.700000 +vt 0.550000 0.650000 +vt 0.550000 0.675000 +vt 0.550000 0.700000 +vt 0.575000 0.650000 +vt 0.575000 0.675000 +vt 0.575000 0.700000 +vt 0.600000 0.650000 +vt 0.600000 0.675000 +vt 0.600000 0.700000 +vt 0.275000 0.725000 +vt 0.275000 0.750000 +vt 0.300000 0.725000 +vt 0.300000 0.750000 +vt 0.325000 0.725000 +vt 0.325000 0.750000 +vt 0.275000 0.650000 +vt 0.275000 0.675000 +vt 0.275000 0.700000 +vt 0.300000 0.650000 +vt 0.300000 0.675000 +vt 0.300000 0.700000 +vt 0.325000 0.650000 +vt 0.325000 0.675000 +vt 0.325000 0.700000 +vt 0.350000 0.650000 +vt 0.350000 0.675000 +vt 0.350000 0.700000 +vt 0.525000 0.225000 +vt 0.550000 0.225000 +vt 0.575000 0.225000 +vt 0.525000 0.150000 +vt 0.525000 0.175000 +vt 0.525000 0.200000 +vt 0.550000 0.150000 +vt 0.550000 0.175000 +vt 0.550000 0.200000 +vt 0.575000 0.150000 +vt 0.575000 0.175000 +vt 0.575000 0.200000 +vt 0.600000 0.150000 +vt 0.600000 0.175000 +vt 0.600000 0.200000 +vt 0.625000 0.150000 +vt 0.625000 0.175000 +vt 0.625000 0.200000 +vt 0.525000 0.975000 +vt 0.525000 1.000000 +vt 0.550000 0.975000 +vt 0.550000 1.000000 +vt 0.575000 0.975000 +vt 0.575000 1.000000 +vt 0.525000 0.900000 +vt 0.525000 0.925000 +vt 0.525000 0.950000 +vt 0.550000 0.900000 +vt 0.550000 0.925000 +vt 0.550000 0.950000 +vt 0.575000 0.900000 +vt 0.575000 0.925000 +vt 0.575000 0.950000 +vt 0.600000 0.900000 +vt 0.600000 0.925000 +vt 0.600000 0.950000 +vt 0.625000 0.900000 +vt 0.625000 0.925000 +vt 0.625000 0.950000 +vt 0.775000 0.725000 +vt 0.775000 0.750000 +vt 0.800000 0.725000 +vt 0.800000 0.750000 +vt 0.825000 0.725000 +vt 0.825000 0.750000 +vt 0.775000 0.650000 +vt 0.775000 0.675000 +vt 0.775000 0.700000 +vt 0.800000 0.650000 +vt 0.800000 0.675000 +vt 0.800000 0.700000 +vt 0.825000 0.650000 +vt 0.825000 0.675000 +vt 0.825000 0.700000 +vt 0.850000 0.650000 +vt 0.850000 0.675000 +vt 0.850000 0.700000 +vt 0.875000 0.650000 +vt 0.875000 0.675000 +vt 0.875000 0.700000 +s 0 +usemtl Material +f 602/1/1 111/2/1 7/3/1 54/4/1 +f 586/5/2 54/6/2 7/7/2 42/8/2 +f 570/9/3 66/10/3 5/11/3 95/12/3 +f 554/13/4 119/14/4 4/15/4 62/16/4 +f 538/17/5 58/18/5 3/19/5 91/20/5 +f 522/21/6 70/22/6 1/23/6 83/24/6 +f 506/25/7 126/26/7 11/27/7 35/28/7 +f 490/29/8 130/30/8 21/31/8 131/32/8 +f 474/33/9 118/34/9 19/35/9 135/36/9 +f 458/37/10 142/38/10 13/39/10 43/40/10 +f 442/41/11 146/42/11 22/43/11 147/44/11 +f 426/45/12 106/46/12 16/47/12 151/48/12 +f 410/49/13 158/50/13 17/51/13 110/52/13 +f 394/53/14 162/54/14 23/55/14 163/56/14 +f 378/57/15 71/58/15 20/59/15 167/60/15 +f 362/61/16 174/62/16 14/63/16 47/64/16 +f 346/65/17 178/66/17 24/67/17 179/68/17 +f 330/69/18 114/70/18 18/71/18 183/72/18 +f 314/73/19 190/74/19 12/75/19 90/76/19 +f 298/77/20 194/78/20 25/79/20 195/80/20 +f 282/81/21 102/82/21 15/83/21 199/84/21 +f 266/85/22 206/86/22 15/87/22 102/88/22 +f 250/89/23 210/90/23 26/91/23 211/92/23 +f 234/93/24 63/94/24 18/95/24 215/96/24 +f 210/90/25 222/97/25 218/98/25 26/91/25 +f 222/97/26 226/99/26 217/100/26 218/98/26 +f 226/99/27 230/101/27 216/102/27 217/100/27 +f 230/101/28 234/93/28 215/96/28 216/102/28 +f 19/103/29 118/104/29 219/105/29 207/106/29 +f 207/106/30 219/105/30 220/107/30 208/108/30 +f 208/108/31 220/107/31 221/109/31 209/110/31 +f 209/110/32 221/109/32 222/97/32 210/90/32 +f 118/104/33 117/111/33 223/112/33 219/105/33 +f 219/105/34 223/112/34 224/113/34 220/107/34 +f 220/107/35 224/113/35 225/114/35 221/109/35 +f 221/109/36 225/114/36 226/99/36 222/97/36 +f 117/111/37 116/115/37 227/116/37 223/112/37 +f 223/112/38 227/116/38 228/117/38 224/113/38 +f 224/113/39 228/117/39 229/118/39 225/114/39 +f 225/114/40 229/118/40 230/101/40 226/99/40 +f 116/115/41 115/119/41 231/120/41 227/116/41 +f 227/116/42 231/120/42 232/121/42 228/117/42 +f 228/117/43 232/121/43 233/122/43 229/118/43 +f 229/118/44 233/122/44 234/93/44 230/101/44 +f 115/119/45 5/123/45 66/124/45 231/120/45 +f 231/120/46 66/124/46 65/125/46 232/121/46 +f 232/121/47 65/125/47 64/126/47 233/122/47 +f 233/122/48 64/126/48 63/94/48 234/93/48 +f 106/46/49 238/127/49 214/128/49 16/47/49 +f 238/127/50 242/129/50 213/130/50 214/128/50 +f 242/129/51 246/131/51 212/132/51 213/130/51 +f 246/131/52 250/89/52 211/92/52 212/132/52 +f 1/23/53 70/133/53 235/134/53 103/135/53 +f 103/135/54 235/134/54 236/136/54 104/137/54 +f 104/137/55 236/136/55 237/138/55 105/139/55 +f 105/139/56 237/138/56 238/127/56 106/46/56 +f 70/133/57 69/140/57 239/141/57 235/134/57 +f 235/134/58 239/141/58 240/142/58 236/136/58 +f 236/136/59 240/142/59 241/143/59 237/138/59 +f 237/138/60 241/143/60 242/129/60 238/127/60 +f 69/140/61 68/144/61 243/145/61 239/141/61 +f 239/141/62 243/145/62 244/146/62 240/142/62 +f 240/142/63 244/146/63 245/147/63 241/143/63 +f 241/143/64 245/147/64 246/131/64 242/129/64 +f 68/144/65 67/148/65 247/149/65 243/145/65 +f 243/145/66 247/149/66 248/150/66 244/146/66 +f 244/146/67 248/150/67 249/151/67 245/147/67 +f 245/147/68 249/151/68 250/89/68 246/131/68 +f 67/148/69 19/103/69 207/106/69 247/149/69 +f 247/149/70 207/106/70 208/108/70 248/150/70 +f 248/150/71 208/108/71 209/110/71 249/151/71 +f 249/151/72 209/110/72 210/90/72 250/89/72 +f 58/18/73 254/152/73 99/153/73 3/19/73 +f 254/152/74 258/154/74 100/155/74 99/153/74 +f 258/154/75 262/156/75 101/157/75 100/155/75 +f 262/156/76 266/85/76 102/88/76 101/157/76 +f 16/47/77 214/128/77 251/158/77 55/159/77 +f 55/159/78 251/158/78 252/160/78 56/161/78 +f 56/161/79 252/160/79 253/162/79 57/163/79 +f 57/163/80 253/162/80 254/152/80 58/18/80 +f 214/128/81 213/130/81 255/164/81 251/158/81 +f 251/158/82 255/164/82 256/165/82 252/160/82 +f 252/160/83 256/165/83 257/166/83 253/162/83 +f 253/162/84 257/166/84 258/154/84 254/152/84 +f 213/130/85 212/132/85 259/167/85 255/164/85 +f 255/164/86 259/167/86 260/168/86 256/165/86 +f 256/165/87 260/168/87 261/169/87 257/166/87 +f 257/166/88 261/169/88 262/156/88 258/154/88 +f 212/132/89 211/92/89 263/170/89 259/167/89 +f 259/167/90 263/170/90 264/171/90 260/168/90 +f 260/168/91 264/171/91 265/172/91 261/169/91 +f 261/169/92 265/172/92 266/85/92 262/156/92 +f 211/92/93 26/91/93 203/173/93 263/170/93 +f 263/170/94 203/173/94 204/174/94 264/171/94 +f 264/171/95 204/174/95 205/175/95 265/172/95 +f 265/172/96 205/175/96 206/86/96 266/85/96 +f 194/78/97 270/176/97 202/177/97 25/79/97 +f 270/176/98 274/178/98 201/179/98 202/177/98 +f 274/178/99 278/180/99 200/181/99 201/179/99 +f 278/180/100 282/81/100 199/84/100 200/181/100 +f 13/39/101 94/182/101 267/183/101 191/184/101 +f 191/184/102 267/183/102 268/185/102 192/186/102 +f 192/186/103 268/185/103 269/187/103 193/188/103 +f 193/188/104 269/187/104 270/176/104 194/78/104 +f 94/182/105 93/189/105 271/190/105 267/183/105 +f 267/183/106 271/190/106 272/191/106 268/185/106 +f 268/185/107 272/191/107 273/192/107 269/187/107 +f 269/187/108 273/192/108 274/178/108 270/176/108 +f 93/189/109 92/193/109 275/194/109 271/190/109 +f 271/190/110 275/194/110 276/195/110 272/191/110 +f 272/191/111 276/195/111 277/196/111 273/192/111 +f 273/192/112 277/196/112 278/180/112 274/178/112 +f 92/193/113 91/20/113 279/197/113 275/194/113 +f 275/194/114 279/197/114 280/198/114 276/195/114 +f 276/195/115 280/198/115 281/199/115 277/196/115 +f 277/196/116 281/199/116 282/81/116 278/180/116 +f 91/20/117 3/19/117 99/200/117 279/197/117 +f 279/197/118 99/200/118 100/201/118 280/198/118 +f 280/198/119 100/201/119 101/202/119 281/199/119 +f 281/199/120 101/202/120 102/82/120 282/81/120 +f 59/203/121 286/204/121 198/205/121 17/206/121 +f 286/204/122 290/207/122 197/208/122 198/205/122 +f 290/207/123 294/209/123 196/210/123 197/208/123 +f 294/209/124 298/77/124 195/80/124 196/210/124 +f 4/15/125 46/211/125 283/212/125 62/213/125 +f 62/213/126 283/212/126 284/214/126 61/215/126 +f 61/215/127 284/214/127 285/216/127 60/217/127 +f 60/217/128 285/216/128 286/204/128 59/203/128 +f 46/211/129 45/218/129 287/219/129 283/212/129 +f 283/212/130 287/219/130 288/220/130 284/214/130 +f 284/214/131 288/220/131 289/221/131 285/216/131 +f 285/216/132 289/221/132 290/207/132 286/204/132 +f 45/218/133 44/222/133 291/223/133 287/219/133 +f 287/219/134 291/223/134 292/224/134 288/220/134 +f 288/220/135 292/224/135 293/225/135 289/221/135 +f 289/221/136 293/225/136 294/209/136 290/207/136 +f 44/222/137 43/40/137 295/226/137 291/223/137 +f 291/223/138 295/226/138 296/227/138 292/224/138 +f 292/224/139 296/227/139 297/228/139 293/225/139 +f 293/225/140 297/228/140 298/77/140 294/209/140 +f 43/40/141 13/39/141 191/184/141 295/226/141 +f 295/226/142 191/184/142 192/186/142 296/227/142 +f 296/227/143 192/186/143 193/188/143 297/228/143 +f 297/228/144 193/188/144 194/78/144 298/77/144 +f 107/229/145 302/230/145 87/231/145 8/232/145 +f 302/230/146 306/233/146 88/234/146 87/231/146 +f 306/233/147 310/235/147 89/236/147 88/234/147 +f 310/235/148 314/73/148 90/76/148 89/236/148 +f 17/206/149 198/205/149 299/237/149 110/238/149 +f 110/238/150 299/237/150 300/239/150 109/240/150 +f 109/240/151 300/239/151 301/241/151 108/242/151 +f 108/242/152 301/241/152 302/230/152 107/229/152 +f 198/205/153 197/208/153 303/243/153 299/237/153 +f 299/237/154 303/243/154 304/244/154 300/239/154 +f 300/239/155 304/244/155 305/245/155 301/241/155 +f 301/241/156 305/245/156 306/233/156 302/230/156 +f 197/208/157 196/210/157 307/246/157 303/243/157 +f 303/243/158 307/246/158 308/247/158 304/244/158 +f 304/244/159 308/247/159 309/248/159 305/245/159 +f 305/245/160 309/248/160 310/235/160 306/233/160 +f 196/210/161 195/80/161 311/249/161 307/246/161 +f 307/246/162 311/249/162 312/250/162 308/247/162 +f 308/247/163 312/250/163 313/251/163 309/248/163 +f 309/248/164 313/251/164 314/73/164 310/235/164 +f 195/80/165 25/79/165 187/252/165 311/249/165 +f 311/249/166 187/252/166 188/253/166 312/250/166 +f 312/250/167 188/253/167 189/254/167 313/251/167 +f 313/251/168 189/254/168 190/74/168 314/73/168 +f 178/66/169 318/255/169 186/256/169 24/67/169 +f 318/255/170 322/257/170 185/258/170 186/256/170 +f 322/257/171 326/259/171 184/260/171 185/258/171 +f 326/259/172 330/69/172 183/72/172 184/260/172 +f 12/261/173 39/262/173 315/263/173 175/264/173 +f 175/264/174 315/263/174 316/265/174 176/266/174 +f 176/266/175 316/265/175 317/267/175 177/268/175 +f 177/268/176 317/267/176 318/255/176 178/66/176 +f 39/262/177 40/269/177 319/270/177 315/263/177 +f 315/263/178 319/270/178 320/271/178 316/265/178 +f 316/265/179 320/271/179 321/272/179 317/267/179 +f 317/267/180 321/272/180 322/257/180 318/255/180 +f 40/269/181 41/273/181 323/274/181 319/270/181 +f 319/270/182 323/274/182 324/275/182 320/271/182 +f 320/271/183 324/275/183 325/276/183 321/272/183 +f 321/272/184 325/276/184 326/259/184 322/257/184 +f 41/273/185 42/277/185 327/278/185 323/274/185 +f 323/274/186 327/278/186 328/279/186 324/275/186 +f 324/275/187 328/279/187 329/280/187 325/276/187 +f 325/276/188 329/280/188 330/69/188 326/259/188 +f 42/277/189 7/281/189 111/282/189 327/278/189 +f 327/278/190 111/282/190 112/283/190 328/279/190 +f 328/279/191 112/283/191 113/284/191 329/280/191 +f 329/280/192 113/284/192 114/70/192 330/69/192 +f 27/285/193 334/286/193 182/287/193 9/288/193 +f 334/286/194 338/289/194 181/290/194 182/287/194 +f 338/289/195 342/291/195 180/292/195 181/290/195 +f 342/291/196 346/65/196 179/68/196 180/292/196 +f 8/293/197 87/294/197 331/295/197 30/296/197 +f 30/296/198 331/295/198 332/297/198 29/298/198 +f 29/298/199 332/297/199 333/299/199 28/300/199 +f 28/300/200 333/299/200 334/286/200 27/285/200 +f 87/294/201 88/301/201 335/302/201 331/295/201 +f 331/295/202 335/302/202 336/303/202 332/297/202 +f 332/297/203 336/303/203 337/304/203 333/299/203 +f 333/299/204 337/304/204 338/289/204 334/286/204 +f 88/301/205 89/305/205 339/306/205 335/302/205 +f 335/302/206 339/306/206 340/307/206 336/303/206 +f 336/303/207 340/307/207 341/308/207 337/304/207 +f 337/304/208 341/308/208 342/291/208 338/289/208 +f 89/305/209 90/309/209 343/310/209 339/306/209 +f 339/306/210 343/310/210 344/311/210 340/307/210 +f 340/307/211 344/311/211 345/312/211 341/308/211 +f 341/308/212 345/312/212 346/65/212 342/291/212 +f 90/309/213 12/261/213 175/264/213 343/310/213 +f 343/310/214 175/264/214 176/266/214 344/311/214 +f 344/311/215 176/266/215 177/268/215 345/312/215 +f 345/312/216 177/268/216 178/66/216 346/65/216 +f 75/313/217 350/314/217 50/315/217 6/316/217 +f 350/314/218 354/317/218 49/318/218 50/315/218 +f 354/317/219 358/319/219 48/320/219 49/318/219 +f 358/319/220 362/61/220 47/64/220 48/320/220 +f 9/288/221 182/287/221 347/321/221 78/322/221 +f 78/322/222 347/321/222 348/323/222 77/324/222 +f 77/324/223 348/323/223 349/325/223 76/326/223 +f 76/326/224 349/325/224 350/314/224 75/313/224 +f 182/287/225 181/290/225 351/327/225 347/321/225 +f 347/321/226 351/327/226 352/328/226 348/323/226 +f 348/323/227 352/328/227 353/329/227 349/325/227 +f 349/325/228 353/329/228 354/317/228 350/314/228 +f 181/290/229 180/292/229 355/330/229 351/327/229 +f 351/327/230 355/330/230 356/331/230 352/328/230 +f 352/328/231 356/331/231 357/332/231 353/329/231 +f 353/329/232 357/332/232 358/319/232 354/317/232 +f 180/292/233 179/68/233 359/333/233 355/330/233 +f 355/330/234 359/333/234 360/334/234 356/331/234 +f 356/331/235 360/334/235 361/335/235 357/332/235 +f 357/332/236 361/335/236 362/61/236 358/319/236 +f 179/68/237 24/67/237 171/336/237 359/333/237 +f 359/333/238 171/336/238 172/337/238 360/334/238 +f 360/334/239 172/337/239 173/338/239 361/335/239 +f 361/335/240 173/338/240 174/62/240 362/61/240 +f 162/54/241 366/339/241 170/340/241 23/55/241 +f 366/339/242 370/341/242 169/342/242 170/340/242 +f 370/341/243 374/343/243 168/344/243 169/342/243 +f 374/343/244 378/57/244 167/60/244 168/344/244 +f 10/345/245 82/346/245 363/347/245 159/348/245 +f 159/348/246 363/347/246 364/349/246 160/350/246 +f 160/350/247 364/349/247 365/351/247 161/352/247 +f 161/352/248 365/351/248 366/339/248 162/54/248 +f 82/346/249 81/353/249 367/354/249 363/347/249 +f 363/347/250 367/354/250 368/355/250 364/349/250 +f 364/349/251 368/355/251 369/356/251 365/351/251 +f 365/351/252 369/356/252 370/341/252 366/339/252 +f 81/353/253 80/357/253 371/358/253 367/354/253 +f 367/354/254 371/358/254 372/359/254 368/355/254 +f 368/355/255 372/359/255 373/360/255 369/356/255 +f 369/356/256 373/360/256 374/343/256 370/341/256 +f 80/357/257 79/361/257 375/362/257 371/358/257 +f 371/358/258 375/362/258 376/363/258 372/359/258 +f 372/359/259 376/363/259 377/364/259 373/360/259 +f 373/360/260 377/364/260 378/57/260 374/343/260 +f 79/361/261 2/365/261 74/366/261 375/362/261 +f 375/362/262 74/366/262 73/367/262 376/363/262 +f 376/363/263 73/367/263 72/368/263 377/364/263 +f 377/364/264 72/368/264 71/58/264 378/57/264 +f 78/369/265 382/370/265 166/371/265 9/372/265 +f 382/370/266 386/373/266 165/374/266 166/371/266 +f 386/373/267 390/375/267 164/376/267 165/374/267 +f 390/375/268 394/53/268 163/56/268 164/376/268 +f 6/377/269 34/378/269 379/379/269 75/380/269 +f 75/380/270 379/379/270 380/381/270 76/382/270 +f 76/382/271 380/381/271 381/383/271 77/384/271 +f 77/384/272 381/383/272 382/370/272 78/369/272 +f 34/378/273 33/385/273 383/386/273 379/379/273 +f 379/379/274 383/386/274 384/387/274 380/381/274 +f 380/381/275 384/387/275 385/388/275 381/383/275 +f 381/383/276 385/388/276 386/373/276 382/370/276 +f 33/385/277 32/389/277 387/390/277 383/386/277 +f 383/386/278 387/390/278 388/391/278 384/387/278 +f 384/387/279 388/391/279 389/392/279 385/388/279 +f 385/388/280 389/392/280 390/375/280 386/373/280 +f 32/389/281 31/393/281 391/394/281 387/390/281 +f 387/390/282 391/394/282 392/395/282 388/391/282 +f 388/391/283 392/395/283 393/396/283 389/392/283 +f 389/392/284 393/396/284 394/53/284 390/375/284 +f 31/393/285 10/345/285 159/348/285 391/394/285 +f 391/394/286 159/348/286 160/350/286 392/395/286 +f 392/395/287 160/350/287 161/352/287 393/396/287 +f 393/396/288 161/352/288 162/54/288 394/53/288 +f 30/397/289 398/398/289 107/399/289 8/400/289 +f 398/398/290 402/401/290 108/402/290 107/399/290 +f 402/401/291 406/403/291 109/404/291 108/402/291 +f 406/403/292 410/49/292 110/52/292 109/404/292 +f 9/372/293 166/371/293 395/405/293 27/406/293 +f 27/406/294 395/405/294 396/407/294 28/408/294 +f 28/408/295 396/407/295 397/409/295 29/410/295 +f 29/410/296 397/409/296 398/398/296 30/397/296 +f 166/371/297 165/374/297 399/411/297 395/405/297 +f 395/405/298 399/411/298 400/412/298 396/407/298 +f 396/407/299 400/412/299 401/413/299 397/409/299 +f 397/409/300 401/413/300 402/401/300 398/398/300 +f 165/374/301 164/376/301 403/414/301 399/411/301 +f 399/411/302 403/414/302 404/415/302 400/412/302 +f 400/412/303 404/415/303 405/416/303 401/413/303 +f 401/413/304 405/416/304 406/403/304 402/401/304 +f 164/376/305 163/56/305 407/417/305 403/414/305 +f 403/414/306 407/417/306 408/418/306 404/415/306 +f 404/415/307 408/418/307 409/419/307 405/416/307 +f 405/416/308 409/419/308 410/49/308 406/403/308 +f 163/56/309 23/55/309 155/420/309 407/417/309 +f 407/417/310 155/420/310 156/421/310 408/418/310 +f 408/418/311 156/421/311 157/422/311 409/419/311 +f 409/419/312 157/422/312 158/50/312 410/49/312 +f 146/42/313 414/423/313 154/424/313 22/43/313 +f 414/423/314 418/425/314 153/426/314 154/424/314 +f 418/425/315 422/427/315 152/428/315 153/426/315 +f 422/427/316 426/45/316 151/48/316 152/428/316 +f 11/27/317 86/429/317 411/430/317 143/431/317 +f 143/431/318 411/430/318 412/432/318 144/433/318 +f 144/433/319 412/432/319 413/434/319 145/435/319 +f 145/435/320 413/434/320 414/423/320 146/42/320 +f 86/429/321 85/436/321 415/437/321 411/430/321 +f 411/430/322 415/437/322 416/438/322 412/432/322 +f 412/432/323 416/438/323 417/439/323 413/434/323 +f 413/434/324 417/439/324 418/425/324 414/423/324 +f 85/436/325 84/440/325 419/441/325 415/437/325 +f 415/437/326 419/441/326 420/442/326 416/438/326 +f 416/438/327 420/442/327 421/443/327 417/439/327 +f 417/439/328 421/443/328 422/427/328 418/425/328 +f 84/440/329 83/24/329 423/444/329 419/441/329 +f 419/441/330 423/444/330 424/445/330 420/442/330 +f 420/442/331 424/445/331 425/446/331 421/443/331 +f 421/443/332 425/446/332 426/45/332 422/427/332 +f 83/24/333 1/23/333 103/135/333 423/444/333 +f 423/444/334 103/135/334 104/137/334 424/445/334 +f 424/445/335 104/137/335 105/139/335 425/446/335 +f 425/446/336 105/139/336 106/46/336 426/45/336 +f 71/58/337 430/447/337 150/448/337 20/59/337 +f 430/447/338 434/449/338 149/450/338 150/448/338 +f 434/449/339 438/451/339 148/452/339 149/450/339 +f 438/451/340 442/41/340 147/44/340 148/452/340 +f 2/365/341 38/453/341 427/454/341 74/366/341 +f 74/366/342 427/454/342 428/455/342 73/367/342 +f 73/367/343 428/455/343 429/456/343 72/368/343 +f 72/368/344 429/456/344 430/447/344 71/58/344 +f 38/453/345 37/457/345 431/458/345 427/454/345 +f 427/454/346 431/458/346 432/459/346 428/455/346 +f 428/455/347 432/459/347 433/460/347 429/456/347 +f 429/456/348 433/460/348 434/449/348 430/447/348 +f 37/457/349 36/461/349 435/462/349 431/458/349 +f 431/458/350 435/462/350 436/463/350 432/459/350 +f 432/459/351 436/463/351 437/464/351 433/460/351 +f 433/460/352 437/464/352 438/451/352 434/449/352 +f 36/461/353 35/28/353 439/465/353 435/462/353 +f 435/462/354 439/465/354 440/466/354 436/463/354 +f 436/463/355 440/466/355 441/467/355 437/464/355 +f 437/464/356 441/467/356 442/41/356 438/451/356 +f 35/28/357 11/27/357 143/431/357 439/465/357 +f 439/465/358 143/431/358 144/433/358 440/466/358 +f 440/466/359 144/433/359 145/435/359 441/467/359 +f 441/467/360 145/435/360 146/42/360 442/41/360 +f 119/14/361 446/468/361 46/211/361 4/15/361 +f 446/468/362 450/469/362 45/218/362 46/211/362 +f 450/469/363 454/470/363 44/222/363 45/218/363 +f 454/470/364 458/37/364 43/40/364 44/222/364 +f 20/59/365 150/448/365 443/471/365 122/472/365 +f 122/472/366 443/471/366 444/473/366 121/474/366 +f 121/474/367 444/473/367 445/475/367 120/476/367 +f 120/476/368 445/475/368 446/468/368 119/14/368 +f 150/448/369 149/450/369 447/477/369 443/471/369 +f 443/471/370 447/477/370 448/478/370 444/473/370 +f 444/473/371 448/478/371 449/479/371 445/475/371 +f 445/475/372 449/479/372 450/469/372 446/468/372 +f 149/450/373 148/452/373 451/480/373 447/477/373 +f 447/477/374 451/480/374 452/481/374 448/478/374 +f 448/478/375 452/481/375 453/482/375 449/479/375 +f 449/479/376 453/482/376 454/470/376 450/469/376 +f 148/452/377 147/44/377 455/483/377 451/480/377 +f 451/480/378 455/483/378 456/484/378 452/481/378 +f 452/481/379 456/484/379 457/485/379 453/482/379 +f 453/482/380 457/485/380 458/37/380 454/470/380 +f 147/44/381 22/43/381 139/486/381 455/483/381 +f 455/483/382 139/486/382 140/487/382 456/484/382 +f 456/484/383 140/487/383 141/488/383 457/485/383 +f 457/485/384 141/488/384 142/38/384 458/37/384 +f 130/30/385 462/489/385 138/490/385 21/31/385 +f 462/489/386 466/491/386 137/492/386 138/490/386 +f 466/491/387 470/493/387 136/494/387 137/492/387 +f 470/493/388 474/33/388 135/36/388 136/494/388 +f 14/63/389 98/495/389 459/496/389 127/497/389 +f 127/497/390 459/496/390 460/498/390 128/499/390 +f 128/499/391 460/498/391 461/500/391 129/501/391 +f 129/501/392 461/500/392 462/489/392 130/30/392 +f 98/495/393 97/502/393 463/503/393 459/496/393 +f 459/496/394 463/503/394 464/504/394 460/498/394 +f 460/498/395 464/504/395 465/505/395 461/500/395 +f 461/500/396 465/505/396 466/491/396 462/489/396 +f 97/502/397 96/506/397 467/507/397 463/503/397 +f 463/503/398 467/507/398 468/508/398 464/504/398 +f 464/504/399 468/508/399 469/509/399 465/505/399 +f 465/505/400 469/509/400 470/493/400 466/491/400 +f 96/506/401 95/12/401 471/510/401 467/507/401 +f 467/507/402 471/510/402 472/511/402 468/508/402 +f 468/508/403 472/511/403 473/512/403 469/509/403 +f 469/509/404 473/512/404 474/33/404 470/493/404 +f 95/12/405 5/11/405 115/513/405 471/510/405 +f 471/510/406 115/513/406 116/514/406 472/511/406 +f 472/511/407 116/514/407 117/515/407 473/512/407 +f 473/512/408 117/515/408 118/34/408 474/33/408 +f 31/516/409 478/517/409 134/518/409 10/519/409 +f 478/517/410 482/520/410 133/521/410 134/518/410 +f 482/520/411 486/522/411 132/523/411 133/521/411 +f 486/522/412 490/29/412 131/32/412 132/523/412 +f 6/316/413 50/315/413 475/524/413 34/525/413 +f 34/525/414 475/524/414 476/526/414 33/527/414 +f 33/527/415 476/526/415 477/528/415 32/529/415 +f 32/529/416 477/528/416 478/517/416 31/516/416 +f 50/315/417 49/318/417 479/530/417 475/524/417 +f 475/524/418 479/530/418 480/531/418 476/526/418 +f 476/526/419 480/531/419 481/532/419 477/528/419 +f 477/528/420 481/532/420 482/520/420 478/517/420 +f 49/318/421 48/320/421 483/533/421 479/530/421 +f 479/530/422 483/533/422 484/534/422 480/531/422 +f 480/531/423 484/534/423 485/535/423 481/532/423 +f 481/532/424 485/535/424 486/522/424 482/520/424 +f 48/320/425 47/64/425 487/536/425 483/533/425 +f 483/533/426 487/536/426 488/537/426 484/534/426 +f 484/534/427 488/537/427 489/538/427 485/535/427 +f 485/535/428 489/538/428 490/29/428 486/522/428 +f 47/64/429 14/63/429 127/497/429 487/536/429 +f 487/536/430 127/497/430 128/499/430 488/537/430 +f 488/537/431 128/499/431 129/501/431 489/538/431 +f 489/538/432 129/501/432 130/30/432 490/29/432 +f 79/539/433 494/540/433 38/453/433 2/365/433 +f 494/540/434 498/541/434 37/457/434 38/453/434 +f 498/541/435 502/542/435 36/461/435 37/457/435 +f 502/542/436 506/25/436 35/28/436 36/461/436 +f 10/519/437 134/518/437 491/543/437 82/544/437 +f 82/544/438 491/543/438 492/545/438 81/546/438 +f 81/546/439 492/545/439 493/547/439 80/548/439 +f 80/548/440 493/547/440 494/540/440 79/539/440 +f 134/518/441 133/521/441 495/549/441 491/543/441 +f 491/543/442 495/549/442 496/550/442 492/545/442 +f 492/545/443 496/550/443 497/551/443 493/547/443 +f 493/547/444 497/551/444 498/541/444 494/540/444 +f 133/521/445 132/523/445 499/552/445 495/549/445 +f 495/549/446 499/552/446 500/553/446 496/550/446 +f 496/550/447 500/553/447 501/554/447 497/551/447 +f 497/551/448 501/554/448 502/542/448 498/541/448 +f 132/523/449 131/32/449 503/555/449 499/552/449 +f 499/552/450 503/555/450 504/556/450 500/553/450 +f 500/553/451 504/556/451 505/557/451 501/554/451 +f 501/554/452 505/557/452 506/25/452 502/542/452 +f 131/32/453 21/31/453 123/558/453 503/555/453 +f 503/555/454 123/558/454 124/559/454 504/556/454 +f 504/556/455 124/559/455 125/560/455 505/557/455 +f 505/557/456 125/560/456 126/26/456 506/25/456 +f 126/26/457 510/561/457 86/429/457 11/27/457 +f 510/561/458 514/562/458 85/436/458 86/429/458 +f 514/562/459 518/563/459 84/440/459 85/436/459 +f 518/563/460 522/21/460 83/24/460 84/440/460 +f 21/31/461 138/490/461 507/564/461 123/558/461 +f 123/558/462 507/564/462 508/565/462 124/559/462 +f 124/559/463 508/565/463 509/566/463 125/560/463 +f 125/560/464 509/566/464 510/561/464 126/26/464 +f 138/490/465 137/492/465 511/567/465 507/564/465 +f 507/564/466 511/567/466 512/568/466 508/565/466 +f 508/565/467 512/568/467 513/569/467 509/566/467 +f 509/566/468 513/569/468 514/562/468 510/561/468 +f 137/492/469 136/494/469 515/570/469 511/567/469 +f 511/567/470 515/570/470 516/571/470 512/568/470 +f 512/568/471 516/571/471 517/572/471 513/569/471 +f 513/569/472 517/572/472 518/563/472 514/562/472 +f 136/494/473 135/36/473 519/573/473 515/570/473 +f 515/570/474 519/573/474 520/574/474 516/571/474 +f 516/571/475 520/574/475 521/575/475 517/572/475 +f 517/572/476 521/575/476 522/21/476 518/563/476 +f 135/36/477 19/35/477 67/576/477 519/573/477 +f 519/573/478 67/576/478 68/577/478 520/574/478 +f 520/574/479 68/577/479 69/578/479 521/575/479 +f 521/575/480 69/578/480 70/22/480 522/21/480 +f 142/38/481 526/579/481 94/182/481 13/39/481 +f 526/579/482 530/580/482 93/189/482 94/182/482 +f 530/580/483 534/581/483 92/193/483 93/189/483 +f 534/581/484 538/17/484 91/20/484 92/193/484 +f 22/43/485 154/424/485 523/582/485 139/486/485 +f 139/486/486 523/582/486 524/583/486 140/487/486 +f 140/487/487 524/583/487 525/584/487 141/488/487 +f 141/488/488 525/584/488 526/579/488 142/38/488 +f 154/424/489 153/426/489 527/585/489 523/582/489 +f 523/582/490 527/585/490 528/586/490 524/583/490 +f 524/583/491 528/586/491 529/587/491 525/584/491 +f 525/584/492 529/587/492 530/580/492 526/579/492 +f 153/426/493 152/428/493 531/588/493 527/585/493 +f 527/585/494 531/588/494 532/589/494 528/586/494 +f 528/586/495 532/589/495 533/590/495 529/587/495 +f 529/587/496 533/590/496 534/581/496 530/580/496 +f 152/428/497 151/48/497 535/591/497 531/588/497 +f 531/588/498 535/591/498 536/592/498 532/589/498 +f 532/589/499 536/592/499 537/593/499 533/590/499 +f 533/590/500 537/593/500 538/17/500 534/581/500 +f 151/48/501 16/47/501 55/159/501 535/591/501 +f 535/591/502 55/159/502 56/161/502 536/592/502 +f 536/592/503 56/161/503 57/163/503 537/593/503 +f 537/593/504 57/163/504 58/18/504 538/17/504 +f 158/50/505 542/594/505 59/595/505 17/51/505 +f 542/594/506 546/596/506 60/597/506 59/595/506 +f 546/596/507 550/598/507 61/599/507 60/597/507 +f 550/598/508 554/13/508 62/16/508 61/599/508 +f 23/55/509 170/340/509 539/600/509 155/420/509 +f 155/420/510 539/600/510 540/601/510 156/421/510 +f 156/421/511 540/601/511 541/602/511 157/422/511 +f 157/422/512 541/602/512 542/594/512 158/50/512 +f 170/340/513 169/342/513 543/603/513 539/600/513 +f 539/600/514 543/603/514 544/604/514 540/601/514 +f 540/601/515 544/604/515 545/605/515 541/602/515 +f 541/602/516 545/605/516 546/596/516 542/594/516 +f 169/342/517 168/344/517 547/606/517 543/603/517 +f 543/603/518 547/606/518 548/607/518 544/604/518 +f 544/604/519 548/607/519 549/608/519 545/605/519 +f 545/605/520 549/608/520 550/598/520 546/596/520 +f 168/344/521 167/60/521 551/609/521 547/606/521 +f 547/606/522 551/609/522 552/610/522 548/607/522 +f 548/607/523 552/610/523 553/611/523 549/608/523 +f 549/608/524 553/611/524 554/13/524 550/598/524 +f 167/60/525 20/59/525 122/472/525 551/609/525 +f 551/609/526 122/472/526 121/474/526 552/610/526 +f 552/610/527 121/474/527 120/476/527 553/611/527 +f 553/611/528 120/476/528 119/14/528 554/13/528 +f 174/62/529 558/612/529 98/495/529 14/63/529 +f 558/612/530 562/613/530 97/502/530 98/495/530 +f 562/613/531 566/614/531 96/506/531 97/502/531 +f 566/614/532 570/9/532 95/12/532 96/506/532 +f 24/67/533 186/256/533 555/615/533 171/336/533 +f 171/336/534 555/615/534 556/616/534 172/337/534 +f 172/337/535 556/616/535 557/617/535 173/338/535 +f 173/338/536 557/617/536 558/612/536 174/62/536 +f 186/256/537 185/258/537 559/618/537 555/615/537 +f 555/615/538 559/618/538 560/619/538 556/616/538 +f 556/616/539 560/619/539 561/620/539 557/617/539 +f 557/617/540 561/620/540 562/613/540 558/612/540 +f 185/258/541 184/260/541 563/621/541 559/618/541 +f 559/618/542 563/621/542 564/622/542 560/619/542 +f 560/619/543 564/622/543 565/623/543 561/620/543 +f 561/620/544 565/623/544 566/614/544 562/613/544 +f 184/260/545 183/72/545 567/624/545 563/621/545 +f 563/621/546 567/624/546 568/625/546 564/622/546 +f 564/622/547 568/625/547 569/626/547 565/623/547 +f 565/623/548 569/626/548 570/9/548 566/614/548 +f 183/72/549 18/71/549 63/627/549 567/624/549 +f 567/624/550 63/627/550 64/628/550 568/625/550 +f 568/625/551 64/628/551 65/629/551 569/626/551 +f 569/626/552 65/629/552 66/10/552 570/9/552 +f 190/74/553 574/630/553 39/631/553 12/75/553 +f 574/630/554 578/632/554 40/633/554 39/631/554 +f 578/632/555 582/634/555 41/635/555 40/633/555 +f 582/634/556 586/5/556 42/8/556 41/635/556 +f 25/79/557 202/177/557 571/636/557 187/252/557 +f 187/252/558 571/636/558 572/637/558 188/253/558 +f 188/253/559 572/637/559 573/638/559 189/254/559 +f 189/254/560 573/638/560 574/630/560 190/74/560 +f 202/177/561 201/179/561 575/639/561 571/636/561 +f 571/636/562 575/639/562 576/640/562 572/637/562 +f 572/637/563 576/640/563 577/641/563 573/638/563 +f 573/638/564 577/641/564 578/632/564 574/630/564 +f 201/179/565 200/181/565 579/642/565 575/639/565 +f 575/639/566 579/642/566 580/643/566 576/640/566 +f 576/640/567 580/643/567 581/644/567 577/641/567 +f 577/641/568 581/644/568 582/634/568 578/632/568 +f 200/181/569 199/84/569 583/645/569 579/642/569 +f 579/642/570 583/645/570 584/646/570 580/643/570 +f 580/643/571 584/646/571 585/647/571 581/644/571 +f 581/644/572 585/647/572 586/5/572 582/634/572 +f 199/84/573 15/83/573 51/648/573 583/645/573 +f 583/645/574 51/648/574 52/649/574 584/646/574 +f 584/646/575 52/649/575 53/650/575 585/647/575 +f 585/647/576 53/650/576 54/6/576 586/5/576 +f 206/86/577 590/651/577 51/652/577 15/87/577 +f 590/651/578 594/653/578 52/654/578 51/652/578 +f 594/653/579 598/655/579 53/656/579 52/654/579 +f 598/655/580 602/1/580 54/4/580 53/656/580 +f 26/91/581 218/98/581 587/657/581 203/173/581 +f 203/173/582 587/657/582 588/658/582 204/174/582 +f 204/174/583 588/658/583 589/659/583 205/175/583 +f 205/175/584 589/659/584 590/651/584 206/86/584 +f 218/98/585 217/100/585 591/660/585 587/657/585 +f 587/657/586 591/660/586 592/661/586 588/658/586 +f 588/658/587 592/661/587 593/662/587 589/659/587 +f 589/659/588 593/662/588 594/653/588 590/651/588 +f 217/100/589 216/102/589 595/663/589 591/660/589 +f 591/660/590 595/663/590 596/664/590 592/661/590 +f 592/661/591 596/664/591 597/665/591 593/662/591 +f 593/662/592 597/665/592 598/655/592 594/653/592 +f 216/102/593 215/96/593 599/666/593 595/663/593 +f 595/663/594 599/666/594 600/667/594 596/664/594 +f 596/664/595 600/667/595 601/668/595 597/665/595 +f 597/665/596 601/668/596 602/1/596 598/655/596 +f 215/96/597 18/95/597 114/669/597 599/666/597 +f 599/666/598 114/669/598 113/670/598 600/667/598 +f 600/667/599 113/670/599 112/671/599 601/668/599 +f 601/668/600 112/671/600 111/2/600 602/1/600 diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/star_sphere.json b/src/main/resources/assets/cosmiccore/models/block/iris/star_sphere.json new file mode 100644 index 000000000..60fcf37ca --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/star_sphere.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "model": "cosmiccore:models/block/iris/star_core.obj", + "textures": { + "texture0": "cosmiccore:block/iris/star_core", + "particle":"cosmiccore:block/iris/star_core" + }, + "automatic_culling": false + } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/star_sphere_inner.json b/src/main/resources/assets/cosmiccore/models/block/iris/star_sphere_inner.json new file mode 100644 index 000000000..26ff66976 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/star_sphere_inner.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "model": "cosmiccore:models/block/iris/star_sphere_inner_dense.obj", + "textures": { + "texture0": "cosmiccore:block/iris/star_sphere_inner_dense", + "particle":"cosmiccore:block/iris/star_sphere_inner_dense" + }, + "automatic_culling": false + } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/star_sphere_inner_dense.mtl b/src/main/resources/assets/cosmiccore/models/block/iris/star_sphere_inner_dense.mtl new file mode 100644 index 000000000..3dbe4ace0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/star_sphere_inner_dense.mtl @@ -0,0 +1,13 @@ +# Blender 4.0.2 MTL File: 'None' +# www.blender.org + +newmtl Material +map_Kd #texture0 +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 1.000000 1.000000 1.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 10.650000 +d 1.000000 +illum 3 diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/star_sphere_inner_dense.obj b/src/main/resources/assets/cosmiccore/models/block/iris/star_sphere_inner_dense.obj new file mode 100644 index 000000000..fda126453 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/star_sphere_inner_dense.obj @@ -0,0 +1,2479 @@ +# Blender 4.0.2 +# www.blender.org +mtllib star_sphere_inner_dense.mtl +o Cube +v 0.742856 0.742856 -0.742856 +v 0.742856 -0.742856 -0.742856 +v 0.742856 0.742856 0.742856 +v 0.742856 -0.742856 0.742856 +v -0.742856 0.742856 -0.742856 +v -0.742856 -0.742856 -0.742856 +v -0.742856 0.742856 0.742856 +v -0.742856 -0.742856 0.742856 +v -0.909809 -0.909809 0.000000 +v 0.000000 -0.909809 -0.909809 +v 0.909809 0.000000 -0.909809 +v -0.909809 0.000000 0.909809 +v 0.909809 0.000000 0.909809 +v -0.909809 0.000000 -0.909809 +v 0.000000 0.909809 0.909809 +v 0.909809 0.909809 0.000000 +v 0.000000 -0.909809 0.909809 +v -0.909809 0.909809 0.000000 +v 0.000000 0.909809 -0.909809 +v 0.909809 -0.909809 0.000000 +v -0.000000 -0.000000 -1.286664 +v 1.286664 -0.000000 -0.000000 +v -0.000000 -1.286664 -0.000000 +v -1.286664 -0.000000 -0.000000 +v -0.000000 -0.000000 1.286664 +v -0.000000 1.286664 -0.000000 +v -0.900845 -0.900845 0.180169 +v -0.875464 -0.875464 0.350186 +v -0.837547 -0.837547 0.502528 +v -0.791887 -0.791887 0.633510 +v -0.180169 -0.900845 -0.900845 +v -0.350186 -0.875464 -0.875464 +v -0.502528 -0.837547 -0.837547 +v -0.633510 -0.791887 -0.791887 +v 0.900845 -0.180169 -0.900845 +v 0.875464 -0.350186 -0.875464 +v 0.837547 -0.502528 -0.837547 +v 0.791887 -0.633510 -0.791887 +v -0.900845 0.180169 0.900845 +v -0.875464 0.350186 0.875464 +v -0.837547 0.502528 0.837547 +v -0.791887 0.633510 0.791887 +v 0.900845 -0.180169 0.900845 +v 0.875464 -0.350186 0.875464 +v 0.837547 -0.502528 0.837547 +v 0.791887 -0.633510 0.791887 +v -0.900845 -0.180169 -0.900845 +v -0.875464 -0.350186 -0.875464 +v -0.837547 -0.502528 -0.837547 +v -0.791887 -0.633510 -0.791887 +v -0.180169 0.900845 0.900845 +v -0.350186 0.875464 0.875464 +v -0.502528 0.837547 0.837547 +v -0.633510 0.791887 0.791887 +v 0.900845 0.900845 0.180169 +v 0.875464 0.875464 0.350186 +v 0.837547 0.837547 0.502528 +v 0.791887 0.791887 0.633510 +v 0.180169 -0.900845 0.900845 +v 0.350186 -0.875464 0.875464 +v 0.502528 -0.837547 0.837547 +v 0.633510 -0.791887 0.791887 +v -0.900845 0.900845 -0.180169 +v -0.875464 0.875464 -0.350186 +v -0.837547 0.837547 -0.502528 +v -0.791887 0.791887 -0.633510 +v 0.180169 0.900845 -0.900845 +v 0.350186 0.875464 -0.875464 +v 0.502528 0.837547 -0.837547 +v 0.633510 0.791887 -0.791887 +v 0.900845 -0.900845 -0.180169 +v 0.875464 -0.875464 -0.350186 +v 0.837547 -0.837547 -0.502528 +v 0.791887 -0.791887 -0.633510 +v -0.791887 -0.791887 -0.633510 +v -0.837547 -0.837547 -0.502528 +v -0.875464 -0.875464 -0.350186 +v -0.900845 -0.900845 -0.180169 +v 0.633510 -0.791887 -0.791887 +v 0.502528 -0.837547 -0.837547 +v 0.350186 -0.875464 -0.875464 +v 0.180169 -0.900845 -0.900845 +v 0.791887 0.633510 -0.791887 +v 0.837547 0.502528 -0.837547 +v 0.875464 0.350186 -0.875464 +v 0.900845 0.180169 -0.900845 +v -0.791887 -0.633510 0.791887 +v -0.837547 -0.502528 0.837547 +v -0.875464 -0.350186 0.875464 +v -0.900845 -0.180169 0.900845 +v 0.791887 0.633510 0.791887 +v 0.837547 0.502528 0.837547 +v 0.875464 0.350186 0.875464 +v 0.900845 0.180169 0.900845 +v -0.791887 0.633510 -0.791887 +v -0.837547 0.502528 -0.837547 +v -0.875464 0.350186 -0.875464 +v -0.900845 0.180169 -0.900845 +v 0.633510 0.791887 0.791887 +v 0.502528 0.837547 0.837547 +v 0.350186 0.875464 0.875464 +v 0.180169 0.900845 0.900845 +v 0.791887 0.791887 -0.633510 +v 0.837547 0.837547 -0.502528 +v 0.875464 0.875464 -0.350186 +v 0.900845 0.900845 -0.180169 +v -0.633510 -0.791887 0.791887 +v -0.502528 -0.837547 0.837547 +v -0.350186 -0.875464 0.875464 +v -0.180169 -0.900845 0.900845 +v -0.791887 0.791887 0.633510 +v -0.837547 0.837547 0.502528 +v -0.875464 0.875464 0.350186 +v -0.900845 0.900845 0.180169 +v -0.633510 0.791887 -0.791887 +v -0.502528 0.837547 -0.837547 +v -0.350186 0.875464 -0.875464 +v -0.180169 0.900845 -0.900845 +v 0.791887 -0.791887 0.633510 +v 0.837547 -0.837547 0.502528 +v 0.875464 -0.875464 0.350186 +v 0.900845 -0.900845 0.180169 +v 0.252336 -0.000000 -1.261678 +v 0.477855 -0.000000 -1.194638 +v 0.661983 -0.000000 -1.103306 +v 0.803773 -0.000000 -1.004716 +v -0.803773 -0.000000 -1.004716 +v -0.661983 -0.000000 -1.103306 +v -0.477855 -0.000000 -1.194638 +v -0.252336 -0.000000 -1.261678 +v -0.000000 -0.252336 -1.261678 +v -0.000000 -0.477855 -1.194638 +v -0.000000 -0.661983 -1.103306 +v -0.000000 -0.803773 -1.004716 +v -0.000000 0.803773 -1.004716 +v -0.000000 0.661983 -1.103306 +v -0.000000 0.477855 -1.194638 +v -0.000000 0.252336 -1.261678 +v 1.261678 -0.000000 0.252336 +v 1.194638 -0.000000 0.477855 +v 1.103306 -0.000000 0.661983 +v 1.004716 -0.000000 0.803773 +v 1.004716 -0.000000 -0.803773 +v 1.103306 -0.000000 -0.661983 +v 1.194638 -0.000000 -0.477855 +v 1.261678 -0.000000 -0.252336 +v 1.261678 -0.252336 -0.000000 +v 1.194638 -0.477855 -0.000000 +v 1.103306 -0.661983 -0.000000 +v 1.004716 -0.803773 -0.000000 +v 1.004716 0.803773 -0.000000 +v 1.103306 0.661983 -0.000000 +v 1.194638 0.477855 -0.000000 +v 1.261678 0.252336 -0.000000 +v -0.000000 -1.261678 0.252336 +v -0.000000 -1.194638 0.477855 +v -0.000000 -1.103306 0.661983 +v -0.000000 -1.004716 0.803773 +v -0.000000 -1.004716 -0.803773 +v -0.000000 -1.103306 -0.661983 +v -0.000000 -1.194638 -0.477855 +v -0.000000 -1.261678 -0.252336 +v -0.252336 -1.261678 -0.000000 +v -0.477855 -1.194638 -0.000000 +v -0.661983 -1.103306 -0.000000 +v -0.803773 -1.004716 -0.000000 +v 0.803773 -1.004716 -0.000000 +v 0.661983 -1.103306 -0.000000 +v 0.477855 -1.194638 -0.000000 +v 0.252336 -1.261678 -0.000000 +v -1.261678 -0.000000 -0.252336 +v -1.194638 -0.000000 -0.477855 +v -1.103306 -0.000000 -0.661983 +v -1.004716 -0.000000 -0.803773 +v -1.004716 -0.000000 0.803773 +v -1.103306 -0.000000 0.661983 +v -1.194638 -0.000000 0.477855 +v -1.261678 -0.000000 0.252336 +v -1.261678 -0.252336 -0.000000 +v -1.194638 -0.477855 -0.000000 +v -1.103306 -0.661983 -0.000000 +v -1.004716 -0.803773 -0.000000 +v -1.004716 0.803773 -0.000000 +v -1.103306 0.661983 -0.000000 +v -1.194638 0.477855 -0.000000 +v -1.261678 0.252336 -0.000000 +v -0.252336 -0.000000 1.261678 +v -0.477855 -0.000000 1.194638 +v -0.661983 -0.000000 1.103306 +v -0.803773 -0.000000 1.004716 +v 0.803773 -0.000000 1.004716 +v 0.661983 -0.000000 1.103306 +v 0.477855 -0.000000 1.194638 +v 0.252336 -0.000000 1.261678 +v -0.000000 -0.252336 1.261678 +v -0.000000 -0.477855 1.194638 +v -0.000000 -0.661983 1.103306 +v -0.000000 -0.803773 1.004716 +v -0.000000 0.803773 1.004716 +v -0.000000 0.661983 1.103306 +v -0.000000 0.477855 1.194638 +v -0.000000 0.252336 1.261678 +v -0.000000 1.261678 0.252336 +v -0.000000 1.194638 0.477855 +v -0.000000 1.103306 0.661983 +v -0.000000 1.004716 0.803773 +v -0.000000 1.004716 -0.803773 +v -0.000000 1.103306 -0.661983 +v -0.000000 1.194638 -0.477855 +v -0.000000 1.261678 -0.252336 +v 0.252336 1.261678 -0.000000 +v 0.477855 1.194638 -0.000000 +v 0.661983 1.103306 -0.000000 +v 0.803773 1.004716 -0.000000 +v -0.803773 1.004716 -0.000000 +v -0.661983 1.103306 -0.000000 +v -0.477855 1.194638 -0.000000 +v -0.252336 1.261678 -0.000000 +v -0.198537 0.992683 -0.794147 +v -0.217486 1.087430 -0.652458 +v -0.234912 1.174559 -0.469823 +v -0.247619 1.238093 -0.247619 +v -0.383609 0.959023 -0.767218 +v -0.417449 1.043623 -0.626174 +v -0.447959 1.119898 -0.447959 +v -0.469823 1.174559 -0.234912 +v -0.545886 0.909809 -0.727847 +v -0.588644 0.981073 -0.588644 +v -0.626174 1.043623 -0.417449 +v -0.652458 1.087430 -0.217486 +v -0.681691 0.852114 -0.681691 +v -0.727847 0.909809 -0.545886 +v -0.767218 0.959023 -0.383609 +v -0.794147 0.992683 -0.198537 +v 0.681691 0.852114 -0.681691 +v 0.727847 0.909809 -0.545886 +v 0.767218 0.959023 -0.383609 +v 0.794147 0.992683 -0.198537 +v 0.545886 0.909809 -0.727847 +v 0.588644 0.981073 -0.588644 +v 0.626174 1.043623 -0.417449 +v 0.652458 1.087430 -0.217486 +v 0.383609 0.959023 -0.767218 +v 0.417449 1.043623 -0.626174 +v 0.447959 1.119898 -0.447959 +v 0.469823 1.174559 -0.234912 +v 0.198537 0.992683 -0.794147 +v 0.217486 1.087430 -0.652458 +v 0.234912 1.174559 -0.469823 +v 0.247619 1.238093 -0.247619 +v 0.794147 0.992683 0.198537 +v 0.767218 0.959023 0.383609 +v 0.727847 0.909809 0.545886 +v 0.681691 0.852114 0.681691 +v 0.652458 1.087430 0.217486 +v 0.626174 1.043623 0.417449 +v 0.588644 0.981073 0.588644 +v 0.545886 0.909809 0.727847 +v 0.469823 1.174559 0.234912 +v 0.447959 1.119898 0.447959 +v 0.417449 1.043623 0.626174 +v 0.383609 0.959023 0.767218 +v 0.247619 1.238093 0.247619 +v 0.234912 1.174559 0.469823 +v 0.217486 1.087430 0.652458 +v 0.198537 0.992683 0.794147 +v 0.794147 0.198537 0.992683 +v 0.652458 0.217486 1.087430 +v 0.469823 0.234912 1.174559 +v 0.247619 0.247619 1.238093 +v 0.767218 0.383609 0.959023 +v 0.626174 0.417449 1.043623 +v 0.447959 0.447959 1.119898 +v 0.234912 0.469823 1.174559 +v 0.727847 0.545886 0.909809 +v 0.588644 0.588644 0.981073 +v 0.417449 0.626174 1.043623 +v 0.217486 0.652458 1.087430 +v 0.681691 0.681691 0.852114 +v 0.545886 0.727847 0.909809 +v 0.383609 0.767218 0.959023 +v 0.198537 0.794147 0.992683 +v 0.681691 -0.681691 0.852114 +v 0.545886 -0.727847 0.909809 +v 0.383609 -0.767218 0.959023 +v 0.198537 -0.794147 0.992683 +v 0.727847 -0.545886 0.909809 +v 0.588644 -0.588644 0.981073 +v 0.417449 -0.626174 1.043623 +v 0.217486 -0.652458 1.087430 +v 0.767218 -0.383609 0.959023 +v 0.626174 -0.417449 1.043623 +v 0.447959 -0.447959 1.119898 +v 0.234912 -0.469823 1.174559 +v 0.794147 -0.198537 0.992683 +v 0.652458 -0.217486 1.087430 +v 0.469823 -0.234912 1.174559 +v 0.247619 -0.247619 1.238093 +v -0.198537 -0.794147 0.992683 +v -0.383609 -0.767218 0.959023 +v -0.545886 -0.727847 0.909809 +v -0.681691 -0.681691 0.852114 +v -0.217486 -0.652458 1.087430 +v -0.417449 -0.626174 1.043623 +v -0.588644 -0.588644 0.981073 +v -0.727847 -0.545886 0.909809 +v -0.234912 -0.469823 1.174559 +v -0.447959 -0.447959 1.119898 +v -0.626174 -0.417449 1.043623 +v -0.767218 -0.383609 0.959023 +v -0.247619 -0.247619 1.238093 +v -0.469823 -0.234912 1.174559 +v -0.652458 -0.217486 1.087430 +v -0.794147 -0.198537 0.992683 +v -0.992683 0.198537 0.794147 +v -1.087430 0.217486 0.652458 +v -1.174559 0.234912 0.469823 +v -1.238093 0.247619 0.247619 +v -0.959023 0.383609 0.767218 +v -1.043623 0.417449 0.626174 +v -1.119898 0.447959 0.447959 +v -1.174559 0.469823 0.234912 +v -0.909809 0.545886 0.727847 +v -0.981073 0.588644 0.588644 +v -1.043623 0.626174 0.417449 +v -1.087430 0.652458 0.217486 +v -0.852114 0.681691 0.681691 +v -0.909809 0.727847 0.545886 +v -0.959023 0.767218 0.383609 +v -0.992683 0.794147 0.198537 +v -0.852114 -0.681691 0.681691 +v -0.909809 -0.727847 0.545886 +v -0.959023 -0.767218 0.383609 +v -0.992683 -0.794147 0.198537 +v -0.909809 -0.545886 0.727847 +v -0.981073 -0.588644 0.588644 +v -1.043623 -0.626174 0.417449 +v -1.087430 -0.652458 0.217486 +v -0.959023 -0.383609 0.767218 +v -1.043623 -0.417449 0.626174 +v -1.119898 -0.447959 0.447959 +v -1.174559 -0.469823 0.234912 +v -0.992683 -0.198537 0.794147 +v -1.087430 -0.217486 0.652458 +v -1.174559 -0.234912 0.469823 +v -1.238093 -0.247619 0.247619 +v -0.992683 -0.794147 -0.198537 +v -0.959023 -0.767218 -0.383609 +v -0.909809 -0.727847 -0.545886 +v -0.852114 -0.681691 -0.681691 +v -1.087430 -0.652458 -0.217486 +v -1.043623 -0.626174 -0.417449 +v -0.981073 -0.588644 -0.588644 +v -0.909809 -0.545886 -0.727847 +v -1.174559 -0.469823 -0.234912 +v -1.119898 -0.447959 -0.447959 +v -1.043623 -0.417449 -0.626174 +v -0.959023 -0.383609 -0.767218 +v -1.238093 -0.247619 -0.247619 +v -1.174559 -0.234912 -0.469823 +v -1.087430 -0.217486 -0.652458 +v -0.992683 -0.198537 -0.794147 +v 0.198537 -0.992683 -0.794147 +v 0.217486 -1.087430 -0.652458 +v 0.234912 -1.174559 -0.469823 +v 0.247619 -1.238093 -0.247619 +v 0.383609 -0.959023 -0.767218 +v 0.417449 -1.043623 -0.626174 +v 0.447959 -1.119898 -0.447959 +v 0.469823 -1.174559 -0.234912 +v 0.545886 -0.909809 -0.727847 +v 0.588644 -0.981073 -0.588644 +v 0.626174 -1.043623 -0.417449 +v 0.652458 -1.087430 -0.217486 +v 0.681691 -0.852114 -0.681691 +v 0.727847 -0.909809 -0.545886 +v 0.767218 -0.959023 -0.383609 +v 0.794147 -0.992683 -0.198537 +v -0.681691 -0.852114 -0.681691 +v -0.727847 -0.909809 -0.545886 +v -0.767218 -0.959023 -0.383609 +v -0.794147 -0.992683 -0.198537 +v -0.545886 -0.909809 -0.727847 +v -0.588644 -0.981073 -0.588644 +v -0.626174 -1.043623 -0.417449 +v -0.652458 -1.087430 -0.217486 +v -0.383609 -0.959023 -0.767218 +v -0.417449 -1.043623 -0.626174 +v -0.447959 -1.119898 -0.447959 +v -0.469823 -1.174559 -0.234912 +v -0.198537 -0.992683 -0.794147 +v -0.217486 -1.087430 -0.652458 +v -0.234912 -1.174559 -0.469823 +v -0.247619 -1.238093 -0.247619 +v -0.794147 -0.992683 0.198537 +v -0.767218 -0.959023 0.383609 +v -0.727847 -0.909809 0.545886 +v -0.681691 -0.852114 0.681691 +v -0.652458 -1.087430 0.217486 +v -0.626174 -1.043623 0.417449 +v -0.588644 -0.981073 0.588644 +v -0.545886 -0.909809 0.727847 +v -0.469823 -1.174559 0.234912 +v -0.447959 -1.119898 0.447959 +v -0.417449 -1.043623 0.626174 +v -0.383609 -0.959023 0.767218 +v -0.247619 -1.238093 0.247619 +v -0.234912 -1.174559 0.469823 +v -0.217486 -1.087430 0.652458 +v -0.198537 -0.992683 0.794147 +v 0.992683 0.198537 -0.794147 +v 1.087430 0.217486 -0.652458 +v 1.174559 0.234912 -0.469823 +v 1.238093 0.247619 -0.247619 +v 0.959023 0.383609 -0.767218 +v 1.043623 0.417449 -0.626174 +v 1.119898 0.447959 -0.447959 +v 1.174559 0.469823 -0.234912 +v 0.909809 0.545886 -0.727847 +v 0.981073 0.588644 -0.588644 +v 1.043623 0.626174 -0.417449 +v 1.087430 0.652458 -0.217486 +v 0.852114 0.681691 -0.681691 +v 0.909809 0.727847 -0.545886 +v 0.959023 0.767218 -0.383609 +v 0.992683 0.794147 -0.198537 +v 0.852114 -0.681691 -0.681691 +v 0.909809 -0.727847 -0.545886 +v 0.959023 -0.767218 -0.383609 +v 0.992683 -0.794147 -0.198537 +v 0.909809 -0.545886 -0.727847 +v 0.981073 -0.588644 -0.588644 +v 1.043623 -0.626174 -0.417449 +v 1.087430 -0.652458 -0.217486 +v 0.959023 -0.383609 -0.767218 +v 1.043623 -0.417449 -0.626174 +v 1.119898 -0.447959 -0.447959 +v 1.174559 -0.469823 -0.234912 +v 0.992683 -0.198537 -0.794147 +v 1.087430 -0.217486 -0.652458 +v 1.174559 -0.234912 -0.469823 +v 1.238093 -0.247619 -0.247619 +v 0.992683 -0.794147 0.198537 +v 0.959023 -0.767218 0.383609 +v 0.909809 -0.727847 0.545886 +v 0.852114 -0.681691 0.681691 +v 1.087430 -0.652458 0.217486 +v 1.043623 -0.626174 0.417449 +v 0.981073 -0.588644 0.588644 +v 0.909809 -0.545886 0.727847 +v 1.174559 -0.469823 0.234912 +v 1.119898 -0.447959 0.447959 +v 1.043623 -0.417449 0.626174 +v 0.959023 -0.383609 0.767218 +v 1.238093 -0.247619 0.247619 +v 1.174559 -0.234912 0.469823 +v 1.087430 -0.217486 0.652458 +v 0.992683 -0.198537 0.794147 +v -0.794147 0.198537 -0.992683 +v -0.652458 0.217486 -1.087430 +v -0.469823 0.234912 -1.174559 +v -0.247619 0.247619 -1.238093 +v -0.767218 0.383609 -0.959023 +v -0.626174 0.417449 -1.043623 +v -0.447959 0.447959 -1.119898 +v -0.234912 0.469823 -1.174559 +v -0.727847 0.545886 -0.909809 +v -0.588644 0.588644 -0.981073 +v -0.417449 0.626174 -1.043623 +v -0.217486 0.652458 -1.087430 +v -0.681691 0.681691 -0.852114 +v -0.545886 0.727847 -0.909809 +v -0.383609 0.767218 -0.959023 +v -0.198537 0.794147 -0.992683 +v -0.681691 -0.681691 -0.852114 +v -0.545886 -0.727847 -0.909809 +v -0.383609 -0.767218 -0.959023 +v -0.198537 -0.794147 -0.992683 +v -0.727847 -0.545886 -0.909809 +v -0.588644 -0.588644 -0.981073 +v -0.417449 -0.626174 -1.043623 +v -0.217486 -0.652458 -1.087430 +v -0.767218 -0.383609 -0.959023 +v -0.626174 -0.417449 -1.043623 +v -0.447959 -0.447959 -1.119898 +v -0.234912 -0.469823 -1.174559 +v -0.794147 -0.198537 -0.992683 +v -0.652458 -0.217486 -1.087430 +v -0.469823 -0.234912 -1.174559 +v -0.247619 -0.247619 -1.238093 +v 0.198537 -0.794147 -0.992683 +v 0.383609 -0.767218 -0.959023 +v 0.545886 -0.727847 -0.909809 +v 0.681691 -0.681691 -0.852114 +v 0.217486 -0.652458 -1.087430 +v 0.417449 -0.626174 -1.043623 +v 0.588644 -0.588644 -0.981073 +v 0.727847 -0.545886 -0.909809 +v 0.234912 -0.469823 -1.174559 +v 0.447959 -0.447959 -1.119898 +v 0.626174 -0.417449 -1.043623 +v 0.767218 -0.383609 -0.959023 +v 0.247619 -0.247619 -1.238093 +v 0.469823 -0.234912 -1.174559 +v 0.652458 -0.217486 -1.087430 +v 0.794147 -0.198537 -0.992683 +v 0.247619 0.247619 -1.238093 +v 0.469823 0.234912 -1.174559 +v 0.652458 0.217486 -1.087430 +v 0.794147 0.198537 -0.992683 +v 0.234912 0.469823 -1.174559 +v 0.447959 0.447959 -1.119898 +v 0.626174 0.417449 -1.043623 +v 0.767218 0.383609 -0.959023 +v 0.217486 0.652458 -1.087430 +v 0.417449 0.626174 -1.043623 +v 0.588644 0.588644 -0.981073 +v 0.727847 0.545886 -0.909809 +v 0.198537 0.794147 -0.992683 +v 0.383609 0.767218 -0.959023 +v 0.545886 0.727847 -0.909809 +v 0.681691 0.681691 -0.852114 +v 1.238093 0.247619 0.247619 +v 1.174559 0.234912 0.469823 +v 1.087430 0.217486 0.652458 +v 0.992683 0.198537 0.794147 +v 1.174559 0.469823 0.234912 +v 1.119898 0.447959 0.447959 +v 1.043623 0.417449 0.626174 +v 0.959023 0.383609 0.767218 +v 1.087430 0.652458 0.217486 +v 1.043623 0.626174 0.417449 +v 0.981073 0.588644 0.588644 +v 0.909809 0.545886 0.727847 +v 0.992683 0.794147 0.198537 +v 0.959023 0.767218 0.383609 +v 0.909809 0.727847 0.545886 +v 0.852114 0.681691 0.681691 +v 0.247619 -1.238093 0.247619 +v 0.234912 -1.174559 0.469823 +v 0.217486 -1.087430 0.652458 +v 0.198537 -0.992683 0.794147 +v 0.469823 -1.174559 0.234912 +v 0.447959 -1.119898 0.447959 +v 0.417449 -1.043623 0.626174 +v 0.383609 -0.959023 0.767218 +v 0.652458 -1.087430 0.217486 +v 0.626174 -1.043623 0.417449 +v 0.588644 -0.981073 0.588644 +v 0.545886 -0.909809 0.727847 +v 0.794147 -0.992683 0.198537 +v 0.767218 -0.959023 0.383609 +v 0.727847 -0.909809 0.545886 +v 0.681691 -0.852114 0.681691 +v -1.238093 0.247619 -0.247619 +v -1.174559 0.234912 -0.469823 +v -1.087430 0.217486 -0.652458 +v -0.992683 0.198537 -0.794147 +v -1.174559 0.469823 -0.234912 +v -1.119898 0.447959 -0.447959 +v -1.043623 0.417449 -0.626174 +v -0.959023 0.383609 -0.767218 +v -1.087430 0.652458 -0.217486 +v -1.043623 0.626174 -0.417449 +v -0.981073 0.588644 -0.588644 +v -0.909809 0.545886 -0.727847 +v -0.992683 0.794147 -0.198537 +v -0.959023 0.767218 -0.383609 +v -0.909809 0.727847 -0.545886 +v -0.852114 0.681691 -0.681691 +v -0.247619 0.247619 1.238093 +v -0.469823 0.234912 1.174559 +v -0.652458 0.217486 1.087430 +v -0.794147 0.198537 0.992683 +v -0.234912 0.469823 1.174559 +v -0.447959 0.447959 1.119898 +v -0.626174 0.417449 1.043623 +v -0.767218 0.383609 0.959023 +v -0.217486 0.652458 1.087430 +v -0.417449 0.626174 1.043623 +v -0.588644 0.588644 0.981073 +v -0.727847 0.545886 0.909809 +v -0.198537 0.794147 0.992683 +v -0.383609 0.767218 0.959023 +v -0.545886 0.727847 0.909809 +v -0.681691 0.681691 0.852114 +v -0.247619 1.238093 0.247619 +v -0.234912 1.174559 0.469823 +v -0.217486 1.087430 0.652458 +v -0.198537 0.992683 0.794147 +v -0.469823 1.174559 0.234912 +v -0.447959 1.119898 0.447959 +v -0.417449 1.043623 0.626174 +v -0.383609 0.959023 0.767218 +v -0.652458 1.087430 0.217486 +v -0.626174 1.043623 0.417449 +v -0.588644 0.981073 0.588644 +v -0.545886 0.909809 0.727847 +v -0.794147 0.992683 0.198537 +v -0.767218 0.959023 0.383609 +v -0.727847 0.909809 0.545886 +v -0.681691 0.852114 0.681691 +vn -0.5544 0.6207 0.5544 +vn -0.5544 0.5544 0.6207 +vn -0.6207 0.5544 -0.5544 +vn 0.5544 -0.6207 0.5544 +vn 0.6207 0.5544 0.5544 +vn 0.5544 0.5544 -0.6207 +vn 0.6615 -0.0738 -0.7463 +vn -0.0971 -0.0971 -0.9905 +vn -0.0738 0.6615 -0.7463 +vn 0.7463 -0.0738 0.6615 +vn 0.9905 -0.0971 -0.0971 +vn 0.7463 0.6615 -0.0738 +vn -0.0738 -0.7463 0.6615 +vn -0.0971 -0.9905 -0.0971 +vn 0.6615 -0.7463 -0.0738 +vn -0.7463 -0.0738 -0.6615 +vn -0.9905 -0.0971 0.0971 +vn -0.7463 0.6615 0.0738 +vn -0.6615 -0.0738 0.7463 +vn 0.0971 -0.0971 0.9905 +vn 0.0738 0.6615 0.7463 +vn 0.0738 0.7463 0.6615 +vn 0.0971 0.9905 -0.0971 +vn -0.6615 0.7463 -0.0738 +vn -0.0971 0.9905 -0.0971 +vn -0.2812 0.9550 -0.0939 +vn -0.4392 0.8941 -0.0881 +vn -0.5653 0.8209 -0.0811 +vn -0.0738 0.7463 -0.6615 +vn -0.0811 0.8209 -0.5653 +vn -0.0881 0.8941 -0.4392 +vn -0.0939 0.9550 -0.2812 +vn -0.2169 0.7301 -0.6480 +vn -0.2371 0.7997 -0.5516 +vn -0.2565 0.8672 -0.4268 +vn -0.2722 0.9229 -0.2722 +vn -0.3472 0.7007 -0.6233 +vn -0.3768 0.7619 -0.5267 +vn -0.4046 0.8201 -0.4046 +vn -0.4268 0.8672 -0.2565 +vn -0.4601 0.6627 -0.5908 +vn -0.4949 0.7142 -0.4949 +vn -0.5267 0.7619 -0.3768 +vn -0.5516 0.7997 -0.2371 +vn -0.5544 0.6207 -0.5544 +vn -0.5908 0.6627 -0.4601 +vn -0.6233 0.7007 -0.3472 +vn -0.6480 0.7301 -0.2169 +vn 0.6615 0.7463 -0.0738 +vn 0.5653 0.8209 -0.0811 +vn 0.4392 0.8941 -0.0881 +vn 0.2812 0.9550 -0.0939 +vn 0.5544 0.6207 -0.5544 +vn 0.5908 0.6627 -0.4601 +vn 0.6233 0.7007 -0.3472 +vn 0.6480 0.7301 -0.2169 +vn 0.4601 0.6627 -0.5908 +vn 0.4949 0.7142 -0.4949 +vn 0.5267 0.7619 -0.3768 +vn 0.5516 0.7997 -0.2371 +vn 0.3472 0.7007 -0.6233 +vn 0.3768 0.7619 -0.5267 +vn 0.4046 0.8201 -0.4046 +vn 0.4268 0.8672 -0.2565 +vn 0.2169 0.7301 -0.6480 +vn 0.2371 0.7997 -0.5516 +vn 0.2565 0.8672 -0.4268 +vn 0.2722 0.9229 -0.2722 +vn 0.0738 0.7463 -0.6615 +vn 0.0811 0.8209 -0.5653 +vn 0.0881 0.8941 -0.4392 +vn 0.0939 0.9550 -0.2812 +vn 0.5544 0.6207 0.5544 +vn 0.4601 0.6627 0.5908 +vn 0.3472 0.7007 0.6233 +vn 0.2169 0.7301 0.6480 +vn 0.6615 0.7463 0.0738 +vn 0.6480 0.7301 0.2169 +vn 0.6233 0.7007 0.3472 +vn 0.5908 0.6627 0.4601 +vn 0.5653 0.8209 0.0811 +vn 0.5516 0.7997 0.2371 +vn 0.5267 0.7619 0.3768 +vn 0.4949 0.7142 0.4949 +vn 0.4392 0.8941 0.0881 +vn 0.4268 0.8672 0.2565 +vn 0.4046 0.8201 0.4046 +vn 0.3768 0.7619 0.5267 +vn 0.2812 0.9550 0.0939 +vn 0.2722 0.9229 0.2722 +vn 0.2565 0.8672 0.4268 +vn 0.2371 0.7997 0.5516 +vn 0.0971 0.9905 0.0971 +vn 0.0939 0.9550 0.2812 +vn 0.0881 0.8941 0.4392 +vn 0.0811 0.8209 0.5653 +vn 0.0971 0.0971 0.9905 +vn 0.0939 0.2812 0.9551 +vn 0.0881 0.4392 0.8941 +vn 0.0811 0.5653 0.8209 +vn 0.6615 0.0738 0.7463 +vn 0.5653 0.0811 0.8209 +vn 0.4392 0.0881 0.8941 +vn 0.2812 0.0939 0.9551 +vn 0.6480 0.2169 0.7301 +vn 0.5516 0.2371 0.7997 +vn 0.4268 0.2565 0.8672 +vn 0.2722 0.2722 0.9229 +vn 0.6233 0.3472 0.7007 +vn 0.5267 0.3768 0.7619 +vn 0.4046 0.4046 0.8201 +vn 0.2565 0.4268 0.8672 +vn 0.5908 0.4601 0.6627 +vn 0.4949 0.4949 0.7142 +vn 0.3768 0.5267 0.7619 +vn 0.2371 0.5516 0.7997 +vn 0.5544 0.5544 0.6207 +vn 0.4601 0.5908 0.6627 +vn 0.3472 0.6233 0.7007 +vn 0.2169 0.6480 0.7301 +vn 0.0738 -0.6615 0.7463 +vn 0.0811 -0.5653 0.8209 +vn 0.0881 -0.4392 0.8941 +vn 0.0939 -0.2812 0.9551 +vn 0.5544 -0.5544 0.6207 +vn 0.4601 -0.5908 0.6627 +vn 0.3472 -0.6233 0.7007 +vn 0.2169 -0.6480 0.7301 +vn 0.5908 -0.4601 0.6627 +vn 0.4949 -0.4949 0.7142 +vn 0.3768 -0.5267 0.7619 +vn 0.2371 -0.5516 0.7997 +vn 0.6233 -0.3472 0.7007 +vn 0.5267 -0.3768 0.7619 +vn 0.4046 -0.4046 0.8201 +vn 0.2565 -0.4268 0.8672 +vn 0.6480 -0.2169 0.7301 +vn 0.5516 -0.2371 0.7997 +vn 0.4268 -0.2565 0.8672 +vn 0.2722 -0.2722 0.9229 +vn 0.6615 -0.0738 0.7463 +vn 0.5653 -0.0811 0.8209 +vn 0.4392 -0.0881 0.8941 +vn 0.2812 -0.0939 0.9551 +vn -0.5544 -0.5544 0.6207 +vn -0.5908 -0.4601 0.6627 +vn -0.6233 -0.3472 0.7007 +vn -0.6480 -0.2169 0.7301 +vn -0.0738 -0.6615 0.7463 +vn -0.2169 -0.6480 0.7301 +vn -0.3472 -0.6233 0.7007 +vn -0.4601 -0.5908 0.6627 +vn -0.0811 -0.5653 0.8209 +vn -0.2371 -0.5516 0.7997 +vn -0.3768 -0.5267 0.7619 +vn -0.4949 -0.4949 0.7142 +vn -0.0881 -0.4392 0.8941 +vn -0.2565 -0.4268 0.8672 +vn -0.4046 -0.4046 0.8201 +vn -0.5267 -0.3768 0.7619 +vn -0.0939 -0.2812 0.9551 +vn -0.2722 -0.2722 0.9229 +vn -0.4268 -0.2565 0.8672 +vn -0.5516 -0.2371 0.7997 +vn -0.0971 -0.0971 0.9905 +vn -0.2812 -0.0939 0.9551 +vn -0.4392 -0.0881 0.8941 +vn -0.5653 -0.0811 0.8209 +vn -0.9905 0.0971 0.0971 +vn -0.9551 0.2812 0.0939 +vn -0.8941 0.4392 0.0881 +vn -0.8209 0.5653 0.0811 +vn -0.7463 0.0738 0.6615 +vn -0.8209 0.0811 0.5653 +vn -0.8941 0.0881 0.4392 +vn -0.9551 0.0939 0.2812 +vn -0.7301 0.2169 0.6480 +vn -0.7997 0.2371 0.5516 +vn -0.8672 0.2565 0.4268 +vn -0.9229 0.2722 0.2722 +vn -0.7007 0.3472 0.6233 +vn -0.7619 0.3768 0.5267 +vn -0.8201 0.4046 0.4046 +vn -0.8672 0.4268 0.2565 +vn -0.6627 0.4601 0.5908 +vn -0.7142 0.4949 0.4949 +vn -0.7619 0.5267 0.3768 +vn -0.7997 0.5516 0.2371 +vn -0.6207 0.5544 0.5544 +vn -0.6627 0.5908 0.4601 +vn -0.7007 0.6233 0.3472 +vn -0.7301 0.6480 0.2169 +vn -0.7463 -0.6615 0.0738 +vn -0.8209 -0.5653 0.0811 +vn -0.8941 -0.4392 0.0881 +vn -0.9551 -0.2812 0.0939 +vn -0.6207 -0.5544 0.5544 +vn -0.6627 -0.5908 0.4601 +vn -0.7007 -0.6233 0.3472 +vn -0.7301 -0.6480 0.2169 +vn -0.6627 -0.4601 0.5908 +vn -0.7142 -0.4949 0.4949 +vn -0.7619 -0.5267 0.3768 +vn -0.7997 -0.5516 0.2371 +vn -0.7007 -0.3472 0.6233 +vn -0.7619 -0.3768 0.5267 +vn -0.8201 -0.4046 0.4046 +vn -0.8672 -0.4268 0.2565 +vn -0.7301 -0.2169 0.6480 +vn -0.7997 -0.2371 0.5516 +vn -0.8672 -0.2565 0.4268 +vn -0.9229 -0.2722 0.2722 +vn -0.7463 -0.0738 0.6615 +vn -0.8209 -0.0811 0.5653 +vn -0.8941 -0.0881 0.4392 +vn -0.9551 -0.0939 0.2812 +vn -0.6207 -0.5544 -0.5544 +vn -0.6627 -0.4601 -0.5908 +vn -0.7007 -0.3472 -0.6233 +vn -0.7301 -0.2169 -0.6480 +vn -0.7463 -0.6615 -0.0738 +vn -0.7301 -0.6480 -0.2169 +vn -0.7007 -0.6233 -0.3472 +vn -0.6627 -0.5908 -0.4601 +vn -0.8209 -0.5653 -0.0811 +vn -0.7997 -0.5516 -0.2371 +vn -0.7619 -0.5267 -0.3768 +vn -0.7142 -0.4949 -0.4949 +vn -0.8941 -0.4392 -0.0881 +vn -0.8672 -0.4268 -0.2565 +vn -0.8201 -0.4046 -0.4046 +vn -0.7619 -0.3768 -0.5267 +vn -0.9551 -0.2812 -0.0939 +vn -0.9229 -0.2722 -0.2722 +vn -0.8672 -0.2565 -0.4268 +vn -0.7997 -0.2371 -0.5516 +vn -0.9905 -0.0971 -0.0971 +vn -0.9551 -0.0939 -0.2812 +vn -0.8941 -0.0881 -0.4392 +vn -0.8209 -0.0811 -0.5653 +vn 0.0971 -0.9905 -0.0971 +vn 0.2812 -0.9550 -0.0939 +vn 0.4392 -0.8941 -0.0881 +vn 0.5653 -0.8209 -0.0811 +vn 0.0738 -0.7463 -0.6615 +vn 0.0811 -0.8209 -0.5653 +vn 0.0881 -0.8941 -0.4392 +vn 0.0939 -0.9550 -0.2812 +vn 0.2169 -0.7301 -0.6480 +vn 0.2371 -0.7997 -0.5516 +vn 0.2565 -0.8672 -0.4268 +vn 0.2722 -0.9229 -0.2722 +vn 0.3472 -0.7007 -0.6233 +vn 0.3768 -0.7619 -0.5267 +vn 0.4046 -0.8201 -0.4046 +vn 0.4268 -0.8672 -0.2565 +vn 0.4601 -0.6627 -0.5908 +vn 0.4949 -0.7142 -0.4949 +vn 0.5267 -0.7619 -0.3768 +vn 0.5516 -0.7997 -0.2371 +vn 0.5544 -0.6207 -0.5544 +vn 0.5908 -0.6627 -0.4601 +vn 0.6233 -0.7007 -0.3472 +vn 0.6480 -0.7301 -0.2169 +vn -0.6615 -0.7463 -0.0738 +vn -0.5653 -0.8209 -0.0811 +vn -0.4392 -0.8941 -0.0881 +vn -0.2812 -0.9550 -0.0939 +vn -0.5544 -0.6207 -0.5544 +vn -0.5908 -0.6627 -0.4601 +vn -0.6233 -0.7007 -0.3472 +vn -0.6480 -0.7301 -0.2169 +vn -0.4601 -0.6627 -0.5908 +vn -0.4949 -0.7142 -0.4949 +vn -0.5267 -0.7619 -0.3768 +vn -0.5516 -0.7997 -0.2371 +vn -0.3472 -0.7007 -0.6233 +vn -0.3768 -0.7619 -0.5267 +vn -0.4046 -0.8201 -0.4046 +vn -0.4268 -0.8672 -0.2565 +vn -0.2169 -0.7301 -0.6480 +vn -0.2371 -0.7997 -0.5516 +vn -0.2565 -0.8672 -0.4268 +vn -0.2722 -0.9229 -0.2722 +vn -0.0738 -0.7463 -0.6615 +vn -0.0811 -0.8209 -0.5653 +vn -0.0881 -0.8941 -0.4392 +vn -0.0939 -0.9550 -0.2812 +vn -0.5544 -0.6207 0.5544 +vn -0.4601 -0.6627 0.5908 +vn -0.3472 -0.7007 0.6233 +vn -0.2169 -0.7301 0.6480 +vn -0.6615 -0.7463 0.0738 +vn -0.6480 -0.7301 0.2169 +vn -0.6233 -0.7007 0.3472 +vn -0.5908 -0.6627 0.4601 +vn -0.5653 -0.8209 0.0811 +vn -0.5516 -0.7997 0.2371 +vn -0.5267 -0.7619 0.3768 +vn -0.4949 -0.7142 0.4949 +vn -0.4392 -0.8941 0.0881 +vn -0.4268 -0.8672 0.2565 +vn -0.4046 -0.8201 0.4046 +vn -0.3768 -0.7619 0.5267 +vn -0.2812 -0.9551 0.0939 +vn -0.2722 -0.9229 0.2722 +vn -0.2565 -0.8672 0.4268 +vn -0.2371 -0.7997 0.5516 +vn -0.0971 -0.9905 0.0971 +vn -0.0939 -0.9550 0.2812 +vn -0.0881 -0.8941 0.4392 +vn -0.0811 -0.8209 0.5653 +vn 0.9905 0.0971 -0.0971 +vn 0.9551 0.2812 -0.0939 +vn 0.8941 0.4392 -0.0881 +vn 0.8209 0.5653 -0.0811 +vn 0.7463 0.0738 -0.6615 +vn 0.8209 0.0811 -0.5653 +vn 0.8941 0.0881 -0.4392 +vn 0.9551 0.0939 -0.2812 +vn 0.7301 0.2169 -0.6480 +vn 0.7997 0.2371 -0.5516 +vn 0.8672 0.2565 -0.4268 +vn 0.9229 0.2722 -0.2722 +vn 0.7007 0.3472 -0.6233 +vn 0.7619 0.3768 -0.5267 +vn 0.8201 0.4046 -0.4046 +vn 0.8672 0.4268 -0.2565 +vn 0.6627 0.4601 -0.5908 +vn 0.7142 0.4949 -0.4949 +vn 0.7619 0.5267 -0.3768 +vn 0.7997 0.5516 -0.2371 +vn 0.6207 0.5544 -0.5544 +vn 0.6627 0.5908 -0.4601 +vn 0.7007 0.6233 -0.3472 +vn 0.7301 0.6480 -0.2169 +vn 0.7463 -0.6615 -0.0738 +vn 0.8209 -0.5653 -0.0811 +vn 0.8941 -0.4392 -0.0881 +vn 0.9551 -0.2812 -0.0939 +vn 0.6207 -0.5544 -0.5544 +vn 0.6627 -0.5908 -0.4601 +vn 0.7007 -0.6233 -0.3472 +vn 0.7301 -0.6480 -0.2169 +vn 0.6627 -0.4601 -0.5908 +vn 0.7142 -0.4949 -0.4949 +vn 0.7619 -0.5267 -0.3768 +vn 0.7997 -0.5516 -0.2371 +vn 0.7007 -0.3472 -0.6233 +vn 0.7619 -0.3768 -0.5267 +vn 0.8201 -0.4046 -0.4046 +vn 0.8672 -0.4268 -0.2565 +vn 0.7301 -0.2169 -0.6480 +vn 0.7997 -0.2371 -0.5516 +vn 0.8672 -0.2565 -0.4268 +vn 0.9229 -0.2722 -0.2722 +vn 0.7463 -0.0738 -0.6615 +vn 0.8209 -0.0811 -0.5653 +vn 0.8941 -0.0881 -0.4392 +vn 0.9551 -0.0939 -0.2812 +vn 0.6207 -0.5544 0.5544 +vn 0.6627 -0.4601 0.5908 +vn 0.7007 -0.3472 0.6233 +vn 0.7301 -0.2169 0.6480 +vn 0.7463 -0.6615 0.0738 +vn 0.7301 -0.6480 0.2169 +vn 0.7007 -0.6233 0.3472 +vn 0.6627 -0.5908 0.4601 +vn 0.8209 -0.5653 0.0811 +vn 0.7997 -0.5516 0.2371 +vn 0.7619 -0.5267 0.3768 +vn 0.7142 -0.4949 0.4949 +vn 0.8941 -0.4392 0.0881 +vn 0.8672 -0.4268 0.2565 +vn 0.8201 -0.4046 0.4046 +vn 0.7619 -0.3768 0.5267 +vn 0.9551 -0.2812 0.0939 +vn 0.9229 -0.2722 0.2722 +vn 0.8672 -0.2565 0.4268 +vn 0.7997 -0.2371 0.5516 +vn 0.9905 -0.0971 0.0971 +vn 0.9551 -0.0939 0.2812 +vn 0.8941 -0.0881 0.4392 +vn 0.8209 -0.0811 0.5653 +vn -0.0971 0.0971 -0.9905 +vn -0.0939 0.2812 -0.9551 +vn -0.0881 0.4392 -0.8941 +vn -0.0811 0.5653 -0.8209 +vn -0.6615 0.0738 -0.7463 +vn -0.5653 0.0811 -0.8209 +vn -0.4392 0.0881 -0.8941 +vn -0.2812 0.0939 -0.9551 +vn -0.6480 0.2169 -0.7301 +vn -0.5516 0.2371 -0.7997 +vn -0.4268 0.2565 -0.8672 +vn -0.2722 0.2722 -0.9229 +vn -0.6233 0.3472 -0.7007 +vn -0.5267 0.3768 -0.7619 +vn -0.4046 0.4046 -0.8201 +vn -0.2565 0.4268 -0.8672 +vn -0.5908 0.4601 -0.6627 +vn -0.4949 0.4949 -0.7142 +vn -0.3768 0.5267 -0.7619 +vn -0.2371 0.5516 -0.7997 +vn -0.5544 0.5544 -0.6207 +vn -0.4601 0.5908 -0.6627 +vn -0.3472 0.6233 -0.7007 +vn -0.2169 0.6480 -0.7301 +vn -0.0738 -0.6615 -0.7463 +vn -0.0811 -0.5653 -0.8209 +vn -0.0881 -0.4392 -0.8941 +vn -0.0939 -0.2812 -0.9551 +vn -0.5544 -0.5544 -0.6207 +vn -0.4601 -0.5908 -0.6627 +vn -0.3472 -0.6233 -0.7007 +vn -0.2169 -0.6480 -0.7301 +vn -0.5908 -0.4601 -0.6627 +vn -0.4949 -0.4949 -0.7142 +vn -0.3768 -0.5267 -0.7619 +vn -0.2371 -0.5516 -0.7997 +vn -0.6233 -0.3472 -0.7007 +vn -0.5267 -0.3768 -0.7619 +vn -0.4046 -0.4046 -0.8201 +vn -0.2565 -0.4268 -0.8672 +vn -0.6480 -0.2169 -0.7301 +vn -0.5516 -0.2371 -0.7997 +vn -0.4268 -0.2565 -0.8672 +vn -0.2722 -0.2722 -0.9229 +vn -0.6615 -0.0738 -0.7463 +vn -0.5653 -0.0811 -0.8209 +vn -0.4392 -0.0881 -0.8941 +vn -0.2812 -0.0939 -0.9551 +vn 0.5544 -0.5544 -0.6207 +vn 0.5908 -0.4601 -0.6627 +vn 0.6233 -0.3472 -0.7007 +vn 0.6480 -0.2169 -0.7301 +vn 0.0738 -0.6615 -0.7463 +vn 0.2169 -0.6480 -0.7301 +vn 0.3472 -0.6233 -0.7007 +vn 0.4601 -0.5908 -0.6627 +vn 0.0811 -0.5653 -0.8209 +vn 0.2371 -0.5516 -0.7997 +vn 0.3768 -0.5267 -0.7619 +vn 0.4949 -0.4949 -0.7142 +vn 0.0881 -0.4392 -0.8941 +vn 0.2565 -0.4268 -0.8672 +vn 0.4046 -0.4046 -0.8201 +vn 0.5267 -0.3768 -0.7619 +vn 0.0939 -0.2812 -0.9551 +vn 0.2722 -0.2722 -0.9229 +vn 0.4268 -0.2565 -0.8672 +vn 0.5516 -0.2371 -0.7997 +vn 0.0971 -0.0971 -0.9905 +vn 0.2812 -0.0939 -0.9551 +vn 0.4392 -0.0881 -0.8941 +vn 0.5653 -0.0811 -0.8209 +vn 0.6615 0.0738 -0.7463 +vn 0.6480 0.2169 -0.7301 +vn 0.6233 0.3472 -0.7007 +vn 0.5908 0.4601 -0.6627 +vn 0.0971 0.0971 -0.9905 +vn 0.2812 0.0939 -0.9551 +vn 0.4392 0.0881 -0.8941 +vn 0.5653 0.0811 -0.8209 +vn 0.0939 0.2812 -0.9551 +vn 0.2722 0.2722 -0.9229 +vn 0.4268 0.2565 -0.8672 +vn 0.5516 0.2371 -0.7997 +vn 0.0881 0.4392 -0.8941 +vn 0.2565 0.4268 -0.8672 +vn 0.4046 0.4046 -0.8201 +vn 0.5267 0.3768 -0.7619 +vn 0.0811 0.5653 -0.8209 +vn 0.2371 0.5516 -0.7997 +vn 0.3768 0.5267 -0.7619 +vn 0.4949 0.4949 -0.7142 +vn 0.0738 0.6615 -0.7463 +vn 0.2169 0.6480 -0.7301 +vn 0.3472 0.6233 -0.7007 +vn 0.4601 0.5908 -0.6627 +vn 0.7463 0.0738 0.6615 +vn 0.7301 0.2169 0.6480 +vn 0.7007 0.3472 0.6233 +vn 0.6627 0.4601 0.5908 +vn 0.9905 0.0971 0.0971 +vn 0.9551 0.0939 0.2812 +vn 0.8941 0.0881 0.4392 +vn 0.8209 0.0811 0.5653 +vn 0.9551 0.2812 0.0939 +vn 0.9229 0.2722 0.2722 +vn 0.8672 0.2565 0.4268 +vn 0.7997 0.2371 0.5516 +vn 0.8941 0.4392 0.0881 +vn 0.8672 0.4268 0.2565 +vn 0.8201 0.4046 0.4046 +vn 0.7619 0.3768 0.5267 +vn 0.8209 0.5653 0.0811 +vn 0.7997 0.5516 0.2371 +vn 0.7619 0.5267 0.3768 +vn 0.7142 0.4949 0.4949 +vn 0.7463 0.6615 0.0738 +vn 0.7301 0.6480 0.2169 +vn 0.7007 0.6233 0.3472 +vn 0.6627 0.5908 0.4601 +vn 0.0738 -0.7463 0.6615 +vn 0.2169 -0.7301 0.6480 +vn 0.3472 -0.7007 0.6233 +vn 0.4601 -0.6627 0.5908 +vn 0.0971 -0.9905 0.0971 +vn 0.0939 -0.9550 0.2812 +vn 0.0881 -0.8941 0.4392 +vn 0.0811 -0.8209 0.5653 +vn 0.2812 -0.9550 0.0939 +vn 0.2722 -0.9229 0.2722 +vn 0.2565 -0.8672 0.4268 +vn 0.2371 -0.7997 0.5516 +vn 0.4392 -0.8941 0.0881 +vn 0.4268 -0.8672 0.2565 +vn 0.4046 -0.8201 0.4046 +vn 0.3768 -0.7619 0.5267 +vn 0.5653 -0.8209 0.0811 +vn 0.5516 -0.7997 0.2371 +vn 0.5267 -0.7619 0.3768 +vn 0.4949 -0.7142 0.4949 +vn 0.6615 -0.7463 0.0738 +vn 0.6480 -0.7301 0.2169 +vn 0.6233 -0.7007 0.3472 +vn 0.5908 -0.6627 0.4601 +vn -0.7463 0.0738 -0.6615 +vn -0.7301 0.2169 -0.6480 +vn -0.7007 0.3472 -0.6233 +vn -0.6627 0.4601 -0.5908 +vn -0.9905 0.0971 -0.0971 +vn -0.9551 0.0939 -0.2812 +vn -0.8941 0.0881 -0.4392 +vn -0.8209 0.0811 -0.5653 +vn -0.9551 0.2812 -0.0939 +vn -0.9229 0.2722 -0.2722 +vn -0.8672 0.2565 -0.4268 +vn -0.7997 0.2371 -0.5516 +vn -0.8941 0.4392 -0.0881 +vn -0.8672 0.4268 -0.2565 +vn -0.8201 0.4046 -0.4046 +vn -0.7619 0.3768 -0.5267 +vn -0.8209 0.5653 -0.0811 +vn -0.7997 0.5516 -0.2371 +vn -0.7619 0.5267 -0.3768 +vn -0.7142 0.4949 -0.4949 +vn -0.7463 0.6615 -0.0738 +vn -0.7301 0.6480 -0.2169 +vn -0.7007 0.6233 -0.3472 +vn -0.6627 0.5908 -0.4601 +vn -0.6615 0.0738 0.7463 +vn -0.6480 0.2169 0.7301 +vn -0.6233 0.3472 0.7007 +vn -0.5908 0.4601 0.6627 +vn -0.0971 0.0971 0.9905 +vn -0.2812 0.0939 0.9551 +vn -0.4392 0.0881 0.8941 +vn -0.5653 0.0811 0.8209 +vn -0.0939 0.2812 0.9551 +vn -0.2722 0.2722 0.9229 +vn -0.4268 0.2565 0.8672 +vn -0.5516 0.2371 0.7997 +vn -0.0881 0.4392 0.8941 +vn -0.2565 0.4268 0.8672 +vn -0.4046 0.4046 0.8201 +vn -0.5267 0.3768 0.7619 +vn -0.0811 0.5653 0.8209 +vn -0.2371 0.5516 0.7997 +vn -0.3768 0.5267 0.7619 +vn -0.4949 0.4949 0.7142 +vn -0.0738 0.6615 0.7463 +vn -0.2169 0.6480 0.7301 +vn -0.3472 0.6233 0.7007 +vn -0.4601 0.5908 0.6627 +vn -0.0738 0.7463 0.6615 +vn -0.2169 0.7301 0.6480 +vn -0.3472 0.7007 0.6233 +vn -0.4601 0.6627 0.5908 +vn -0.0971 0.9905 0.0971 +vn -0.0939 0.9550 0.2812 +vn -0.0881 0.8941 0.4392 +vn -0.0811 0.8209 0.5653 +vn -0.2812 0.9550 0.0939 +vn -0.2722 0.9229 0.2722 +vn -0.2565 0.8672 0.4268 +vn -0.2371 0.7997 0.5516 +vn -0.4392 0.8941 0.0881 +vn -0.4268 0.8672 0.2565 +vn -0.4046 0.8201 0.4046 +vn -0.3768 0.7619 0.5267 +vn -0.5653 0.8209 0.0811 +vn -0.5516 0.7997 0.2371 +vn -0.5267 0.7619 0.3768 +vn -0.4949 0.7142 0.4949 +vn -0.6615 0.7463 0.0738 +vn -0.6480 0.7301 0.2169 +vn -0.6233 0.7007 0.3472 +vn -0.5908 0.6627 0.4601 +vt 0.850000 0.725000 +vt 0.875000 0.725000 +vt 0.875000 0.750000 +vt 0.850000 0.750000 +vt 0.600000 0.975000 +vt 0.625000 0.975000 +vt 0.625000 1.000000 +vt 0.600000 1.000000 +vt 0.600000 0.225000 +vt 0.625000 0.225000 +vt 0.625000 0.250000 +vt 0.600000 0.250000 +vt 0.350000 0.725000 +vt 0.375000 0.725000 +vt 0.375000 0.750000 +vt 0.350000 0.750000 +vt 0.600000 0.725000 +vt 0.625000 0.725000 +vt 0.625000 0.750000 +vt 0.600000 0.750000 +vt 0.600000 0.475000 +vt 0.625000 0.475000 +vt 0.625000 0.500000 +vt 0.600000 0.500000 +vt 0.475000 0.475000 +vt 0.500000 0.475000 +vt 0.500000 0.500000 +vt 0.475000 0.500000 +vt 0.475000 0.350000 +vt 0.500000 0.350000 +vt 0.500000 0.375000 +vt 0.475000 0.375000 +vt 0.600000 0.350000 +vt 0.625000 0.350000 +vt 0.625000 0.375000 +vt 0.600000 0.375000 +vt 0.475000 0.725000 +vt 0.500000 0.725000 +vt 0.500000 0.750000 +vt 0.475000 0.750000 +vt 0.475000 0.600000 +vt 0.500000 0.600000 +vt 0.500000 0.625000 +vt 0.475000 0.625000 +vt 0.600000 0.600000 +vt 0.625000 0.600000 +vt 0.625000 0.625000 +vt 0.600000 0.625000 +vt 0.225000 0.725000 +vt 0.250000 0.725000 +vt 0.250000 0.750000 +vt 0.225000 0.750000 +vt 0.225000 0.600000 +vt 0.250000 0.600000 +vt 0.250000 0.625000 +vt 0.225000 0.625000 +vt 0.350000 0.600000 +vt 0.375000 0.600000 +vt 0.375000 0.625000 +vt 0.350000 0.625000 +vt 0.475000 0.225000 +vt 0.500000 0.225000 +vt 0.500000 0.250000 +vt 0.475000 0.250000 +vt 0.475000 0.100000 +vt 0.500000 0.100000 +vt 0.500000 0.125000 +vt 0.475000 0.125000 +vt 0.600000 0.100000 +vt 0.625000 0.100000 +vt 0.625000 0.125000 +vt 0.600000 0.125000 +vt 0.475000 0.975000 +vt 0.500000 0.975000 +vt 0.500000 1.000000 +vt 0.475000 1.000000 +vt 0.475000 0.850000 +vt 0.500000 0.850000 +vt 0.500000 0.875000 +vt 0.475000 0.875000 +vt 0.600000 0.850000 +vt 0.625000 0.850000 +vt 0.625000 0.875000 +vt 0.600000 0.875000 +vt 0.725000 0.725000 +vt 0.750000 0.725000 +vt 0.750000 0.750000 +vt 0.725000 0.750000 +vt 0.725000 0.600000 +vt 0.750000 0.600000 +vt 0.750000 0.625000 +vt 0.725000 0.625000 +vt 0.850000 0.600000 +vt 0.875000 0.600000 +vt 0.875000 0.625000 +vt 0.850000 0.625000 +vt 0.775000 0.600000 +vt 0.775000 0.625000 +vt 0.800000 0.600000 +vt 0.800000 0.625000 +vt 0.825000 0.600000 +vt 0.825000 0.625000 +vt 0.750000 0.500000 +vt 0.775000 0.500000 +vt 0.775000 0.525000 +vt 0.750000 0.525000 +vt 0.775000 0.550000 +vt 0.750000 0.550000 +vt 0.775000 0.575000 +vt 0.750000 0.575000 +vt 0.800000 0.500000 +vt 0.800000 0.525000 +vt 0.800000 0.550000 +vt 0.800000 0.575000 +vt 0.825000 0.500000 +vt 0.825000 0.525000 +vt 0.825000 0.550000 +vt 0.825000 0.575000 +vt 0.850000 0.500000 +vt 0.850000 0.525000 +vt 0.850000 0.550000 +vt 0.850000 0.575000 +vt 0.875000 0.500000 +vt 0.875000 0.525000 +vt 0.875000 0.550000 +vt 0.875000 0.575000 +vt 0.650000 0.600000 +vt 0.650000 0.625000 +vt 0.675000 0.600000 +vt 0.675000 0.625000 +vt 0.700000 0.600000 +vt 0.700000 0.625000 +vt 0.650000 0.500000 +vt 0.650000 0.525000 +vt 0.625000 0.525000 +vt 0.650000 0.550000 +vt 0.625000 0.550000 +vt 0.650000 0.575000 +vt 0.625000 0.575000 +vt 0.675000 0.500000 +vt 0.675000 0.525000 +vt 0.675000 0.550000 +vt 0.675000 0.575000 +vt 0.700000 0.500000 +vt 0.700000 0.525000 +vt 0.700000 0.550000 +vt 0.700000 0.575000 +vt 0.725000 0.500000 +vt 0.725000 0.525000 +vt 0.725000 0.550000 +vt 0.725000 0.575000 +vt 0.650000 0.725000 +vt 0.650000 0.750000 +vt 0.675000 0.725000 +vt 0.675000 0.750000 +vt 0.700000 0.725000 +vt 0.700000 0.750000 +vt 0.650000 0.650000 +vt 0.625000 0.650000 +vt 0.650000 0.675000 +vt 0.625000 0.675000 +vt 0.650000 0.700000 +vt 0.625000 0.700000 +vt 0.675000 0.650000 +vt 0.675000 0.675000 +vt 0.675000 0.700000 +vt 0.700000 0.650000 +vt 0.700000 0.675000 +vt 0.700000 0.700000 +vt 0.725000 0.650000 +vt 0.725000 0.675000 +vt 0.725000 0.700000 +vt 0.750000 0.650000 +vt 0.750000 0.675000 +vt 0.750000 0.700000 +vt 0.525000 0.850000 +vt 0.525000 0.875000 +vt 0.550000 0.850000 +vt 0.550000 0.875000 +vt 0.575000 0.850000 +vt 0.575000 0.875000 +vt 0.525000 0.750000 +vt 0.525000 0.775000 +vt 0.500000 0.775000 +vt 0.525000 0.800000 +vt 0.500000 0.800000 +vt 0.525000 0.825000 +vt 0.500000 0.825000 +vt 0.550000 0.750000 +vt 0.550000 0.775000 +vt 0.550000 0.800000 +vt 0.550000 0.825000 +vt 0.575000 0.750000 +vt 0.575000 0.775000 +vt 0.575000 0.800000 +vt 0.575000 0.825000 +vt 0.600000 0.775000 +vt 0.600000 0.800000 +vt 0.600000 0.825000 +vt 0.625000 0.775000 +vt 0.625000 0.800000 +vt 0.625000 0.825000 +vt 0.375000 0.850000 +vt 0.400000 0.850000 +vt 0.400000 0.875000 +vt 0.375000 0.875000 +vt 0.425000 0.850000 +vt 0.425000 0.875000 +vt 0.450000 0.850000 +vt 0.450000 0.875000 +vt 0.400000 0.750000 +vt 0.400000 0.775000 +vt 0.375000 0.775000 +vt 0.400000 0.800000 +vt 0.375000 0.800000 +vt 0.400000 0.825000 +vt 0.375000 0.825000 +vt 0.425000 0.750000 +vt 0.425000 0.775000 +vt 0.425000 0.800000 +vt 0.425000 0.825000 +vt 0.450000 0.750000 +vt 0.450000 0.775000 +vt 0.450000 0.800000 +vt 0.450000 0.825000 +vt 0.475000 0.775000 +vt 0.475000 0.800000 +vt 0.475000 0.825000 +vt 0.375000 0.975000 +vt 0.400000 0.975000 +vt 0.400000 1.000000 +vt 0.375000 1.000000 +vt 0.425000 0.975000 +vt 0.425000 1.000000 +vt 0.450000 0.975000 +vt 0.450000 1.000000 +vt 0.400000 0.900000 +vt 0.375000 0.900000 +vt 0.400000 0.925000 +vt 0.375000 0.925000 +vt 0.400000 0.950000 +vt 0.375000 0.950000 +vt 0.425000 0.900000 +vt 0.425000 0.925000 +vt 0.425000 0.950000 +vt 0.450000 0.900000 +vt 0.450000 0.925000 +vt 0.450000 0.950000 +vt 0.475000 0.900000 +vt 0.475000 0.925000 +vt 0.475000 0.950000 +vt 0.500000 0.900000 +vt 0.500000 0.925000 +vt 0.500000 0.950000 +vt 0.525000 0.100000 +vt 0.525000 0.125000 +vt 0.550000 0.100000 +vt 0.550000 0.125000 +vt 0.575000 0.100000 +vt 0.575000 0.125000 +vt 0.500000 0.000000 +vt 0.525000 0.000000 +vt 0.525000 0.025000 +vt 0.500000 0.025000 +vt 0.525000 0.050000 +vt 0.500000 0.050000 +vt 0.525000 0.075000 +vt 0.500000 0.075000 +vt 0.550000 0.000000 +vt 0.550000 0.025000 +vt 0.550000 0.050000 +vt 0.550000 0.075000 +vt 0.575000 0.000000 +vt 0.575000 0.025000 +vt 0.575000 0.050000 +vt 0.575000 0.075000 +vt 0.600000 0.000000 +vt 0.600000 0.025000 +vt 0.600000 0.050000 +vt 0.600000 0.075000 +vt 0.625000 0.000000 +vt 0.625000 0.025000 +vt 0.625000 0.050000 +vt 0.625000 0.075000 +vt 0.375000 0.100000 +vt 0.400000 0.100000 +vt 0.400000 0.125000 +vt 0.375000 0.125000 +vt 0.425000 0.100000 +vt 0.425000 0.125000 +vt 0.450000 0.100000 +vt 0.450000 0.125000 +vt 0.375000 0.000000 +vt 0.400000 0.000000 +vt 0.400000 0.025000 +vt 0.375000 0.025000 +vt 0.400000 0.050000 +vt 0.375000 0.050000 +vt 0.400000 0.075000 +vt 0.375000 0.075000 +vt 0.425000 0.000000 +vt 0.425000 0.025000 +vt 0.425000 0.050000 +vt 0.425000 0.075000 +vt 0.450000 0.000000 +vt 0.450000 0.025000 +vt 0.450000 0.050000 +vt 0.450000 0.075000 +vt 0.475000 0.000000 +vt 0.475000 0.025000 +vt 0.475000 0.050000 +vt 0.475000 0.075000 +vt 0.375000 0.225000 +vt 0.400000 0.225000 +vt 0.400000 0.250000 +vt 0.375000 0.250000 +vt 0.425000 0.225000 +vt 0.425000 0.250000 +vt 0.450000 0.225000 +vt 0.450000 0.250000 +vt 0.400000 0.150000 +vt 0.375000 0.150000 +vt 0.400000 0.175000 +vt 0.375000 0.175000 +vt 0.400000 0.200000 +vt 0.375000 0.200000 +vt 0.425000 0.150000 +vt 0.425000 0.175000 +vt 0.425000 0.200000 +vt 0.450000 0.150000 +vt 0.450000 0.175000 +vt 0.450000 0.200000 +vt 0.475000 0.150000 +vt 0.475000 0.175000 +vt 0.475000 0.200000 +vt 0.500000 0.150000 +vt 0.500000 0.175000 +vt 0.500000 0.200000 +vt 0.275000 0.600000 +vt 0.275000 0.625000 +vt 0.300000 0.600000 +vt 0.300000 0.625000 +vt 0.325000 0.600000 +vt 0.325000 0.625000 +vt 0.250000 0.500000 +vt 0.275000 0.500000 +vt 0.275000 0.525000 +vt 0.250000 0.525000 +vt 0.275000 0.550000 +vt 0.250000 0.550000 +vt 0.275000 0.575000 +vt 0.250000 0.575000 +vt 0.300000 0.500000 +vt 0.300000 0.525000 +vt 0.300000 0.550000 +vt 0.300000 0.575000 +vt 0.325000 0.500000 +vt 0.325000 0.525000 +vt 0.325000 0.550000 +vt 0.325000 0.575000 +vt 0.350000 0.500000 +vt 0.350000 0.525000 +vt 0.350000 0.550000 +vt 0.350000 0.575000 +vt 0.375000 0.500000 +vt 0.375000 0.525000 +vt 0.375000 0.550000 +vt 0.375000 0.575000 +vt 0.125000 0.600000 +vt 0.150000 0.600000 +vt 0.150000 0.625000 +vt 0.125000 0.625000 +vt 0.175000 0.600000 +vt 0.175000 0.625000 +vt 0.200000 0.600000 +vt 0.200000 0.625000 +vt 0.125000 0.500000 +vt 0.150000 0.500000 +vt 0.150000 0.525000 +vt 0.125000 0.525000 +vt 0.150000 0.550000 +vt 0.125000 0.550000 +vt 0.150000 0.575000 +vt 0.125000 0.575000 +vt 0.175000 0.500000 +vt 0.175000 0.525000 +vt 0.175000 0.550000 +vt 0.175000 0.575000 +vt 0.200000 0.500000 +vt 0.200000 0.525000 +vt 0.200000 0.550000 +vt 0.200000 0.575000 +vt 0.225000 0.500000 +vt 0.225000 0.525000 +vt 0.225000 0.550000 +vt 0.225000 0.575000 +vt 0.125000 0.725000 +vt 0.150000 0.725000 +vt 0.150000 0.750000 +vt 0.125000 0.750000 +vt 0.175000 0.725000 +vt 0.175000 0.750000 +vt 0.200000 0.725000 +vt 0.200000 0.750000 +vt 0.150000 0.650000 +vt 0.125000 0.650000 +vt 0.150000 0.675000 +vt 0.125000 0.675000 +vt 0.150000 0.700000 +vt 0.125000 0.700000 +vt 0.175000 0.650000 +vt 0.175000 0.675000 +vt 0.175000 0.700000 +vt 0.200000 0.650000 +vt 0.200000 0.675000 +vt 0.200000 0.700000 +vt 0.225000 0.650000 +vt 0.225000 0.675000 +vt 0.225000 0.700000 +vt 0.250000 0.650000 +vt 0.250000 0.675000 +vt 0.250000 0.700000 +vt 0.525000 0.600000 +vt 0.525000 0.625000 +vt 0.550000 0.600000 +vt 0.550000 0.625000 +vt 0.575000 0.600000 +vt 0.575000 0.625000 +vt 0.525000 0.500000 +vt 0.525000 0.525000 +vt 0.500000 0.525000 +vt 0.525000 0.550000 +vt 0.500000 0.550000 +vt 0.525000 0.575000 +vt 0.500000 0.575000 +vt 0.550000 0.500000 +vt 0.550000 0.525000 +vt 0.550000 0.550000 +vt 0.550000 0.575000 +vt 0.575000 0.500000 +vt 0.575000 0.525000 +vt 0.575000 0.550000 +vt 0.575000 0.575000 +vt 0.600000 0.525000 +vt 0.600000 0.550000 +vt 0.600000 0.575000 +vt 0.400000 0.600000 +vt 0.400000 0.625000 +vt 0.425000 0.600000 +vt 0.425000 0.625000 +vt 0.450000 0.600000 +vt 0.450000 0.625000 +vt 0.400000 0.500000 +vt 0.400000 0.525000 +vt 0.400000 0.550000 +vt 0.400000 0.575000 +vt 0.425000 0.500000 +vt 0.425000 0.525000 +vt 0.425000 0.550000 +vt 0.425000 0.575000 +vt 0.450000 0.500000 +vt 0.450000 0.525000 +vt 0.450000 0.550000 +vt 0.450000 0.575000 +vt 0.475000 0.525000 +vt 0.475000 0.550000 +vt 0.475000 0.575000 +vt 0.400000 0.725000 +vt 0.425000 0.725000 +vt 0.450000 0.725000 +vt 0.400000 0.650000 +vt 0.375000 0.650000 +vt 0.400000 0.675000 +vt 0.375000 0.675000 +vt 0.400000 0.700000 +vt 0.375000 0.700000 +vt 0.425000 0.650000 +vt 0.425000 0.675000 +vt 0.425000 0.700000 +vt 0.450000 0.650000 +vt 0.450000 0.675000 +vt 0.450000 0.700000 +vt 0.475000 0.650000 +vt 0.475000 0.675000 +vt 0.475000 0.700000 +vt 0.500000 0.650000 +vt 0.500000 0.675000 +vt 0.500000 0.700000 +vt 0.525000 0.350000 +vt 0.525000 0.375000 +vt 0.550000 0.350000 +vt 0.550000 0.375000 +vt 0.575000 0.350000 +vt 0.575000 0.375000 +vt 0.525000 0.250000 +vt 0.525000 0.275000 +vt 0.500000 0.275000 +vt 0.525000 0.300000 +vt 0.500000 0.300000 +vt 0.525000 0.325000 +vt 0.500000 0.325000 +vt 0.550000 0.250000 +vt 0.550000 0.275000 +vt 0.550000 0.300000 +vt 0.550000 0.325000 +vt 0.575000 0.250000 +vt 0.575000 0.275000 +vt 0.575000 0.300000 +vt 0.575000 0.325000 +vt 0.600000 0.275000 +vt 0.600000 0.300000 +vt 0.600000 0.325000 +vt 0.625000 0.275000 +vt 0.625000 0.300000 +vt 0.625000 0.325000 +vt 0.375000 0.350000 +vt 0.400000 0.350000 +vt 0.400000 0.375000 +vt 0.375000 0.375000 +vt 0.425000 0.350000 +vt 0.425000 0.375000 +vt 0.450000 0.350000 +vt 0.450000 0.375000 +vt 0.400000 0.275000 +vt 0.375000 0.275000 +vt 0.400000 0.300000 +vt 0.375000 0.300000 +vt 0.400000 0.325000 +vt 0.375000 0.325000 +vt 0.425000 0.275000 +vt 0.425000 0.300000 +vt 0.425000 0.325000 +vt 0.450000 0.275000 +vt 0.450000 0.300000 +vt 0.450000 0.325000 +vt 0.475000 0.275000 +vt 0.475000 0.300000 +vt 0.475000 0.325000 +vt 0.375000 0.475000 +vt 0.400000 0.475000 +vt 0.425000 0.475000 +vt 0.450000 0.475000 +vt 0.400000 0.400000 +vt 0.375000 0.400000 +vt 0.400000 0.425000 +vt 0.375000 0.425000 +vt 0.400000 0.450000 +vt 0.375000 0.450000 +vt 0.425000 0.400000 +vt 0.425000 0.425000 +vt 0.425000 0.450000 +vt 0.450000 0.400000 +vt 0.450000 0.425000 +vt 0.450000 0.450000 +vt 0.475000 0.400000 +vt 0.475000 0.425000 +vt 0.475000 0.450000 +vt 0.500000 0.400000 +vt 0.500000 0.425000 +vt 0.500000 0.450000 +vt 0.525000 0.475000 +vt 0.550000 0.475000 +vt 0.575000 0.475000 +vt 0.525000 0.400000 +vt 0.525000 0.425000 +vt 0.525000 0.450000 +vt 0.550000 0.400000 +vt 0.550000 0.425000 +vt 0.550000 0.450000 +vt 0.575000 0.400000 +vt 0.575000 0.425000 +vt 0.575000 0.450000 +vt 0.600000 0.400000 +vt 0.600000 0.425000 +vt 0.600000 0.450000 +vt 0.625000 0.400000 +vt 0.625000 0.425000 +vt 0.625000 0.450000 +vt 0.525000 0.725000 +vt 0.550000 0.725000 +vt 0.575000 0.725000 +vt 0.525000 0.650000 +vt 0.525000 0.675000 +vt 0.525000 0.700000 +vt 0.550000 0.650000 +vt 0.550000 0.675000 +vt 0.550000 0.700000 +vt 0.575000 0.650000 +vt 0.575000 0.675000 +vt 0.575000 0.700000 +vt 0.600000 0.650000 +vt 0.600000 0.675000 +vt 0.600000 0.700000 +vt 0.275000 0.725000 +vt 0.275000 0.750000 +vt 0.300000 0.725000 +vt 0.300000 0.750000 +vt 0.325000 0.725000 +vt 0.325000 0.750000 +vt 0.275000 0.650000 +vt 0.275000 0.675000 +vt 0.275000 0.700000 +vt 0.300000 0.650000 +vt 0.300000 0.675000 +vt 0.300000 0.700000 +vt 0.325000 0.650000 +vt 0.325000 0.675000 +vt 0.325000 0.700000 +vt 0.350000 0.650000 +vt 0.350000 0.675000 +vt 0.350000 0.700000 +vt 0.525000 0.225000 +vt 0.550000 0.225000 +vt 0.575000 0.225000 +vt 0.525000 0.150000 +vt 0.525000 0.175000 +vt 0.525000 0.200000 +vt 0.550000 0.150000 +vt 0.550000 0.175000 +vt 0.550000 0.200000 +vt 0.575000 0.150000 +vt 0.575000 0.175000 +vt 0.575000 0.200000 +vt 0.600000 0.150000 +vt 0.600000 0.175000 +vt 0.600000 0.200000 +vt 0.625000 0.150000 +vt 0.625000 0.175000 +vt 0.625000 0.200000 +vt 0.525000 0.975000 +vt 0.525000 1.000000 +vt 0.550000 0.975000 +vt 0.550000 1.000000 +vt 0.575000 0.975000 +vt 0.575000 1.000000 +vt 0.525000 0.900000 +vt 0.525000 0.925000 +vt 0.525000 0.950000 +vt 0.550000 0.900000 +vt 0.550000 0.925000 +vt 0.550000 0.950000 +vt 0.575000 0.900000 +vt 0.575000 0.925000 +vt 0.575000 0.950000 +vt 0.600000 0.900000 +vt 0.600000 0.925000 +vt 0.600000 0.950000 +vt 0.625000 0.900000 +vt 0.625000 0.925000 +vt 0.625000 0.950000 +vt 0.775000 0.725000 +vt 0.775000 0.750000 +vt 0.800000 0.725000 +vt 0.800000 0.750000 +vt 0.825000 0.725000 +vt 0.825000 0.750000 +vt 0.775000 0.650000 +vt 0.775000 0.675000 +vt 0.775000 0.700000 +vt 0.800000 0.650000 +vt 0.800000 0.675000 +vt 0.800000 0.700000 +vt 0.825000 0.650000 +vt 0.825000 0.675000 +vt 0.825000 0.700000 +vt 0.850000 0.650000 +vt 0.850000 0.675000 +vt 0.850000 0.700000 +vt 0.875000 0.650000 +vt 0.875000 0.675000 +vt 0.875000 0.700000 +s 0 +usemtl Material +f 602/1/1 111/2/1 7/3/1 54/4/1 +f 586/5/2 54/6/2 7/7/2 42/8/2 +f 570/9/3 66/10/3 5/11/3 95/12/3 +f 554/13/4 119/14/4 4/15/4 62/16/4 +f 538/17/5 58/18/5 3/19/5 91/20/5 +f 522/21/6 70/22/6 1/23/6 83/24/6 +f 506/25/7 126/26/7 11/27/7 35/28/7 +f 490/29/8 130/30/8 21/31/8 131/32/8 +f 474/33/9 118/34/9 19/35/9 135/36/9 +f 458/37/10 142/38/10 13/39/10 43/40/10 +f 442/41/11 146/42/11 22/43/11 147/44/11 +f 426/45/12 106/46/12 16/47/12 151/48/12 +f 410/49/13 158/50/13 17/51/13 110/52/13 +f 394/53/14 162/54/14 23/55/14 163/56/14 +f 378/57/15 71/58/15 20/59/15 167/60/15 +f 362/61/16 174/62/16 14/63/16 47/64/16 +f 346/65/17 178/66/17 24/67/17 179/68/17 +f 330/69/18 114/70/18 18/71/18 183/72/18 +f 314/73/19 190/74/19 12/75/19 90/76/19 +f 298/77/20 194/78/20 25/79/20 195/80/20 +f 282/81/21 102/82/21 15/83/21 199/84/21 +f 266/85/22 206/86/22 15/87/22 102/88/22 +f 250/89/23 210/90/23 26/91/23 211/92/23 +f 234/93/24 63/94/24 18/95/24 215/96/24 +f 210/90/25 222/97/25 218/98/25 26/91/25 +f 222/97/26 226/99/26 217/100/26 218/98/26 +f 226/99/27 230/101/27 216/102/27 217/100/27 +f 230/101/28 234/93/28 215/96/28 216/102/28 +f 19/103/29 118/104/29 219/105/29 207/106/29 +f 207/106/30 219/105/30 220/107/30 208/108/30 +f 208/108/31 220/107/31 221/109/31 209/110/31 +f 209/110/32 221/109/32 222/97/32 210/90/32 +f 118/104/33 117/111/33 223/112/33 219/105/33 +f 219/105/34 223/112/34 224/113/34 220/107/34 +f 220/107/35 224/113/35 225/114/35 221/109/35 +f 221/109/36 225/114/36 226/99/36 222/97/36 +f 117/111/37 116/115/37 227/116/37 223/112/37 +f 223/112/38 227/116/38 228/117/38 224/113/38 +f 224/113/39 228/117/39 229/118/39 225/114/39 +f 225/114/40 229/118/40 230/101/40 226/99/40 +f 116/115/41 115/119/41 231/120/41 227/116/41 +f 227/116/42 231/120/42 232/121/42 228/117/42 +f 228/117/43 232/121/43 233/122/43 229/118/43 +f 229/118/44 233/122/44 234/93/44 230/101/44 +f 115/119/45 5/123/45 66/124/45 231/120/45 +f 231/120/46 66/124/46 65/125/46 232/121/46 +f 232/121/47 65/125/47 64/126/47 233/122/47 +f 233/122/48 64/126/48 63/94/48 234/93/48 +f 106/46/49 238/127/49 214/128/49 16/47/49 +f 238/127/50 242/129/50 213/130/50 214/128/50 +f 242/129/51 246/131/51 212/132/51 213/130/51 +f 246/131/52 250/89/52 211/92/52 212/132/52 +f 1/23/53 70/133/53 235/134/53 103/135/53 +f 103/135/54 235/134/54 236/136/54 104/137/54 +f 104/137/55 236/136/55 237/138/55 105/139/55 +f 105/139/56 237/138/56 238/127/56 106/46/56 +f 70/133/57 69/140/57 239/141/57 235/134/57 +f 235/134/58 239/141/58 240/142/58 236/136/58 +f 236/136/59 240/142/59 241/143/59 237/138/59 +f 237/138/60 241/143/60 242/129/60 238/127/60 +f 69/140/61 68/144/61 243/145/61 239/141/61 +f 239/141/62 243/145/62 244/146/62 240/142/62 +f 240/142/63 244/146/63 245/147/63 241/143/63 +f 241/143/64 245/147/64 246/131/64 242/129/64 +f 68/144/65 67/148/65 247/149/65 243/145/65 +f 243/145/66 247/149/66 248/150/66 244/146/66 +f 244/146/67 248/150/67 249/151/67 245/147/67 +f 245/147/68 249/151/68 250/89/68 246/131/68 +f 67/148/69 19/103/69 207/106/69 247/149/69 +f 247/149/70 207/106/70 208/108/70 248/150/70 +f 248/150/71 208/108/71 209/110/71 249/151/71 +f 249/151/72 209/110/72 210/90/72 250/89/72 +f 58/18/73 254/152/73 99/153/73 3/19/73 +f 254/152/74 258/154/74 100/155/74 99/153/74 +f 258/154/75 262/156/75 101/157/75 100/155/75 +f 262/156/76 266/85/76 102/88/76 101/157/76 +f 16/47/77 214/128/77 251/158/77 55/159/77 +f 55/159/78 251/158/78 252/160/78 56/161/78 +f 56/161/79 252/160/79 253/162/79 57/163/79 +f 57/163/80 253/162/80 254/152/80 58/18/80 +f 214/128/81 213/130/81 255/164/81 251/158/81 +f 251/158/82 255/164/82 256/165/82 252/160/82 +f 252/160/83 256/165/83 257/166/83 253/162/83 +f 253/162/84 257/166/84 258/154/84 254/152/84 +f 213/130/85 212/132/85 259/167/85 255/164/85 +f 255/164/86 259/167/86 260/168/86 256/165/86 +f 256/165/87 260/168/87 261/169/87 257/166/87 +f 257/166/88 261/169/88 262/156/88 258/154/88 +f 212/132/89 211/92/89 263/170/89 259/167/89 +f 259/167/90 263/170/90 264/171/90 260/168/90 +f 260/168/91 264/171/91 265/172/91 261/169/91 +f 261/169/92 265/172/92 266/85/92 262/156/92 +f 211/92/93 26/91/93 203/173/93 263/170/93 +f 263/170/94 203/173/94 204/174/94 264/171/94 +f 264/171/95 204/174/95 205/175/95 265/172/95 +f 265/172/96 205/175/96 206/86/96 266/85/96 +f 194/78/97 270/176/97 202/177/97 25/79/97 +f 270/176/98 274/178/98 201/179/98 202/177/98 +f 274/178/99 278/180/99 200/181/99 201/179/99 +f 278/180/100 282/81/100 199/84/100 200/181/100 +f 13/39/101 94/182/101 267/183/101 191/184/101 +f 191/184/102 267/183/102 268/185/102 192/186/102 +f 192/186/103 268/185/103 269/187/103 193/188/103 +f 193/188/104 269/187/104 270/176/104 194/78/104 +f 94/182/105 93/189/105 271/190/105 267/183/105 +f 267/183/106 271/190/106 272/191/106 268/185/106 +f 268/185/107 272/191/107 273/192/107 269/187/107 +f 269/187/108 273/192/108 274/178/108 270/176/108 +f 93/189/109 92/193/109 275/194/109 271/190/109 +f 271/190/110 275/194/110 276/195/110 272/191/110 +f 272/191/111 276/195/111 277/196/111 273/192/111 +f 273/192/112 277/196/112 278/180/112 274/178/112 +f 92/193/113 91/20/113 279/197/113 275/194/113 +f 275/194/114 279/197/114 280/198/114 276/195/114 +f 276/195/115 280/198/115 281/199/115 277/196/115 +f 277/196/116 281/199/116 282/81/116 278/180/116 +f 91/20/117 3/19/117 99/200/117 279/197/117 +f 279/197/118 99/200/118 100/201/118 280/198/118 +f 280/198/119 100/201/119 101/202/119 281/199/119 +f 281/199/120 101/202/120 102/82/120 282/81/120 +f 59/203/121 286/204/121 198/205/121 17/206/121 +f 286/204/122 290/207/122 197/208/122 198/205/122 +f 290/207/123 294/209/123 196/210/123 197/208/123 +f 294/209/124 298/77/124 195/80/124 196/210/124 +f 4/15/125 46/211/125 283/212/125 62/213/125 +f 62/213/126 283/212/126 284/214/126 61/215/126 +f 61/215/127 284/214/127 285/216/127 60/217/127 +f 60/217/128 285/216/128 286/204/128 59/203/128 +f 46/211/129 45/218/129 287/219/129 283/212/129 +f 283/212/130 287/219/130 288/220/130 284/214/130 +f 284/214/131 288/220/131 289/221/131 285/216/131 +f 285/216/132 289/221/132 290/207/132 286/204/132 +f 45/218/133 44/222/133 291/223/133 287/219/133 +f 287/219/134 291/223/134 292/224/134 288/220/134 +f 288/220/135 292/224/135 293/225/135 289/221/135 +f 289/221/136 293/225/136 294/209/136 290/207/136 +f 44/222/137 43/40/137 295/226/137 291/223/137 +f 291/223/138 295/226/138 296/227/138 292/224/138 +f 292/224/139 296/227/139 297/228/139 293/225/139 +f 293/225/140 297/228/140 298/77/140 294/209/140 +f 43/40/141 13/39/141 191/184/141 295/226/141 +f 295/226/142 191/184/142 192/186/142 296/227/142 +f 296/227/143 192/186/143 193/188/143 297/228/143 +f 297/228/144 193/188/144 194/78/144 298/77/144 +f 107/229/145 302/230/145 87/231/145 8/232/145 +f 302/230/146 306/233/146 88/234/146 87/231/146 +f 306/233/147 310/235/147 89/236/147 88/234/147 +f 310/235/148 314/73/148 90/76/148 89/236/148 +f 17/206/149 198/205/149 299/237/149 110/238/149 +f 110/238/150 299/237/150 300/239/150 109/240/150 +f 109/240/151 300/239/151 301/241/151 108/242/151 +f 108/242/152 301/241/152 302/230/152 107/229/152 +f 198/205/153 197/208/153 303/243/153 299/237/153 +f 299/237/154 303/243/154 304/244/154 300/239/154 +f 300/239/155 304/244/155 305/245/155 301/241/155 +f 301/241/156 305/245/156 306/233/156 302/230/156 +f 197/208/157 196/210/157 307/246/157 303/243/157 +f 303/243/158 307/246/158 308/247/158 304/244/158 +f 304/244/159 308/247/159 309/248/159 305/245/159 +f 305/245/160 309/248/160 310/235/160 306/233/160 +f 196/210/161 195/80/161 311/249/161 307/246/161 +f 307/246/162 311/249/162 312/250/162 308/247/162 +f 308/247/163 312/250/163 313/251/163 309/248/163 +f 309/248/164 313/251/164 314/73/164 310/235/164 +f 195/80/165 25/79/165 187/252/165 311/249/165 +f 311/249/166 187/252/166 188/253/166 312/250/166 +f 312/250/167 188/253/167 189/254/167 313/251/167 +f 313/251/168 189/254/168 190/74/168 314/73/168 +f 178/66/169 318/255/169 186/256/169 24/67/169 +f 318/255/170 322/257/170 185/258/170 186/256/170 +f 322/257/171 326/259/171 184/260/171 185/258/171 +f 326/259/172 330/69/172 183/72/172 184/260/172 +f 12/261/173 39/262/173 315/263/173 175/264/173 +f 175/264/174 315/263/174 316/265/174 176/266/174 +f 176/266/175 316/265/175 317/267/175 177/268/175 +f 177/268/176 317/267/176 318/255/176 178/66/176 +f 39/262/177 40/269/177 319/270/177 315/263/177 +f 315/263/178 319/270/178 320/271/178 316/265/178 +f 316/265/179 320/271/179 321/272/179 317/267/179 +f 317/267/180 321/272/180 322/257/180 318/255/180 +f 40/269/181 41/273/181 323/274/181 319/270/181 +f 319/270/182 323/274/182 324/275/182 320/271/182 +f 320/271/183 324/275/183 325/276/183 321/272/183 +f 321/272/184 325/276/184 326/259/184 322/257/184 +f 41/273/185 42/277/185 327/278/185 323/274/185 +f 323/274/186 327/278/186 328/279/186 324/275/186 +f 324/275/187 328/279/187 329/280/187 325/276/187 +f 325/276/188 329/280/188 330/69/188 326/259/188 +f 42/277/189 7/281/189 111/282/189 327/278/189 +f 327/278/190 111/282/190 112/283/190 328/279/190 +f 328/279/191 112/283/191 113/284/191 329/280/191 +f 329/280/192 113/284/192 114/70/192 330/69/192 +f 27/285/193 334/286/193 182/287/193 9/288/193 +f 334/286/194 338/289/194 181/290/194 182/287/194 +f 338/289/195 342/291/195 180/292/195 181/290/195 +f 342/291/196 346/65/196 179/68/196 180/292/196 +f 8/293/197 87/294/197 331/295/197 30/296/197 +f 30/296/198 331/295/198 332/297/198 29/298/198 +f 29/298/199 332/297/199 333/299/199 28/300/199 +f 28/300/200 333/299/200 334/286/200 27/285/200 +f 87/294/201 88/301/201 335/302/201 331/295/201 +f 331/295/202 335/302/202 336/303/202 332/297/202 +f 332/297/203 336/303/203 337/304/203 333/299/203 +f 333/299/204 337/304/204 338/289/204 334/286/204 +f 88/301/205 89/305/205 339/306/205 335/302/205 +f 335/302/206 339/306/206 340/307/206 336/303/206 +f 336/303/207 340/307/207 341/308/207 337/304/207 +f 337/304/208 341/308/208 342/291/208 338/289/208 +f 89/305/209 90/309/209 343/310/209 339/306/209 +f 339/306/210 343/310/210 344/311/210 340/307/210 +f 340/307/211 344/311/211 345/312/211 341/308/211 +f 341/308/212 345/312/212 346/65/212 342/291/212 +f 90/309/213 12/261/213 175/264/213 343/310/213 +f 343/310/214 175/264/214 176/266/214 344/311/214 +f 344/311/215 176/266/215 177/268/215 345/312/215 +f 345/312/216 177/268/216 178/66/216 346/65/216 +f 75/313/217 350/314/217 50/315/217 6/316/217 +f 350/314/218 354/317/218 49/318/218 50/315/218 +f 354/317/219 358/319/219 48/320/219 49/318/219 +f 358/319/220 362/61/220 47/64/220 48/320/220 +f 9/288/221 182/287/221 347/321/221 78/322/221 +f 78/322/222 347/321/222 348/323/222 77/324/222 +f 77/324/223 348/323/223 349/325/223 76/326/223 +f 76/326/224 349/325/224 350/314/224 75/313/224 +f 182/287/225 181/290/225 351/327/225 347/321/225 +f 347/321/226 351/327/226 352/328/226 348/323/226 +f 348/323/227 352/328/227 353/329/227 349/325/227 +f 349/325/228 353/329/228 354/317/228 350/314/228 +f 181/290/229 180/292/229 355/330/229 351/327/229 +f 351/327/230 355/330/230 356/331/230 352/328/230 +f 352/328/231 356/331/231 357/332/231 353/329/231 +f 353/329/232 357/332/232 358/319/232 354/317/232 +f 180/292/233 179/68/233 359/333/233 355/330/233 +f 355/330/234 359/333/234 360/334/234 356/331/234 +f 356/331/235 360/334/235 361/335/235 357/332/235 +f 357/332/236 361/335/236 362/61/236 358/319/236 +f 179/68/237 24/67/237 171/336/237 359/333/237 +f 359/333/238 171/336/238 172/337/238 360/334/238 +f 360/334/239 172/337/239 173/338/239 361/335/239 +f 361/335/240 173/338/240 174/62/240 362/61/240 +f 162/54/241 366/339/241 170/340/241 23/55/241 +f 366/339/242 370/341/242 169/342/242 170/340/242 +f 370/341/243 374/343/243 168/344/243 169/342/243 +f 374/343/244 378/57/244 167/60/244 168/344/244 +f 10/345/245 82/346/245 363/347/245 159/348/245 +f 159/348/246 363/347/246 364/349/246 160/350/246 +f 160/350/247 364/349/247 365/351/247 161/352/247 +f 161/352/248 365/351/248 366/339/248 162/54/248 +f 82/346/249 81/353/249 367/354/249 363/347/249 +f 363/347/250 367/354/250 368/355/250 364/349/250 +f 364/349/251 368/355/251 369/356/251 365/351/251 +f 365/351/252 369/356/252 370/341/252 366/339/252 +f 81/353/253 80/357/253 371/358/253 367/354/253 +f 367/354/254 371/358/254 372/359/254 368/355/254 +f 368/355/255 372/359/255 373/360/255 369/356/255 +f 369/356/256 373/360/256 374/343/256 370/341/256 +f 80/357/257 79/361/257 375/362/257 371/358/257 +f 371/358/258 375/362/258 376/363/258 372/359/258 +f 372/359/259 376/363/259 377/364/259 373/360/259 +f 373/360/260 377/364/260 378/57/260 374/343/260 +f 79/361/261 2/365/261 74/366/261 375/362/261 +f 375/362/262 74/366/262 73/367/262 376/363/262 +f 376/363/263 73/367/263 72/368/263 377/364/263 +f 377/364/264 72/368/264 71/58/264 378/57/264 +f 78/369/265 382/370/265 166/371/265 9/372/265 +f 382/370/266 386/373/266 165/374/266 166/371/266 +f 386/373/267 390/375/267 164/376/267 165/374/267 +f 390/375/268 394/53/268 163/56/268 164/376/268 +f 6/377/269 34/378/269 379/379/269 75/380/269 +f 75/380/270 379/379/270 380/381/270 76/382/270 +f 76/382/271 380/381/271 381/383/271 77/384/271 +f 77/384/272 381/383/272 382/370/272 78/369/272 +f 34/378/273 33/385/273 383/386/273 379/379/273 +f 379/379/274 383/386/274 384/387/274 380/381/274 +f 380/381/275 384/387/275 385/388/275 381/383/275 +f 381/383/276 385/388/276 386/373/276 382/370/276 +f 33/385/277 32/389/277 387/390/277 383/386/277 +f 383/386/278 387/390/278 388/391/278 384/387/278 +f 384/387/279 388/391/279 389/392/279 385/388/279 +f 385/388/280 389/392/280 390/375/280 386/373/280 +f 32/389/281 31/393/281 391/394/281 387/390/281 +f 387/390/282 391/394/282 392/395/282 388/391/282 +f 388/391/283 392/395/283 393/396/283 389/392/283 +f 389/392/284 393/396/284 394/53/284 390/375/284 +f 31/393/285 10/345/285 159/348/285 391/394/285 +f 391/394/286 159/348/286 160/350/286 392/395/286 +f 392/395/287 160/350/287 161/352/287 393/396/287 +f 393/396/288 161/352/288 162/54/288 394/53/288 +f 30/397/289 398/398/289 107/399/289 8/400/289 +f 398/398/290 402/401/290 108/402/290 107/399/290 +f 402/401/291 406/403/291 109/404/291 108/402/291 +f 406/403/292 410/49/292 110/52/292 109/404/292 +f 9/372/293 166/371/293 395/405/293 27/406/293 +f 27/406/294 395/405/294 396/407/294 28/408/294 +f 28/408/295 396/407/295 397/409/295 29/410/295 +f 29/410/296 397/409/296 398/398/296 30/397/296 +f 166/371/297 165/374/297 399/411/297 395/405/297 +f 395/405/298 399/411/298 400/412/298 396/407/298 +f 396/407/299 400/412/299 401/413/299 397/409/299 +f 397/409/300 401/413/300 402/401/300 398/398/300 +f 165/374/301 164/376/301 403/414/301 399/411/301 +f 399/411/302 403/414/302 404/415/302 400/412/302 +f 400/412/303 404/415/303 405/416/303 401/413/303 +f 401/413/304 405/416/304 406/403/304 402/401/304 +f 164/376/305 163/56/305 407/417/305 403/414/305 +f 403/414/306 407/417/306 408/418/306 404/415/306 +f 404/415/307 408/418/307 409/419/307 405/416/307 +f 405/416/308 409/419/308 410/49/308 406/403/308 +f 163/56/309 23/55/309 155/420/309 407/417/309 +f 407/417/310 155/420/310 156/421/310 408/418/310 +f 408/418/311 156/421/311 157/422/311 409/419/311 +f 409/419/312 157/422/312 158/50/312 410/49/312 +f 146/42/313 414/423/313 154/424/313 22/43/313 +f 414/423/314 418/425/314 153/426/314 154/424/314 +f 418/425/315 422/427/315 152/428/315 153/426/315 +f 422/427/316 426/45/316 151/48/316 152/428/316 +f 11/27/317 86/429/317 411/430/317 143/431/317 +f 143/431/318 411/430/318 412/432/318 144/433/318 +f 144/433/319 412/432/319 413/434/319 145/435/319 +f 145/435/320 413/434/320 414/423/320 146/42/320 +f 86/429/321 85/436/321 415/437/321 411/430/321 +f 411/430/322 415/437/322 416/438/322 412/432/322 +f 412/432/323 416/438/323 417/439/323 413/434/323 +f 413/434/324 417/439/324 418/425/324 414/423/324 +f 85/436/325 84/440/325 419/441/325 415/437/325 +f 415/437/326 419/441/326 420/442/326 416/438/326 +f 416/438/327 420/442/327 421/443/327 417/439/327 +f 417/439/328 421/443/328 422/427/328 418/425/328 +f 84/440/329 83/24/329 423/444/329 419/441/329 +f 419/441/330 423/444/330 424/445/330 420/442/330 +f 420/442/331 424/445/331 425/446/331 421/443/331 +f 421/443/332 425/446/332 426/45/332 422/427/332 +f 83/24/333 1/23/333 103/135/333 423/444/333 +f 423/444/334 103/135/334 104/137/334 424/445/334 +f 424/445/335 104/137/335 105/139/335 425/446/335 +f 425/446/336 105/139/336 106/46/336 426/45/336 +f 71/58/337 430/447/337 150/448/337 20/59/337 +f 430/447/338 434/449/338 149/450/338 150/448/338 +f 434/449/339 438/451/339 148/452/339 149/450/339 +f 438/451/340 442/41/340 147/44/340 148/452/340 +f 2/365/341 38/453/341 427/454/341 74/366/341 +f 74/366/342 427/454/342 428/455/342 73/367/342 +f 73/367/343 428/455/343 429/456/343 72/368/343 +f 72/368/344 429/456/344 430/447/344 71/58/344 +f 38/453/345 37/457/345 431/458/345 427/454/345 +f 427/454/346 431/458/346 432/459/346 428/455/346 +f 428/455/347 432/459/347 433/460/347 429/456/347 +f 429/456/348 433/460/348 434/449/348 430/447/348 +f 37/457/349 36/461/349 435/462/349 431/458/349 +f 431/458/350 435/462/350 436/463/350 432/459/350 +f 432/459/351 436/463/351 437/464/351 433/460/351 +f 433/460/352 437/464/352 438/451/352 434/449/352 +f 36/461/353 35/28/353 439/465/353 435/462/353 +f 435/462/354 439/465/354 440/466/354 436/463/354 +f 436/463/355 440/466/355 441/467/355 437/464/355 +f 437/464/356 441/467/356 442/41/356 438/451/356 +f 35/28/357 11/27/357 143/431/357 439/465/357 +f 439/465/358 143/431/358 144/433/358 440/466/358 +f 440/466/359 144/433/359 145/435/359 441/467/359 +f 441/467/360 145/435/360 146/42/360 442/41/360 +f 119/14/361 446/468/361 46/211/361 4/15/361 +f 446/468/362 450/469/362 45/218/362 46/211/362 +f 450/469/363 454/470/363 44/222/363 45/218/363 +f 454/470/364 458/37/364 43/40/364 44/222/364 +f 20/59/365 150/448/365 443/471/365 122/472/365 +f 122/472/366 443/471/366 444/473/366 121/474/366 +f 121/474/367 444/473/367 445/475/367 120/476/367 +f 120/476/368 445/475/368 446/468/368 119/14/368 +f 150/448/369 149/450/369 447/477/369 443/471/369 +f 443/471/370 447/477/370 448/478/370 444/473/370 +f 444/473/371 448/478/371 449/479/371 445/475/371 +f 445/475/372 449/479/372 450/469/372 446/468/372 +f 149/450/373 148/452/373 451/480/373 447/477/373 +f 447/477/374 451/480/374 452/481/374 448/478/374 +f 448/478/375 452/481/375 453/482/375 449/479/375 +f 449/479/376 453/482/376 454/470/376 450/469/376 +f 148/452/377 147/44/377 455/483/377 451/480/377 +f 451/480/378 455/483/378 456/484/378 452/481/378 +f 452/481/379 456/484/379 457/485/379 453/482/379 +f 453/482/380 457/485/380 458/37/380 454/470/380 +f 147/44/381 22/43/381 139/486/381 455/483/381 +f 455/483/382 139/486/382 140/487/382 456/484/382 +f 456/484/383 140/487/383 141/488/383 457/485/383 +f 457/485/384 141/488/384 142/38/384 458/37/384 +f 130/30/385 462/489/385 138/490/385 21/31/385 +f 462/489/386 466/491/386 137/492/386 138/490/386 +f 466/491/387 470/493/387 136/494/387 137/492/387 +f 470/493/388 474/33/388 135/36/388 136/494/388 +f 14/63/389 98/495/389 459/496/389 127/497/389 +f 127/497/390 459/496/390 460/498/390 128/499/390 +f 128/499/391 460/498/391 461/500/391 129/501/391 +f 129/501/392 461/500/392 462/489/392 130/30/392 +f 98/495/393 97/502/393 463/503/393 459/496/393 +f 459/496/394 463/503/394 464/504/394 460/498/394 +f 460/498/395 464/504/395 465/505/395 461/500/395 +f 461/500/396 465/505/396 466/491/396 462/489/396 +f 97/502/397 96/506/397 467/507/397 463/503/397 +f 463/503/398 467/507/398 468/508/398 464/504/398 +f 464/504/399 468/508/399 469/509/399 465/505/399 +f 465/505/400 469/509/400 470/493/400 466/491/400 +f 96/506/401 95/12/401 471/510/401 467/507/401 +f 467/507/402 471/510/402 472/511/402 468/508/402 +f 468/508/403 472/511/403 473/512/403 469/509/403 +f 469/509/404 473/512/404 474/33/404 470/493/404 +f 95/12/405 5/11/405 115/513/405 471/510/405 +f 471/510/406 115/513/406 116/514/406 472/511/406 +f 472/511/407 116/514/407 117/515/407 473/512/407 +f 473/512/408 117/515/408 118/34/408 474/33/408 +f 31/516/409 478/517/409 134/518/409 10/519/409 +f 478/517/410 482/520/410 133/521/410 134/518/410 +f 482/520/411 486/522/411 132/523/411 133/521/411 +f 486/522/412 490/29/412 131/32/412 132/523/412 +f 6/316/413 50/315/413 475/524/413 34/525/413 +f 34/525/414 475/524/414 476/526/414 33/527/414 +f 33/527/415 476/526/415 477/528/415 32/529/415 +f 32/529/416 477/528/416 478/517/416 31/516/416 +f 50/315/417 49/318/417 479/530/417 475/524/417 +f 475/524/418 479/530/418 480/531/418 476/526/418 +f 476/526/419 480/531/419 481/532/419 477/528/419 +f 477/528/420 481/532/420 482/520/420 478/517/420 +f 49/318/421 48/320/421 483/533/421 479/530/421 +f 479/530/422 483/533/422 484/534/422 480/531/422 +f 480/531/423 484/534/423 485/535/423 481/532/423 +f 481/532/424 485/535/424 486/522/424 482/520/424 +f 48/320/425 47/64/425 487/536/425 483/533/425 +f 483/533/426 487/536/426 488/537/426 484/534/426 +f 484/534/427 488/537/427 489/538/427 485/535/427 +f 485/535/428 489/538/428 490/29/428 486/522/428 +f 47/64/429 14/63/429 127/497/429 487/536/429 +f 487/536/430 127/497/430 128/499/430 488/537/430 +f 488/537/431 128/499/431 129/501/431 489/538/431 +f 489/538/432 129/501/432 130/30/432 490/29/432 +f 79/539/433 494/540/433 38/453/433 2/365/433 +f 494/540/434 498/541/434 37/457/434 38/453/434 +f 498/541/435 502/542/435 36/461/435 37/457/435 +f 502/542/436 506/25/436 35/28/436 36/461/436 +f 10/519/437 134/518/437 491/543/437 82/544/437 +f 82/544/438 491/543/438 492/545/438 81/546/438 +f 81/546/439 492/545/439 493/547/439 80/548/439 +f 80/548/440 493/547/440 494/540/440 79/539/440 +f 134/518/441 133/521/441 495/549/441 491/543/441 +f 491/543/442 495/549/442 496/550/442 492/545/442 +f 492/545/443 496/550/443 497/551/443 493/547/443 +f 493/547/444 497/551/444 498/541/444 494/540/444 +f 133/521/445 132/523/445 499/552/445 495/549/445 +f 495/549/446 499/552/446 500/553/446 496/550/446 +f 496/550/447 500/553/447 501/554/447 497/551/447 +f 497/551/448 501/554/448 502/542/448 498/541/448 +f 132/523/449 131/32/449 503/555/449 499/552/449 +f 499/552/450 503/555/450 504/556/450 500/553/450 +f 500/553/451 504/556/451 505/557/451 501/554/451 +f 501/554/452 505/557/452 506/25/452 502/542/452 +f 131/32/453 21/31/453 123/558/453 503/555/453 +f 503/555/454 123/558/454 124/559/454 504/556/454 +f 504/556/455 124/559/455 125/560/455 505/557/455 +f 505/557/456 125/560/456 126/26/456 506/25/456 +f 126/26/457 510/561/457 86/429/457 11/27/457 +f 510/561/458 514/562/458 85/436/458 86/429/458 +f 514/562/459 518/563/459 84/440/459 85/436/459 +f 518/563/460 522/21/460 83/24/460 84/440/460 +f 21/31/461 138/490/461 507/564/461 123/558/461 +f 123/558/462 507/564/462 508/565/462 124/559/462 +f 124/559/463 508/565/463 509/566/463 125/560/463 +f 125/560/464 509/566/464 510/561/464 126/26/464 +f 138/490/465 137/492/465 511/567/465 507/564/465 +f 507/564/466 511/567/466 512/568/466 508/565/466 +f 508/565/467 512/568/467 513/569/467 509/566/467 +f 509/566/468 513/569/468 514/562/468 510/561/468 +f 137/492/469 136/494/469 515/570/469 511/567/469 +f 511/567/470 515/570/470 516/571/470 512/568/470 +f 512/568/471 516/571/471 517/572/471 513/569/471 +f 513/569/472 517/572/472 518/563/472 514/562/472 +f 136/494/473 135/36/473 519/573/473 515/570/473 +f 515/570/474 519/573/474 520/574/474 516/571/474 +f 516/571/475 520/574/475 521/575/475 517/572/475 +f 517/572/476 521/575/476 522/21/476 518/563/476 +f 135/36/477 19/35/477 67/576/477 519/573/477 +f 519/573/478 67/576/478 68/577/478 520/574/478 +f 520/574/479 68/577/479 69/578/479 521/575/479 +f 521/575/480 69/578/480 70/22/480 522/21/480 +f 142/38/481 526/579/481 94/182/481 13/39/481 +f 526/579/482 530/580/482 93/189/482 94/182/482 +f 530/580/483 534/581/483 92/193/483 93/189/483 +f 534/581/484 538/17/484 91/20/484 92/193/484 +f 22/43/485 154/424/485 523/582/485 139/486/485 +f 139/486/486 523/582/486 524/583/486 140/487/486 +f 140/487/487 524/583/487 525/584/487 141/488/487 +f 141/488/488 525/584/488 526/579/488 142/38/488 +f 154/424/489 153/426/489 527/585/489 523/582/489 +f 523/582/490 527/585/490 528/586/490 524/583/490 +f 524/583/491 528/586/491 529/587/491 525/584/491 +f 525/584/492 529/587/492 530/580/492 526/579/492 +f 153/426/493 152/428/493 531/588/493 527/585/493 +f 527/585/494 531/588/494 532/589/494 528/586/494 +f 528/586/495 532/589/495 533/590/495 529/587/495 +f 529/587/496 533/590/496 534/581/496 530/580/496 +f 152/428/497 151/48/497 535/591/497 531/588/497 +f 531/588/498 535/591/498 536/592/498 532/589/498 +f 532/589/499 536/592/499 537/593/499 533/590/499 +f 533/590/500 537/593/500 538/17/500 534/581/500 +f 151/48/501 16/47/501 55/159/501 535/591/501 +f 535/591/502 55/159/502 56/161/502 536/592/502 +f 536/592/503 56/161/503 57/163/503 537/593/503 +f 537/593/504 57/163/504 58/18/504 538/17/504 +f 158/50/505 542/594/505 59/595/505 17/51/505 +f 542/594/506 546/596/506 60/597/506 59/595/506 +f 546/596/507 550/598/507 61/599/507 60/597/507 +f 550/598/508 554/13/508 62/16/508 61/599/508 +f 23/55/509 170/340/509 539/600/509 155/420/509 +f 155/420/510 539/600/510 540/601/510 156/421/510 +f 156/421/511 540/601/511 541/602/511 157/422/511 +f 157/422/512 541/602/512 542/594/512 158/50/512 +f 170/340/513 169/342/513 543/603/513 539/600/513 +f 539/600/514 543/603/514 544/604/514 540/601/514 +f 540/601/515 544/604/515 545/605/515 541/602/515 +f 541/602/516 545/605/516 546/596/516 542/594/516 +f 169/342/517 168/344/517 547/606/517 543/603/517 +f 543/603/518 547/606/518 548/607/518 544/604/518 +f 544/604/519 548/607/519 549/608/519 545/605/519 +f 545/605/520 549/608/520 550/598/520 546/596/520 +f 168/344/521 167/60/521 551/609/521 547/606/521 +f 547/606/522 551/609/522 552/610/522 548/607/522 +f 548/607/523 552/610/523 553/611/523 549/608/523 +f 549/608/524 553/611/524 554/13/524 550/598/524 +f 167/60/525 20/59/525 122/472/525 551/609/525 +f 551/609/526 122/472/526 121/474/526 552/610/526 +f 552/610/527 121/474/527 120/476/527 553/611/527 +f 553/611/528 120/476/528 119/14/528 554/13/528 +f 174/62/529 558/612/529 98/495/529 14/63/529 +f 558/612/530 562/613/530 97/502/530 98/495/530 +f 562/613/531 566/614/531 96/506/531 97/502/531 +f 566/614/532 570/9/532 95/12/532 96/506/532 +f 24/67/533 186/256/533 555/615/533 171/336/533 +f 171/336/534 555/615/534 556/616/534 172/337/534 +f 172/337/535 556/616/535 557/617/535 173/338/535 +f 173/338/536 557/617/536 558/612/536 174/62/536 +f 186/256/537 185/258/537 559/618/537 555/615/537 +f 555/615/538 559/618/538 560/619/538 556/616/538 +f 556/616/539 560/619/539 561/620/539 557/617/539 +f 557/617/540 561/620/540 562/613/540 558/612/540 +f 185/258/541 184/260/541 563/621/541 559/618/541 +f 559/618/542 563/621/542 564/622/542 560/619/542 +f 560/619/543 564/622/543 565/623/543 561/620/543 +f 561/620/544 565/623/544 566/614/544 562/613/544 +f 184/260/545 183/72/545 567/624/545 563/621/545 +f 563/621/546 567/624/546 568/625/546 564/622/546 +f 564/622/547 568/625/547 569/626/547 565/623/547 +f 565/623/548 569/626/548 570/9/548 566/614/548 +f 183/72/549 18/71/549 63/627/549 567/624/549 +f 567/624/550 63/627/550 64/628/550 568/625/550 +f 568/625/551 64/628/551 65/629/551 569/626/551 +f 569/626/552 65/629/552 66/10/552 570/9/552 +f 190/74/553 574/630/553 39/631/553 12/75/553 +f 574/630/554 578/632/554 40/633/554 39/631/554 +f 578/632/555 582/634/555 41/635/555 40/633/555 +f 582/634/556 586/5/556 42/8/556 41/635/556 +f 25/79/557 202/177/557 571/636/557 187/252/557 +f 187/252/558 571/636/558 572/637/558 188/253/558 +f 188/253/559 572/637/559 573/638/559 189/254/559 +f 189/254/560 573/638/560 574/630/560 190/74/560 +f 202/177/561 201/179/561 575/639/561 571/636/561 +f 571/636/562 575/639/562 576/640/562 572/637/562 +f 572/637/563 576/640/563 577/641/563 573/638/563 +f 573/638/564 577/641/564 578/632/564 574/630/564 +f 201/179/565 200/181/565 579/642/565 575/639/565 +f 575/639/566 579/642/566 580/643/566 576/640/566 +f 576/640/567 580/643/567 581/644/567 577/641/567 +f 577/641/568 581/644/568 582/634/568 578/632/568 +f 200/181/569 199/84/569 583/645/569 579/642/569 +f 579/642/570 583/645/570 584/646/570 580/643/570 +f 580/643/571 584/646/571 585/647/571 581/644/571 +f 581/644/572 585/647/572 586/5/572 582/634/572 +f 199/84/573 15/83/573 51/648/573 583/645/573 +f 583/645/574 51/648/574 52/649/574 584/646/574 +f 584/646/575 52/649/575 53/650/575 585/647/575 +f 585/647/576 53/650/576 54/6/576 586/5/576 +f 206/86/577 590/651/577 51/652/577 15/87/577 +f 590/651/578 594/653/578 52/654/578 51/652/578 +f 594/653/579 598/655/579 53/656/579 52/654/579 +f 598/655/580 602/1/580 54/4/580 53/656/580 +f 26/91/581 218/98/581 587/657/581 203/173/581 +f 203/173/582 587/657/582 588/658/582 204/174/582 +f 204/174/583 588/658/583 589/659/583 205/175/583 +f 205/175/584 589/659/584 590/651/584 206/86/584 +f 218/98/585 217/100/585 591/660/585 587/657/585 +f 587/657/586 591/660/586 592/661/586 588/658/586 +f 588/658/587 592/661/587 593/662/587 589/659/587 +f 589/659/588 593/662/588 594/653/588 590/651/588 +f 217/100/589 216/102/589 595/663/589 591/660/589 +f 591/660/590 595/663/590 596/664/590 592/661/590 +f 592/661/591 596/664/591 597/665/591 593/662/591 +f 593/662/592 597/665/592 598/655/592 594/653/592 +f 216/102/593 215/96/593 599/666/593 595/663/593 +f 595/663/594 599/666/594 600/667/594 596/664/594 +f 596/664/595 600/667/595 601/668/595 597/665/595 +f 597/665/596 601/668/596 602/1/596 598/655/596 +f 215/96/597 18/95/597 114/669/597 599/666/597 +f 599/666/598 114/669/598 113/670/598 600/667/598 +f 600/667/599 113/670/599 112/671/599 601/668/599 +f 601/668/600 112/671/600 111/2/600 602/1/600 diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/star_sphere_outer.json b/src/main/resources/assets/cosmiccore/models/block/iris/star_sphere_outer.json new file mode 100644 index 000000000..7c6873325 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/star_sphere_outer.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:obj", + "model": "cosmiccore:models/block/iris/star_shell.obj", + "textures": { + "texture0": "cosmiccore:block/iris/star_shell", + "particle":"cosmiccore:block/iris/star_shell" + }, + "automatic_culling": false + } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/the_hole.mtl b/src/main/resources/assets/cosmiccore/models/block/iris/the_hole.mtl new file mode 100644 index 000000000..68a2c05a3 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/the_hole.mtl @@ -0,0 +1,13 @@ +# Blender 4.0.2 MTL File: 'None' +# www.blender.org + +newmtl Material +map_Kd #texture0 +Ns 0.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.000000 0.000000 0.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 10.650000 +d 1.000000 +illum 3 diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/the_hole.obj b/src/main/resources/assets/cosmiccore/models/block/iris/the_hole.obj new file mode 100644 index 000000000..54090452f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/the_hole.obj @@ -0,0 +1,2479 @@ +# Blender 4.0.2 +# www.blender.org +mtllib the_hole.mtl +o Cube +v 0.742856 0.742856 -0.742856 +v 0.742856 -0.742856 -0.742856 +v 0.742856 0.742856 0.742856 +v 0.742856 -0.742856 0.742856 +v -0.742856 0.742856 -0.742856 +v -0.742856 -0.742856 -0.742856 +v -0.742856 0.742856 0.742856 +v -0.742856 -0.742856 0.742856 +v -0.909809 -0.909809 0.000000 +v 0.000000 -0.909809 -0.909809 +v 0.909809 0.000000 -0.909809 +v -0.909809 0.000000 0.909809 +v 0.909809 0.000000 0.909809 +v -0.909809 0.000000 -0.909809 +v 0.000000 0.909809 0.909809 +v 0.909809 0.909809 0.000000 +v 0.000000 -0.909809 0.909809 +v -0.909809 0.909809 0.000000 +v 0.000000 0.909809 -0.909809 +v 0.909809 -0.909809 0.000000 +v -0.000000 -0.000000 -1.286664 +v 1.286664 -0.000000 -0.000000 +v -0.000000 -1.286664 -0.000000 +v -1.286664 -0.000000 -0.000000 +v -0.000000 -0.000000 1.286664 +v -0.000000 1.286664 -0.000000 +v -0.900845 -0.900845 0.180169 +v -0.875464 -0.875464 0.350186 +v -0.837547 -0.837547 0.502528 +v -0.791887 -0.791887 0.633510 +v -0.180169 -0.900845 -0.900845 +v -0.350186 -0.875464 -0.875464 +v -0.502528 -0.837547 -0.837547 +v -0.633510 -0.791887 -0.791887 +v 0.900845 -0.180169 -0.900845 +v 0.875464 -0.350186 -0.875464 +v 0.837547 -0.502528 -0.837547 +v 0.791887 -0.633510 -0.791887 +v -0.900845 0.180169 0.900845 +v -0.875464 0.350186 0.875464 +v -0.837547 0.502528 0.837547 +v -0.791887 0.633510 0.791887 +v 0.900845 -0.180169 0.900845 +v 0.875464 -0.350186 0.875464 +v 0.837547 -0.502528 0.837547 +v 0.791887 -0.633510 0.791887 +v -0.900845 -0.180169 -0.900845 +v -0.875464 -0.350186 -0.875464 +v -0.837547 -0.502528 -0.837547 +v -0.791887 -0.633510 -0.791887 +v -0.180169 0.900845 0.900845 +v -0.350186 0.875464 0.875464 +v -0.502528 0.837547 0.837547 +v -0.633510 0.791887 0.791887 +v 0.900845 0.900845 0.180169 +v 0.875464 0.875464 0.350186 +v 0.837547 0.837547 0.502528 +v 0.791887 0.791887 0.633510 +v 0.180169 -0.900845 0.900845 +v 0.350186 -0.875464 0.875464 +v 0.502528 -0.837547 0.837547 +v 0.633510 -0.791887 0.791887 +v -0.900845 0.900845 -0.180169 +v -0.875464 0.875464 -0.350186 +v -0.837547 0.837547 -0.502528 +v -0.791887 0.791887 -0.633510 +v 0.180169 0.900845 -0.900845 +v 0.350186 0.875464 -0.875464 +v 0.502528 0.837547 -0.837547 +v 0.633510 0.791887 -0.791887 +v 0.900845 -0.900845 -0.180169 +v 0.875464 -0.875464 -0.350186 +v 0.837547 -0.837547 -0.502528 +v 0.791887 -0.791887 -0.633510 +v -0.791887 -0.791887 -0.633510 +v -0.837547 -0.837547 -0.502528 +v -0.875464 -0.875464 -0.350186 +v -0.900845 -0.900845 -0.180169 +v 0.633510 -0.791887 -0.791887 +v 0.502528 -0.837547 -0.837547 +v 0.350186 -0.875464 -0.875464 +v 0.180169 -0.900845 -0.900845 +v 0.791887 0.633510 -0.791887 +v 0.837547 0.502528 -0.837547 +v 0.875464 0.350186 -0.875464 +v 0.900845 0.180169 -0.900845 +v -0.791887 -0.633510 0.791887 +v -0.837547 -0.502528 0.837547 +v -0.875464 -0.350186 0.875464 +v -0.900845 -0.180169 0.900845 +v 0.791887 0.633510 0.791887 +v 0.837547 0.502528 0.837547 +v 0.875464 0.350186 0.875464 +v 0.900845 0.180169 0.900845 +v -0.791887 0.633510 -0.791887 +v -0.837547 0.502528 -0.837547 +v -0.875464 0.350186 -0.875464 +v -0.900845 0.180169 -0.900845 +v 0.633510 0.791887 0.791887 +v 0.502528 0.837547 0.837547 +v 0.350186 0.875464 0.875464 +v 0.180169 0.900845 0.900845 +v 0.791887 0.791887 -0.633510 +v 0.837547 0.837547 -0.502528 +v 0.875464 0.875464 -0.350186 +v 0.900845 0.900845 -0.180169 +v -0.633510 -0.791887 0.791887 +v -0.502528 -0.837547 0.837547 +v -0.350186 -0.875464 0.875464 +v -0.180169 -0.900845 0.900845 +v -0.791887 0.791887 0.633510 +v -0.837547 0.837547 0.502528 +v -0.875464 0.875464 0.350186 +v -0.900845 0.900845 0.180169 +v -0.633510 0.791887 -0.791887 +v -0.502528 0.837547 -0.837547 +v -0.350186 0.875464 -0.875464 +v -0.180169 0.900845 -0.900845 +v 0.791887 -0.791887 0.633510 +v 0.837547 -0.837547 0.502528 +v 0.875464 -0.875464 0.350186 +v 0.900845 -0.900845 0.180169 +v 0.252336 -0.000000 -1.261678 +v 0.477855 -0.000000 -1.194638 +v 0.661983 -0.000000 -1.103306 +v 0.803773 -0.000000 -1.004716 +v -0.803773 -0.000000 -1.004716 +v -0.661983 -0.000000 -1.103306 +v -0.477855 -0.000000 -1.194638 +v -0.252336 -0.000000 -1.261678 +v -0.000000 -0.252336 -1.261678 +v -0.000000 -0.477855 -1.194638 +v -0.000000 -0.661983 -1.103306 +v -0.000000 -0.803773 -1.004716 +v -0.000000 0.803773 -1.004716 +v -0.000000 0.661983 -1.103306 +v -0.000000 0.477855 -1.194638 +v -0.000000 0.252336 -1.261678 +v 1.261678 -0.000000 0.252336 +v 1.194638 -0.000000 0.477855 +v 1.103306 -0.000000 0.661983 +v 1.004716 -0.000000 0.803773 +v 1.004716 -0.000000 -0.803773 +v 1.103306 -0.000000 -0.661983 +v 1.194638 -0.000000 -0.477855 +v 1.261678 -0.000000 -0.252336 +v 1.261678 -0.252336 -0.000000 +v 1.194638 -0.477855 -0.000000 +v 1.103306 -0.661983 -0.000000 +v 1.004716 -0.803773 -0.000000 +v 1.004716 0.803773 -0.000000 +v 1.103306 0.661983 -0.000000 +v 1.194638 0.477855 -0.000000 +v 1.261678 0.252336 -0.000000 +v -0.000000 -1.261678 0.252336 +v -0.000000 -1.194638 0.477855 +v -0.000000 -1.103306 0.661983 +v -0.000000 -1.004716 0.803773 +v -0.000000 -1.004716 -0.803773 +v -0.000000 -1.103306 -0.661983 +v -0.000000 -1.194638 -0.477855 +v -0.000000 -1.261678 -0.252336 +v -0.252336 -1.261678 -0.000000 +v -0.477855 -1.194638 -0.000000 +v -0.661983 -1.103306 -0.000000 +v -0.803773 -1.004716 -0.000000 +v 0.803773 -1.004716 -0.000000 +v 0.661983 -1.103306 -0.000000 +v 0.477855 -1.194638 -0.000000 +v 0.252336 -1.261678 -0.000000 +v -1.261678 -0.000000 -0.252336 +v -1.194638 -0.000000 -0.477855 +v -1.103306 -0.000000 -0.661983 +v -1.004716 -0.000000 -0.803773 +v -1.004716 -0.000000 0.803773 +v -1.103306 -0.000000 0.661983 +v -1.194638 -0.000000 0.477855 +v -1.261678 -0.000000 0.252336 +v -1.261678 -0.252336 -0.000000 +v -1.194638 -0.477855 -0.000000 +v -1.103306 -0.661983 -0.000000 +v -1.004716 -0.803773 -0.000000 +v -1.004716 0.803773 -0.000000 +v -1.103306 0.661983 -0.000000 +v -1.194638 0.477855 -0.000000 +v -1.261678 0.252336 -0.000000 +v -0.252336 -0.000000 1.261678 +v -0.477855 -0.000000 1.194638 +v -0.661983 -0.000000 1.103306 +v -0.803773 -0.000000 1.004716 +v 0.803773 -0.000000 1.004716 +v 0.661983 -0.000000 1.103306 +v 0.477855 -0.000000 1.194638 +v 0.252336 -0.000000 1.261678 +v -0.000000 -0.252336 1.261678 +v -0.000000 -0.477855 1.194638 +v -0.000000 -0.661983 1.103306 +v -0.000000 -0.803773 1.004716 +v -0.000000 0.803773 1.004716 +v -0.000000 0.661983 1.103306 +v -0.000000 0.477855 1.194638 +v -0.000000 0.252336 1.261678 +v -0.000000 1.261678 0.252336 +v -0.000000 1.194638 0.477855 +v -0.000000 1.103306 0.661983 +v -0.000000 1.004716 0.803773 +v -0.000000 1.004716 -0.803773 +v -0.000000 1.103306 -0.661983 +v -0.000000 1.194638 -0.477855 +v -0.000000 1.261678 -0.252336 +v 0.252336 1.261678 -0.000000 +v 0.477855 1.194638 -0.000000 +v 0.661983 1.103306 -0.000000 +v 0.803773 1.004716 -0.000000 +v -0.803773 1.004716 -0.000000 +v -0.661983 1.103306 -0.000000 +v -0.477855 1.194638 -0.000000 +v -0.252336 1.261678 -0.000000 +v -0.198537 0.992683 -0.794147 +v -0.217486 1.087430 -0.652458 +v -0.234912 1.174559 -0.469823 +v -0.247619 1.238093 -0.247619 +v -0.383609 0.959023 -0.767218 +v -0.417449 1.043623 -0.626174 +v -0.447959 1.119898 -0.447959 +v -0.469823 1.174559 -0.234912 +v -0.545886 0.909809 -0.727847 +v -0.588644 0.981073 -0.588644 +v -0.626174 1.043623 -0.417449 +v -0.652458 1.087430 -0.217486 +v -0.681691 0.852114 -0.681691 +v -0.727847 0.909809 -0.545886 +v -0.767218 0.959023 -0.383609 +v -0.794147 0.992683 -0.198537 +v 0.681691 0.852114 -0.681691 +v 0.727847 0.909809 -0.545886 +v 0.767218 0.959023 -0.383609 +v 0.794147 0.992683 -0.198537 +v 0.545886 0.909809 -0.727847 +v 0.588644 0.981073 -0.588644 +v 0.626174 1.043623 -0.417449 +v 0.652458 1.087430 -0.217486 +v 0.383609 0.959023 -0.767218 +v 0.417449 1.043623 -0.626174 +v 0.447959 1.119898 -0.447959 +v 0.469823 1.174559 -0.234912 +v 0.198537 0.992683 -0.794147 +v 0.217486 1.087430 -0.652458 +v 0.234912 1.174559 -0.469823 +v 0.247619 1.238093 -0.247619 +v 0.794147 0.992683 0.198537 +v 0.767218 0.959023 0.383609 +v 0.727847 0.909809 0.545886 +v 0.681691 0.852114 0.681691 +v 0.652458 1.087430 0.217486 +v 0.626174 1.043623 0.417449 +v 0.588644 0.981073 0.588644 +v 0.545886 0.909809 0.727847 +v 0.469823 1.174559 0.234912 +v 0.447959 1.119898 0.447959 +v 0.417449 1.043623 0.626174 +v 0.383609 0.959023 0.767218 +v 0.247619 1.238093 0.247619 +v 0.234912 1.174559 0.469823 +v 0.217486 1.087430 0.652458 +v 0.198537 0.992683 0.794147 +v 0.794147 0.198537 0.992683 +v 0.652458 0.217486 1.087430 +v 0.469823 0.234912 1.174559 +v 0.247619 0.247619 1.238093 +v 0.767218 0.383609 0.959023 +v 0.626174 0.417449 1.043623 +v 0.447959 0.447959 1.119898 +v 0.234912 0.469823 1.174559 +v 0.727847 0.545886 0.909809 +v 0.588644 0.588644 0.981073 +v 0.417449 0.626174 1.043623 +v 0.217486 0.652458 1.087430 +v 0.681691 0.681691 0.852114 +v 0.545886 0.727847 0.909809 +v 0.383609 0.767218 0.959023 +v 0.198537 0.794147 0.992683 +v 0.681691 -0.681691 0.852114 +v 0.545886 -0.727847 0.909809 +v 0.383609 -0.767218 0.959023 +v 0.198537 -0.794147 0.992683 +v 0.727847 -0.545886 0.909809 +v 0.588644 -0.588644 0.981073 +v 0.417449 -0.626174 1.043623 +v 0.217486 -0.652458 1.087430 +v 0.767218 -0.383609 0.959023 +v 0.626174 -0.417449 1.043623 +v 0.447959 -0.447959 1.119898 +v 0.234912 -0.469823 1.174559 +v 0.794147 -0.198537 0.992683 +v 0.652458 -0.217486 1.087430 +v 0.469823 -0.234912 1.174559 +v 0.247619 -0.247619 1.238093 +v -0.198537 -0.794147 0.992683 +v -0.383609 -0.767218 0.959023 +v -0.545886 -0.727847 0.909809 +v -0.681691 -0.681691 0.852114 +v -0.217486 -0.652458 1.087430 +v -0.417449 -0.626174 1.043623 +v -0.588644 -0.588644 0.981073 +v -0.727847 -0.545886 0.909809 +v -0.234912 -0.469823 1.174559 +v -0.447959 -0.447959 1.119898 +v -0.626174 -0.417449 1.043623 +v -0.767218 -0.383609 0.959023 +v -0.247619 -0.247619 1.238093 +v -0.469823 -0.234912 1.174559 +v -0.652458 -0.217486 1.087430 +v -0.794147 -0.198537 0.992683 +v -0.992683 0.198537 0.794147 +v -1.087430 0.217486 0.652458 +v -1.174559 0.234912 0.469823 +v -1.238093 0.247619 0.247619 +v -0.959023 0.383609 0.767218 +v -1.043623 0.417449 0.626174 +v -1.119898 0.447959 0.447959 +v -1.174559 0.469823 0.234912 +v -0.909809 0.545886 0.727847 +v -0.981073 0.588644 0.588644 +v -1.043623 0.626174 0.417449 +v -1.087430 0.652458 0.217486 +v -0.852114 0.681691 0.681691 +v -0.909809 0.727847 0.545886 +v -0.959023 0.767218 0.383609 +v -0.992683 0.794147 0.198537 +v -0.852114 -0.681691 0.681691 +v -0.909809 -0.727847 0.545886 +v -0.959023 -0.767218 0.383609 +v -0.992683 -0.794147 0.198537 +v -0.909809 -0.545886 0.727847 +v -0.981073 -0.588644 0.588644 +v -1.043623 -0.626174 0.417449 +v -1.087430 -0.652458 0.217486 +v -0.959023 -0.383609 0.767218 +v -1.043623 -0.417449 0.626174 +v -1.119898 -0.447959 0.447959 +v -1.174559 -0.469823 0.234912 +v -0.992683 -0.198537 0.794147 +v -1.087430 -0.217486 0.652458 +v -1.174559 -0.234912 0.469823 +v -1.238093 -0.247619 0.247619 +v -0.992683 -0.794147 -0.198537 +v -0.959023 -0.767218 -0.383609 +v -0.909809 -0.727847 -0.545886 +v -0.852114 -0.681691 -0.681691 +v -1.087430 -0.652458 -0.217486 +v -1.043623 -0.626174 -0.417449 +v -0.981073 -0.588644 -0.588644 +v -0.909809 -0.545886 -0.727847 +v -1.174559 -0.469823 -0.234912 +v -1.119898 -0.447959 -0.447959 +v -1.043623 -0.417449 -0.626174 +v -0.959023 -0.383609 -0.767218 +v -1.238093 -0.247619 -0.247619 +v -1.174559 -0.234912 -0.469823 +v -1.087430 -0.217486 -0.652458 +v -0.992683 -0.198537 -0.794147 +v 0.198537 -0.992683 -0.794147 +v 0.217486 -1.087430 -0.652458 +v 0.234912 -1.174559 -0.469823 +v 0.247619 -1.238093 -0.247619 +v 0.383609 -0.959023 -0.767218 +v 0.417449 -1.043623 -0.626174 +v 0.447959 -1.119898 -0.447959 +v 0.469823 -1.174559 -0.234912 +v 0.545886 -0.909809 -0.727847 +v 0.588644 -0.981073 -0.588644 +v 0.626174 -1.043623 -0.417449 +v 0.652458 -1.087430 -0.217486 +v 0.681691 -0.852114 -0.681691 +v 0.727847 -0.909809 -0.545886 +v 0.767218 -0.959023 -0.383609 +v 0.794147 -0.992683 -0.198537 +v -0.681691 -0.852114 -0.681691 +v -0.727847 -0.909809 -0.545886 +v -0.767218 -0.959023 -0.383609 +v -0.794147 -0.992683 -0.198537 +v -0.545886 -0.909809 -0.727847 +v -0.588644 -0.981073 -0.588644 +v -0.626174 -1.043623 -0.417449 +v -0.652458 -1.087430 -0.217486 +v -0.383609 -0.959023 -0.767218 +v -0.417449 -1.043623 -0.626174 +v -0.447959 -1.119898 -0.447959 +v -0.469823 -1.174559 -0.234912 +v -0.198537 -0.992683 -0.794147 +v -0.217486 -1.087430 -0.652458 +v -0.234912 -1.174559 -0.469823 +v -0.247619 -1.238093 -0.247619 +v -0.794147 -0.992683 0.198537 +v -0.767218 -0.959023 0.383609 +v -0.727847 -0.909809 0.545886 +v -0.681691 -0.852114 0.681691 +v -0.652458 -1.087430 0.217486 +v -0.626174 -1.043623 0.417449 +v -0.588644 -0.981073 0.588644 +v -0.545886 -0.909809 0.727847 +v -0.469823 -1.174559 0.234912 +v -0.447959 -1.119898 0.447959 +v -0.417449 -1.043623 0.626174 +v -0.383609 -0.959023 0.767218 +v -0.247619 -1.238093 0.247619 +v -0.234912 -1.174559 0.469823 +v -0.217486 -1.087430 0.652458 +v -0.198537 -0.992683 0.794147 +v 0.992683 0.198537 -0.794147 +v 1.087430 0.217486 -0.652458 +v 1.174559 0.234912 -0.469823 +v 1.238093 0.247619 -0.247619 +v 0.959023 0.383609 -0.767218 +v 1.043623 0.417449 -0.626174 +v 1.119898 0.447959 -0.447959 +v 1.174559 0.469823 -0.234912 +v 0.909809 0.545886 -0.727847 +v 0.981073 0.588644 -0.588644 +v 1.043623 0.626174 -0.417449 +v 1.087430 0.652458 -0.217486 +v 0.852114 0.681691 -0.681691 +v 0.909809 0.727847 -0.545886 +v 0.959023 0.767218 -0.383609 +v 0.992683 0.794147 -0.198537 +v 0.852114 -0.681691 -0.681691 +v 0.909809 -0.727847 -0.545886 +v 0.959023 -0.767218 -0.383609 +v 0.992683 -0.794147 -0.198537 +v 0.909809 -0.545886 -0.727847 +v 0.981073 -0.588644 -0.588644 +v 1.043623 -0.626174 -0.417449 +v 1.087430 -0.652458 -0.217486 +v 0.959023 -0.383609 -0.767218 +v 1.043623 -0.417449 -0.626174 +v 1.119898 -0.447959 -0.447959 +v 1.174559 -0.469823 -0.234912 +v 0.992683 -0.198537 -0.794147 +v 1.087430 -0.217486 -0.652458 +v 1.174559 -0.234912 -0.469823 +v 1.238093 -0.247619 -0.247619 +v 0.992683 -0.794147 0.198537 +v 0.959023 -0.767218 0.383609 +v 0.909809 -0.727847 0.545886 +v 0.852114 -0.681691 0.681691 +v 1.087430 -0.652458 0.217486 +v 1.043623 -0.626174 0.417449 +v 0.981073 -0.588644 0.588644 +v 0.909809 -0.545886 0.727847 +v 1.174559 -0.469823 0.234912 +v 1.119898 -0.447959 0.447959 +v 1.043623 -0.417449 0.626174 +v 0.959023 -0.383609 0.767218 +v 1.238093 -0.247619 0.247619 +v 1.174559 -0.234912 0.469823 +v 1.087430 -0.217486 0.652458 +v 0.992683 -0.198537 0.794147 +v -0.794147 0.198537 -0.992683 +v -0.652458 0.217486 -1.087430 +v -0.469823 0.234912 -1.174559 +v -0.247619 0.247619 -1.238093 +v -0.767218 0.383609 -0.959023 +v -0.626174 0.417449 -1.043623 +v -0.447959 0.447959 -1.119898 +v -0.234912 0.469823 -1.174559 +v -0.727847 0.545886 -0.909809 +v -0.588644 0.588644 -0.981073 +v -0.417449 0.626174 -1.043623 +v -0.217486 0.652458 -1.087430 +v -0.681691 0.681691 -0.852114 +v -0.545886 0.727847 -0.909809 +v -0.383609 0.767218 -0.959023 +v -0.198537 0.794147 -0.992683 +v -0.681691 -0.681691 -0.852114 +v -0.545886 -0.727847 -0.909809 +v -0.383609 -0.767218 -0.959023 +v -0.198537 -0.794147 -0.992683 +v -0.727847 -0.545886 -0.909809 +v -0.588644 -0.588644 -0.981073 +v -0.417449 -0.626174 -1.043623 +v -0.217486 -0.652458 -1.087430 +v -0.767218 -0.383609 -0.959023 +v -0.626174 -0.417449 -1.043623 +v -0.447959 -0.447959 -1.119898 +v -0.234912 -0.469823 -1.174559 +v -0.794147 -0.198537 -0.992683 +v -0.652458 -0.217486 -1.087430 +v -0.469823 -0.234912 -1.174559 +v -0.247619 -0.247619 -1.238093 +v 0.198537 -0.794147 -0.992683 +v 0.383609 -0.767218 -0.959023 +v 0.545886 -0.727847 -0.909809 +v 0.681691 -0.681691 -0.852114 +v 0.217486 -0.652458 -1.087430 +v 0.417449 -0.626174 -1.043623 +v 0.588644 -0.588644 -0.981073 +v 0.727847 -0.545886 -0.909809 +v 0.234912 -0.469823 -1.174559 +v 0.447959 -0.447959 -1.119898 +v 0.626174 -0.417449 -1.043623 +v 0.767218 -0.383609 -0.959023 +v 0.247619 -0.247619 -1.238093 +v 0.469823 -0.234912 -1.174559 +v 0.652458 -0.217486 -1.087430 +v 0.794147 -0.198537 -0.992683 +v 0.247619 0.247619 -1.238093 +v 0.469823 0.234912 -1.174559 +v 0.652458 0.217486 -1.087430 +v 0.794147 0.198537 -0.992683 +v 0.234912 0.469823 -1.174559 +v 0.447959 0.447959 -1.119898 +v 0.626174 0.417449 -1.043623 +v 0.767218 0.383609 -0.959023 +v 0.217486 0.652458 -1.087430 +v 0.417449 0.626174 -1.043623 +v 0.588644 0.588644 -0.981073 +v 0.727847 0.545886 -0.909809 +v 0.198537 0.794147 -0.992683 +v 0.383609 0.767218 -0.959023 +v 0.545886 0.727847 -0.909809 +v 0.681691 0.681691 -0.852114 +v 1.238093 0.247619 0.247619 +v 1.174559 0.234912 0.469823 +v 1.087430 0.217486 0.652458 +v 0.992683 0.198537 0.794147 +v 1.174559 0.469823 0.234912 +v 1.119898 0.447959 0.447959 +v 1.043623 0.417449 0.626174 +v 0.959023 0.383609 0.767218 +v 1.087430 0.652458 0.217486 +v 1.043623 0.626174 0.417449 +v 0.981073 0.588644 0.588644 +v 0.909809 0.545886 0.727847 +v 0.992683 0.794147 0.198537 +v 0.959023 0.767218 0.383609 +v 0.909809 0.727847 0.545886 +v 0.852114 0.681691 0.681691 +v 0.247619 -1.238093 0.247619 +v 0.234912 -1.174559 0.469823 +v 0.217486 -1.087430 0.652458 +v 0.198537 -0.992683 0.794147 +v 0.469823 -1.174559 0.234912 +v 0.447959 -1.119898 0.447959 +v 0.417449 -1.043623 0.626174 +v 0.383609 -0.959023 0.767218 +v 0.652458 -1.087430 0.217486 +v 0.626174 -1.043623 0.417449 +v 0.588644 -0.981073 0.588644 +v 0.545886 -0.909809 0.727847 +v 0.794147 -0.992683 0.198537 +v 0.767218 -0.959023 0.383609 +v 0.727847 -0.909809 0.545886 +v 0.681691 -0.852114 0.681691 +v -1.238093 0.247619 -0.247619 +v -1.174559 0.234912 -0.469823 +v -1.087430 0.217486 -0.652458 +v -0.992683 0.198537 -0.794147 +v -1.174559 0.469823 -0.234912 +v -1.119898 0.447959 -0.447959 +v -1.043623 0.417449 -0.626174 +v -0.959023 0.383609 -0.767218 +v -1.087430 0.652458 -0.217486 +v -1.043623 0.626174 -0.417449 +v -0.981073 0.588644 -0.588644 +v -0.909809 0.545886 -0.727847 +v -0.992683 0.794147 -0.198537 +v -0.959023 0.767218 -0.383609 +v -0.909809 0.727847 -0.545886 +v -0.852114 0.681691 -0.681691 +v -0.247619 0.247619 1.238093 +v -0.469823 0.234912 1.174559 +v -0.652458 0.217486 1.087430 +v -0.794147 0.198537 0.992683 +v -0.234912 0.469823 1.174559 +v -0.447959 0.447959 1.119898 +v -0.626174 0.417449 1.043623 +v -0.767218 0.383609 0.959023 +v -0.217486 0.652458 1.087430 +v -0.417449 0.626174 1.043623 +v -0.588644 0.588644 0.981073 +v -0.727847 0.545886 0.909809 +v -0.198537 0.794147 0.992683 +v -0.383609 0.767218 0.959023 +v -0.545886 0.727847 0.909809 +v -0.681691 0.681691 0.852114 +v -0.247619 1.238093 0.247619 +v -0.234912 1.174559 0.469823 +v -0.217486 1.087430 0.652458 +v -0.198537 0.992683 0.794147 +v -0.469823 1.174559 0.234912 +v -0.447959 1.119898 0.447959 +v -0.417449 1.043623 0.626174 +v -0.383609 0.959023 0.767218 +v -0.652458 1.087430 0.217486 +v -0.626174 1.043623 0.417449 +v -0.588644 0.981073 0.588644 +v -0.545886 0.909809 0.727847 +v -0.794147 0.992683 0.198537 +v -0.767218 0.959023 0.383609 +v -0.727847 0.909809 0.545886 +v -0.681691 0.852114 0.681691 +vn -0.5544 0.6207 0.5544 +vn -0.5544 0.5544 0.6207 +vn -0.6207 0.5544 -0.5544 +vn 0.5544 -0.6207 0.5544 +vn 0.6207 0.5544 0.5544 +vn 0.5544 0.5544 -0.6207 +vn 0.6615 -0.0738 -0.7463 +vn -0.0971 -0.0971 -0.9905 +vn -0.0738 0.6615 -0.7463 +vn 0.7463 -0.0738 0.6615 +vn 0.9905 -0.0971 -0.0971 +vn 0.7463 0.6615 -0.0738 +vn -0.0738 -0.7463 0.6615 +vn -0.0971 -0.9905 -0.0971 +vn 0.6615 -0.7463 -0.0738 +vn -0.7463 -0.0738 -0.6615 +vn -0.9905 -0.0971 0.0971 +vn -0.7463 0.6615 0.0738 +vn -0.6615 -0.0738 0.7463 +vn 0.0971 -0.0971 0.9905 +vn 0.0738 0.6615 0.7463 +vn 0.0738 0.7463 0.6615 +vn 0.0971 0.9905 -0.0971 +vn -0.6615 0.7463 -0.0738 +vn -0.0971 0.9905 -0.0971 +vn -0.2812 0.9550 -0.0939 +vn -0.4392 0.8941 -0.0881 +vn -0.5653 0.8209 -0.0811 +vn -0.0738 0.7463 -0.6615 +vn -0.0811 0.8209 -0.5653 +vn -0.0881 0.8941 -0.4392 +vn -0.0939 0.9550 -0.2812 +vn -0.2169 0.7301 -0.6480 +vn -0.2371 0.7997 -0.5516 +vn -0.2565 0.8672 -0.4268 +vn -0.2722 0.9229 -0.2722 +vn -0.3472 0.7007 -0.6233 +vn -0.3768 0.7619 -0.5267 +vn -0.4046 0.8201 -0.4046 +vn -0.4268 0.8672 -0.2565 +vn -0.4601 0.6627 -0.5908 +vn -0.4949 0.7142 -0.4949 +vn -0.5267 0.7619 -0.3768 +vn -0.5516 0.7997 -0.2371 +vn -0.5544 0.6207 -0.5544 +vn -0.5908 0.6627 -0.4601 +vn -0.6233 0.7007 -0.3472 +vn -0.6480 0.7301 -0.2169 +vn 0.6615 0.7463 -0.0738 +vn 0.5653 0.8209 -0.0811 +vn 0.4392 0.8941 -0.0881 +vn 0.2812 0.9550 -0.0939 +vn 0.5544 0.6207 -0.5544 +vn 0.5908 0.6627 -0.4601 +vn 0.6233 0.7007 -0.3472 +vn 0.6480 0.7301 -0.2169 +vn 0.4601 0.6627 -0.5908 +vn 0.4949 0.7142 -0.4949 +vn 0.5267 0.7619 -0.3768 +vn 0.5516 0.7997 -0.2371 +vn 0.3472 0.7007 -0.6233 +vn 0.3768 0.7619 -0.5267 +vn 0.4046 0.8201 -0.4046 +vn 0.4268 0.8672 -0.2565 +vn 0.2169 0.7301 -0.6480 +vn 0.2371 0.7997 -0.5516 +vn 0.2565 0.8672 -0.4268 +vn 0.2722 0.9229 -0.2722 +vn 0.0738 0.7463 -0.6615 +vn 0.0811 0.8209 -0.5653 +vn 0.0881 0.8941 -0.4392 +vn 0.0939 0.9550 -0.2812 +vn 0.5544 0.6207 0.5544 +vn 0.4601 0.6627 0.5908 +vn 0.3472 0.7007 0.6233 +vn 0.2169 0.7301 0.6480 +vn 0.6615 0.7463 0.0738 +vn 0.6480 0.7301 0.2169 +vn 0.6233 0.7007 0.3472 +vn 0.5908 0.6627 0.4601 +vn 0.5653 0.8209 0.0811 +vn 0.5516 0.7997 0.2371 +vn 0.5267 0.7619 0.3768 +vn 0.4949 0.7142 0.4949 +vn 0.4392 0.8941 0.0881 +vn 0.4268 0.8672 0.2565 +vn 0.4046 0.8201 0.4046 +vn 0.3768 0.7619 0.5267 +vn 0.2812 0.9550 0.0939 +vn 0.2722 0.9229 0.2722 +vn 0.2565 0.8672 0.4268 +vn 0.2371 0.7997 0.5516 +vn 0.0971 0.9905 0.0971 +vn 0.0939 0.9550 0.2812 +vn 0.0881 0.8941 0.4392 +vn 0.0811 0.8209 0.5653 +vn 0.0971 0.0971 0.9905 +vn 0.0939 0.2812 0.9551 +vn 0.0881 0.4392 0.8941 +vn 0.0811 0.5653 0.8209 +vn 0.6615 0.0738 0.7463 +vn 0.5653 0.0811 0.8209 +vn 0.4392 0.0881 0.8941 +vn 0.2812 0.0939 0.9551 +vn 0.6480 0.2169 0.7301 +vn 0.5516 0.2371 0.7997 +vn 0.4268 0.2565 0.8672 +vn 0.2722 0.2722 0.9229 +vn 0.6233 0.3472 0.7007 +vn 0.5267 0.3768 0.7619 +vn 0.4046 0.4046 0.8201 +vn 0.2565 0.4268 0.8672 +vn 0.5908 0.4601 0.6627 +vn 0.4949 0.4949 0.7142 +vn 0.3768 0.5267 0.7619 +vn 0.2371 0.5516 0.7997 +vn 0.5544 0.5544 0.6207 +vn 0.4601 0.5908 0.6627 +vn 0.3472 0.6233 0.7007 +vn 0.2169 0.6480 0.7301 +vn 0.0738 -0.6615 0.7463 +vn 0.0811 -0.5653 0.8209 +vn 0.0881 -0.4392 0.8941 +vn 0.0939 -0.2812 0.9551 +vn 0.5544 -0.5544 0.6207 +vn 0.4601 -0.5908 0.6627 +vn 0.3472 -0.6233 0.7007 +vn 0.2169 -0.6480 0.7301 +vn 0.5908 -0.4601 0.6627 +vn 0.4949 -0.4949 0.7142 +vn 0.3768 -0.5267 0.7619 +vn 0.2371 -0.5516 0.7997 +vn 0.6233 -0.3472 0.7007 +vn 0.5267 -0.3768 0.7619 +vn 0.4046 -0.4046 0.8201 +vn 0.2565 -0.4268 0.8672 +vn 0.6480 -0.2169 0.7301 +vn 0.5516 -0.2371 0.7997 +vn 0.4268 -0.2565 0.8672 +vn 0.2722 -0.2722 0.9229 +vn 0.6615 -0.0738 0.7463 +vn 0.5653 -0.0811 0.8209 +vn 0.4392 -0.0881 0.8941 +vn 0.2812 -0.0939 0.9551 +vn -0.5544 -0.5544 0.6207 +vn -0.5908 -0.4601 0.6627 +vn -0.6233 -0.3472 0.7007 +vn -0.6480 -0.2169 0.7301 +vn -0.0738 -0.6615 0.7463 +vn -0.2169 -0.6480 0.7301 +vn -0.3472 -0.6233 0.7007 +vn -0.4601 -0.5908 0.6627 +vn -0.0811 -0.5653 0.8209 +vn -0.2371 -0.5516 0.7997 +vn -0.3768 -0.5267 0.7619 +vn -0.4949 -0.4949 0.7142 +vn -0.0881 -0.4392 0.8941 +vn -0.2565 -0.4268 0.8672 +vn -0.4046 -0.4046 0.8201 +vn -0.5267 -0.3768 0.7619 +vn -0.0939 -0.2812 0.9551 +vn -0.2722 -0.2722 0.9229 +vn -0.4268 -0.2565 0.8672 +vn -0.5516 -0.2371 0.7997 +vn -0.0971 -0.0971 0.9905 +vn -0.2812 -0.0939 0.9551 +vn -0.4392 -0.0881 0.8941 +vn -0.5653 -0.0811 0.8209 +vn -0.9905 0.0971 0.0971 +vn -0.9551 0.2812 0.0939 +vn -0.8941 0.4392 0.0881 +vn -0.8209 0.5653 0.0811 +vn -0.7463 0.0738 0.6615 +vn -0.8209 0.0811 0.5653 +vn -0.8941 0.0881 0.4392 +vn -0.9551 0.0939 0.2812 +vn -0.7301 0.2169 0.6480 +vn -0.7997 0.2371 0.5516 +vn -0.8672 0.2565 0.4268 +vn -0.9229 0.2722 0.2722 +vn -0.7007 0.3472 0.6233 +vn -0.7619 0.3768 0.5267 +vn -0.8201 0.4046 0.4046 +vn -0.8672 0.4268 0.2565 +vn -0.6627 0.4601 0.5908 +vn -0.7142 0.4949 0.4949 +vn -0.7619 0.5267 0.3768 +vn -0.7997 0.5516 0.2371 +vn -0.6207 0.5544 0.5544 +vn -0.6627 0.5908 0.4601 +vn -0.7007 0.6233 0.3472 +vn -0.7301 0.6480 0.2169 +vn -0.7463 -0.6615 0.0738 +vn -0.8209 -0.5653 0.0811 +vn -0.8941 -0.4392 0.0881 +vn -0.9551 -0.2812 0.0939 +vn -0.6207 -0.5544 0.5544 +vn -0.6627 -0.5908 0.4601 +vn -0.7007 -0.6233 0.3472 +vn -0.7301 -0.6480 0.2169 +vn -0.6627 -0.4601 0.5908 +vn -0.7142 -0.4949 0.4949 +vn -0.7619 -0.5267 0.3768 +vn -0.7997 -0.5516 0.2371 +vn -0.7007 -0.3472 0.6233 +vn -0.7619 -0.3768 0.5267 +vn -0.8201 -0.4046 0.4046 +vn -0.8672 -0.4268 0.2565 +vn -0.7301 -0.2169 0.6480 +vn -0.7997 -0.2371 0.5516 +vn -0.8672 -0.2565 0.4268 +vn -0.9229 -0.2722 0.2722 +vn -0.7463 -0.0738 0.6615 +vn -0.8209 -0.0811 0.5653 +vn -0.8941 -0.0881 0.4392 +vn -0.9551 -0.0939 0.2812 +vn -0.6207 -0.5544 -0.5544 +vn -0.6627 -0.4601 -0.5908 +vn -0.7007 -0.3472 -0.6233 +vn -0.7301 -0.2169 -0.6480 +vn -0.7463 -0.6615 -0.0738 +vn -0.7301 -0.6480 -0.2169 +vn -0.7007 -0.6233 -0.3472 +vn -0.6627 -0.5908 -0.4601 +vn -0.8209 -0.5653 -0.0811 +vn -0.7997 -0.5516 -0.2371 +vn -0.7619 -0.5267 -0.3768 +vn -0.7142 -0.4949 -0.4949 +vn -0.8941 -0.4392 -0.0881 +vn -0.8672 -0.4268 -0.2565 +vn -0.8201 -0.4046 -0.4046 +vn -0.7619 -0.3768 -0.5267 +vn -0.9551 -0.2812 -0.0939 +vn -0.9229 -0.2722 -0.2722 +vn -0.8672 -0.2565 -0.4268 +vn -0.7997 -0.2371 -0.5516 +vn -0.9905 -0.0971 -0.0971 +vn -0.9551 -0.0939 -0.2812 +vn -0.8941 -0.0881 -0.4392 +vn -0.8209 -0.0811 -0.5653 +vn 0.0971 -0.9905 -0.0971 +vn 0.2812 -0.9550 -0.0939 +vn 0.4392 -0.8941 -0.0881 +vn 0.5653 -0.8209 -0.0811 +vn 0.0738 -0.7463 -0.6615 +vn 0.0811 -0.8209 -0.5653 +vn 0.0881 -0.8941 -0.4392 +vn 0.0939 -0.9550 -0.2812 +vn 0.2169 -0.7301 -0.6480 +vn 0.2371 -0.7997 -0.5516 +vn 0.2565 -0.8672 -0.4268 +vn 0.2722 -0.9229 -0.2722 +vn 0.3472 -0.7007 -0.6233 +vn 0.3768 -0.7619 -0.5267 +vn 0.4046 -0.8201 -0.4046 +vn 0.4268 -0.8672 -0.2565 +vn 0.4601 -0.6627 -0.5908 +vn 0.4949 -0.7142 -0.4949 +vn 0.5267 -0.7619 -0.3768 +vn 0.5516 -0.7997 -0.2371 +vn 0.5544 -0.6207 -0.5544 +vn 0.5908 -0.6627 -0.4601 +vn 0.6233 -0.7007 -0.3472 +vn 0.6480 -0.7301 -0.2169 +vn -0.6615 -0.7463 -0.0738 +vn -0.5653 -0.8209 -0.0811 +vn -0.4392 -0.8941 -0.0881 +vn -0.2812 -0.9550 -0.0939 +vn -0.5544 -0.6207 -0.5544 +vn -0.5908 -0.6627 -0.4601 +vn -0.6233 -0.7007 -0.3472 +vn -0.6480 -0.7301 -0.2169 +vn -0.4601 -0.6627 -0.5908 +vn -0.4949 -0.7142 -0.4949 +vn -0.5267 -0.7619 -0.3768 +vn -0.5516 -0.7997 -0.2371 +vn -0.3472 -0.7007 -0.6233 +vn -0.3768 -0.7619 -0.5267 +vn -0.4046 -0.8201 -0.4046 +vn -0.4268 -0.8672 -0.2565 +vn -0.2169 -0.7301 -0.6480 +vn -0.2371 -0.7997 -0.5516 +vn -0.2565 -0.8672 -0.4268 +vn -0.2722 -0.9229 -0.2722 +vn -0.0738 -0.7463 -0.6615 +vn -0.0811 -0.8209 -0.5653 +vn -0.0881 -0.8941 -0.4392 +vn -0.0939 -0.9550 -0.2812 +vn -0.5544 -0.6207 0.5544 +vn -0.4601 -0.6627 0.5908 +vn -0.3472 -0.7007 0.6233 +vn -0.2169 -0.7301 0.6480 +vn -0.6615 -0.7463 0.0738 +vn -0.6480 -0.7301 0.2169 +vn -0.6233 -0.7007 0.3472 +vn -0.5908 -0.6627 0.4601 +vn -0.5653 -0.8209 0.0811 +vn -0.5516 -0.7997 0.2371 +vn -0.5267 -0.7619 0.3768 +vn -0.4949 -0.7142 0.4949 +vn -0.4392 -0.8941 0.0881 +vn -0.4268 -0.8672 0.2565 +vn -0.4046 -0.8201 0.4046 +vn -0.3768 -0.7619 0.5267 +vn -0.2812 -0.9551 0.0939 +vn -0.2722 -0.9229 0.2722 +vn -0.2565 -0.8672 0.4268 +vn -0.2371 -0.7997 0.5516 +vn -0.0971 -0.9905 0.0971 +vn -0.0939 -0.9550 0.2812 +vn -0.0881 -0.8941 0.4392 +vn -0.0811 -0.8209 0.5653 +vn 0.9905 0.0971 -0.0971 +vn 0.9551 0.2812 -0.0939 +vn 0.8941 0.4392 -0.0881 +vn 0.8209 0.5653 -0.0811 +vn 0.7463 0.0738 -0.6615 +vn 0.8209 0.0811 -0.5653 +vn 0.8941 0.0881 -0.4392 +vn 0.9551 0.0939 -0.2812 +vn 0.7301 0.2169 -0.6480 +vn 0.7997 0.2371 -0.5516 +vn 0.8672 0.2565 -0.4268 +vn 0.9229 0.2722 -0.2722 +vn 0.7007 0.3472 -0.6233 +vn 0.7619 0.3768 -0.5267 +vn 0.8201 0.4046 -0.4046 +vn 0.8672 0.4268 -0.2565 +vn 0.6627 0.4601 -0.5908 +vn 0.7142 0.4949 -0.4949 +vn 0.7619 0.5267 -0.3768 +vn 0.7997 0.5516 -0.2371 +vn 0.6207 0.5544 -0.5544 +vn 0.6627 0.5908 -0.4601 +vn 0.7007 0.6233 -0.3472 +vn 0.7301 0.6480 -0.2169 +vn 0.7463 -0.6615 -0.0738 +vn 0.8209 -0.5653 -0.0811 +vn 0.8941 -0.4392 -0.0881 +vn 0.9551 -0.2812 -0.0939 +vn 0.6207 -0.5544 -0.5544 +vn 0.6627 -0.5908 -0.4601 +vn 0.7007 -0.6233 -0.3472 +vn 0.7301 -0.6480 -0.2169 +vn 0.6627 -0.4601 -0.5908 +vn 0.7142 -0.4949 -0.4949 +vn 0.7619 -0.5267 -0.3768 +vn 0.7997 -0.5516 -0.2371 +vn 0.7007 -0.3472 -0.6233 +vn 0.7619 -0.3768 -0.5267 +vn 0.8201 -0.4046 -0.4046 +vn 0.8672 -0.4268 -0.2565 +vn 0.7301 -0.2169 -0.6480 +vn 0.7997 -0.2371 -0.5516 +vn 0.8672 -0.2565 -0.4268 +vn 0.9229 -0.2722 -0.2722 +vn 0.7463 -0.0738 -0.6615 +vn 0.8209 -0.0811 -0.5653 +vn 0.8941 -0.0881 -0.4392 +vn 0.9551 -0.0939 -0.2812 +vn 0.6207 -0.5544 0.5544 +vn 0.6627 -0.4601 0.5908 +vn 0.7007 -0.3472 0.6233 +vn 0.7301 -0.2169 0.6480 +vn 0.7463 -0.6615 0.0738 +vn 0.7301 -0.6480 0.2169 +vn 0.7007 -0.6233 0.3472 +vn 0.6627 -0.5908 0.4601 +vn 0.8209 -0.5653 0.0811 +vn 0.7997 -0.5516 0.2371 +vn 0.7619 -0.5267 0.3768 +vn 0.7142 -0.4949 0.4949 +vn 0.8941 -0.4392 0.0881 +vn 0.8672 -0.4268 0.2565 +vn 0.8201 -0.4046 0.4046 +vn 0.7619 -0.3768 0.5267 +vn 0.9551 -0.2812 0.0939 +vn 0.9229 -0.2722 0.2722 +vn 0.8672 -0.2565 0.4268 +vn 0.7997 -0.2371 0.5516 +vn 0.9905 -0.0971 0.0971 +vn 0.9551 -0.0939 0.2812 +vn 0.8941 -0.0881 0.4392 +vn 0.8209 -0.0811 0.5653 +vn -0.0971 0.0971 -0.9905 +vn -0.0939 0.2812 -0.9551 +vn -0.0881 0.4392 -0.8941 +vn -0.0811 0.5653 -0.8209 +vn -0.6615 0.0738 -0.7463 +vn -0.5653 0.0811 -0.8209 +vn -0.4392 0.0881 -0.8941 +vn -0.2812 0.0939 -0.9551 +vn -0.6480 0.2169 -0.7301 +vn -0.5516 0.2371 -0.7997 +vn -0.4268 0.2565 -0.8672 +vn -0.2722 0.2722 -0.9229 +vn -0.6233 0.3472 -0.7007 +vn -0.5267 0.3768 -0.7619 +vn -0.4046 0.4046 -0.8201 +vn -0.2565 0.4268 -0.8672 +vn -0.5908 0.4601 -0.6627 +vn -0.4949 0.4949 -0.7142 +vn -0.3768 0.5267 -0.7619 +vn -0.2371 0.5516 -0.7997 +vn -0.5544 0.5544 -0.6207 +vn -0.4601 0.5908 -0.6627 +vn -0.3472 0.6233 -0.7007 +vn -0.2169 0.6480 -0.7301 +vn -0.0738 -0.6615 -0.7463 +vn -0.0811 -0.5653 -0.8209 +vn -0.0881 -0.4392 -0.8941 +vn -0.0939 -0.2812 -0.9551 +vn -0.5544 -0.5544 -0.6207 +vn -0.4601 -0.5908 -0.6627 +vn -0.3472 -0.6233 -0.7007 +vn -0.2169 -0.6480 -0.7301 +vn -0.5908 -0.4601 -0.6627 +vn -0.4949 -0.4949 -0.7142 +vn -0.3768 -0.5267 -0.7619 +vn -0.2371 -0.5516 -0.7997 +vn -0.6233 -0.3472 -0.7007 +vn -0.5267 -0.3768 -0.7619 +vn -0.4046 -0.4046 -0.8201 +vn -0.2565 -0.4268 -0.8672 +vn -0.6480 -0.2169 -0.7301 +vn -0.5516 -0.2371 -0.7997 +vn -0.4268 -0.2565 -0.8672 +vn -0.2722 -0.2722 -0.9229 +vn -0.6615 -0.0738 -0.7463 +vn -0.5653 -0.0811 -0.8209 +vn -0.4392 -0.0881 -0.8941 +vn -0.2812 -0.0939 -0.9551 +vn 0.5544 -0.5544 -0.6207 +vn 0.5908 -0.4601 -0.6627 +vn 0.6233 -0.3472 -0.7007 +vn 0.6480 -0.2169 -0.7301 +vn 0.0738 -0.6615 -0.7463 +vn 0.2169 -0.6480 -0.7301 +vn 0.3472 -0.6233 -0.7007 +vn 0.4601 -0.5908 -0.6627 +vn 0.0811 -0.5653 -0.8209 +vn 0.2371 -0.5516 -0.7997 +vn 0.3768 -0.5267 -0.7619 +vn 0.4949 -0.4949 -0.7142 +vn 0.0881 -0.4392 -0.8941 +vn 0.2565 -0.4268 -0.8672 +vn 0.4046 -0.4046 -0.8201 +vn 0.5267 -0.3768 -0.7619 +vn 0.0939 -0.2812 -0.9551 +vn 0.2722 -0.2722 -0.9229 +vn 0.4268 -0.2565 -0.8672 +vn 0.5516 -0.2371 -0.7997 +vn 0.0971 -0.0971 -0.9905 +vn 0.2812 -0.0939 -0.9551 +vn 0.4392 -0.0881 -0.8941 +vn 0.5653 -0.0811 -0.8209 +vn 0.6615 0.0738 -0.7463 +vn 0.6480 0.2169 -0.7301 +vn 0.6233 0.3472 -0.7007 +vn 0.5908 0.4601 -0.6627 +vn 0.0971 0.0971 -0.9905 +vn 0.2812 0.0939 -0.9551 +vn 0.4392 0.0881 -0.8941 +vn 0.5653 0.0811 -0.8209 +vn 0.0939 0.2812 -0.9551 +vn 0.2722 0.2722 -0.9229 +vn 0.4268 0.2565 -0.8672 +vn 0.5516 0.2371 -0.7997 +vn 0.0881 0.4392 -0.8941 +vn 0.2565 0.4268 -0.8672 +vn 0.4046 0.4046 -0.8201 +vn 0.5267 0.3768 -0.7619 +vn 0.0811 0.5653 -0.8209 +vn 0.2371 0.5516 -0.7997 +vn 0.3768 0.5267 -0.7619 +vn 0.4949 0.4949 -0.7142 +vn 0.0738 0.6615 -0.7463 +vn 0.2169 0.6480 -0.7301 +vn 0.3472 0.6233 -0.7007 +vn 0.4601 0.5908 -0.6627 +vn 0.7463 0.0738 0.6615 +vn 0.7301 0.2169 0.6480 +vn 0.7007 0.3472 0.6233 +vn 0.6627 0.4601 0.5908 +vn 0.9905 0.0971 0.0971 +vn 0.9551 0.0939 0.2812 +vn 0.8941 0.0881 0.4392 +vn 0.8209 0.0811 0.5653 +vn 0.9551 0.2812 0.0939 +vn 0.9229 0.2722 0.2722 +vn 0.8672 0.2565 0.4268 +vn 0.7997 0.2371 0.5516 +vn 0.8941 0.4392 0.0881 +vn 0.8672 0.4268 0.2565 +vn 0.8201 0.4046 0.4046 +vn 0.7619 0.3768 0.5267 +vn 0.8209 0.5653 0.0811 +vn 0.7997 0.5516 0.2371 +vn 0.7619 0.5267 0.3768 +vn 0.7142 0.4949 0.4949 +vn 0.7463 0.6615 0.0738 +vn 0.7301 0.6480 0.2169 +vn 0.7007 0.6233 0.3472 +vn 0.6627 0.5908 0.4601 +vn 0.0738 -0.7463 0.6615 +vn 0.2169 -0.7301 0.6480 +vn 0.3472 -0.7007 0.6233 +vn 0.4601 -0.6627 0.5908 +vn 0.0971 -0.9905 0.0971 +vn 0.0939 -0.9550 0.2812 +vn 0.0881 -0.8941 0.4392 +vn 0.0811 -0.8209 0.5653 +vn 0.2812 -0.9550 0.0939 +vn 0.2722 -0.9229 0.2722 +vn 0.2565 -0.8672 0.4268 +vn 0.2371 -0.7997 0.5516 +vn 0.4392 -0.8941 0.0881 +vn 0.4268 -0.8672 0.2565 +vn 0.4046 -0.8201 0.4046 +vn 0.3768 -0.7619 0.5267 +vn 0.5653 -0.8209 0.0811 +vn 0.5516 -0.7997 0.2371 +vn 0.5267 -0.7619 0.3768 +vn 0.4949 -0.7142 0.4949 +vn 0.6615 -0.7463 0.0738 +vn 0.6480 -0.7301 0.2169 +vn 0.6233 -0.7007 0.3472 +vn 0.5908 -0.6627 0.4601 +vn -0.7463 0.0738 -0.6615 +vn -0.7301 0.2169 -0.6480 +vn -0.7007 0.3472 -0.6233 +vn -0.6627 0.4601 -0.5908 +vn -0.9905 0.0971 -0.0971 +vn -0.9551 0.0939 -0.2812 +vn -0.8941 0.0881 -0.4392 +vn -0.8209 0.0811 -0.5653 +vn -0.9551 0.2812 -0.0939 +vn -0.9229 0.2722 -0.2722 +vn -0.8672 0.2565 -0.4268 +vn -0.7997 0.2371 -0.5516 +vn -0.8941 0.4392 -0.0881 +vn -0.8672 0.4268 -0.2565 +vn -0.8201 0.4046 -0.4046 +vn -0.7619 0.3768 -0.5267 +vn -0.8209 0.5653 -0.0811 +vn -0.7997 0.5516 -0.2371 +vn -0.7619 0.5267 -0.3768 +vn -0.7142 0.4949 -0.4949 +vn -0.7463 0.6615 -0.0738 +vn -0.7301 0.6480 -0.2169 +vn -0.7007 0.6233 -0.3472 +vn -0.6627 0.5908 -0.4601 +vn -0.6615 0.0738 0.7463 +vn -0.6480 0.2169 0.7301 +vn -0.6233 0.3472 0.7007 +vn -0.5908 0.4601 0.6627 +vn -0.0971 0.0971 0.9905 +vn -0.2812 0.0939 0.9551 +vn -0.4392 0.0881 0.8941 +vn -0.5653 0.0811 0.8209 +vn -0.0939 0.2812 0.9551 +vn -0.2722 0.2722 0.9229 +vn -0.4268 0.2565 0.8672 +vn -0.5516 0.2371 0.7997 +vn -0.0881 0.4392 0.8941 +vn -0.2565 0.4268 0.8672 +vn -0.4046 0.4046 0.8201 +vn -0.5267 0.3768 0.7619 +vn -0.0811 0.5653 0.8209 +vn -0.2371 0.5516 0.7997 +vn -0.3768 0.5267 0.7619 +vn -0.4949 0.4949 0.7142 +vn -0.0738 0.6615 0.7463 +vn -0.2169 0.6480 0.7301 +vn -0.3472 0.6233 0.7007 +vn -0.4601 0.5908 0.6627 +vn -0.0738 0.7463 0.6615 +vn -0.2169 0.7301 0.6480 +vn -0.3472 0.7007 0.6233 +vn -0.4601 0.6627 0.5908 +vn -0.0971 0.9905 0.0971 +vn -0.0939 0.9550 0.2812 +vn -0.0881 0.8941 0.4392 +vn -0.0811 0.8209 0.5653 +vn -0.2812 0.9550 0.0939 +vn -0.2722 0.9229 0.2722 +vn -0.2565 0.8672 0.4268 +vn -0.2371 0.7997 0.5516 +vn -0.4392 0.8941 0.0881 +vn -0.4268 0.8672 0.2565 +vn -0.4046 0.8201 0.4046 +vn -0.3768 0.7619 0.5267 +vn -0.5653 0.8209 0.0811 +vn -0.5516 0.7997 0.2371 +vn -0.5267 0.7619 0.3768 +vn -0.4949 0.7142 0.4949 +vn -0.6615 0.7463 0.0738 +vn -0.6480 0.7301 0.2169 +vn -0.6233 0.7007 0.3472 +vn -0.5908 0.6627 0.4601 +vt 0.850000 0.725000 +vt 0.875000 0.725000 +vt 0.875000 0.750000 +vt 0.850000 0.750000 +vt 0.600000 0.975000 +vt 0.625000 0.975000 +vt 0.625000 1.000000 +vt 0.600000 1.000000 +vt 0.600000 0.225000 +vt 0.625000 0.225000 +vt 0.625000 0.250000 +vt 0.600000 0.250000 +vt 0.350000 0.725000 +vt 0.375000 0.725000 +vt 0.375000 0.750000 +vt 0.350000 0.750000 +vt 0.600000 0.725000 +vt 0.625000 0.725000 +vt 0.625000 0.750000 +vt 0.600000 0.750000 +vt 0.600000 0.475000 +vt 0.625000 0.475000 +vt 0.625000 0.500000 +vt 0.600000 0.500000 +vt 0.475000 0.475000 +vt 0.500000 0.475000 +vt 0.500000 0.500000 +vt 0.475000 0.500000 +vt 0.475000 0.350000 +vt 0.500000 0.350000 +vt 0.500000 0.375000 +vt 0.475000 0.375000 +vt 0.600000 0.350000 +vt 0.625000 0.350000 +vt 0.625000 0.375000 +vt 0.600000 0.375000 +vt 0.475000 0.725000 +vt 0.500000 0.725000 +vt 0.500000 0.750000 +vt 0.475000 0.750000 +vt 0.475000 0.600000 +vt 0.500000 0.600000 +vt 0.500000 0.625000 +vt 0.475000 0.625000 +vt 0.600000 0.600000 +vt 0.625000 0.600000 +vt 0.625000 0.625000 +vt 0.600000 0.625000 +vt 0.225000 0.725000 +vt 0.250000 0.725000 +vt 0.250000 0.750000 +vt 0.225000 0.750000 +vt 0.225000 0.600000 +vt 0.250000 0.600000 +vt 0.250000 0.625000 +vt 0.225000 0.625000 +vt 0.350000 0.600000 +vt 0.375000 0.600000 +vt 0.375000 0.625000 +vt 0.350000 0.625000 +vt 0.475000 0.225000 +vt 0.500000 0.225000 +vt 0.500000 0.250000 +vt 0.475000 0.250000 +vt 0.475000 0.100000 +vt 0.500000 0.100000 +vt 0.500000 0.125000 +vt 0.475000 0.125000 +vt 0.600000 0.100000 +vt 0.625000 0.100000 +vt 0.625000 0.125000 +vt 0.600000 0.125000 +vt 0.475000 0.975000 +vt 0.500000 0.975000 +vt 0.500000 1.000000 +vt 0.475000 1.000000 +vt 0.475000 0.850000 +vt 0.500000 0.850000 +vt 0.500000 0.875000 +vt 0.475000 0.875000 +vt 0.600000 0.850000 +vt 0.625000 0.850000 +vt 0.625000 0.875000 +vt 0.600000 0.875000 +vt 0.725000 0.725000 +vt 0.750000 0.725000 +vt 0.750000 0.750000 +vt 0.725000 0.750000 +vt 0.725000 0.600000 +vt 0.750000 0.600000 +vt 0.750000 0.625000 +vt 0.725000 0.625000 +vt 0.850000 0.600000 +vt 0.875000 0.600000 +vt 0.875000 0.625000 +vt 0.850000 0.625000 +vt 0.775000 0.600000 +vt 0.775000 0.625000 +vt 0.800000 0.600000 +vt 0.800000 0.625000 +vt 0.825000 0.600000 +vt 0.825000 0.625000 +vt 0.750000 0.500000 +vt 0.775000 0.500000 +vt 0.775000 0.525000 +vt 0.750000 0.525000 +vt 0.775000 0.550000 +vt 0.750000 0.550000 +vt 0.775000 0.575000 +vt 0.750000 0.575000 +vt 0.800000 0.500000 +vt 0.800000 0.525000 +vt 0.800000 0.550000 +vt 0.800000 0.575000 +vt 0.825000 0.500000 +vt 0.825000 0.525000 +vt 0.825000 0.550000 +vt 0.825000 0.575000 +vt 0.850000 0.500000 +vt 0.850000 0.525000 +vt 0.850000 0.550000 +vt 0.850000 0.575000 +vt 0.875000 0.500000 +vt 0.875000 0.525000 +vt 0.875000 0.550000 +vt 0.875000 0.575000 +vt 0.650000 0.600000 +vt 0.650000 0.625000 +vt 0.675000 0.600000 +vt 0.675000 0.625000 +vt 0.700000 0.600000 +vt 0.700000 0.625000 +vt 0.650000 0.500000 +vt 0.650000 0.525000 +vt 0.625000 0.525000 +vt 0.650000 0.550000 +vt 0.625000 0.550000 +vt 0.650000 0.575000 +vt 0.625000 0.575000 +vt 0.675000 0.500000 +vt 0.675000 0.525000 +vt 0.675000 0.550000 +vt 0.675000 0.575000 +vt 0.700000 0.500000 +vt 0.700000 0.525000 +vt 0.700000 0.550000 +vt 0.700000 0.575000 +vt 0.725000 0.500000 +vt 0.725000 0.525000 +vt 0.725000 0.550000 +vt 0.725000 0.575000 +vt 0.650000 0.725000 +vt 0.650000 0.750000 +vt 0.675000 0.725000 +vt 0.675000 0.750000 +vt 0.700000 0.725000 +vt 0.700000 0.750000 +vt 0.650000 0.650000 +vt 0.625000 0.650000 +vt 0.650000 0.675000 +vt 0.625000 0.675000 +vt 0.650000 0.700000 +vt 0.625000 0.700000 +vt 0.675000 0.650000 +vt 0.675000 0.675000 +vt 0.675000 0.700000 +vt 0.700000 0.650000 +vt 0.700000 0.675000 +vt 0.700000 0.700000 +vt 0.725000 0.650000 +vt 0.725000 0.675000 +vt 0.725000 0.700000 +vt 0.750000 0.650000 +vt 0.750000 0.675000 +vt 0.750000 0.700000 +vt 0.525000 0.850000 +vt 0.525000 0.875000 +vt 0.550000 0.850000 +vt 0.550000 0.875000 +vt 0.575000 0.850000 +vt 0.575000 0.875000 +vt 0.525000 0.750000 +vt 0.525000 0.775000 +vt 0.500000 0.775000 +vt 0.525000 0.800000 +vt 0.500000 0.800000 +vt 0.525000 0.825000 +vt 0.500000 0.825000 +vt 0.550000 0.750000 +vt 0.550000 0.775000 +vt 0.550000 0.800000 +vt 0.550000 0.825000 +vt 0.575000 0.750000 +vt 0.575000 0.775000 +vt 0.575000 0.800000 +vt 0.575000 0.825000 +vt 0.600000 0.775000 +vt 0.600000 0.800000 +vt 0.600000 0.825000 +vt 0.625000 0.775000 +vt 0.625000 0.800000 +vt 0.625000 0.825000 +vt 0.375000 0.850000 +vt 0.400000 0.850000 +vt 0.400000 0.875000 +vt 0.375000 0.875000 +vt 0.425000 0.850000 +vt 0.425000 0.875000 +vt 0.450000 0.850000 +vt 0.450000 0.875000 +vt 0.400000 0.750000 +vt 0.400000 0.775000 +vt 0.375000 0.775000 +vt 0.400000 0.800000 +vt 0.375000 0.800000 +vt 0.400000 0.825000 +vt 0.375000 0.825000 +vt 0.425000 0.750000 +vt 0.425000 0.775000 +vt 0.425000 0.800000 +vt 0.425000 0.825000 +vt 0.450000 0.750000 +vt 0.450000 0.775000 +vt 0.450000 0.800000 +vt 0.450000 0.825000 +vt 0.475000 0.775000 +vt 0.475000 0.800000 +vt 0.475000 0.825000 +vt 0.375000 0.975000 +vt 0.400000 0.975000 +vt 0.400000 1.000000 +vt 0.375000 1.000000 +vt 0.425000 0.975000 +vt 0.425000 1.000000 +vt 0.450000 0.975000 +vt 0.450000 1.000000 +vt 0.400000 0.900000 +vt 0.375000 0.900000 +vt 0.400000 0.925000 +vt 0.375000 0.925000 +vt 0.400000 0.950000 +vt 0.375000 0.950000 +vt 0.425000 0.900000 +vt 0.425000 0.925000 +vt 0.425000 0.950000 +vt 0.450000 0.900000 +vt 0.450000 0.925000 +vt 0.450000 0.950000 +vt 0.475000 0.900000 +vt 0.475000 0.925000 +vt 0.475000 0.950000 +vt 0.500000 0.900000 +vt 0.500000 0.925000 +vt 0.500000 0.950000 +vt 0.525000 0.100000 +vt 0.525000 0.125000 +vt 0.550000 0.100000 +vt 0.550000 0.125000 +vt 0.575000 0.100000 +vt 0.575000 0.125000 +vt 0.500000 0.000000 +vt 0.525000 0.000000 +vt 0.525000 0.025000 +vt 0.500000 0.025000 +vt 0.525000 0.050000 +vt 0.500000 0.050000 +vt 0.525000 0.075000 +vt 0.500000 0.075000 +vt 0.550000 0.000000 +vt 0.550000 0.025000 +vt 0.550000 0.050000 +vt 0.550000 0.075000 +vt 0.575000 0.000000 +vt 0.575000 0.025000 +vt 0.575000 0.050000 +vt 0.575000 0.075000 +vt 0.600000 0.000000 +vt 0.600000 0.025000 +vt 0.600000 0.050000 +vt 0.600000 0.075000 +vt 0.625000 0.000000 +vt 0.625000 0.025000 +vt 0.625000 0.050000 +vt 0.625000 0.075000 +vt 0.375000 0.100000 +vt 0.400000 0.100000 +vt 0.400000 0.125000 +vt 0.375000 0.125000 +vt 0.425000 0.100000 +vt 0.425000 0.125000 +vt 0.450000 0.100000 +vt 0.450000 0.125000 +vt 0.375000 0.000000 +vt 0.400000 0.000000 +vt 0.400000 0.025000 +vt 0.375000 0.025000 +vt 0.400000 0.050000 +vt 0.375000 0.050000 +vt 0.400000 0.075000 +vt 0.375000 0.075000 +vt 0.425000 0.000000 +vt 0.425000 0.025000 +vt 0.425000 0.050000 +vt 0.425000 0.075000 +vt 0.450000 0.000000 +vt 0.450000 0.025000 +vt 0.450000 0.050000 +vt 0.450000 0.075000 +vt 0.475000 0.000000 +vt 0.475000 0.025000 +vt 0.475000 0.050000 +vt 0.475000 0.075000 +vt 0.375000 0.225000 +vt 0.400000 0.225000 +vt 0.400000 0.250000 +vt 0.375000 0.250000 +vt 0.425000 0.225000 +vt 0.425000 0.250000 +vt 0.450000 0.225000 +vt 0.450000 0.250000 +vt 0.400000 0.150000 +vt 0.375000 0.150000 +vt 0.400000 0.175000 +vt 0.375000 0.175000 +vt 0.400000 0.200000 +vt 0.375000 0.200000 +vt 0.425000 0.150000 +vt 0.425000 0.175000 +vt 0.425000 0.200000 +vt 0.450000 0.150000 +vt 0.450000 0.175000 +vt 0.450000 0.200000 +vt 0.475000 0.150000 +vt 0.475000 0.175000 +vt 0.475000 0.200000 +vt 0.500000 0.150000 +vt 0.500000 0.175000 +vt 0.500000 0.200000 +vt 0.275000 0.600000 +vt 0.275000 0.625000 +vt 0.300000 0.600000 +vt 0.300000 0.625000 +vt 0.325000 0.600000 +vt 0.325000 0.625000 +vt 0.250000 0.500000 +vt 0.275000 0.500000 +vt 0.275000 0.525000 +vt 0.250000 0.525000 +vt 0.275000 0.550000 +vt 0.250000 0.550000 +vt 0.275000 0.575000 +vt 0.250000 0.575000 +vt 0.300000 0.500000 +vt 0.300000 0.525000 +vt 0.300000 0.550000 +vt 0.300000 0.575000 +vt 0.325000 0.500000 +vt 0.325000 0.525000 +vt 0.325000 0.550000 +vt 0.325000 0.575000 +vt 0.350000 0.500000 +vt 0.350000 0.525000 +vt 0.350000 0.550000 +vt 0.350000 0.575000 +vt 0.375000 0.500000 +vt 0.375000 0.525000 +vt 0.375000 0.550000 +vt 0.375000 0.575000 +vt 0.125000 0.600000 +vt 0.150000 0.600000 +vt 0.150000 0.625000 +vt 0.125000 0.625000 +vt 0.175000 0.600000 +vt 0.175000 0.625000 +vt 0.200000 0.600000 +vt 0.200000 0.625000 +vt 0.125000 0.500000 +vt 0.150000 0.500000 +vt 0.150000 0.525000 +vt 0.125000 0.525000 +vt 0.150000 0.550000 +vt 0.125000 0.550000 +vt 0.150000 0.575000 +vt 0.125000 0.575000 +vt 0.175000 0.500000 +vt 0.175000 0.525000 +vt 0.175000 0.550000 +vt 0.175000 0.575000 +vt 0.200000 0.500000 +vt 0.200000 0.525000 +vt 0.200000 0.550000 +vt 0.200000 0.575000 +vt 0.225000 0.500000 +vt 0.225000 0.525000 +vt 0.225000 0.550000 +vt 0.225000 0.575000 +vt 0.125000 0.725000 +vt 0.150000 0.725000 +vt 0.150000 0.750000 +vt 0.125000 0.750000 +vt 0.175000 0.725000 +vt 0.175000 0.750000 +vt 0.200000 0.725000 +vt 0.200000 0.750000 +vt 0.150000 0.650000 +vt 0.125000 0.650000 +vt 0.150000 0.675000 +vt 0.125000 0.675000 +vt 0.150000 0.700000 +vt 0.125000 0.700000 +vt 0.175000 0.650000 +vt 0.175000 0.675000 +vt 0.175000 0.700000 +vt 0.200000 0.650000 +vt 0.200000 0.675000 +vt 0.200000 0.700000 +vt 0.225000 0.650000 +vt 0.225000 0.675000 +vt 0.225000 0.700000 +vt 0.250000 0.650000 +vt 0.250000 0.675000 +vt 0.250000 0.700000 +vt 0.525000 0.600000 +vt 0.525000 0.625000 +vt 0.550000 0.600000 +vt 0.550000 0.625000 +vt 0.575000 0.600000 +vt 0.575000 0.625000 +vt 0.525000 0.500000 +vt 0.525000 0.525000 +vt 0.500000 0.525000 +vt 0.525000 0.550000 +vt 0.500000 0.550000 +vt 0.525000 0.575000 +vt 0.500000 0.575000 +vt 0.550000 0.500000 +vt 0.550000 0.525000 +vt 0.550000 0.550000 +vt 0.550000 0.575000 +vt 0.575000 0.500000 +vt 0.575000 0.525000 +vt 0.575000 0.550000 +vt 0.575000 0.575000 +vt 0.600000 0.525000 +vt 0.600000 0.550000 +vt 0.600000 0.575000 +vt 0.400000 0.600000 +vt 0.400000 0.625000 +vt 0.425000 0.600000 +vt 0.425000 0.625000 +vt 0.450000 0.600000 +vt 0.450000 0.625000 +vt 0.400000 0.500000 +vt 0.400000 0.525000 +vt 0.400000 0.550000 +vt 0.400000 0.575000 +vt 0.425000 0.500000 +vt 0.425000 0.525000 +vt 0.425000 0.550000 +vt 0.425000 0.575000 +vt 0.450000 0.500000 +vt 0.450000 0.525000 +vt 0.450000 0.550000 +vt 0.450000 0.575000 +vt 0.475000 0.525000 +vt 0.475000 0.550000 +vt 0.475000 0.575000 +vt 0.400000 0.725000 +vt 0.425000 0.725000 +vt 0.450000 0.725000 +vt 0.400000 0.650000 +vt 0.375000 0.650000 +vt 0.400000 0.675000 +vt 0.375000 0.675000 +vt 0.400000 0.700000 +vt 0.375000 0.700000 +vt 0.425000 0.650000 +vt 0.425000 0.675000 +vt 0.425000 0.700000 +vt 0.450000 0.650000 +vt 0.450000 0.675000 +vt 0.450000 0.700000 +vt 0.475000 0.650000 +vt 0.475000 0.675000 +vt 0.475000 0.700000 +vt 0.500000 0.650000 +vt 0.500000 0.675000 +vt 0.500000 0.700000 +vt 0.525000 0.350000 +vt 0.525000 0.375000 +vt 0.550000 0.350000 +vt 0.550000 0.375000 +vt 0.575000 0.350000 +vt 0.575000 0.375000 +vt 0.525000 0.250000 +vt 0.525000 0.275000 +vt 0.500000 0.275000 +vt 0.525000 0.300000 +vt 0.500000 0.300000 +vt 0.525000 0.325000 +vt 0.500000 0.325000 +vt 0.550000 0.250000 +vt 0.550000 0.275000 +vt 0.550000 0.300000 +vt 0.550000 0.325000 +vt 0.575000 0.250000 +vt 0.575000 0.275000 +vt 0.575000 0.300000 +vt 0.575000 0.325000 +vt 0.600000 0.275000 +vt 0.600000 0.300000 +vt 0.600000 0.325000 +vt 0.625000 0.275000 +vt 0.625000 0.300000 +vt 0.625000 0.325000 +vt 0.375000 0.350000 +vt 0.400000 0.350000 +vt 0.400000 0.375000 +vt 0.375000 0.375000 +vt 0.425000 0.350000 +vt 0.425000 0.375000 +vt 0.450000 0.350000 +vt 0.450000 0.375000 +vt 0.400000 0.275000 +vt 0.375000 0.275000 +vt 0.400000 0.300000 +vt 0.375000 0.300000 +vt 0.400000 0.325000 +vt 0.375000 0.325000 +vt 0.425000 0.275000 +vt 0.425000 0.300000 +vt 0.425000 0.325000 +vt 0.450000 0.275000 +vt 0.450000 0.300000 +vt 0.450000 0.325000 +vt 0.475000 0.275000 +vt 0.475000 0.300000 +vt 0.475000 0.325000 +vt 0.375000 0.475000 +vt 0.400000 0.475000 +vt 0.425000 0.475000 +vt 0.450000 0.475000 +vt 0.400000 0.400000 +vt 0.375000 0.400000 +vt 0.400000 0.425000 +vt 0.375000 0.425000 +vt 0.400000 0.450000 +vt 0.375000 0.450000 +vt 0.425000 0.400000 +vt 0.425000 0.425000 +vt 0.425000 0.450000 +vt 0.450000 0.400000 +vt 0.450000 0.425000 +vt 0.450000 0.450000 +vt 0.475000 0.400000 +vt 0.475000 0.425000 +vt 0.475000 0.450000 +vt 0.500000 0.400000 +vt 0.500000 0.425000 +vt 0.500000 0.450000 +vt 0.525000 0.475000 +vt 0.550000 0.475000 +vt 0.575000 0.475000 +vt 0.525000 0.400000 +vt 0.525000 0.425000 +vt 0.525000 0.450000 +vt 0.550000 0.400000 +vt 0.550000 0.425000 +vt 0.550000 0.450000 +vt 0.575000 0.400000 +vt 0.575000 0.425000 +vt 0.575000 0.450000 +vt 0.600000 0.400000 +vt 0.600000 0.425000 +vt 0.600000 0.450000 +vt 0.625000 0.400000 +vt 0.625000 0.425000 +vt 0.625000 0.450000 +vt 0.525000 0.725000 +vt 0.550000 0.725000 +vt 0.575000 0.725000 +vt 0.525000 0.650000 +vt 0.525000 0.675000 +vt 0.525000 0.700000 +vt 0.550000 0.650000 +vt 0.550000 0.675000 +vt 0.550000 0.700000 +vt 0.575000 0.650000 +vt 0.575000 0.675000 +vt 0.575000 0.700000 +vt 0.600000 0.650000 +vt 0.600000 0.675000 +vt 0.600000 0.700000 +vt 0.275000 0.725000 +vt 0.275000 0.750000 +vt 0.300000 0.725000 +vt 0.300000 0.750000 +vt 0.325000 0.725000 +vt 0.325000 0.750000 +vt 0.275000 0.650000 +vt 0.275000 0.675000 +vt 0.275000 0.700000 +vt 0.300000 0.650000 +vt 0.300000 0.675000 +vt 0.300000 0.700000 +vt 0.325000 0.650000 +vt 0.325000 0.675000 +vt 0.325000 0.700000 +vt 0.350000 0.650000 +vt 0.350000 0.675000 +vt 0.350000 0.700000 +vt 0.525000 0.225000 +vt 0.550000 0.225000 +vt 0.575000 0.225000 +vt 0.525000 0.150000 +vt 0.525000 0.175000 +vt 0.525000 0.200000 +vt 0.550000 0.150000 +vt 0.550000 0.175000 +vt 0.550000 0.200000 +vt 0.575000 0.150000 +vt 0.575000 0.175000 +vt 0.575000 0.200000 +vt 0.600000 0.150000 +vt 0.600000 0.175000 +vt 0.600000 0.200000 +vt 0.625000 0.150000 +vt 0.625000 0.175000 +vt 0.625000 0.200000 +vt 0.525000 0.975000 +vt 0.525000 1.000000 +vt 0.550000 0.975000 +vt 0.550000 1.000000 +vt 0.575000 0.975000 +vt 0.575000 1.000000 +vt 0.525000 0.900000 +vt 0.525000 0.925000 +vt 0.525000 0.950000 +vt 0.550000 0.900000 +vt 0.550000 0.925000 +vt 0.550000 0.950000 +vt 0.575000 0.900000 +vt 0.575000 0.925000 +vt 0.575000 0.950000 +vt 0.600000 0.900000 +vt 0.600000 0.925000 +vt 0.600000 0.950000 +vt 0.625000 0.900000 +vt 0.625000 0.925000 +vt 0.625000 0.950000 +vt 0.775000 0.725000 +vt 0.775000 0.750000 +vt 0.800000 0.725000 +vt 0.800000 0.750000 +vt 0.825000 0.725000 +vt 0.825000 0.750000 +vt 0.775000 0.650000 +vt 0.775000 0.675000 +vt 0.775000 0.700000 +vt 0.800000 0.650000 +vt 0.800000 0.675000 +vt 0.800000 0.700000 +vt 0.825000 0.650000 +vt 0.825000 0.675000 +vt 0.825000 0.700000 +vt 0.850000 0.650000 +vt 0.850000 0.675000 +vt 0.850000 0.700000 +vt 0.875000 0.650000 +vt 0.875000 0.675000 +vt 0.875000 0.700000 +s 0 +usemtl Material +f 602/1/1 111/2/1 7/3/1 54/4/1 +f 586/5/2 54/6/2 7/7/2 42/8/2 +f 570/9/3 66/10/3 5/11/3 95/12/3 +f 554/13/4 119/14/4 4/15/4 62/16/4 +f 538/17/5 58/18/5 3/19/5 91/20/5 +f 522/21/6 70/22/6 1/23/6 83/24/6 +f 506/25/7 126/26/7 11/27/7 35/28/7 +f 490/29/8 130/30/8 21/31/8 131/32/8 +f 474/33/9 118/34/9 19/35/9 135/36/9 +f 458/37/10 142/38/10 13/39/10 43/40/10 +f 442/41/11 146/42/11 22/43/11 147/44/11 +f 426/45/12 106/46/12 16/47/12 151/48/12 +f 410/49/13 158/50/13 17/51/13 110/52/13 +f 394/53/14 162/54/14 23/55/14 163/56/14 +f 378/57/15 71/58/15 20/59/15 167/60/15 +f 362/61/16 174/62/16 14/63/16 47/64/16 +f 346/65/17 178/66/17 24/67/17 179/68/17 +f 330/69/18 114/70/18 18/71/18 183/72/18 +f 314/73/19 190/74/19 12/75/19 90/76/19 +f 298/77/20 194/78/20 25/79/20 195/80/20 +f 282/81/21 102/82/21 15/83/21 199/84/21 +f 266/85/22 206/86/22 15/87/22 102/88/22 +f 250/89/23 210/90/23 26/91/23 211/92/23 +f 234/93/24 63/94/24 18/95/24 215/96/24 +f 210/90/25 222/97/25 218/98/25 26/91/25 +f 222/97/26 226/99/26 217/100/26 218/98/26 +f 226/99/27 230/101/27 216/102/27 217/100/27 +f 230/101/28 234/93/28 215/96/28 216/102/28 +f 19/103/29 118/104/29 219/105/29 207/106/29 +f 207/106/30 219/105/30 220/107/30 208/108/30 +f 208/108/31 220/107/31 221/109/31 209/110/31 +f 209/110/32 221/109/32 222/97/32 210/90/32 +f 118/104/33 117/111/33 223/112/33 219/105/33 +f 219/105/34 223/112/34 224/113/34 220/107/34 +f 220/107/35 224/113/35 225/114/35 221/109/35 +f 221/109/36 225/114/36 226/99/36 222/97/36 +f 117/111/37 116/115/37 227/116/37 223/112/37 +f 223/112/38 227/116/38 228/117/38 224/113/38 +f 224/113/39 228/117/39 229/118/39 225/114/39 +f 225/114/40 229/118/40 230/101/40 226/99/40 +f 116/115/41 115/119/41 231/120/41 227/116/41 +f 227/116/42 231/120/42 232/121/42 228/117/42 +f 228/117/43 232/121/43 233/122/43 229/118/43 +f 229/118/44 233/122/44 234/93/44 230/101/44 +f 115/119/45 5/123/45 66/124/45 231/120/45 +f 231/120/46 66/124/46 65/125/46 232/121/46 +f 232/121/47 65/125/47 64/126/47 233/122/47 +f 233/122/48 64/126/48 63/94/48 234/93/48 +f 106/46/49 238/127/49 214/128/49 16/47/49 +f 238/127/50 242/129/50 213/130/50 214/128/50 +f 242/129/51 246/131/51 212/132/51 213/130/51 +f 246/131/52 250/89/52 211/92/52 212/132/52 +f 1/23/53 70/133/53 235/134/53 103/135/53 +f 103/135/54 235/134/54 236/136/54 104/137/54 +f 104/137/55 236/136/55 237/138/55 105/139/55 +f 105/139/56 237/138/56 238/127/56 106/46/56 +f 70/133/57 69/140/57 239/141/57 235/134/57 +f 235/134/58 239/141/58 240/142/58 236/136/58 +f 236/136/59 240/142/59 241/143/59 237/138/59 +f 237/138/60 241/143/60 242/129/60 238/127/60 +f 69/140/61 68/144/61 243/145/61 239/141/61 +f 239/141/62 243/145/62 244/146/62 240/142/62 +f 240/142/63 244/146/63 245/147/63 241/143/63 +f 241/143/64 245/147/64 246/131/64 242/129/64 +f 68/144/65 67/148/65 247/149/65 243/145/65 +f 243/145/66 247/149/66 248/150/66 244/146/66 +f 244/146/67 248/150/67 249/151/67 245/147/67 +f 245/147/68 249/151/68 250/89/68 246/131/68 +f 67/148/69 19/103/69 207/106/69 247/149/69 +f 247/149/70 207/106/70 208/108/70 248/150/70 +f 248/150/71 208/108/71 209/110/71 249/151/71 +f 249/151/72 209/110/72 210/90/72 250/89/72 +f 58/18/73 254/152/73 99/153/73 3/19/73 +f 254/152/74 258/154/74 100/155/74 99/153/74 +f 258/154/75 262/156/75 101/157/75 100/155/75 +f 262/156/76 266/85/76 102/88/76 101/157/76 +f 16/47/77 214/128/77 251/158/77 55/159/77 +f 55/159/78 251/158/78 252/160/78 56/161/78 +f 56/161/79 252/160/79 253/162/79 57/163/79 +f 57/163/80 253/162/80 254/152/80 58/18/80 +f 214/128/81 213/130/81 255/164/81 251/158/81 +f 251/158/82 255/164/82 256/165/82 252/160/82 +f 252/160/83 256/165/83 257/166/83 253/162/83 +f 253/162/84 257/166/84 258/154/84 254/152/84 +f 213/130/85 212/132/85 259/167/85 255/164/85 +f 255/164/86 259/167/86 260/168/86 256/165/86 +f 256/165/87 260/168/87 261/169/87 257/166/87 +f 257/166/88 261/169/88 262/156/88 258/154/88 +f 212/132/89 211/92/89 263/170/89 259/167/89 +f 259/167/90 263/170/90 264/171/90 260/168/90 +f 260/168/91 264/171/91 265/172/91 261/169/91 +f 261/169/92 265/172/92 266/85/92 262/156/92 +f 211/92/93 26/91/93 203/173/93 263/170/93 +f 263/170/94 203/173/94 204/174/94 264/171/94 +f 264/171/95 204/174/95 205/175/95 265/172/95 +f 265/172/96 205/175/96 206/86/96 266/85/96 +f 194/78/97 270/176/97 202/177/97 25/79/97 +f 270/176/98 274/178/98 201/179/98 202/177/98 +f 274/178/99 278/180/99 200/181/99 201/179/99 +f 278/180/100 282/81/100 199/84/100 200/181/100 +f 13/39/101 94/182/101 267/183/101 191/184/101 +f 191/184/102 267/183/102 268/185/102 192/186/102 +f 192/186/103 268/185/103 269/187/103 193/188/103 +f 193/188/104 269/187/104 270/176/104 194/78/104 +f 94/182/105 93/189/105 271/190/105 267/183/105 +f 267/183/106 271/190/106 272/191/106 268/185/106 +f 268/185/107 272/191/107 273/192/107 269/187/107 +f 269/187/108 273/192/108 274/178/108 270/176/108 +f 93/189/109 92/193/109 275/194/109 271/190/109 +f 271/190/110 275/194/110 276/195/110 272/191/110 +f 272/191/111 276/195/111 277/196/111 273/192/111 +f 273/192/112 277/196/112 278/180/112 274/178/112 +f 92/193/113 91/20/113 279/197/113 275/194/113 +f 275/194/114 279/197/114 280/198/114 276/195/114 +f 276/195/115 280/198/115 281/199/115 277/196/115 +f 277/196/116 281/199/116 282/81/116 278/180/116 +f 91/20/117 3/19/117 99/200/117 279/197/117 +f 279/197/118 99/200/118 100/201/118 280/198/118 +f 280/198/119 100/201/119 101/202/119 281/199/119 +f 281/199/120 101/202/120 102/82/120 282/81/120 +f 59/203/121 286/204/121 198/205/121 17/206/121 +f 286/204/122 290/207/122 197/208/122 198/205/122 +f 290/207/123 294/209/123 196/210/123 197/208/123 +f 294/209/124 298/77/124 195/80/124 196/210/124 +f 4/15/125 46/211/125 283/212/125 62/213/125 +f 62/213/126 283/212/126 284/214/126 61/215/126 +f 61/215/127 284/214/127 285/216/127 60/217/127 +f 60/217/128 285/216/128 286/204/128 59/203/128 +f 46/211/129 45/218/129 287/219/129 283/212/129 +f 283/212/130 287/219/130 288/220/130 284/214/130 +f 284/214/131 288/220/131 289/221/131 285/216/131 +f 285/216/132 289/221/132 290/207/132 286/204/132 +f 45/218/133 44/222/133 291/223/133 287/219/133 +f 287/219/134 291/223/134 292/224/134 288/220/134 +f 288/220/135 292/224/135 293/225/135 289/221/135 +f 289/221/136 293/225/136 294/209/136 290/207/136 +f 44/222/137 43/40/137 295/226/137 291/223/137 +f 291/223/138 295/226/138 296/227/138 292/224/138 +f 292/224/139 296/227/139 297/228/139 293/225/139 +f 293/225/140 297/228/140 298/77/140 294/209/140 +f 43/40/141 13/39/141 191/184/141 295/226/141 +f 295/226/142 191/184/142 192/186/142 296/227/142 +f 296/227/143 192/186/143 193/188/143 297/228/143 +f 297/228/144 193/188/144 194/78/144 298/77/144 +f 107/229/145 302/230/145 87/231/145 8/232/145 +f 302/230/146 306/233/146 88/234/146 87/231/146 +f 306/233/147 310/235/147 89/236/147 88/234/147 +f 310/235/148 314/73/148 90/76/148 89/236/148 +f 17/206/149 198/205/149 299/237/149 110/238/149 +f 110/238/150 299/237/150 300/239/150 109/240/150 +f 109/240/151 300/239/151 301/241/151 108/242/151 +f 108/242/152 301/241/152 302/230/152 107/229/152 +f 198/205/153 197/208/153 303/243/153 299/237/153 +f 299/237/154 303/243/154 304/244/154 300/239/154 +f 300/239/155 304/244/155 305/245/155 301/241/155 +f 301/241/156 305/245/156 306/233/156 302/230/156 +f 197/208/157 196/210/157 307/246/157 303/243/157 +f 303/243/158 307/246/158 308/247/158 304/244/158 +f 304/244/159 308/247/159 309/248/159 305/245/159 +f 305/245/160 309/248/160 310/235/160 306/233/160 +f 196/210/161 195/80/161 311/249/161 307/246/161 +f 307/246/162 311/249/162 312/250/162 308/247/162 +f 308/247/163 312/250/163 313/251/163 309/248/163 +f 309/248/164 313/251/164 314/73/164 310/235/164 +f 195/80/165 25/79/165 187/252/165 311/249/165 +f 311/249/166 187/252/166 188/253/166 312/250/166 +f 312/250/167 188/253/167 189/254/167 313/251/167 +f 313/251/168 189/254/168 190/74/168 314/73/168 +f 178/66/169 318/255/169 186/256/169 24/67/169 +f 318/255/170 322/257/170 185/258/170 186/256/170 +f 322/257/171 326/259/171 184/260/171 185/258/171 +f 326/259/172 330/69/172 183/72/172 184/260/172 +f 12/261/173 39/262/173 315/263/173 175/264/173 +f 175/264/174 315/263/174 316/265/174 176/266/174 +f 176/266/175 316/265/175 317/267/175 177/268/175 +f 177/268/176 317/267/176 318/255/176 178/66/176 +f 39/262/177 40/269/177 319/270/177 315/263/177 +f 315/263/178 319/270/178 320/271/178 316/265/178 +f 316/265/179 320/271/179 321/272/179 317/267/179 +f 317/267/180 321/272/180 322/257/180 318/255/180 +f 40/269/181 41/273/181 323/274/181 319/270/181 +f 319/270/182 323/274/182 324/275/182 320/271/182 +f 320/271/183 324/275/183 325/276/183 321/272/183 +f 321/272/184 325/276/184 326/259/184 322/257/184 +f 41/273/185 42/277/185 327/278/185 323/274/185 +f 323/274/186 327/278/186 328/279/186 324/275/186 +f 324/275/187 328/279/187 329/280/187 325/276/187 +f 325/276/188 329/280/188 330/69/188 326/259/188 +f 42/277/189 7/281/189 111/282/189 327/278/189 +f 327/278/190 111/282/190 112/283/190 328/279/190 +f 328/279/191 112/283/191 113/284/191 329/280/191 +f 329/280/192 113/284/192 114/70/192 330/69/192 +f 27/285/193 334/286/193 182/287/193 9/288/193 +f 334/286/194 338/289/194 181/290/194 182/287/194 +f 338/289/195 342/291/195 180/292/195 181/290/195 +f 342/291/196 346/65/196 179/68/196 180/292/196 +f 8/293/197 87/294/197 331/295/197 30/296/197 +f 30/296/198 331/295/198 332/297/198 29/298/198 +f 29/298/199 332/297/199 333/299/199 28/300/199 +f 28/300/200 333/299/200 334/286/200 27/285/200 +f 87/294/201 88/301/201 335/302/201 331/295/201 +f 331/295/202 335/302/202 336/303/202 332/297/202 +f 332/297/203 336/303/203 337/304/203 333/299/203 +f 333/299/204 337/304/204 338/289/204 334/286/204 +f 88/301/205 89/305/205 339/306/205 335/302/205 +f 335/302/206 339/306/206 340/307/206 336/303/206 +f 336/303/207 340/307/207 341/308/207 337/304/207 +f 337/304/208 341/308/208 342/291/208 338/289/208 +f 89/305/209 90/309/209 343/310/209 339/306/209 +f 339/306/210 343/310/210 344/311/210 340/307/210 +f 340/307/211 344/311/211 345/312/211 341/308/211 +f 341/308/212 345/312/212 346/65/212 342/291/212 +f 90/309/213 12/261/213 175/264/213 343/310/213 +f 343/310/214 175/264/214 176/266/214 344/311/214 +f 344/311/215 176/266/215 177/268/215 345/312/215 +f 345/312/216 177/268/216 178/66/216 346/65/216 +f 75/313/217 350/314/217 50/315/217 6/316/217 +f 350/314/218 354/317/218 49/318/218 50/315/218 +f 354/317/219 358/319/219 48/320/219 49/318/219 +f 358/319/220 362/61/220 47/64/220 48/320/220 +f 9/288/221 182/287/221 347/321/221 78/322/221 +f 78/322/222 347/321/222 348/323/222 77/324/222 +f 77/324/223 348/323/223 349/325/223 76/326/223 +f 76/326/224 349/325/224 350/314/224 75/313/224 +f 182/287/225 181/290/225 351/327/225 347/321/225 +f 347/321/226 351/327/226 352/328/226 348/323/226 +f 348/323/227 352/328/227 353/329/227 349/325/227 +f 349/325/228 353/329/228 354/317/228 350/314/228 +f 181/290/229 180/292/229 355/330/229 351/327/229 +f 351/327/230 355/330/230 356/331/230 352/328/230 +f 352/328/231 356/331/231 357/332/231 353/329/231 +f 353/329/232 357/332/232 358/319/232 354/317/232 +f 180/292/233 179/68/233 359/333/233 355/330/233 +f 355/330/234 359/333/234 360/334/234 356/331/234 +f 356/331/235 360/334/235 361/335/235 357/332/235 +f 357/332/236 361/335/236 362/61/236 358/319/236 +f 179/68/237 24/67/237 171/336/237 359/333/237 +f 359/333/238 171/336/238 172/337/238 360/334/238 +f 360/334/239 172/337/239 173/338/239 361/335/239 +f 361/335/240 173/338/240 174/62/240 362/61/240 +f 162/54/241 366/339/241 170/340/241 23/55/241 +f 366/339/242 370/341/242 169/342/242 170/340/242 +f 370/341/243 374/343/243 168/344/243 169/342/243 +f 374/343/244 378/57/244 167/60/244 168/344/244 +f 10/345/245 82/346/245 363/347/245 159/348/245 +f 159/348/246 363/347/246 364/349/246 160/350/246 +f 160/350/247 364/349/247 365/351/247 161/352/247 +f 161/352/248 365/351/248 366/339/248 162/54/248 +f 82/346/249 81/353/249 367/354/249 363/347/249 +f 363/347/250 367/354/250 368/355/250 364/349/250 +f 364/349/251 368/355/251 369/356/251 365/351/251 +f 365/351/252 369/356/252 370/341/252 366/339/252 +f 81/353/253 80/357/253 371/358/253 367/354/253 +f 367/354/254 371/358/254 372/359/254 368/355/254 +f 368/355/255 372/359/255 373/360/255 369/356/255 +f 369/356/256 373/360/256 374/343/256 370/341/256 +f 80/357/257 79/361/257 375/362/257 371/358/257 +f 371/358/258 375/362/258 376/363/258 372/359/258 +f 372/359/259 376/363/259 377/364/259 373/360/259 +f 373/360/260 377/364/260 378/57/260 374/343/260 +f 79/361/261 2/365/261 74/366/261 375/362/261 +f 375/362/262 74/366/262 73/367/262 376/363/262 +f 376/363/263 73/367/263 72/368/263 377/364/263 +f 377/364/264 72/368/264 71/58/264 378/57/264 +f 78/369/265 382/370/265 166/371/265 9/372/265 +f 382/370/266 386/373/266 165/374/266 166/371/266 +f 386/373/267 390/375/267 164/376/267 165/374/267 +f 390/375/268 394/53/268 163/56/268 164/376/268 +f 6/377/269 34/378/269 379/379/269 75/380/269 +f 75/380/270 379/379/270 380/381/270 76/382/270 +f 76/382/271 380/381/271 381/383/271 77/384/271 +f 77/384/272 381/383/272 382/370/272 78/369/272 +f 34/378/273 33/385/273 383/386/273 379/379/273 +f 379/379/274 383/386/274 384/387/274 380/381/274 +f 380/381/275 384/387/275 385/388/275 381/383/275 +f 381/383/276 385/388/276 386/373/276 382/370/276 +f 33/385/277 32/389/277 387/390/277 383/386/277 +f 383/386/278 387/390/278 388/391/278 384/387/278 +f 384/387/279 388/391/279 389/392/279 385/388/279 +f 385/388/280 389/392/280 390/375/280 386/373/280 +f 32/389/281 31/393/281 391/394/281 387/390/281 +f 387/390/282 391/394/282 392/395/282 388/391/282 +f 388/391/283 392/395/283 393/396/283 389/392/283 +f 389/392/284 393/396/284 394/53/284 390/375/284 +f 31/393/285 10/345/285 159/348/285 391/394/285 +f 391/394/286 159/348/286 160/350/286 392/395/286 +f 392/395/287 160/350/287 161/352/287 393/396/287 +f 393/396/288 161/352/288 162/54/288 394/53/288 +f 30/397/289 398/398/289 107/399/289 8/400/289 +f 398/398/290 402/401/290 108/402/290 107/399/290 +f 402/401/291 406/403/291 109/404/291 108/402/291 +f 406/403/292 410/49/292 110/52/292 109/404/292 +f 9/372/293 166/371/293 395/405/293 27/406/293 +f 27/406/294 395/405/294 396/407/294 28/408/294 +f 28/408/295 396/407/295 397/409/295 29/410/295 +f 29/410/296 397/409/296 398/398/296 30/397/296 +f 166/371/297 165/374/297 399/411/297 395/405/297 +f 395/405/298 399/411/298 400/412/298 396/407/298 +f 396/407/299 400/412/299 401/413/299 397/409/299 +f 397/409/300 401/413/300 402/401/300 398/398/300 +f 165/374/301 164/376/301 403/414/301 399/411/301 +f 399/411/302 403/414/302 404/415/302 400/412/302 +f 400/412/303 404/415/303 405/416/303 401/413/303 +f 401/413/304 405/416/304 406/403/304 402/401/304 +f 164/376/305 163/56/305 407/417/305 403/414/305 +f 403/414/306 407/417/306 408/418/306 404/415/306 +f 404/415/307 408/418/307 409/419/307 405/416/307 +f 405/416/308 409/419/308 410/49/308 406/403/308 +f 163/56/309 23/55/309 155/420/309 407/417/309 +f 407/417/310 155/420/310 156/421/310 408/418/310 +f 408/418/311 156/421/311 157/422/311 409/419/311 +f 409/419/312 157/422/312 158/50/312 410/49/312 +f 146/42/313 414/423/313 154/424/313 22/43/313 +f 414/423/314 418/425/314 153/426/314 154/424/314 +f 418/425/315 422/427/315 152/428/315 153/426/315 +f 422/427/316 426/45/316 151/48/316 152/428/316 +f 11/27/317 86/429/317 411/430/317 143/431/317 +f 143/431/318 411/430/318 412/432/318 144/433/318 +f 144/433/319 412/432/319 413/434/319 145/435/319 +f 145/435/320 413/434/320 414/423/320 146/42/320 +f 86/429/321 85/436/321 415/437/321 411/430/321 +f 411/430/322 415/437/322 416/438/322 412/432/322 +f 412/432/323 416/438/323 417/439/323 413/434/323 +f 413/434/324 417/439/324 418/425/324 414/423/324 +f 85/436/325 84/440/325 419/441/325 415/437/325 +f 415/437/326 419/441/326 420/442/326 416/438/326 +f 416/438/327 420/442/327 421/443/327 417/439/327 +f 417/439/328 421/443/328 422/427/328 418/425/328 +f 84/440/329 83/24/329 423/444/329 419/441/329 +f 419/441/330 423/444/330 424/445/330 420/442/330 +f 420/442/331 424/445/331 425/446/331 421/443/331 +f 421/443/332 425/446/332 426/45/332 422/427/332 +f 83/24/333 1/23/333 103/135/333 423/444/333 +f 423/444/334 103/135/334 104/137/334 424/445/334 +f 424/445/335 104/137/335 105/139/335 425/446/335 +f 425/446/336 105/139/336 106/46/336 426/45/336 +f 71/58/337 430/447/337 150/448/337 20/59/337 +f 430/447/338 434/449/338 149/450/338 150/448/338 +f 434/449/339 438/451/339 148/452/339 149/450/339 +f 438/451/340 442/41/340 147/44/340 148/452/340 +f 2/365/341 38/453/341 427/454/341 74/366/341 +f 74/366/342 427/454/342 428/455/342 73/367/342 +f 73/367/343 428/455/343 429/456/343 72/368/343 +f 72/368/344 429/456/344 430/447/344 71/58/344 +f 38/453/345 37/457/345 431/458/345 427/454/345 +f 427/454/346 431/458/346 432/459/346 428/455/346 +f 428/455/347 432/459/347 433/460/347 429/456/347 +f 429/456/348 433/460/348 434/449/348 430/447/348 +f 37/457/349 36/461/349 435/462/349 431/458/349 +f 431/458/350 435/462/350 436/463/350 432/459/350 +f 432/459/351 436/463/351 437/464/351 433/460/351 +f 433/460/352 437/464/352 438/451/352 434/449/352 +f 36/461/353 35/28/353 439/465/353 435/462/353 +f 435/462/354 439/465/354 440/466/354 436/463/354 +f 436/463/355 440/466/355 441/467/355 437/464/355 +f 437/464/356 441/467/356 442/41/356 438/451/356 +f 35/28/357 11/27/357 143/431/357 439/465/357 +f 439/465/358 143/431/358 144/433/358 440/466/358 +f 440/466/359 144/433/359 145/435/359 441/467/359 +f 441/467/360 145/435/360 146/42/360 442/41/360 +f 119/14/361 446/468/361 46/211/361 4/15/361 +f 446/468/362 450/469/362 45/218/362 46/211/362 +f 450/469/363 454/470/363 44/222/363 45/218/363 +f 454/470/364 458/37/364 43/40/364 44/222/364 +f 20/59/365 150/448/365 443/471/365 122/472/365 +f 122/472/366 443/471/366 444/473/366 121/474/366 +f 121/474/367 444/473/367 445/475/367 120/476/367 +f 120/476/368 445/475/368 446/468/368 119/14/368 +f 150/448/369 149/450/369 447/477/369 443/471/369 +f 443/471/370 447/477/370 448/478/370 444/473/370 +f 444/473/371 448/478/371 449/479/371 445/475/371 +f 445/475/372 449/479/372 450/469/372 446/468/372 +f 149/450/373 148/452/373 451/480/373 447/477/373 +f 447/477/374 451/480/374 452/481/374 448/478/374 +f 448/478/375 452/481/375 453/482/375 449/479/375 +f 449/479/376 453/482/376 454/470/376 450/469/376 +f 148/452/377 147/44/377 455/483/377 451/480/377 +f 451/480/378 455/483/378 456/484/378 452/481/378 +f 452/481/379 456/484/379 457/485/379 453/482/379 +f 453/482/380 457/485/380 458/37/380 454/470/380 +f 147/44/381 22/43/381 139/486/381 455/483/381 +f 455/483/382 139/486/382 140/487/382 456/484/382 +f 456/484/383 140/487/383 141/488/383 457/485/383 +f 457/485/384 141/488/384 142/38/384 458/37/384 +f 130/30/385 462/489/385 138/490/385 21/31/385 +f 462/489/386 466/491/386 137/492/386 138/490/386 +f 466/491/387 470/493/387 136/494/387 137/492/387 +f 470/493/388 474/33/388 135/36/388 136/494/388 +f 14/63/389 98/495/389 459/496/389 127/497/389 +f 127/497/390 459/496/390 460/498/390 128/499/390 +f 128/499/391 460/498/391 461/500/391 129/501/391 +f 129/501/392 461/500/392 462/489/392 130/30/392 +f 98/495/393 97/502/393 463/503/393 459/496/393 +f 459/496/394 463/503/394 464/504/394 460/498/394 +f 460/498/395 464/504/395 465/505/395 461/500/395 +f 461/500/396 465/505/396 466/491/396 462/489/396 +f 97/502/397 96/506/397 467/507/397 463/503/397 +f 463/503/398 467/507/398 468/508/398 464/504/398 +f 464/504/399 468/508/399 469/509/399 465/505/399 +f 465/505/400 469/509/400 470/493/400 466/491/400 +f 96/506/401 95/12/401 471/510/401 467/507/401 +f 467/507/402 471/510/402 472/511/402 468/508/402 +f 468/508/403 472/511/403 473/512/403 469/509/403 +f 469/509/404 473/512/404 474/33/404 470/493/404 +f 95/12/405 5/11/405 115/513/405 471/510/405 +f 471/510/406 115/513/406 116/514/406 472/511/406 +f 472/511/407 116/514/407 117/515/407 473/512/407 +f 473/512/408 117/515/408 118/34/408 474/33/408 +f 31/516/409 478/517/409 134/518/409 10/519/409 +f 478/517/410 482/520/410 133/521/410 134/518/410 +f 482/520/411 486/522/411 132/523/411 133/521/411 +f 486/522/412 490/29/412 131/32/412 132/523/412 +f 6/316/413 50/315/413 475/524/413 34/525/413 +f 34/525/414 475/524/414 476/526/414 33/527/414 +f 33/527/415 476/526/415 477/528/415 32/529/415 +f 32/529/416 477/528/416 478/517/416 31/516/416 +f 50/315/417 49/318/417 479/530/417 475/524/417 +f 475/524/418 479/530/418 480/531/418 476/526/418 +f 476/526/419 480/531/419 481/532/419 477/528/419 +f 477/528/420 481/532/420 482/520/420 478/517/420 +f 49/318/421 48/320/421 483/533/421 479/530/421 +f 479/530/422 483/533/422 484/534/422 480/531/422 +f 480/531/423 484/534/423 485/535/423 481/532/423 +f 481/532/424 485/535/424 486/522/424 482/520/424 +f 48/320/425 47/64/425 487/536/425 483/533/425 +f 483/533/426 487/536/426 488/537/426 484/534/426 +f 484/534/427 488/537/427 489/538/427 485/535/427 +f 485/535/428 489/538/428 490/29/428 486/522/428 +f 47/64/429 14/63/429 127/497/429 487/536/429 +f 487/536/430 127/497/430 128/499/430 488/537/430 +f 488/537/431 128/499/431 129/501/431 489/538/431 +f 489/538/432 129/501/432 130/30/432 490/29/432 +f 79/539/433 494/540/433 38/453/433 2/365/433 +f 494/540/434 498/541/434 37/457/434 38/453/434 +f 498/541/435 502/542/435 36/461/435 37/457/435 +f 502/542/436 506/25/436 35/28/436 36/461/436 +f 10/519/437 134/518/437 491/543/437 82/544/437 +f 82/544/438 491/543/438 492/545/438 81/546/438 +f 81/546/439 492/545/439 493/547/439 80/548/439 +f 80/548/440 493/547/440 494/540/440 79/539/440 +f 134/518/441 133/521/441 495/549/441 491/543/441 +f 491/543/442 495/549/442 496/550/442 492/545/442 +f 492/545/443 496/550/443 497/551/443 493/547/443 +f 493/547/444 497/551/444 498/541/444 494/540/444 +f 133/521/445 132/523/445 499/552/445 495/549/445 +f 495/549/446 499/552/446 500/553/446 496/550/446 +f 496/550/447 500/553/447 501/554/447 497/551/447 +f 497/551/448 501/554/448 502/542/448 498/541/448 +f 132/523/449 131/32/449 503/555/449 499/552/449 +f 499/552/450 503/555/450 504/556/450 500/553/450 +f 500/553/451 504/556/451 505/557/451 501/554/451 +f 501/554/452 505/557/452 506/25/452 502/542/452 +f 131/32/453 21/31/453 123/558/453 503/555/453 +f 503/555/454 123/558/454 124/559/454 504/556/454 +f 504/556/455 124/559/455 125/560/455 505/557/455 +f 505/557/456 125/560/456 126/26/456 506/25/456 +f 126/26/457 510/561/457 86/429/457 11/27/457 +f 510/561/458 514/562/458 85/436/458 86/429/458 +f 514/562/459 518/563/459 84/440/459 85/436/459 +f 518/563/460 522/21/460 83/24/460 84/440/460 +f 21/31/461 138/490/461 507/564/461 123/558/461 +f 123/558/462 507/564/462 508/565/462 124/559/462 +f 124/559/463 508/565/463 509/566/463 125/560/463 +f 125/560/464 509/566/464 510/561/464 126/26/464 +f 138/490/465 137/492/465 511/567/465 507/564/465 +f 507/564/466 511/567/466 512/568/466 508/565/466 +f 508/565/467 512/568/467 513/569/467 509/566/467 +f 509/566/468 513/569/468 514/562/468 510/561/468 +f 137/492/469 136/494/469 515/570/469 511/567/469 +f 511/567/470 515/570/470 516/571/470 512/568/470 +f 512/568/471 516/571/471 517/572/471 513/569/471 +f 513/569/472 517/572/472 518/563/472 514/562/472 +f 136/494/473 135/36/473 519/573/473 515/570/473 +f 515/570/474 519/573/474 520/574/474 516/571/474 +f 516/571/475 520/574/475 521/575/475 517/572/475 +f 517/572/476 521/575/476 522/21/476 518/563/476 +f 135/36/477 19/35/477 67/576/477 519/573/477 +f 519/573/478 67/576/478 68/577/478 520/574/478 +f 520/574/479 68/577/479 69/578/479 521/575/479 +f 521/575/480 69/578/480 70/22/480 522/21/480 +f 142/38/481 526/579/481 94/182/481 13/39/481 +f 526/579/482 530/580/482 93/189/482 94/182/482 +f 530/580/483 534/581/483 92/193/483 93/189/483 +f 534/581/484 538/17/484 91/20/484 92/193/484 +f 22/43/485 154/424/485 523/582/485 139/486/485 +f 139/486/486 523/582/486 524/583/486 140/487/486 +f 140/487/487 524/583/487 525/584/487 141/488/487 +f 141/488/488 525/584/488 526/579/488 142/38/488 +f 154/424/489 153/426/489 527/585/489 523/582/489 +f 523/582/490 527/585/490 528/586/490 524/583/490 +f 524/583/491 528/586/491 529/587/491 525/584/491 +f 525/584/492 529/587/492 530/580/492 526/579/492 +f 153/426/493 152/428/493 531/588/493 527/585/493 +f 527/585/494 531/588/494 532/589/494 528/586/494 +f 528/586/495 532/589/495 533/590/495 529/587/495 +f 529/587/496 533/590/496 534/581/496 530/580/496 +f 152/428/497 151/48/497 535/591/497 531/588/497 +f 531/588/498 535/591/498 536/592/498 532/589/498 +f 532/589/499 536/592/499 537/593/499 533/590/499 +f 533/590/500 537/593/500 538/17/500 534/581/500 +f 151/48/501 16/47/501 55/159/501 535/591/501 +f 535/591/502 55/159/502 56/161/502 536/592/502 +f 536/592/503 56/161/503 57/163/503 537/593/503 +f 537/593/504 57/163/504 58/18/504 538/17/504 +f 158/50/505 542/594/505 59/595/505 17/51/505 +f 542/594/506 546/596/506 60/597/506 59/595/506 +f 546/596/507 550/598/507 61/599/507 60/597/507 +f 550/598/508 554/13/508 62/16/508 61/599/508 +f 23/55/509 170/340/509 539/600/509 155/420/509 +f 155/420/510 539/600/510 540/601/510 156/421/510 +f 156/421/511 540/601/511 541/602/511 157/422/511 +f 157/422/512 541/602/512 542/594/512 158/50/512 +f 170/340/513 169/342/513 543/603/513 539/600/513 +f 539/600/514 543/603/514 544/604/514 540/601/514 +f 540/601/515 544/604/515 545/605/515 541/602/515 +f 541/602/516 545/605/516 546/596/516 542/594/516 +f 169/342/517 168/344/517 547/606/517 543/603/517 +f 543/603/518 547/606/518 548/607/518 544/604/518 +f 544/604/519 548/607/519 549/608/519 545/605/519 +f 545/605/520 549/608/520 550/598/520 546/596/520 +f 168/344/521 167/60/521 551/609/521 547/606/521 +f 547/606/522 551/609/522 552/610/522 548/607/522 +f 548/607/523 552/610/523 553/611/523 549/608/523 +f 549/608/524 553/611/524 554/13/524 550/598/524 +f 167/60/525 20/59/525 122/472/525 551/609/525 +f 551/609/526 122/472/526 121/474/526 552/610/526 +f 552/610/527 121/474/527 120/476/527 553/611/527 +f 553/611/528 120/476/528 119/14/528 554/13/528 +f 174/62/529 558/612/529 98/495/529 14/63/529 +f 558/612/530 562/613/530 97/502/530 98/495/530 +f 562/613/531 566/614/531 96/506/531 97/502/531 +f 566/614/532 570/9/532 95/12/532 96/506/532 +f 24/67/533 186/256/533 555/615/533 171/336/533 +f 171/336/534 555/615/534 556/616/534 172/337/534 +f 172/337/535 556/616/535 557/617/535 173/338/535 +f 173/338/536 557/617/536 558/612/536 174/62/536 +f 186/256/537 185/258/537 559/618/537 555/615/537 +f 555/615/538 559/618/538 560/619/538 556/616/538 +f 556/616/539 560/619/539 561/620/539 557/617/539 +f 557/617/540 561/620/540 562/613/540 558/612/540 +f 185/258/541 184/260/541 563/621/541 559/618/541 +f 559/618/542 563/621/542 564/622/542 560/619/542 +f 560/619/543 564/622/543 565/623/543 561/620/543 +f 561/620/544 565/623/544 566/614/544 562/613/544 +f 184/260/545 183/72/545 567/624/545 563/621/545 +f 563/621/546 567/624/546 568/625/546 564/622/546 +f 564/622/547 568/625/547 569/626/547 565/623/547 +f 565/623/548 569/626/548 570/9/548 566/614/548 +f 183/72/549 18/71/549 63/627/549 567/624/549 +f 567/624/550 63/627/550 64/628/550 568/625/550 +f 568/625/551 64/628/551 65/629/551 569/626/551 +f 569/626/552 65/629/552 66/10/552 570/9/552 +f 190/74/553 574/630/553 39/631/553 12/75/553 +f 574/630/554 578/632/554 40/633/554 39/631/554 +f 578/632/555 582/634/555 41/635/555 40/633/555 +f 582/634/556 586/5/556 42/8/556 41/635/556 +f 25/79/557 202/177/557 571/636/557 187/252/557 +f 187/252/558 571/636/558 572/637/558 188/253/558 +f 188/253/559 572/637/559 573/638/559 189/254/559 +f 189/254/560 573/638/560 574/630/560 190/74/560 +f 202/177/561 201/179/561 575/639/561 571/636/561 +f 571/636/562 575/639/562 576/640/562 572/637/562 +f 572/637/563 576/640/563 577/641/563 573/638/563 +f 573/638/564 577/641/564 578/632/564 574/630/564 +f 201/179/565 200/181/565 579/642/565 575/639/565 +f 575/639/566 579/642/566 580/643/566 576/640/566 +f 576/640/567 580/643/567 581/644/567 577/641/567 +f 577/641/568 581/644/568 582/634/568 578/632/568 +f 200/181/569 199/84/569 583/645/569 579/642/569 +f 579/642/570 583/645/570 584/646/570 580/643/570 +f 580/643/571 584/646/571 585/647/571 581/644/571 +f 581/644/572 585/647/572 586/5/572 582/634/572 +f 199/84/573 15/83/573 51/648/573 583/645/573 +f 583/645/574 51/648/574 52/649/574 584/646/574 +f 584/646/575 52/649/575 53/650/575 585/647/575 +f 585/647/576 53/650/576 54/6/576 586/5/576 +f 206/86/577 590/651/577 51/652/577 15/87/577 +f 590/651/578 594/653/578 52/654/578 51/652/578 +f 594/653/579 598/655/579 53/656/579 52/654/579 +f 598/655/580 602/1/580 54/4/580 53/656/580 +f 26/91/581 218/98/581 587/657/581 203/173/581 +f 203/173/582 587/657/582 588/658/582 204/174/582 +f 204/174/583 588/658/583 589/659/583 205/175/583 +f 205/175/584 589/659/584 590/651/584 206/86/584 +f 218/98/585 217/100/585 591/660/585 587/657/585 +f 587/657/586 591/660/586 592/661/586 588/658/586 +f 588/658/587 592/661/587 593/662/587 589/659/587 +f 589/659/588 593/662/588 594/653/588 590/651/588 +f 217/100/589 216/102/589 595/663/589 591/660/589 +f 591/660/590 595/663/590 596/664/590 592/661/590 +f 592/661/591 596/664/591 597/665/591 593/662/591 +f 593/662/592 597/665/592 598/655/592 594/653/592 +f 216/102/593 215/96/593 599/666/593 595/663/593 +f 595/663/594 599/666/594 600/667/594 596/664/594 +f 596/664/595 600/667/595 601/668/595 597/665/595 +f 597/665/596 601/668/596 602/1/596 598/655/596 +f 215/96/597 18/95/597 114/669/597 599/666/597 +f 599/666/598 114/669/598 113/670/598 600/667/598 +f 600/667/599 113/670/599 112/671/599 601/668/599 +f 601/668/600 112/671/600 111/2/600 602/1/600 diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/the_ring.mtl b/src/main/resources/assets/cosmiccore/models/block/iris/the_ring.mtl new file mode 100644 index 000000000..b69252d1f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/the_ring.mtl @@ -0,0 +1,13 @@ +# Blender 4.0.2 MTL File: 'Disk.blend' +# www.blender.org + +newmtl planematerial +Ns 250.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd #texture0 diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/the_ring.obj b/src/main/resources/assets/cosmiccore/models/block/iris/the_ring.obj new file mode 100644 index 000000000..d56123f9f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/the_ring.obj @@ -0,0 +1,16 @@ +# Blender 4.0.2 +# www.blender.org +mtllib the_ring.mtl +o Plane.001 +v -3.750000 0.000000 3.750000 +v 3.750000 0.000000 3.750000 +v -3.750000 0.000000 -3.750000 +v 3.750000 0.000000 -3.750000 +vn -0.0000 1.0000 -0.0000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +s 0 +usemtl planematerial +f 1/1/1 2/2/1 4/3/1 3/4/1 diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/the_ring_white.mtl b/src/main/resources/assets/cosmiccore/models/block/iris/the_ring_white.mtl new file mode 100644 index 000000000..b69252d1f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/the_ring_white.mtl @@ -0,0 +1,13 @@ +# Blender 4.0.2 MTL File: 'Disk.blend' +# www.blender.org + +newmtl planematerial +Ns 250.000000 +Ka 1.000000 1.000000 1.000000 +Kd 0.800000 0.800000 0.800000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd #texture0 diff --git a/src/main/resources/assets/cosmiccore/models/block/iris/the_ring_white.obj b/src/main/resources/assets/cosmiccore/models/block/iris/the_ring_white.obj new file mode 100644 index 000000000..663147209 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iris/the_ring_white.obj @@ -0,0 +1,16 @@ +# Blender 4.0.2 +# www.blender.org +mtllib the_ring_white.mtl +o Plane.001 +v -3.750000 0.000000 3.750000 +v 3.750000 0.000000 3.750000 +v -3.750000 0.000000 -3.750000 +v 3.750000 0.000000 -3.750000 +vn -0.0000 1.0000 -0.0000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +s 0 +usemtl planematerial +f 1/1/1 2/2/1 4/3/1 3/4/1 diff --git a/src/main/resources/assets/cosmiccore/models/block/iv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/iv_ember_emitter.json new file mode 100644 index 000000000..12fd902f5 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_iv", + "1": "cosmiccore:block/puff_tex_iv", + "particle": "cosmiccore:block/puff_tex_iv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/iv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/iv_ember_receptor.json new file mode 100644 index 000000000..c850177d9 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/iv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_iv", + "particle": "cosmiccore:block/puff_tex_iv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/luv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/luv_ember_emitter.json new file mode 100644 index 000000000..98620377b --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/luv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_luv", + "1": "cosmiccore:block/puff_tex_luv", + "particle": "cosmiccore:block/puff_tex_luv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/luv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/luv_ember_receptor.json new file mode 100644 index 000000000..f02bd8e72 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/luv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_luv", + "particle": "cosmiccore:block/puff_tex_luv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/lv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/lv_ember_emitter.json new file mode 100644 index 000000000..95ad7ea71 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/lv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_lv", + "1": "cosmiccore:block/puff_tex_lv", + "particle": "cosmiccore:block/puff_tex_lv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/lv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/lv_ember_receptor.json new file mode 100644 index 000000000..29dd27765 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/lv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_lv", + "particle": "cosmiccore:block/puff_tex_lv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/alveary/accelerant.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/alveary/accelerant.json new file mode 100644 index 000000000..c35ff750b --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/alveary/accelerant.json @@ -0,0 +1,6 @@ +{ + "parent": "cosmiccore:block/overlay/all_sides", + "textures": { + "overlay": "cosmiccore:block/overlay/alveary/accelerant" + } +} diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/cleaning_cover.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/cleaning_cover.json new file mode 100644 index 000000000..69532cc8b --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/cleaning_cover.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/overlay/2_layer/front_emissive", + "textures": { + "overlay_emissive": "cosmiccore:block/overlay/cleaning_cover_emissive", + "overlay": "cosmiccore:block/overlay/cleaning_cover" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/drone_hatch_maint.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/drone_hatch_maint.json new file mode 100644 index 000000000..f3f94419e --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/drone_hatch_maint.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/overlay/2_layer/front_emissive", + "textures": { + "overlay": "cosmiccore:block/overlay/drone_hatch_maint", + "overlay_emissive": "cosmiccore:block/overlay/drone_hatch_maint_emissive" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/ember_hatch.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/ember_hatch.json new file mode 100644 index 000000000..45a67d319 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/ember_hatch.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/overlay/front_emissive", + "textures": { + "overlay_emissive": "cosmiccore:block/overlay/ember_overlay_front" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/energy_output_hatch_16a.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/energy_output_hatch_16a.json new file mode 100644 index 000000000..2955f4fa7 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/energy_output_hatch_16a.json @@ -0,0 +1,45 @@ +{ + "parent": "gtceu:block/overlay/2_layer/tinted/front", + "textures": { + "overlay_tint": "gtceu:block/overlay/machine/overlay_energy_16a_tinted", + "overlay_in": "gtceu:block/overlay/machine/overlay_energy_16a_in", + "overlay_out_emissive": "gtceu:block/overlay/machine/overlay_energy_16a_out_emissive" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down", "tintindex": 1 }, + "up": { "texture": "#top", "cullface": "up", "tintindex": 1 }, + "north": { "texture": "#side", "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#side", "cullface": "south", "tintindex": 1 }, + "west": { "texture": "#side", "cullface": "west", "tintindex": 1 }, + "east": { "texture": "#side", "cullface": "east", "tintindex": 1 } + } + }, + { + "from": [ -0.01, -0.01, -0.01 ], + "to": [ 16.01, 16.01, 16.01 ], + "faces": { + "north": { "uv": [0, 0, 16, 16], "texture": "#overlay_tint", "cullface": "north", "tintindex": 2 } + } + }, + { + "from": [ -0.02, -0.02, -0.02 ], + "to": [ 16.02, 16.02, 16.02 ], + "faces": { + "north": { "uv": [0, 0, 16, 16], "texture": "#overlay_in", "cullface": "north" } + } + }, + { + "from": [ -0.02, -0.02, -0.02 ], + "to": [ 16.02, 16.02, 16.02 ], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "shade": false, + "faces": { + "north": { "uv": [0, 0, 16, 16], "texture": "#overlay_out_emissive", "cullface": "north" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/energy_output_hatch_4a.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/energy_output_hatch_4a.json new file mode 100644 index 000000000..7f84a0143 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/energy_output_hatch_4a.json @@ -0,0 +1,45 @@ +{ + "parent": "gtceu:block/overlay/2_layer/tinted/front", + "textures": { + "overlay_tint": "gtceu:block/overlay/machine/overlay_energy_4a_tinted", + "overlay_in": "gtceu:block/overlay/machine/overlay_energy_4a_in", + "overlay_out_emissive": "gtceu:block/overlay/machine/overlay_energy_4a_out_emissive" + }, + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down", "tintindex": 1 }, + "up": { "texture": "#top", "cullface": "up", "tintindex": 1 }, + "north": { "texture": "#side", "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#side", "cullface": "south", "tintindex": 1 }, + "west": { "texture": "#side", "cullface": "west", "tintindex": 1 }, + "east": { "texture": "#side", "cullface": "east", "tintindex": 1 } + } + }, + { + "from": [ -0.01, -0.01, -0.01 ], + "to": [ 16.01, 16.01, 16.01 ], + "faces": { + "north": { "uv": [0, 0, 16, 16], "texture": "#overlay_tint", "cullface": "north", "tintindex": 2 } + } + }, + { + "from": [ -0.02, -0.02, -0.02 ], + "to": [ 16.02, 16.02, 16.02 ], + "faces": { + "north": { "uv": [0, 0, 16, 16], "texture": "#overlay_in", "cullface": "north" } + } + }, + { + "from": [ -0.02, -0.02, -0.02 ], + "to": [ 16.02, 16.02, 16.02 ], + "forge_data": { "block_light": 15, "sky_light": 15 }, + "shade": false, + "faces": { + "north": { "uv": [0, 0, 16, 16], "texture": "#overlay_out_emissive", "cullface": "north" } + } + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/fluid_me_assemblyline.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/fluid_me_assemblyline.json new file mode 100644 index 000000000..426e01d4c --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/fluid_me_assemblyline.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/overlay/2_layer/front_emissive", + "textures": { + "overlay": "cosmiccore:block/overlay/me_assemblyline_overlay_base", + "overlay_emissive": "cosmiccore:block/overlay/me_assemblyline_overlay_fluid_emissive" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/hpca_indicator.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/hpca_indicator.json new file mode 100644 index 000000000..84b14a213 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/hpca_indicator.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/overlay/front", + "textures": { + "overlay": "cosmiccore:block/overlay/machine/hpca/indicator" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/item_me_assemblyline.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/item_me_assemblyline.json new file mode 100644 index 000000000..728f67803 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/item_me_assemblyline.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/overlay/2_layer/front_emissive", + "textures": { + "overlay": "cosmiccore:block/overlay/me_assemblyline_overlay_base", + "overlay_emissive": "cosmiccore:block/overlay/me_assemblyline_overlay_item_emissive" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/module_hatch.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/module_hatch.json new file mode 100644 index 000000000..414f7a7aa --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/module_hatch.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/overlay/2_layer/front_emissive", + "textures": { + "overlay": "cosmiccore:block/overlay/module_hatch", + "overlay_emissive": "cosmiccore:block/overlay/module_hatch_emissive" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/soul_hatch.export.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/soul_hatch.export.json deleted file mode 100644 index 0feaf91c9..000000000 --- a/src/main/resources/assets/cosmiccore/models/block/machine/part/soul_hatch.export.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "parent": "block/block", - "textures": { - "particle": "#overlay_soul_hatch", - "overlay_soul_hatch": "cosmiccore:block/overlay/soul_overlay_front" - }, - "elements": [ - { - "from": [0, 0, 0], - "to": [16, 16, 0], - "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#overlay_soul_hatch", "cullface": "north", "tintindex": -101, "emissivity": 15} - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/soul_hatch.import.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/soul_hatch.import.json deleted file mode 100644 index 0feaf91c9..000000000 --- a/src/main/resources/assets/cosmiccore/models/block/machine/part/soul_hatch.import.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "parent": "block/block", - "textures": { - "particle": "#overlay_soul_hatch", - "overlay_soul_hatch": "cosmiccore:block/overlay/soul_overlay_front" - }, - "elements": [ - { - "from": [0, 0, 0], - "to": [16, 16, 0], - "faces": { - "north": {"uv": [0, 0, 16, 16], "texture": "#overlay_soul_hatch", "cullface": "north", "tintindex": -101, "emissivity": 15} - } - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/soul_hatch.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/soul_hatch.json new file mode 100644 index 000000000..9bdae6ccf --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/soul_hatch.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/overlay/front_emissive", + "textures": { + "overlay_emissive": "cosmiccore:block/overlay/soul_overlay_front" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/thermia_input_hatch.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/thermia_input_hatch.json new file mode 100644 index 000000000..ffa4b849b --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/thermia_input_hatch.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/overlay/front", + "textures": { + "overlay": "cosmiccore:block/overlay/thermia_import" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/thermia_output_hatch.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/thermia_output_hatch.json new file mode 100644 index 000000000..2094e19d9 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/thermia_output_hatch.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/overlay/front", + "textures": { + "overlay": "cosmiccore:block/overlay/thermia_export" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/wireless_data_hatch.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/wireless_data_hatch.json new file mode 100644 index 000000000..1ff595ac7 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/wireless_data_hatch.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/overlay/front_emissive", + "textures": { + "overlay_emissive": "cosmiccore:block/overlay/wireless_data_hatch" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/wireless_energy_16a.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/wireless_energy_16a.json new file mode 100644 index 000000000..9dcb04bed --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/wireless_energy_16a.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/overlay/front_emissive", + "textures": { + "overlay_emissive": "cosmiccore:block/overlay/wireless_energy_16a" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/wireless_energy_1a.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/wireless_energy_1a.json new file mode 100644 index 000000000..6d3a821a1 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/wireless_energy_1a.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/overlay/front_emissive", + "textures": { + "overlay_emissive": "cosmiccore:block/overlay/wireless_energy_1a" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/wireless_energy_4a.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/wireless_energy_4a.json new file mode 100644 index 000000000..44449dce7 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/wireless_energy_4a.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/overlay/front_emissive", + "textures": { + "overlay_emissive": "cosmiccore:block/overlay/wireless_energy_4a" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/part/wireless_energy_laser.json b/src/main/resources/assets/cosmiccore/models/block/machine/part/wireless_energy_laser.json new file mode 100644 index 000000000..754fd5a2e --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/part/wireless_energy_laser.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/overlay/front_emissive", + "textures": { + "overlay_emissive": "cosmiccore:block/overlay/wireless_energy_laser" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/machine/template/part/alveary_part_machine.json b/src/main/resources/assets/cosmiccore/models/block/machine/template/part/alveary_part_machine.json new file mode 100644 index 000000000..c003c6289 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/machine/template/part/alveary_part_machine.json @@ -0,0 +1,49 @@ +{ + "parent": "gtceu:block/overlay/2_layer/front_emissive", + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#bottom", "cullface": "down" }, + "up": { "texture": "#top", "cullface": "up" }, + "north": { "texture": "#side", "cullface": "north" }, + "south": { "texture": "#side", "cullface": "south" }, + "west": { "texture": "#side", "cullface": "west" }, + "east": { "texture": "#side", "cullface": "east" } + } + }, + { + "comment": "North overlay", + "from": [ -0.002, -0.002, -0.002 ], + "to": [ 16.002, 16.002, -0.002 ], + "faces": { + "north": { "uv": [0, 0, 16, 16], "texture": "#overlay", "cullface": "north" } + } + }, + { + "comment": "South overlay", + "from": [ -0.002, -0.002, 16.002 ], + "to": [ 16.002, 16.002, 16.002 ], + "faces": { + "south": { "uv": [0, 0, 16, 16], "texture": "#overlay", "cullface": "south" } + } + }, + { + "comment": "West overlay", + "from": [ -0.002, -0.002, -0.002 ], + "to": [ -0.002, 16.002, 16.002 ], + "faces": { + "west": { "uv": [0, 0, 16, 16], "texture": "#overlay", "cullface": "west" } + } + }, + { + "comment": "East overlay", + "from": [ 16.002, -0.002, -0.002 ], + "to": [ 16.002, 16.002, 16.002 ], + "faces": { + "east": { "uv": [0, 0, 16, 16], "texture": "#overlay", "cullface": "east" } + } + } + ] +} diff --git a/src/main/resources/assets/cosmiccore/models/block/max_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/max_ember_emitter.json new file mode 100644 index 000000000..4e0ee3759 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/max_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_max", + "1": "cosmiccore:block/puff_tex_max", + "particle": "cosmiccore:block/puff_tex_max" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/max_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/max_ember_receptor.json new file mode 100644 index 000000000..df7d6addc --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/max_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_max", + "particle": "cosmiccore:block/puff_tex_max" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/mv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/mv_ember_emitter.json new file mode 100644 index 000000000..7c34ea09a --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/mv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_mv", + "1": "cosmiccore:block/puff_tex_mv", + "particle": "cosmiccore:block/puff_tex_mv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/mv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/mv_ember_receptor.json new file mode 100644 index 000000000..97fb6905f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/mv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_mv", + "particle": "cosmiccore:block/puff_tex_mv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/opv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/opv_ember_emitter.json new file mode 100644 index 000000000..75388f796 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/opv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_opv", + "1": "cosmiccore:block/puff_tex_opv", + "particle": "cosmiccore:block/puff_tex_opv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/opv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/opv_ember_receptor.json new file mode 100644 index 000000000..63cb4b267 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/opv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_opv", + "particle": "cosmiccore:block/puff_tex_opv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/overlay/drone_hatch_maint.json b/src/main/resources/assets/cosmiccore/models/block/overlay/drone_hatch_maint.json new file mode 100644 index 000000000..e69de29bb diff --git a/src/main/resources/assets/cosmiccore/models/block/steam_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/steam_ember_emitter.json new file mode 100644 index 000000000..c6b9f7eaa --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/steam_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_steam", + "1": "cosmiccore:block/puff_tex_steam", + "particle": "cosmiccore:block/puff_tex_steam" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/steam_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/steam_ember_receptor.json new file mode 100644 index 000000000..3fa71a337 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/steam_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_steam", + "particle": "cosmiccore:block/puff_tex_steam" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uev_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/uev_ember_emitter.json new file mode 100644 index 000000000..656cbf5f9 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uev_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_uev", + "1": "cosmiccore:block/puff_tex_uev", + "particle": "cosmiccore:block/puff_tex_uev" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uev_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/uev_ember_receptor.json new file mode 100644 index 000000000..7effa37be --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uev_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_uev", + "particle": "cosmiccore:block/puff_tex_uev" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uhv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/uhv_ember_emitter.json new file mode 100644 index 000000000..b8ba47139 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uhv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_uhv", + "1": "cosmiccore:block/puff_tex_uhv", + "particle": "cosmiccore:block/puff_tex_uhv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uhv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/uhv_ember_receptor.json new file mode 100644 index 000000000..5d53a5d1f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uhv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_uhv", + "particle": "cosmiccore:block/puff_tex_uhv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uiv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/uiv_ember_emitter.json new file mode 100644 index 000000000..4caf2962c --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uiv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_uiv", + "1": "cosmiccore:block/puff_tex_uiv", + "particle": "cosmiccore:block/puff_tex_uiv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uiv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/uiv_ember_receptor.json new file mode 100644 index 000000000..f4670525b --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uiv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_uiv", + "particle": "cosmiccore:block/puff_tex_uiv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/uv_ember_emitter.json new file mode 100644 index 000000000..83d34f76f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_uv", + "1": "cosmiccore:block/puff_tex_uv", + "particle": "cosmiccore:block/puff_tex_uv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/uv_ember_receptor.json new file mode 100644 index 000000000..660cb4d88 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_uv", + "particle": "cosmiccore:block/puff_tex_uv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uxv_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/uxv_ember_emitter.json new file mode 100644 index 000000000..aec3c0d8b --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uxv_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_uxv", + "1": "cosmiccore:block/puff_tex_uxv", + "particle": "cosmiccore:block/puff_tex_uxv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/uxv_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/uxv_ember_receptor.json new file mode 100644 index 000000000..7847fe481 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/uxv_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_uxv", + "particle": "cosmiccore:block/puff_tex_uxv" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/variant/heat_fan.json b/src/main/resources/assets/cosmiccore/models/block/variant/heat_fan.json new file mode 100644 index 000000000..3a4eb2f89 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/variant/heat_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "cosmiccore:block/variant/heat_fan" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/variant/heat_fan_active.json b/src/main/resources/assets/cosmiccore/models/block/variant/heat_fan_active.json new file mode 100644 index 000000000..50b03cabe --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/variant/heat_fan_active.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "cosmiccore:block/variant/heat_fan_active" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/variant/ludicrious_intake.json b/src/main/resources/assets/cosmiccore/models/block/variant/ludicrious_intake.json new file mode 100644 index 000000000..6a37976bb --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/variant/ludicrious_intake.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "cosmiccore:block/variant/machine_casing_ludicrous_engine_intake" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/variant/ludicrious_intake_active.json b/src/main/resources/assets/cosmiccore/models/block/variant/ludicrious_intake_active.json new file mode 100644 index 000000000..9dc60f211 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/variant/ludicrious_intake_active.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "cosmiccore:block/variant/machine_casing_ludicrous_engine_intake_active" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/variant/radioactive_filter_casing.json b/src/main/resources/assets/cosmiccore/models/block/variant/radioactive_filter_casing.json new file mode 100644 index 000000000..f175150bf --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/variant/radioactive_filter_casing.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "cosmiccore:block/variant/machine_casing_radioactive_filter" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/variant/radioactive_filter_casing_active.json b/src/main/resources/assets/cosmiccore/models/block/variant/radioactive_filter_casing_active.json new file mode 100644 index 000000000..f22d85d95 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/variant/radioactive_filter_casing_active.json @@ -0,0 +1,7 @@ +{ + "parent": "gtceu:block/cube_2_layer/all", + "textures": { + "bot_all": "cosmiccore:block/variant/machine_casing_radioactive_filter", + "top_all": "cosmiccore:block/variant/machine_casing_radioactive_filter_active" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/variant/ultimate_intake.json b/src/main/resources/assets/cosmiccore/models/block/variant/ultimate_intake.json new file mode 100644 index 000000000..a6d91085a --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/variant/ultimate_intake.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "cosmiccore:block/variant/machine_casing_ultimate_engine_intake" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/variant/ultimate_intake_active.json b/src/main/resources/assets/cosmiccore/models/block/variant/ultimate_intake_active.json new file mode 100644 index 000000000..4a9c1747a --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/variant/ultimate_intake_active.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "cosmiccore:block/variant/machine_casing_ultimate_engine_intake_active" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/zpm_ember_emitter.json b/src/main/resources/assets/cosmiccore/models/block/zpm_ember_emitter.json new file mode 100644 index 000000000..2ec9d5982 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/zpm_ember_emitter.json @@ -0,0 +1,126 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_plating_zpm", + "1": "cosmiccore:block/puff_tex_zpm", + "particle": "cosmiccore:block/puff_tex_zpm" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 8, 11], + "faces": { + "north": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [6, 0, 12, 6], "texture": "#0"}, + "down": {"uv": [0, 6, 6, 12], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [4, 7, 4], + "to": [12, 9, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#1"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#1"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 9, 5], + "to": [11, 11, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#1"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#1"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [6, 11, 6], + "to": [10, 15, 10], + "faces": { + "north": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "east": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "south": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "west": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#1"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [7, 12, 5], + "to": [9, 14, 11], + "faces": { + "north": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "east": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "south": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "west": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "up": {"uv": [4, 0, 6, 6], "texture": "#1"}, + "down": {"uv": [4, 0, 6, 6], "texture": "#1"} + } + }, + { + "name": "Cube", + "from": [5, 12, 7], + "to": [11, 14, 9], + "faces": { + "north": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "east": {"uv": [4, 0, 6, 2], "texture": "#1"}, + "south": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "west": {"uv": [10, 14, 12, 16], "texture": "#1"}, + "up": {"uv": [10, 14, 16, 16], "texture": "#1"}, + "down": {"uv": [10, 14, 16, 16], "texture": "#1"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 45, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2, 0], + "scale": [0.4, 0.4, 0.4] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/block/zpm_ember_receptor.json b/src/main/resources/assets/cosmiccore/models/block/zpm_ember_receptor.json new file mode 100644 index 000000000..98ef17c36 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/block/zpm_ember_receptor.json @@ -0,0 +1,130 @@ +{ + "parent": "block/block", + "textures": { + "0": "cosmiccore:block/puff_tex_zpm", + "particle": "cosmiccore:block/puff_tex_zpm" + }, + "elements": [ + { + "name": "Cube", + "from": [5.1, -2, 5.1], + "to": [10.9, 0, 10.9], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 0, 4], + "to": [12, 2, 12], + "faces": { + "north": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "east": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "south": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "west": {"uv": [8, 6, 16, 8], "texture": "#0"}, + "up": {"uv": [8, 0, 16, 8], "texture": "#0"}, + "down": {"uv": [8, 0, 16, 8], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [5, 2, 5], + "to": [11, 4, 11], + "faces": { + "north": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "east": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "south": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "west": {"uv": [10, 12, 16, 14], "texture": "#0"}, + "up": {"uv": [10, 8, 16, 14], "texture": "#0"}, + "down": {"uv": [10, 8, 16, 14], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [4, 2, 7], + "to": [6, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [10, 2, 7], + "to": [12, 8, 9], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 10], + "to": [9, 8, 12], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [7, 2, 4], + "to": [9, 8, 6], + "faces": { + "north": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "east": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "south": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "west": {"uv": [4, 0, 6, 6], "texture": "#0"}, + "up": {"uv": [4, 4, 6, 6], "texture": "#0"}, + "down": {"uv": [4, 4, 6, 6], "texture": "#0"} + } + }, + { + "name": "Cube", + "from": [6, 3, 6], + "to": [10, 5, 10], + "faces": { + "north": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "east": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "south": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "west": {"uv": [0, 2, 4, 4], "texture": "#0"}, + "up": {"uv": [0, 0, 4, 4], "texture": "#0"}, + "down": {"uv": [0, 0, 4, 4], "texture": "#0"} + } + } + ], + "display": { + "firstperson_righthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "firstperson_lefthand": { + "rotation": [0, 225, 0], + "translation": [0, 2.5, 0], + "scale": [0.4, 0.4, 0.4] + }, + "gui": { + "rotation": [30, 225, 0], + "translation": [0, 0.8, 0], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/air_bladder.json b/src/main/resources/assets/cosmiccore/models/item/air_bladder.json new file mode 100644 index 000000000..93e15e7f8 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/air_bladder.json @@ -0,0 +1,26 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/bladder/bladder-0" + }, + "overrides": [ + { + "predicate": { + "cosmiccore:charges": 0.33 + }, + "model": "cosmiccore:item/air_bladder_1" + }, + { + "predicate": { + "cosmiccore:charges": 0.66 + }, + "model": "cosmiccore:item/air_bladder_2" + }, + { + "predicate": { + "cosmiccore:charges": 1.0 + }, + "model": "cosmiccore:item/air_bladder_3" + } + ] +} diff --git a/src/main/resources/assets/cosmiccore/models/item/air_bladder_1.json b/src/main/resources/assets/cosmiccore/models/item/air_bladder_1.json new file mode 100644 index 000000000..db461a5ec --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/air_bladder_1.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/bladder/bladder-1" + } +} diff --git a/src/main/resources/assets/cosmiccore/models/item/air_bladder_2.json b/src/main/resources/assets/cosmiccore/models/item/air_bladder_2.json new file mode 100644 index 000000000..06a7b1de9 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/air_bladder_2.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/bladder/bladder-2" + } +} diff --git a/src/main/resources/assets/cosmiccore/models/item/air_bladder_3.json b/src/main/resources/assets/cosmiccore/models/item/air_bladder_3.json new file mode 100644 index 000000000..8950f6de3 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/air_bladder_3.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/bladder/bladder-3" + } +} diff --git a/src/main/resources/assets/cosmiccore/models/item/bee/bee_drone_fuzzy.json b/src/main/resources/assets/cosmiccore/models/item/bee/bee_drone_fuzzy.json new file mode 100644 index 000000000..38ce6f010 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee/bee_drone_fuzzy.json @@ -0,0 +1,9 @@ +{ + "parent": "forestry:item/mirror_hands", + "textures": { + "layer0": "cosmiccore:item/bee/drone.outline", + "layer1": "cosmiccore:item/bee/body1", + "layer2": "cosmiccore:item/bee/stripes", + "layer3": "cosmiccore:item/bee/drone.body2" + } +} diff --git a/src/main/resources/assets/cosmiccore/models/item/bee/bee_drone_fuzzy_princess.json b/src/main/resources/assets/cosmiccore/models/item/bee/bee_drone_fuzzy_princess.json new file mode 100644 index 000000000..99d0da8b3 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee/bee_drone_fuzzy_princess.json @@ -0,0 +1,9 @@ +{ + "parent": "forestry:item/mirror_hands", + "textures": { + "layer0": "cosmiccore:item/bee/princess.outline", + "layer1": "cosmiccore:item/bee/body1", + "layer2": "cosmiccore:item/bee/stripes", + "layer3": "cosmiccore:item/bee/princess.body2" + } +} diff --git a/src/main/resources/assets/cosmiccore/models/item/bee/bee_drone_fuzzy_queen.json b/src/main/resources/assets/cosmiccore/models/item/bee/bee_drone_fuzzy_queen.json new file mode 100644 index 000000000..cbadf3618 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee/bee_drone_fuzzy_queen.json @@ -0,0 +1,9 @@ +{ + "parent": "forestry:item/mirror_hands", + "textures": { + "layer0": "cosmiccore:item/bee/queen.outline", + "layer1": "cosmiccore:item/bee/body1", + "layer2": "cosmiccore:item/bee/stripes", + "layer3": "cosmiccore:item/bee/queen.body2" + } +} diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_abrasive.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_abrasive.json new file mode 100644 index 000000000..47b38f1bc --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_abrasive.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/abrasive" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_absent.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_absent.json new file mode 100644 index 000000000..a0b25b5f2 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_absent.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/absent" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_ambrosic.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_ambrosic.json new file mode 100644 index 000000000..d4369f787 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_ambrosic.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/ambrosic" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_architect.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_architect.json new file mode 100644 index 000000000..9936183c5 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_architect.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/architect" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_ashen.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_ashen.json new file mode 100644 index 000000000..437d18189 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_ashen.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/ashen" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_biohazard.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_biohazard.json new file mode 100644 index 000000000..19e0b895e --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_biohazard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/biohazard" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_citrus_polymer.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_citrus_polymer.json new file mode 100644 index 000000000..5a683baca --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_citrus_polymer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/citrus_polymer" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_cobbled.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_cobbled.json new file mode 100644 index 000000000..f152611f4 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_cobbled.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/cobbled" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_constructive.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_constructive.json new file mode 100644 index 000000000..efb8e7bd4 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_constructive.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/constructive" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_cosmos.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_cosmos.json new file mode 100644 index 000000000..6b8af81b6 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_cosmos.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/cosmos" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_energized.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_energized.json new file mode 100644 index 000000000..a8b7bf990 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_energized.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/energized" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_exhaustive.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_exhaustive.json new file mode 100644 index 000000000..19002e41f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_exhaustive.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/exhaustive" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_fate.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_fate.json new file mode 100644 index 000000000..06332d73b --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_fate.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/fate" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_fracking.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_fracking.json new file mode 100644 index 000000000..2a8015b1b --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_fracking.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/fracking" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_grand_garden.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_grand_garden.json new file mode 100644 index 000000000..ca3cd3de5 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_grand_garden.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/grand_garden" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_hadal.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_hadal.json new file mode 100644 index 000000000..6d6fa86e3 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_hadal.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/hadal" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_hellsmith.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_hellsmith.json new file mode 100644 index 000000000..bec526c5d --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_hellsmith.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/hellsmith" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_hydraulic.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_hydraulic.json new file mode 100644 index 000000000..51d88c695 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_hydraulic.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/hydraulic" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_illusive.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_illusive.json new file mode 100644 index 000000000..736ccfda0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_illusive.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/illusive" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_inquisitive.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_inquisitive.json new file mode 100644 index 000000000..d475a0b53 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_inquisitive.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/inquisitive" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_argon.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_argon.json new file mode 100644 index 000000000..8116ddbb8 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_argon.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/lofty_argon" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_hydrogen.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_hydrogen.json new file mode 100644 index 000000000..24934a9ee --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_hydrogen.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/lofty_hydrogen" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_nitrogen.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_nitrogen.json new file mode 100644 index 000000000..aba5b9d34 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_nitrogen.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/lofty_nitrogen" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_oxygen.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_oxygen.json new file mode 100644 index 000000000..b838a4d60 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lofty_oxygen.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/lofty_oxygen" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_lunar.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lunar.json new file mode 100644 index 000000000..55f93daa6 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_lunar.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/lunar" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_pale.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_pale.json new file mode 100644 index 000000000..d20dabe38 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_pale.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/pale" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_prismatic.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_prismatic.json new file mode 100644 index 000000000..230be7a78 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_prismatic.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/prismatic" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_pyrolytic.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_pyrolytic.json new file mode 100644 index 000000000..e7efa875f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_pyrolytic.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/pyrolytic" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_radoxia.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_radoxia.json new file mode 100644 index 000000000..fd816ac8a --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_radoxia.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/radoxia" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_rocky.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_rocky.json new file mode 100644 index 000000000..65f40d722 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_rocky.json @@ -0,0 +1,3 @@ +{ + "parent": "forestry:item/bee_combs" +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_rose_polymer.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_rose_polymer.json new file mode 100644 index 000000000..586900bd6 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_rose_polymer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/rose_polymer" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_runic.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_runic.json new file mode 100644 index 000000000..acf63731b --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_runic.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/runic" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_shaman.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_shaman.json new file mode 100644 index 000000000..754301d68 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_shaman.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/shaman" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_slick.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_slick.json new file mode 100644 index 000000000..905d4c4a0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_slick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/slick" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_solar.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_solar.json new file mode 100644 index 000000000..2932dce52 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_solar.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/solar" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_soul.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_soul.json new file mode 100644 index 000000000..3cc9df8ce --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_soul.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/soul" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_virtue.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_virtue.json new file mode 100644 index 000000000..968bfe217 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_virtue.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/virtue" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/bee_comb_waxy_polymer.json b/src/main/resources/assets/cosmiccore/models/item/bee_comb_waxy_polymer.json new file mode 100644 index 000000000..45d1f9081 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/bee_comb_waxy_polymer.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/comb/waxy_polymer" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/black_spray_can.json b/src/main/resources/assets/cosmiccore/models/item/black_spray_can.json new file mode 100644 index 000000000..4052f51bd --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/black_spray_can.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "cosmiccore:item/black_dye_spray_can" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/blue_spray_can.json b/src/main/resources/assets/cosmiccore/models/item/blue_spray_can.json new file mode 100644 index 000000000..c4f2a1919 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/blue_spray_can.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "cosmiccore:item/blue_dye_spray_can" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/brown_spray_can.json b/src/main/resources/assets/cosmiccore/models/item/brown_spray_can.json new file mode 100644 index 000000000..134925320 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/brown_spray_can.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "cosmiccore:item/brown_dye_spray_can" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/cyan_spray_can.json b/src/main/resources/assets/cosmiccore/models/item/cyan_spray_can.json new file mode 100644 index 000000000..5d45edd01 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/cyan_spray_can.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "cosmiccore:item/cyan_dye_spray_can" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/decaying_cosmic_upgrade.json b/src/main/resources/assets/cosmiccore/models/item/decaying_cosmic_upgrade.json new file mode 100644 index 000000000..060a30c09 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/decaying_cosmic_upgrade.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/decaying" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/gray_spray_can.json b/src/main/resources/assets/cosmiccore/models/item/gray_spray_can.json new file mode 100644 index 000000000..e7a255169 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/gray_spray_can.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "cosmiccore:item/gray_dye_spray_can" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/green_spray_can.json b/src/main/resources/assets/cosmiccore/models/item/green_spray_can.json new file mode 100644 index 000000000..ef91659b8 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/green_spray_can.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "cosmiccore:item/green_dye_spray_can" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/infinite_spray_can.json b/src/main/resources/assets/cosmiccore/models/item/infinite_spray_can.json new file mode 100644 index 000000000..b8f21a68d --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/infinite_spray_can.json @@ -0,0 +1,105 @@ +{ +"parent": "minecraft:item/generated", +"textures": { +"layer0": "cosmiccore:item/infinite_spray_can" +}, + "overrides": [ + { + "predicate": { + "cosmiccore:color": 0.0 + }, + "model": "cosmiccore:item/white_spray_can" + }, + { + "predicate": { + "cosmiccore:color": 1.0 + }, + "model": "cosmiccore:item/orange_spray_can" + }, + { + "predicate": { + "cosmiccore:color": 2.0 + }, + "model": "cosmiccore:item/magenta_spray_can" + }, + { + "predicate": { + "cosmiccore:color": 3.0 + }, + "model": "cosmiccore:item/light_blue_spray_can" + }, + { + "predicate": { + "cosmiccore:color": 4.0 + }, + "model": "cosmiccore:item/yellow_spray_can" + }, + { + "predicate": { + "cosmiccore:color": 5.0 + }, + "model": "cosmiccore:item/lime_spray_can" + }, + { + "predicate": { + "cosmiccore:color": 6.0 + }, + "model": "cosmiccore:item/pink_spray_can" + }, + { + "predicate": { + "cosmiccore:color": 7.0 + }, + "model": "cosmiccore:item/gray_spray_can" + }, + { + "predicate": { + "cosmiccore:color": 8.0 + }, + "model": "cosmiccore:item/light_gray_spray_can" + }, + { + "predicate": { + "cosmiccore:color": 9.0 + }, + "model": "cosmiccore:item/cyan_spray_can" + }, + { + "predicate": { + "cosmiccore:color": 10.0 + }, + "model": "cosmiccore:item/purple_spray_can" + }, + { + "predicate": { + "cosmiccore:color": 11.0 + }, + "model": "cosmiccore:item/blue_spray_can" + }, + { + "predicate": { + "cosmiccore:color": 12.0 + }, + "model": "cosmiccore:item/brown_spray_can" + }, + { + "predicate": { + "cosmiccore:color": 13.0 + }, + "model": "cosmiccore:item/green_spray_can" + }, + { + "predicate": { + "cosmiccore:color": 14.0 + }, + "model": "cosmiccore:item/red_spray_can" + }, + { + "predicate": { + "cosmiccore:color": 15.0 + }, + "model": "cosmiccore:item/black_spray_can" + } + ] + +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/light_blue_spray_can.json b/src/main/resources/assets/cosmiccore/models/item/light_blue_spray_can.json new file mode 100644 index 000000000..1c1a50237 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/light_blue_spray_can.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "cosmiccore:item/light_blue_dye_spray_can" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/light_gray_spray_can.json b/src/main/resources/assets/cosmiccore/models/item/light_gray_spray_can.json new file mode 100644 index 000000000..76bbfd929 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/light_gray_spray_can.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "cosmiccore:item/light_gray_dye_spray_can" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/lime_spray_can.json b/src/main/resources/assets/cosmiccore/models/item/lime_spray_can.json new file mode 100644 index 000000000..5347c240c --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/lime_spray_can.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "cosmiccore:item/lime_dye_spray_can" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/luv_meld_tool.json b/src/main/resources/assets/cosmiccore/models/item/luv_meld_tool.json new file mode 100644 index 000000000..89b0fd58f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/luv_meld_tool.json @@ -0,0 +1,18 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/tools/meld" + }, + "display": { + "thirdperson_righthand": { + "rotation": [0, -90, 55], + "translation": [0, -1, -3.25], + "scale": [0.85, 0.85, 0.85] + }, + "thirdperson_lefthand": { + "rotation": [0, -90, -55], + "translation": [0, -1, -3.25], + "scale": [0.85, 0.85, 0.85] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/magenta_spray_can.json b/src/main/resources/assets/cosmiccore/models/item/magenta_spray_can.json new file mode 100644 index 000000000..0ca88cd57 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/magenta_spray_can.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "cosmiccore:item/magenta_dye_spray_can" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/orange_spray_can.json b/src/main/resources/assets/cosmiccore/models/item/orange_spray_can.json new file mode 100644 index 000000000..fcd7d0e8b --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/orange_spray_can.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "cosmiccore:item/orange_dye_spray_can" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/pink_spray_can.json b/src/main/resources/assets/cosmiccore/models/item/pink_spray_can.json new file mode 100644 index 000000000..d349e5ad4 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/pink_spray_can.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "cosmiccore:item/pink_dye_spray_can" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/purple_spray_can.json b/src/main/resources/assets/cosmiccore/models/item/purple_spray_can.json new file mode 100644 index 000000000..53c6974eb --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/purple_spray_can.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "cosmiccore:item/purple_dye_spray_can" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/red_spray_can.json b/src/main/resources/assets/cosmiccore/models/item/red_spray_can.json new file mode 100644 index 000000000..15a313f89 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/red_spray_can.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "cosmiccore:item/red_dye_spray_can" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/wailing_cosmic_upgrade.json b/src/main/resources/assets/cosmiccore/models/item/wailing_cosmic_upgrade.json new file mode 100644 index 000000000..1bf665990 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/wailing_cosmic_upgrade.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "cosmiccore:item/wailing" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/white_spray_can.json b/src/main/resources/assets/cosmiccore/models/item/white_spray_can.json new file mode 100644 index 000000000..73f4bdd26 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/white_spray_can.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "cosmiccore:item/white_dye_spray_can" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/models/item/yellow_spray_can.json b/src/main/resources/assets/cosmiccore/models/item/yellow_spray_can.json new file mode 100644 index 000000000..50fb98568 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/models/item/yellow_spray_can.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "cosmiccore:item/yellow_dye_spray_can" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/shaders/core/galaxy_bg.fsh b/src/main/resources/assets/cosmiccore/shaders/core/galaxy_bg.fsh new file mode 100644 index 000000000..b82c44659 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/galaxy_bg.fsh @@ -0,0 +1,140 @@ +#version 150 + +in vec2 texCoord; +out vec4 fragColor; + +uniform float GameTime; +uniform vec2 ScreenSize; +uniform float Intensity; + +float hash(vec2 p) { + return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); +} + +float hash21(vec2 p) { + p = fract(p * vec2(234.34, 435.345)); + p += dot(p, p + 34.23); + return fract(p.x * p.y); +} + +float noise(vec2 p) { + vec2 i = floor(p); + vec2 f = fract(p); + f = f * f * (3.0 - 2.0 * f); + + float a = hash(i); + float b = hash(i + vec2(1.0, 0.0)); + float c = hash(i + vec2(0.0, 1.0)); + float d = hash(i + vec2(1.0, 1.0)); + + return mix(mix(a, b, f.x), mix(c, d, f.x), f.y); +} + +float fbm(vec2 p) { + float value = 0.0; + float amplitude = 0.5; + for (int i = 0; i < 6; i++) { + value += amplitude * noise(p); + p *= 2.0; + amplitude *= 0.5; + } + return value; +} + +float stars(vec2 uv, float density, float seed) { + vec2 gv = fract(uv * density) - 0.5; + vec2 id = floor(uv * density); + + float star = 0.0; + float rnd = hash21(id + seed); + + if (rnd > 0.8) { + float size = (rnd - 0.8) * 5.0; + star = smoothstep(0.1 * size + 0.02, 0.0, length(gv)); + } + + return star; +} + +void main() { + float time = GameTime * 1200.0; + + vec2 uv = texCoord; + vec2 aspect = vec2(ScreenSize.x / ScreenSize.y, 1.0); + vec2 centered = (uv - 0.5) * aspect; + + vec3 color = vec3(0.01, 0.01, 0.02); + + // Nebula clouds + vec2 nebulaUV1 = centered * 2.0 + vec2(time * 0.005, time * 0.003); + vec2 nebulaUV2 = centered * 1.5 + vec2(-time * 0.004, time * 0.006); + vec2 nebulaUV3 = centered * 3.0 + vec2(time * 0.003, -time * 0.004); + + float nebula1 = fbm(nebulaUV1); + float nebula2 = fbm(nebulaUV2); + float nebula3 = fbm(nebulaUV3); + + nebula1 = pow(nebula1, 2.0) * smoothstep(0.3, 0.7, nebula1); + nebula2 = pow(nebula2, 2.5) * smoothstep(0.35, 0.75, nebula2); + nebula3 = pow(nebula3, 2.0) * smoothstep(0.25, 0.6, nebula3); + + vec3 nebulaColor1 = vec3(0.15, 0.05, 0.25); + vec3 nebulaColor2 = vec3(0.05, 0.10, 0.20); + vec3 nebulaColor3 = vec3(0.20, 0.08, 0.12); + + color += nebulaColor1 * nebula1 * 0.6; + color += nebulaColor2 * nebula2 * 0.5; + color += nebulaColor3 * nebula3 * 0.4; + + // Bright nebula cores + float brightCore1 = pow(nebula1, 4.0) * 2.0; + float brightCore2 = pow(nebula2, 4.0) * 1.5; + + color += vec3(0.4, 0.2, 0.5) * brightCore1 * 0.3; + color += vec3(0.2, 0.3, 0.5) * brightCore2 * 0.25; + + // Cosmic dust + vec2 dustUV = centered * 4.0 + vec2(time * 0.002, 0.0); + float dust = fbm(dustUV); + dust = smoothstep(0.4, 0.6, dust); + color *= 1.0 - dust * 0.3; + + // Star layers + float starLayer1 = stars(uv + vec2(0.0, time * 0.001), 80.0, 1.0); + color += vec3(0.6, 0.6, 0.7) * starLayer1 * 0.3; + + float starLayer2 = stars(uv + vec2(time * 0.002, 0.0), 40.0, 2.0); + color += vec3(0.8, 0.8, 0.9) * starLayer2 * 0.5; + + float starLayer3 = stars(uv, 20.0, 3.0); + float twinkle = sin(time * 0.5 + hash(floor(uv * 20.0)) * 6.28) * 0.3 + 0.7; + color += vec3(1.0, 0.95, 0.9) * starLayer3 * twinkle * 0.8; + + // Colored stars + float coloredStar = stars(uv + 0.5, 15.0, 4.0); + vec3 starColor = mix( + vec3(1.0, 0.7, 0.5), + vec3(0.7, 0.8, 1.0), + hash(floor(uv * 15.0 + 0.5)) + ); + color += starColor * coloredStar * 0.6; + + // Central glow + float coreGlow = exp(-length(centered) * 2.0) * 0.15; + color += vec3(0.3, 0.25, 0.35) * coreGlow; + + // Shimmer + float shimmer = sin(time * 0.1 + fbm(centered * 5.0) * 6.28) * 0.02 + 1.0; + color *= shimmer; + + // Vignette + float vignette = 1.0 - length(centered) * 0.4; + vignette = clamp(vignette, 0.0, 1.0); + vignette = pow(vignette, 1.2); + color *= 0.7 + vignette * 0.3; + + color *= Intensity; + color = clamp(color, 0.0, 1.0); + + fragColor = vec4(color, 1.0); +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/galaxy_bg.json b/src/main/resources/assets/cosmiccore/shaders/core/galaxy_bg.json new file mode 100644 index 000000000..af62135fa --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/galaxy_bg.json @@ -0,0 +1,21 @@ +{ + "blend": { + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" + }, + "vertex": "cosmiccore:galaxy_bg", + "fragment": "cosmiccore:galaxy_bg", + "attributes": [ + "Position", + "UV0" + ], + "samplers": [], + "uniforms": [ + { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "GameTime", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "ScreenSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "Intensity", "type": "float", "count": 1, "values": [ 1.0 ] } + ] +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/galaxy_bg.vsh b/src/main/resources/assets/cosmiccore/shaders/core/galaxy_bg.vsh new file mode 100644 index 000000000..e58d02c9d --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/galaxy_bg.vsh @@ -0,0 +1,16 @@ +#version 150 + +#moj_import + +in vec3 Position; +in vec2 UV0; + +out vec2 texCoord; + +uniform mat4 ModelViewMat; +uniform mat4 ProjMat; + +void main() { + gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); + texCoord = UV0; +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/rendertype_nebulae.fsh b/src/main/resources/assets/cosmiccore/shaders/core/rendertype_nebulae.fsh new file mode 100644 index 000000000..9e40b8ded --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/rendertype_nebulae.fsh @@ -0,0 +1,82 @@ +#version 150 + +#moj_import + +//CBS +//Parallax scrolling fractal galaxy. +//Inspired by JoshP's Simplicity shader: https://www.shadertoy.com/view/lslGWr + +// Source: https://www.shadertoy.com/view/MslGWN +// Modified by Screret to work within Minecraft + +// GameTime is how many days have passed in fractional days. mutliply by 1200 to get seconds, or 24000 to get ticks. +uniform float GameTime; +// framebuffer width & height +uniform vec2 ScreenSize; +// Modify these (in rendertype_nebulae.json) to get different colors/brightnesses +uniform vec4 Frequencies; +// Multiplier for GameTime, changes how fast the effect scrolls +uniform float ScrollSpeed; +uniform int Layer0Iterations; +uniform int Layer1Iterations; + +// http://www.fractalforums.com/new-theories-and-research/very-simple-formula-for-fractal-patterns/ +float field(in vec3 p, float s, int iterations) { + float strength = 7.0 + 0.03 * log(1.e-6 + fract(sin(GameTime * ScrollSpeed) * 4373.11)); + float accum = s / 4.0; + float prev = 0.0; + float tw = 0.0; + for (int i = 0; i < iterations; ++i) { + float mag = dot(p, p); + p = abs(p) / mag + vec3(-0.5, -0.4, -1.5); + float w = exp(-float(i) / 7.0); + accum += w * exp(-strength * pow(abs(mag - prev), 2.2)); + tw += w; + prev = mag; + } + return max(0.0, 5.0 * accum / tw - 0.7); +} + +vec3 nrand3(vec2 co) { + vec3 a = fract(cos(co.x * 8.3e-3 + co.y) * vec3(1.3e5, 4.7e5, 2.9e5)); + vec3 b = fract(sin(co.x * 0.3e-3 + co.y) * vec3(8.1e5, 1.0e5, 0.1e5)); + vec3 c = mix(a, b, 0.5); + return c; +} +out vec4 fragColor; + + +void main() { + // multiplied by ScrollSpeed to get a reasonable speed + float GameTime = GameTime * ScrollSpeed; + + vec2 uv = gl_FragCoord.xy / ScreenSize - 1.0; + vec2 uvs = uv * ScreenSize / max(ScreenSize.x, ScreenSize.y); + vec3 p = vec3(uvs / 4.0, 0.0) + vec3(1.0, -1.3, 0.0); + p += 0.2 * vec3(sin(GameTime / 16.0), sin(GameTime / 12.0), sin(GameTime / 128.0)); + + float t = field(p, Frequencies[2], Layer0Iterations); + float v = (1.0 - exp((abs(uv.x) - 1.0) * 6.0)) * (1.0 - exp((abs(uv.y) - 1.0) * 6.0)); + + //Second Layer + vec3 p2 = vec3(uvs / (4.0 + sin(GameTime * 0.11) * 0.2 + 0.2 + sin(GameTime * 0.15) * 0.3 + 0.4), 1.5) + vec3(2.0, -1.3, -1.0); + p2 += 0.25 * vec3(sin(GameTime / 16.0), sin(GameTime / 12.0), sin(GameTime / 128.0)); + float t2 = field(p2, Frequencies[3], Layer1Iterations); + vec4 c2 = mix(0.4, 1.0, v) * vec4(1.3 * t2 * t2 * t2, 1.8 * t2 * t2, t2 * Frequencies[0], t2); + + + //Let's add some stars + //Thanks to http://glsl.heroku.com/e#6904.0 + vec2 seed = p.xy * 2.0; + seed = floor(seed * ScreenSize.x); + vec3 rnd = nrand3(seed); + vec4 starcolor = vec4(pow(rnd.y, 40.0)); + + //Second Layer + vec2 seed2 = p2.xy * 2.0; + seed2 = floor(seed2 * ScreenSize.x); + vec3 rnd2 = nrand3(seed2); + starcolor += vec4(pow(rnd2.y, 40.0)); + + fragColor = mix(Frequencies[3] - 0.3, 1.0, v) * vec4(1.5 * Frequencies[2] * t * t * t, 1.2 * Frequencies[1] * t * t, Frequencies[3] * t, 1.0) + c2 + starcolor; +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/rendertype_nebulae.json b/src/main/resources/assets/cosmiccore/shaders/core/rendertype_nebulae.json new file mode 100644 index 000000000..bddf37999 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/rendertype_nebulae.json @@ -0,0 +1,21 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1-srcalpha" + }, + "vertex": "cosmiccore:rendertype_nebulae", + "fragment": "cosmiccore:rendertype_nebulae", + "attributes": [], + "samplers": [], + "uniforms": [ + { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "GameTime", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "ScreenSize", "type": "float", "count": 2, "values": [ 0.0, 0.0 ] }, + { "name": "Frequencies", "type": "float", "count": 4, "values": [ 0.75, -1.0, 1.0, 0.75 ] }, + { "name": "ScrollSpeed", "type": "float", "count": 1, "values": [ 600.0 ] }, + { "name": "Layer0Iterations", "type": "int", "count": 1, "values": [ 26 ] }, + { "name": "Layer1Iterations", "type": "int", "count": 1, "values": [ 18 ] } + ] +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/rendertype_nebulae.vsh b/src/main/resources/assets/cosmiccore/shaders/core/rendertype_nebulae.vsh new file mode 100644 index 000000000..e82c291e6 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/rendertype_nebulae.vsh @@ -0,0 +1,12 @@ +#version 150 + +#moj_import + +in vec3 Position; + +uniform mat4 ModelViewMat; +uniform mat4 ProjMat; + +void main() { + gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/soul_aura.fsh b/src/main/resources/assets/cosmiccore/shaders/core/soul_aura.fsh new file mode 100644 index 000000000..4d58868cf --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/soul_aura.fsh @@ -0,0 +1,66 @@ +#version 150 + +in vec2 texCoord; +out vec4 fragColor; + +uniform float GameTime; +uniform vec2 ScreenSize; +uniform vec2 Center; +uniform vec3 BaseColor; +uniform float Intensity; +uniform float Radius; + +void main() { + float time = GameTime * 1200.0; + + vec2 aspectRatio = vec2(ScreenSize.x / ScreenSize.y, 1.0); + vec2 uv = (texCoord - Center) * aspectRatio; + + float dist = length(uv); + + float alpha = 0.0; + vec3 color = BaseColor; + + // Slow water ripples — expanding ring pulses + float ringSpeed = 0.12; + for (int i = 0; i < 3; i++) { + float phase = float(i) * 2.5 + time * ringSpeed; + float ringDist = mod(phase, Radius * 2.8); + float ringAlpha = 1.0 - ringDist / (Radius * 2.8); + ringAlpha = ringAlpha * ringAlpha * ringAlpha; + float ring = smoothstep(0.06, 0.0, abs(dist - ringDist)) * ringAlpha; + alpha += ring * 0.15; + } + + // Aurora flow (cartesian wave bands) + float flow1 = sin(uv.x * 8.0 + uv.y * 6.0 + time * 0.6 + dist * 4.0) * 0.5 + 0.5; + flow1 = flow1 * flow1; + flow1 *= smoothstep(Radius * 1.6, Radius * 0.6, dist); + flow1 *= smoothstep(Radius * 0.3, Radius * 0.7, dist); + + float flow2 = sin(uv.x * 6.0 - uv.y * 8.0 - time * 0.4 + dist * 3.0 + 2.0) * 0.5 + 0.5; + flow2 = flow2 * flow2; + flow2 *= smoothstep(Radius * 1.4, Radius * 0.5, dist); + flow2 *= smoothstep(Radius * 0.25, Radius * 0.6, dist); + + alpha += (flow1 + flow2) * 0.1; + + // Core glow + float core = 1.0 - smoothstep(0.0, Radius * 0.6, dist); + core = pow(core, 1.8); + alpha += core * 0.25; + + // Outer glow + float outerGlow = 1.0 - smoothstep(Radius * 0.2, Radius * 1.5, dist); + outerGlow = outerGlow * outerGlow; + alpha += outerGlow * 0.15; + + alpha *= Intensity; + + float boundary = 1.0 - smoothstep(Radius * 1.3, Radius * 2.0, dist); + alpha *= boundary; + + alpha = clamp(alpha, 0.0, 1.0); + + fragColor = vec4(color, alpha); +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/soul_aura.json b/src/main/resources/assets/cosmiccore/shaders/core/soul_aura.json new file mode 100644 index 000000000..209d07c1f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/soul_aura.json @@ -0,0 +1,24 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "one" + }, + "vertex": "cosmiccore:soul_aura", + "fragment": "cosmiccore:soul_aura", + "attributes": [ + "Position", + "UV0" + ], + "samplers": [], + "uniforms": [ + { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "GameTime", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "ScreenSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "Center", "type": "float", "count": 2, "values": [ 0.5, 0.5 ] }, + { "name": "BaseColor", "type": "float", "count": 3, "values": [ 1.0, 0.85, 0.5 ] }, + { "name": "Intensity", "type": "float", "count": 1, "values": [ 1.0 ] }, + { "name": "Radius", "type": "float", "count": 1, "values": [ 0.15 ] } + ] +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/soul_aura.vsh b/src/main/resources/assets/cosmiccore/shaders/core/soul_aura.vsh new file mode 100644 index 000000000..e58d02c9d --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/soul_aura.vsh @@ -0,0 +1,16 @@ +#version 150 + +#moj_import + +in vec3 Position; +in vec2 UV0; + +out vec2 texCoord; + +uniform mat4 ModelViewMat; +uniform mat4 ProjMat; + +void main() { + gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); + texCoord = UV0; +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/soul_core.fsh b/src/main/resources/assets/cosmiccore/shaders/core/soul_core.fsh new file mode 100644 index 000000000..e6dc81500 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/soul_core.fsh @@ -0,0 +1,203 @@ +#version 150 + +in vec2 texCoord; +out vec4 fragColor; + +uniform float GameTime; +uniform vec2 ScreenSize; +uniform vec2 Center; +uniform vec3 CoreColor; +uniform vec3 ShellColor; +uniform float Intensity; +uniform float Radius; +uniform float Erosion; + +float hash(vec2 p) { + return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); +} + +vec2 hash2(vec2 p) { + return vec2( + fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453), + fract(sin(dot(p, vec2(269.5, 183.3))) * 43758.5453) + ); +} + +float noise(vec2 p) { + vec2 i = floor(p); + vec2 f = fract(p); + f = f * f * (3.0 - 2.0 * f); + float a = hash(i); + float b = hash(i + vec2(1.0, 0.0)); + float c = hash(i + vec2(0.0, 1.0)); + float d = hash(i + vec2(1.0, 1.0)); + return mix(mix(a, b, f.x), mix(c, d, f.x), f.y); +} + +vec2 voronoi(vec2 uv) { + vec2 cell = floor(uv); + vec2 frac = fract(uv); + + float minDist = 10.0; + float secondDist = 10.0; + float cellId = 0.0; + + for (int y = -1; y <= 1; y++) { + for (int x = -1; x <= 1; x++) { + vec2 neighbor = vec2(float(x), float(y)); + vec2 point = hash2(cell + neighbor); + vec2 diff = neighbor + point - frac; + float d = length(diff); + + if (d < minDist) { + secondDist = minDist; + minDist = d; + cellId = hash(cell + neighbor); + } else if (d < secondDist) { + secondDist = d; + } + } + } + + return vec2(secondDist - minDist, cellId); +} + +void main() { + float time = GameTime * 1200.0; + + vec2 aspectRatio = vec2(ScreenSize.x / ScreenSize.y, 1.0); + vec2 uv = (texCoord - Center) * aspectRatio; + + float dist = length(uv); + float normDist = dist / Radius; + vec2 nuv = uv / Radius; + + float maxExpand = 1.0 + Erosion * 0.4; + if (normDist > maxExpand + 0.15) { + fragColor = vec4(0.0); + return; + } + + // === CORE — Compressed at low erosion, blinding at max === + + float coreCompression = mix(0.35, 0.75, Erosion); + float corePulse = 0.5 + 0.5 * sin(time * 0.25 + dist * 15.0); + float coreBase = 1.0 - smoothstep(0.0, coreCompression, normDist); + coreBase = pow(coreBase, mix(3.0, 1.2, Erosion)); + + float heat1 = noise(nuv * 5.0 + vec2(time * 0.08, time * 0.06)); + float heat2 = noise(nuv * 8.0 - vec2(time * 0.05, time * 0.09)); + float heat = heat1 * heat2; + heat *= smoothstep(0.0, 0.2, normDist) * smoothstep(0.85, 0.3, normDist); + + float coreAlpha = coreBase + heat * 0.4 + corePulse * coreBase * 0.15; + vec3 coreCol = CoreColor * (0.8 + 0.2 * corePulse); + float whiteness = mix(0.3, 0.8, Erosion); + coreCol = mix(coreCol, vec3(1.0, 0.98, 0.92), coreBase * whiteness); + coreCol = mix(coreCol, vec3(1.0, 0.5, 0.1), heat * 0.3); + + // === SHELL — Voronoi fragments that explode outward === + + vec2 v1 = voronoi(nuv * 6.0 + vec2(time * 0.01, -time * 0.008)); + vec2 v2 = voronoi(nuv * 10.0 - vec2(time * 0.006, time * 0.01)); + + float edge1 = v1.x; + float id1 = v1.y; + float edge2 = v2.x; + float id2 = v2.y; + + float cellDisplace1 = hash(vec2(id1 * 127.3, id1 * 53.7)); + float cellDisplace2 = hash(vec2(id2 * 89.1, id2 * 41.3)); + + float pushAmount1 = cellDisplace1 * Erosion * 0.35; + float pushAmount2 = cellDisplace2 * Erosion * 0.25; + + float cellNorm1 = normDist - pushAmount1; + float cellNorm2 = normDist - pushAmount2; + + // Fracture lines widen with erosion + float gapWidth1 = mix(0.02, 0.06, Erosion); + float gapWidth2 = mix(0.02, 0.05, Erosion); + float gap1 = 1.0 - smoothstep(gapWidth1, gapWidth1 + 0.04, edge1); + float gap2 = 1.0 - smoothstep(gapWidth2, gapWidth2 + 0.03, edge2); + + float frag1 = smoothstep(gapWidth1 + 0.02, gapWidth1 + 0.08, edge1); + float frag2 = smoothstep(gapWidth2 + 0.01, gapWidth2 + 0.07, edge2); + + float fragments = max(frag1 * 0.7, frag2 * 0.5); + + float cellBright1 = 0.5 + 0.5 * sin(id1 * 47.0 + time * 0.15); + float cellBright2 = 0.4 + 0.6 * sin(id2 * 31.0 + time * 0.12 + 1.0); + + float metallic = fragments * mix(cellBright1, cellBright2, 0.4); + + float shellRadial1 = smoothstep(0.1, 0.3, cellNorm1) * smoothstep(maxExpand, 0.55, cellNorm1); + float shellRadial2 = smoothstep(0.1, 0.3, cellNorm2) * smoothstep(maxExpand, 0.55, cellNorm2); + float shellRadial = max(shellRadial1, shellRadial2 * 0.6); + + float erosionCutoff = Erosion * 0.85; + float cellSurvival1 = step(erosionCutoff, id1); + float cellSurvival2 = step(erosionCutoff * 0.9, id2); + float survival = max(cellSurvival1, cellSurvival2 * 0.6); + + float shellAlpha = metallic * shellRadial * survival; + + float cellBoundary1 = 1.0 - smoothstep(maxExpand - 0.12, maxExpand, cellNorm1); + float cellBoundary2 = 1.0 - smoothstep(maxExpand - 0.12, maxExpand, cellNorm2); + float cellBoundary = max(cellBoundary1 * cellSurvival1, cellBoundary2 * cellSurvival2 * 0.6); + float boundary = max(cellBoundary, 1.0 - smoothstep(0.85, 1.0, normDist)); + + vec3 shellCol = ShellColor * (0.4 + 0.6 * metallic); + float edgeLight = smoothstep(0.12, 0.06, edge1) * smoothstep(0.02, 0.06, edge1); + shellCol = mix(shellCol, CoreColor * 0.7, edgeLight * 0.5); + + // === FRACTURE GLOW — White-hot at high erosion === + + float gapMask = max(gap1, gap2 * 0.7); + gapMask *= shellRadial * boundary; + float gapIntensity = 0.3 + Erosion * 0.7; + vec3 gapCol = mix(CoreColor * 1.2, vec3(1.0, 0.95, 0.85), Erosion * 0.6); + gapCol *= 1.0 + Erosion * 0.8; + + float edgeBloom1 = smoothstep(gapWidth1 + 0.06, gapWidth1, edge1) * smoothstep(gapWidth1 * 0.5, gapWidth1, edge1); + float edgeBloom2 = smoothstep(gapWidth2 + 0.05, gapWidth2, edge2) * smoothstep(gapWidth2 * 0.5, gapWidth2, edge2); + float edgeBloom = max(edgeBloom1, edgeBloom2 * 0.6) * shellRadial * boundary; + float bloomStrength = Erosion * 0.4; + + // === COMPOSITE === + + float coreVisibility = (1.0 - shellAlpha * 0.85) * boundary; + float erosionGlow = 1.0 + Erosion * 1.0; + coreAlpha *= coreVisibility * erosionGlow; + + float outerGlow = smoothstep(1.2, 0.75, normDist) * smoothstep(0.0, 0.3, normDist); + outerGlow *= (1.0 - shellAlpha * 0.7); + float glowStrength = 0.04 + Erosion * 0.12; + + vec3 color = vec3(0.0); + float alpha = 0.0; + + color += coreCol * coreAlpha; + alpha += coreAlpha; + + color += shellCol * shellAlpha * boundary; + alpha += shellAlpha * boundary; + + color += gapCol * gapMask * gapIntensity; + alpha += gapMask * gapIntensity * 0.6; + + color += vec3(1.0, 0.95, 0.9) * edgeBloom * bloomStrength; + alpha += edgeBloom * bloomStrength * 0.5; + + color += CoreColor * outerGlow * glowStrength; + alpha += outerGlow * glowStrength; + + alpha *= Intensity; + alpha = clamp(alpha, 0.0, 1.0); + + if (alpha > 0.001) { + color /= alpha; + } + + fragColor = vec4(color, alpha); +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/soul_core.json b/src/main/resources/assets/cosmiccore/shaders/core/soul_core.json new file mode 100644 index 000000000..b92c662df --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/soul_core.json @@ -0,0 +1,26 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "1_minus_srcalpha" + }, + "vertex": "cosmiccore:soul_core", + "fragment": "cosmiccore:soul_core", + "attributes": [ + "Position", + "UV0" + ], + "samplers": [], + "uniforms": [ + { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "GameTime", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "ScreenSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "Center", "type": "float", "count": 2, "values": [ 0.5, 0.5 ] }, + { "name": "CoreColor", "type": "float", "count": 3, "values": [ 1.0, 0.9, 0.7 ] }, + { "name": "ShellColor", "type": "float", "count": 3, "values": [ 0.85, 0.85, 0.92 ] }, + { "name": "Intensity", "type": "float", "count": 1, "values": [ 1.0 ] }, + { "name": "Radius", "type": "float", "count": 1, "values": [ 0.08 ] }, + { "name": "Erosion", "type": "float", "count": 1, "values": [ 0.0 ] } + ] +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/soul_core.vsh b/src/main/resources/assets/cosmiccore/shaders/core/soul_core.vsh new file mode 100644 index 000000000..e58d02c9d --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/soul_core.vsh @@ -0,0 +1,16 @@ +#version 150 + +#moj_import + +in vec3 Position; +in vec2 UV0; + +out vec2 texCoord; + +uniform mat4 ModelViewMat; +uniform mat4 ProjMat; + +void main() { + gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); + texCoord = UV0; +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/soul_threads.fsh b/src/main/resources/assets/cosmiccore/shaders/core/soul_threads.fsh new file mode 100644 index 000000000..6d1b8ff2c --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/soul_threads.fsh @@ -0,0 +1,125 @@ +#version 150 + +in vec2 texCoord; +out vec4 fragColor; + +uniform float GameTime; +uniform vec2 ScreenSize; +uniform vec2 Center; +uniform vec3 CoreColor; +uniform vec3 ShellColor; +uniform float Intensity; +uniform float Radius; +uniform float Erosion; + +float hash(vec2 p) { + return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); +} + +float noise(vec2 p) { + vec2 i = floor(p); + vec2 f = fract(p); + f = f * f * (3.0 - 2.0 * f); + float a = hash(i); + float b = hash(i + vec2(1.0, 0.0)); + float c = hash(i + vec2(0.0, 1.0)); + float d = hash(i + vec2(1.0, 1.0)); + return mix(mix(a, b, f.x), mix(c, d, f.x), f.y); +} + +float fbm(vec2 p) { + float v = 0.0; + float a = 0.5; + for (int i = 0; i < 4; i++) { + v += a * noise(p); + p *= 2.1; + a *= 0.5; + } + return v; +} + +float thread(vec2 uv, float angle, float seed, float time, float radius) { + float c = cos(angle); + float s = sin(angle); + vec2 ruv = vec2(uv.x * c + uv.y * s, -uv.x * s + uv.y * c); + + float startDist = radius * 0.6; + float reachMult = 0.5 + seed * 0.8; + float reach = radius * (0.3 + Erosion * 0.9) * reachMult; + float along = (ruv.x - startDist) / reach; + if (along < 0.0 || along > 1.0) return 0.0; + + float wiggle = sin(along * 25.0 + time * 1.5 + seed * 6.28) * 0.003 * (0.5 + along * 1.5); + wiggle += sin(along * 40.0 - time * 2.0 + seed * 3.14) * 0.0015 * along; + wiggle += sin(along * 4.0 + time * 0.3 + seed * 12.0) * 0.002; + + float width = mix(0.005, 0.0012, along) * (0.4 + Erosion * 0.6); + float lateralDist = abs(ruv.y - wiggle); + float threadAlpha = smoothstep(width, width * 0.2, lateralDist); + + float glow = smoothstep(width * 4.0, width * 0.5, lateralDist) * 0.3; + threadAlpha += glow; + + float lengthFade = pow(1.0 - along, 1.5); + float pulse = 0.6 + 0.4 * sin(along * 12.0 - time * 3.0 + seed * 10.0); + + return threadAlpha * lengthFade * pulse; +} + +void main() { + float time = GameTime * 1200.0; + + vec2 aspectRatio = vec2(ScreenSize.x / ScreenSize.y, 1.0); + vec2 uv = (texCoord - Center) * aspectRatio; + + float dist = length(uv); + float normDist = dist / Radius; + + if (normDist > 3.5) { + fragColor = vec4(0.0); + return; + } + + float alpha = 0.0; + vec3 color = vec3(0.0); + + int threadCount = int(mix(5.0, 18.0, Erosion)); + + for (int i = 0; i < 18; i++) { + if (i >= threadCount) break; + + float seed = hash(vec2(float(i) * 73.156, float(i) * 31.77)); + // Golden angle distribution + jitter for organic but non-uniform spacing + float angle = float(i) * 2.39996 + seed * 0.6 + time * 0.015; + + float t = thread(uv, angle, seed, time, Radius); + t *= Erosion * Erosion; + + float ruv_x = uv.x * cos(angle) + uv.y * sin(angle); + float reachMult = 0.5 + seed * 0.8; + float reach = Radius * (0.3 + Erosion * 0.9) * reachMult; + float along = clamp((ruv_x - Radius * 0.6) / reach, 0.0, 1.0); + vec3 threadCol = mix(CoreColor * 1.5, ShellColor * 0.6, along * 0.7); + threadCol = mix(vec3(1.0, 0.97, 0.90), threadCol, smoothstep(0.0, 0.25, along)); + + color += threadCol * t; + alpha += t; + } + + // Inner haze + float haze = smoothstep(Radius * 1.2, Radius * 0.7, dist); + haze *= smoothstep(Radius * 0.4, Radius * 0.8, dist); + float hazeNoise = fbm(uv * 15.0 + vec2(time * 0.1, -time * 0.08)); + haze *= hazeNoise * Erosion * 0.12; + color += CoreColor * haze; + alpha += haze; + + alpha *= Intensity; + alpha = clamp(alpha, 0.0, 0.7); + + if (alpha > 0.001) { + color /= alpha; + } + + fragColor = vec4(color, alpha); +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/soul_threads.json b/src/main/resources/assets/cosmiccore/shaders/core/soul_threads.json new file mode 100644 index 000000000..1e470eeba --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/soul_threads.json @@ -0,0 +1,26 @@ +{ + "blend": { + "func": "add", + "srcrgb": "srcalpha", + "dstrgb": "one" + }, + "vertex": "cosmiccore:soul_threads", + "fragment": "cosmiccore:soul_threads", + "attributes": [ + "Position", + "UV0" + ], + "samplers": [], + "uniforms": [ + { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "GameTime", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "ScreenSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "Center", "type": "float", "count": 2, "values": [ 0.5, 0.5 ] }, + { "name": "CoreColor", "type": "float", "count": 3, "values": [ 1.0, 0.9, 0.7 ] }, + { "name": "ShellColor", "type": "float", "count": 3, "values": [ 0.85, 0.85, 0.92 ] }, + { "name": "Intensity", "type": "float", "count": 1, "values": [ 1.0 ] }, + { "name": "Radius", "type": "float", "count": 1, "values": [ 0.08 ] }, + { "name": "Erosion", "type": "float", "count": 1, "values": [ 0.0 ] } + ] +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/soul_threads.vsh b/src/main/resources/assets/cosmiccore/shaders/core/soul_threads.vsh new file mode 100644 index 000000000..e58d02c9d --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/soul_threads.vsh @@ -0,0 +1,16 @@ +#version 150 + +#moj_import + +in vec3 Position; +in vec2 UV0; + +out vec2 texCoord; + +uniform mat4 ModelViewMat; +uniform mat4 ProjMat; + +void main() { + gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); + texCoord = UV0; +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/void_bg.fsh b/src/main/resources/assets/cosmiccore/shaders/core/void_bg.fsh new file mode 100644 index 000000000..eb6360eec --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/void_bg.fsh @@ -0,0 +1,119 @@ +#version 150 + +in vec2 texCoord; +out vec4 fragColor; + +uniform float GameTime; +uniform vec2 ScreenSize; +uniform float Intensity; + +float hash(vec2 p) { + return fract(sin(dot(p, vec2(127.1, 311.7))) * 43758.5453); +} + +float noise(vec2 p) { + vec2 i = floor(p); + vec2 f = fract(p); + f = f * f * (3.0 - 2.0 * f); + + float a = hash(i); + float b = hash(i + vec2(1.0, 0.0)); + float c = hash(i + vec2(0.0, 1.0)); + float d = hash(i + vec2(1.0, 1.0)); + + return mix(mix(a, b, f.x), mix(c, d, f.x), f.y); +} + +float fbm(vec2 p) { + float value = 0.0; + float amplitude = 0.5; + for (int i = 0; i < 5; i++) { + value += amplitude * noise(p); + p *= 2.0; + amplitude *= 0.5; + } + return value; +} + +void main() { + float time = GameTime * 1200.0; + + vec2 uv = texCoord; + vec2 aspect = vec2(ScreenSize.x / ScreenSize.y, 1.0); + vec2 centered = (uv - 0.5) * aspect; + + vec3 color = vec3(0.0); + + // Void mist + vec2 mistUV1 = centered * 1.5 + vec2(time * 0.02, time * 0.01); + vec2 mistUV2 = centered * 2.0 + vec2(-time * 0.015, time * 0.025); + + float mist1 = fbm(mistUV1) * 0.5 + 0.5; + float mist2 = fbm(mistUV2) * 0.5 + 0.5; + float mist = mist1 * mist2; + + vec3 mistColor = vec3(0.08, 0.04, 0.12); + color += mistColor * mist * 0.4; + + // Drifting wisps + for (int i = 0; i < 4; i++) { + float fi = float(i); + float wispTime = time * 0.03 + fi * 1.57; + + vec2 wispCenter = vec2( + sin(wispTime * 0.7 + fi * 2.0) * 0.3, + cos(wispTime * 0.5 + fi * 1.5) * 0.25 + ); + + vec2 toWisp = centered - wispCenter; + float wispDist = length(toWisp); + float wisp = exp(-wispDist * 4.0) * 0.3; + + vec3 wispColor = mix( + vec3(0.15, 0.08, 0.20), + vec3(0.10, 0.12, 0.18), + sin(fi * 1.5) * 0.5 + 0.5 + ); + + color += wispColor * wisp; + } + + // Energy tendrils + float tendrilNoise = fbm(centered * 3.0 + vec2(time * 0.05, 0.0)); + tendrilNoise = pow(tendrilNoise, 3.0); + + vec3 tendrilColor = vec3(0.12, 0.06, 0.15); + color += tendrilColor * tendrilNoise * 0.2; + + // Floating dust + for (int i = 0; i < 8; i++) { + float fi = float(i); + float seed = fi * 127.1; + + float px = (hash(vec2(seed, 0.0)) - 0.5) * 1.5; + float py = mod(hash(vec2(seed, 1.0)) - time * 0.02 - fi * 0.05, 1.5) - 0.75; + px += sin(time * 0.1 + fi * 2.0) * 0.05; + + vec2 particlePos = vec2(px, py); + float particleDist = length(centered - particlePos); + + float particle = exp(-particleDist * 50.0) * 0.3; + float twinkle = sin(time * (0.5 + fi * 0.2) + fi * 3.0) * 0.3 + 0.7; + + color += vec3(0.3, 0.25, 0.35) * particle * twinkle; + } + + // Ambient pulse + float pulse = sin(time * 0.15) * 0.02 + 0.98; + color *= pulse; + + // Vignette + float vignette = 1.0 - length(centered) * 0.6; + vignette = clamp(vignette, 0.0, 1.0); + vignette = pow(vignette, 1.5); + color *= vignette; + + color *= Intensity; + + fragColor = vec4(color, 1.0); +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/void_bg.json b/src/main/resources/assets/cosmiccore/shaders/core/void_bg.json new file mode 100644 index 000000000..2425414e1 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/void_bg.json @@ -0,0 +1,21 @@ +{ + "blend": { + "func": "add", + "srcrgb": "one", + "dstrgb": "zero" + }, + "vertex": "cosmiccore:void_bg", + "fragment": "cosmiccore:void_bg", + "attributes": [ + "Position", + "UV0" + ], + "samplers": [], + "uniforms": [ + { "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] }, + { "name": "GameTime", "type": "float", "count": 1, "values": [ 0.0 ] }, + { "name": "ScreenSize", "type": "float", "count": 2, "values": [ 1.0, 1.0 ] }, + { "name": "Intensity", "type": "float", "count": 1, "values": [ 1.0 ] } + ] +} diff --git a/src/main/resources/assets/cosmiccore/shaders/core/void_bg.vsh b/src/main/resources/assets/cosmiccore/shaders/core/void_bg.vsh new file mode 100644 index 000000000..e58d02c9d --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/core/void_bg.vsh @@ -0,0 +1,16 @@ +#version 150 + +#moj_import + +in vec3 Position; +in vec2 UV0; + +out vec2 texCoord; + +uniform mat4 ModelViewMat; +uniform mat4 ProjMat; + +void main() { + gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0); + texCoord = UV0; +} diff --git a/src/main/resources/assets/cosmiccore/shaders/include/perlin_2d.glsl b/src/main/resources/assets/cosmiccore/shaders/include/perlin_2d.glsl new file mode 100644 index 000000000..c7d518cb7 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/shaders/include/perlin_2d.glsl @@ -0,0 +1,73 @@ +#version 150 + +// +// Description : Array and textureless GLSL 2D simplex noise function. +// Author : Ian McEwan, Ashima Arts. +// Maintainer : stegu +// Lastmod : 20110822 (ijm) +// License : Copyright (C) 2011 Ashima Arts. All rights reserved. +// Distributed under the MIT License. See LICENSE file. +// https://github.com/ashima/webgl-noise +// https://github.com/stegu/webgl-noise +// + +vec3 mod289(vec3 x) { + return x - floor(x * (1.0 / 289.0)) * 289.0; +} + +vec2 mod289(vec2 x) { + return x - floor(x * (1.0 / 289.0)) * 289.0; +} + +vec3 permute(vec3 x) { + return mod289(((x*34.0)+10.0)*x); +} + +float perlin_2d(vec2 v) +{ + const vec4 C = vec4(0.211324865405187, // (3.0-sqrt(3.0))/6.0 + 0.366025403784439, // 0.5*(sqrt(3.0)-1.0) + -0.577350269189626, // -1.0 + 2.0 * C.x + 0.024390243902439); // 1.0 / 41.0 + // First corner + vec2 i = floor(v + dot(v, C.yy) ); + vec2 x0 = v - i + dot(i, C.xx); + + // Other corners + vec2 i1; + //i1.x = step( x0.y, x0.x ); // x0.x > x0.y ? 1.0 : 0.0 + //i1.y = 1.0 - i1.x; + i1 = (x0.x > x0.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0); + // x0 = x0 - 0.0 + 0.0 * C.xx ; + // x1 = x0 - i1 + 1.0 * C.xx ; + // x2 = x0 - 1.0 + 2.0 * C.xx ; + vec4 x12 = x0.xyxy + C.xxzz; + x12.xy -= i1; + + // Permutations + i = mod289(i); // Avoid truncation effects in permutation + vec3 p = permute( permute( i.y + vec3(0.0, i1.y, 1.0 )) + + i.x + vec3(0.0, i1.x, 1.0 )); + + vec3 m = max(0.5 - vec3(dot(x0,x0), dot(x12.xy,x12.xy), dot(x12.zw,x12.zw)), 0.0); + m = m*m ; + m = m*m ; + + // Gradients: 41 points uniformly over a line, mapped onto a diamond. + // The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287) + + vec3 x = 2.0 * fract(p * C.www) - 1.0; + vec3 h = abs(x) - 0.5; + vec3 ox = floor(x + 0.5); + vec3 a0 = x - ox; + + // Normalise gradients implicitly by scaling m + // Approximation of: m *= inversesqrt( a0*a0 + h*h ); + m *= 1.79284291400159 - 0.85373472095314 * ( a0*a0 + h*h ); + + // Compute final noise value at P + vec3 g; + g.x = a0.x * x0.x + h.x * x0.y; + g.yz = a0.yz * x12.xz + h.yz * x12.yw; + return 130.0 * dot(m, g); +} diff --git a/src/main/resources/assets/cosmiccore/sounds/ambient_drone.ogg b/src/main/resources/assets/cosmiccore/sounds/ambient_drone.ogg new file mode 100644 index 000000000..d6cb64b3e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/sounds/ambient_drone.ogg differ diff --git a/src/main/resources/assets/cosmiccore/sounds/arcane_distil.ogg b/src/main/resources/assets/cosmiccore/sounds/arcane_distil.ogg new file mode 100644 index 000000000..319c64c67 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/sounds/arcane_distil.ogg differ diff --git a/src/main/resources/assets/cosmiccore/sounds/dawnforge.ogg b/src/main/resources/assets/cosmiccore/sounds/dawnforge.ogg new file mode 100644 index 000000000..e6c2f3952 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/sounds/dawnforge.ogg differ diff --git a/src/main/resources/assets/cosmiccore/sounds/dying_star.ogg b/src/main/resources/assets/cosmiccore/sounds/dying_star.ogg new file mode 100644 index 000000000..fef20c869 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/sounds/dying_star.ogg differ diff --git a/src/main/resources/assets/cosmiccore/sounds/fluidizer.ogg b/src/main/resources/assets/cosmiccore/sounds/fluidizer.ogg new file mode 100644 index 000000000..5aaee8983 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/sounds/fluidizer.ogg differ diff --git a/src/main/resources/assets/cosmiccore/sounds/gas_succ.ogg b/src/main/resources/assets/cosmiccore/sounds/gas_succ.ogg new file mode 100644 index 000000000..77cbafec7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/sounds/gas_succ.ogg differ diff --git a/src/main/resources/assets/cosmiccore/sounds/heavy_assembler.ogg b/src/main/resources/assets/cosmiccore/sounds/heavy_assembler.ogg new file mode 100644 index 000000000..03633d1df Binary files /dev/null and b/src/main/resources/assets/cosmiccore/sounds/heavy_assembler.ogg differ diff --git a/src/main/resources/assets/cosmiccore/sounds/icv.ogg b/src/main/resources/assets/cosmiccore/sounds/icv.ogg new file mode 100644 index 000000000..32a1cc21d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/sounds/icv.ogg differ diff --git a/src/main/resources/assets/cosmiccore/sounds/laminator.ogg b/src/main/resources/assets/cosmiccore/sounds/laminator.ogg new file mode 100644 index 000000000..343fe57b8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/sounds/laminator.ogg differ diff --git a/src/main/resources/assets/cosmiccore/sounds/mining_machine.ogg b/src/main/resources/assets/cosmiccore/sounds/mining_machine.ogg new file mode 100644 index 000000000..e59ce44d8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/sounds/mining_machine.ogg differ diff --git a/src/main/resources/assets/cosmiccore/sounds/orbital_forge.ogg b/src/main/resources/assets/cosmiccore/sounds/orbital_forge.ogg new file mode 100644 index 000000000..a39c95fd9 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/sounds/orbital_forge.ogg differ diff --git a/src/main/resources/assets/cosmiccore/sounds/shake.ogg b/src/main/resources/assets/cosmiccore/sounds/shake.ogg new file mode 100644 index 000000000..f2f0f1a6a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/sounds/shake.ogg differ diff --git a/src/main/resources/assets/cosmiccore/sounds/vorax.ogg b/src/main/resources/assets/cosmiccore/sounds/vorax.ogg new file mode 100644 index 000000000..3cd9fcabd Binary files /dev/null and b/src/main/resources/assets/cosmiccore/sounds/vorax.ogg differ diff --git a/src/main/resources/assets/cosmiccore/textures/armor/sanguine_suit_1.png b/src/main/resources/assets/cosmiccore/textures/armor/sanguine_suit_1.png new file mode 100644 index 000000000..898d84b37 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/armor/sanguine_suit_1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/armor/sanguine_suit_2.png b/src/main/resources/assets/cosmiccore/textures/armor/sanguine_suit_2.png new file mode 100644 index 000000000..1ed8cbf34 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/armor/sanguine_suit_2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric.png index 0c71d3114..4870ab807 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric.png.mcmeta index 9aa78aa96..1b312a34b 100644 --- a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric.png.mcmeta +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric.png.mcmeta @@ -4,6 +4,6 @@ }, "animation":{ "interpolate": true, - "frametime":16 + "frametime":25 } } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_bloom.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_bloom.png index bf126873c..9ef3506fa 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_bloom.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_bloom.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_bloom_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_bloom_ctm.png index 748666c5b..2dc1f7ecd 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_bloom_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_bloom_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_ctm.png index fade5b8e8..8cee4da2f 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_ctm.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_ctm.png.mcmeta index bc0a00293..457526c23 100644 --- a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_ctm.png.mcmeta +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_ctm.png.mcmeta @@ -1,6 +1,6 @@ { "animation":{ "interpolate": true, - "frametime":16 + "frametime":25 } } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_off.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_off.png new file mode 100644 index 000000000..121803679 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_off.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_off.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_off.png.mcmeta new file mode 100644 index 000000000..1e54659eb --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_off.png.mcmeta @@ -0,0 +1,9 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/coils/causal_fabric_off_ctm" + }, + "animation":{ + "interpolate": true, + "frametime":16 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_off_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_off_ctm.png new file mode 100644 index 000000000..cf48a2b96 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/causal_fabric_off_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad.png index e1747c5d7..9c7ceae55 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad.png.mcmeta index a52c010bb..0077e5235 100644 --- a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad.png.mcmeta +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad.png.mcmeta @@ -4,6 +4,6 @@ }, "animation":{ "interpolate": true, - "frametime":6 + "frametime":3 } } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad_bloom.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad_bloom.png index 1d6181f5b..e637eae39 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad_bloom.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad_bloom.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad_bloom_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad_bloom_ctm.png index 809f572f8..e79c9e22f 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad_bloom_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad_bloom_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad_ctm.png index f6bfc1510..80626f44f 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad_ctm.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad_ctm.png.mcmeta index 13ec9ea15..9b47a9d6a 100644 --- a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad_ctm.png.mcmeta +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/living_igniclad_ctm.png.mcmeta @@ -1,6 +1 @@ -{ - "animation":{ - "interpolate": true, - "frametime":6 - } -} \ No newline at end of file +{ "animation": { "interpolate": true, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/naquadric_superalloy.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/naquadric_superalloy.png index 04cb55521..121803679 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/naquadric_superalloy.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/naquadric_superalloy.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/naquadric_superalloy_bloom.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/naquadric_superalloy_bloom.png index 26f997c0a..cdbf247cf 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/naquadric_superalloy_bloom.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/naquadric_superalloy_bloom.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/naquadric_superalloy_bloom_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/naquadric_superalloy_bloom_ctm.png index 9799f5ecd..967cfda26 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/naquadric_superalloy_bloom_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/naquadric_superalloy_bloom_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/naquadric_superalloy_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/naquadric_superalloy_ctm.png index e97e6b25f..cf48a2b96 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/naquadric_superalloy_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/naquadric_superalloy_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/prismatic_tungstensteel.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/prismatic_tungstensteel.png index 754e73f14..17af98848 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/prismatic_tungstensteel.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/prismatic_tungstensteel.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/prismatic_tungstensteel_bloom.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/prismatic_tungstensteel_bloom.png index 696a90ff6..a3eebf2bd 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/prismatic_tungstensteel_bloom.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/prismatic_tungstensteel_bloom.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/prismatic_tungstensteel_bloom_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/prismatic_tungstensteel_bloom_ctm.png index 6b44d90a0..890ac0c73 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/prismatic_tungstensteel_bloom_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/prismatic_tungstensteel_bloom_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/prismatic_tungstensteel_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/prismatic_tungstensteel_ctm.png index 85267ccbf..7c0dd5be8 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/prismatic_tungstensteel_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/prismatic_tungstensteel_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/programable_matter.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/programable_matter.png index b0fbe76b4..df5ea8d44 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/programable_matter.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/programable_matter.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/programable_matter_bloom.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/programable_matter_bloom.png index 42a6ca69b..32a06609d 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/programable_matter_bloom.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/programable_matter_bloom.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/programable_matter_bloom_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/programable_matter_bloom_ctm.png index 87b5ecb06..cb28505ad 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/programable_matter_bloom_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/programable_matter_bloom_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/programable_matter_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/programable_matter_ctm.png index ba2e311cf..efdc88d20 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/programable_matter_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/programable_matter_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/psionic_galvorn.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/psionic_galvorn.png index 6686e6f78..86541a5e7 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/psionic_galvorn.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/psionic_galvorn.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/psionic_galvorn_bloom.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/psionic_galvorn_bloom.png index 08867db49..85b296c64 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/psionic_galvorn_bloom.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/psionic_galvorn_bloom.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/psionic_galvorn_bloom_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/psionic_galvorn_bloom_ctm.png index 041f1ab10..34314f69b 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/psionic_galvorn_bloom_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/psionic_galvorn_bloom_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/psionic_galvorn_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/psionic_galvorn_ctm.png index ba3fff1f4..05ac15b59 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/psionic_galvorn_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/psionic_galvorn_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/resonant_virtue_meld.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/resonant_virtue_meld.png index 1273526c9..f8905bbcc 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/resonant_virtue_meld.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/resonant_virtue_meld.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/resonant_virtue_meld_bloom.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/resonant_virtue_meld_bloom.png index eda33ab65..cdbf247cf 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/resonant_virtue_meld_bloom.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/resonant_virtue_meld_bloom.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/resonant_virtue_meld_bloom_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/resonant_virtue_meld_bloom_ctm.png index a4d1a84a3..967cfda26 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/resonant_virtue_meld_bloom_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/resonant_virtue_meld_bloom_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/resonant_virtue_meld_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/resonant_virtue_meld_ctm.png index 8640575b5..73875fe40 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/resonant_virtue_meld_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/resonant_virtue_meld_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/shimmering_neutronium.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/shimmering_neutronium.png index ab2ed5b56..5602a5b52 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/shimmering_neutronium.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/shimmering_neutronium.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/shimmering_neutronium_bloom.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/shimmering_neutronium_bloom.png index fb6b5c098..eaa4c8374 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/shimmering_neutronium_bloom.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/shimmering_neutronium_bloom.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/shimmering_neutronium_bloom_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/shimmering_neutronium_bloom_ctm.png index 4478593d2..51c2de245 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/shimmering_neutronium_bloom_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/shimmering_neutronium_bloom_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/shimmering_neutronium_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/shimmering_neutronium_ctm.png index ebb3afe9e..2351dd90f 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/shimmering_neutronium_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/shimmering_neutronium_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/trinavine.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/trinavine.png index 13f0a0be2..3624938d8 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/trinavine.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/trinavine.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/trinavine_bloom.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/trinavine_bloom.png index 92eb25d4e..3d14cdff0 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/trinavine_bloom.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/trinavine_bloom.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/trinavine_bloom_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/trinavine_bloom_ctm.png index 22d34448b..28e1dbabc 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/trinavine_bloom_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/trinavine_bloom_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/trinavine_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/trinavine_ctm.png index 7a6391791..cbdd5b104 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/coils/trinavine_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/coils/trinavine_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/iron_plated_deepslate_tile.png b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/iron_plated_deepslate_tile.png new file mode 100644 index 000000000..b23079e15 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/iron_plated_deepslate_tile.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/iron_plated_deepslate_tile.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/iron_plated_deepslate_tile.png.mcmeta new file mode 100644 index 000000000..b2330d7f1 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/iron_plated_deepslate_tile.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/cosmetic/iron_plated_deepslate_tile_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/iron_plated_deepslate_tile_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/iron_plated_deepslate_tile_ctm.png new file mode 100644 index 000000000..0b1bea6dc Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/iron_plated_deepslate_tile_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/steel_rose_light.png b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/steel_rose_light.png new file mode 100644 index 000000000..89e756dcd Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/steel_rose_light.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/steel_rose_light.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/steel_rose_light.png.mcmeta new file mode 100644 index 000000000..d0242c2b5 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/steel_rose_light.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/cosmetic/steel_rose_light_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/steel_rose_light_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/steel_rose_light_ctm.png new file mode 100644 index 000000000..eeb4cb225 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/cosmetic/steel_rose_light_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/gearbox/machine_casing_gearbox_naquadria.png b/src/main/resources/assets/cosmiccore/textures/block/casings/gearbox/machine_casing_gearbox_naquadria.png new file mode 100644 index 000000000..feaf2ba0e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/gearbox/machine_casing_gearbox_naquadria.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/gearbox/machine_casing_gearbox_pthanterum.png b/src/main/resources/assets/cosmiccore/textures/block/casings/gearbox/machine_casing_gearbox_pthanterum.png new file mode 100644 index 000000000..fcd8bcaf9 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/gearbox/machine_casing_gearbox_pthanterum.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/glass/zblan_glass.png b/src/main/resources/assets/cosmiccore/textures/block/casings/glass/zblan_glass.png new file mode 100644 index 000000000..b62530f42 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/glass/zblan_glass.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/glass/zblan_glass.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/glass/zblan_glass.png.mcmeta new file mode 100644 index 000000000..3e05fbd6d --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/glass/zblan_glass.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/glass/zblan_glass_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/glass/zblan_glass_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/glass/zblan_glass_ctm.png new file mode 100644 index 000000000..0e7390ed8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/glass/zblan_glass_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t1.png b/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t1.png new file mode 100644 index 000000000..274c1bd88 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t2.png b/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t2.png new file mode 100644 index 000000000..274c1bd88 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t3.png b/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t3.png new file mode 100644 index 000000000..274c1bd88 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t4.png b/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t4.png new file mode 100644 index 000000000..274c1bd88 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/moth/moth_home_t4.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alternator_flux_coiling_copper.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alternator_flux_coiling_copper.png index 52470980b..42aa3a174 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alternator_flux_coiling_copper.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alternator_flux_coiling_copper.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alternator_flux_coiling_copper_bloom.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alternator_flux_coiling_copper_bloom.png new file mode 100644 index 000000000..c2c787169 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alternator_flux_coiling_copper_bloom.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alternator_flux_coiling_copper_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alternator_flux_coiling_copper_ctm.png index a7118a84f..f93ee6422 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alternator_flux_coiling_copper_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alternator_flux_coiling_copper_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alternator_flux_coiling_copper_ctm_bloom.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alternator_flux_coiling_copper_ctm_bloom.png new file mode 100644 index 000000000..9261de1d6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alternator_flux_coiling_copper_ctm_bloom.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alternator_flux_coiling_copper_ctm_bloom.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alternator_flux_coiling_copper_ctm_bloom.png.mcmeta new file mode 100644 index 000000000..1fd8d2fe3 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alternator_flux_coiling_copper_ctm_bloom.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ldlib": { + "emissive": true + }, + "shimmer": { + "bloom": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_accelerant.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_accelerant.png new file mode 100644 index 000000000..f4cec850e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_accelerant.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_casing.png new file mode 100644 index 000000000..36d052711 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_casing.png.mcmeta new file mode 100644 index 000000000..d61d04da4 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/alveary_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_casing_ctm.png new file mode 100644 index 000000000..7bf4fe56b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_cooler.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_cooler.png new file mode 100644 index 000000000..747546dea Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_cooler.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_dryer.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_dryer.png new file mode 100644 index 000000000..cf746b27e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_dryer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_heater.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_heater.png new file mode 100644 index 000000000..6fabf0724 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_heater.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_humidifier.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_humidifier.png new file mode 100644 index 000000000..2fc0012c3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_humidifier.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_lighting.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_lighting.png new file mode 100644 index 000000000..45ee4b50f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_lighting.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_longevity.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_longevity.png new file mode 100644 index 000000000..fece17c04 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_longevity.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_mutagenic.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_mutagenic.png new file mode 100644 index 000000000..103981475 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_mutagenic.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_productivity.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_productivity.png new file mode 100644 index 000000000..a114c8758 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_productivity.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_sealing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_sealing.png new file mode 100644 index 000000000..64fdec58e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_sealing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_sieve.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_sieve.png new file mode 100644 index 000000000..aca8aea37 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_sieve.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_stabiliser.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_stabiliser.png new file mode 100644 index 000000000..7c5add753 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_stabiliser.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_territory.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_territory.png new file mode 100644 index 000000000..3f09a8f6f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_territory.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_weatherproof.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_weatherproof.png new file mode 100644 index 000000000..18e486c16 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/alveary_weatherproof.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bichromal_nevramite_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bichromal_nevramite_casing.png new file mode 100644 index 000000000..2c8e7f783 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bichromal_nevramite_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bichromal_nevramite_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bichromal_nevramite_casing.png.mcmeta new file mode 100644 index 000000000..b81f29f3f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bichromal_nevramite_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/bichromal_nevramite_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bichromal_nevramite_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bichromal_nevramite_casing_ctm.png new file mode 100644 index 000000000..70561951f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bichromal_nevramite_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/blank_rune.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/blank_rune.png new file mode 100644 index 000000000..df6232a24 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/blank_rune.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bolted_heavy_frame_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bolted_heavy_frame_casing.png new file mode 100644 index 000000000..274c1bd88 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bolted_heavy_frame_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bolted_heavy_frame_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bolted_heavy_frame_casing.png.mcmeta new file mode 100644 index 000000000..c517837e1 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bolted_heavy_frame_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/bolted_heavy_frame_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bolted_heavy_frame_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bolted_heavy_frame_casing_ctm.png new file mode 100644 index 000000000..726cea52a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/bolted_heavy_frame_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/cryogenic_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/cryogenic_casing.png new file mode 100644 index 000000000..9fdc1744b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/cryogenic_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/cryogenic_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/cryogenic_casing.png.mcmeta new file mode 100644 index 000000000..048d099f8 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/cryogenic_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/cryogenic_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/cryogenic_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/cryogenic_casing_ctm.png new file mode 100644 index 000000000..028cae35e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/cryogenic_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/cyclozine_high_rigidity_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/cyclozine_high_rigidity_casing.png new file mode 100644 index 000000000..70d042865 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/cyclozine_high_rigidity_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/cyclozine_high_rigidity_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/cyclozine_high_rigidity_casing.png.mcmeta new file mode 100644 index 000000000..e714754cf --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/cyclozine_high_rigidity_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/cyclozine_high_rigidity_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/cyclozine_high_rigidity_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/cyclozine_high_rigidity_casing_ctm.png new file mode 100644 index 000000000..36f3d11ef Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/cyclozine_high_rigidity_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/dyson_solar_cell.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/dyson_solar_cell.png new file mode 100644 index 000000000..c1c05abd6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/dyson_solar_cell.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ethersteel_plated_ash_tiles.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ethersteel_plated_ash_tiles.png new file mode 100644 index 000000000..e10d3989e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ethersteel_plated_ash_tiles.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ethersteel_plated_ash_tiles.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ethersteel_plated_ash_tiles.png.mcmeta new file mode 100644 index 000000000..089900b1d --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ethersteel_plated_ash_tiles.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/ethersteel_plated_ash_tiles_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ethersteel_plated_ash_tiles_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ethersteel_plated_ash_tiles_ctm.png new file mode 100644 index 000000000..cc7fe32ef Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ethersteel_plated_ash_tiles_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/fulgorinth_prime_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/fulgorinth_prime_casing.png new file mode 100644 index 000000000..92d98b9b5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/fulgorinth_prime_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/fulgorinth_prime_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/fulgorinth_prime_casing.png.mcmeta new file mode 100644 index 000000000..96e636d33 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/fulgorinth_prime_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/fulgorinth_prime_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/fulgorinth_prime_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/fulgorinth_prime_casing_ctm.png new file mode 100644 index 000000000..6c292285a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/fulgorinth_prime_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/gilded_pthanterum_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/gilded_pthanterum_casing.png new file mode 100644 index 000000000..674f49962 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/gilded_pthanterum_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/gilded_pthanterum_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/gilded_pthanterum_casing.png.mcmeta new file mode 100644 index 000000000..80b218eea --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/gilded_pthanterum_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/gilded_pthanterum_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/gilded_pthanterum_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/gilded_pthanterum_casing_ctm.png new file mode 100644 index 000000000..c7340d22a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/gilded_pthanterum_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/heavy_frost_proof_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/heavy_frost_proof_casing.png new file mode 100644 index 000000000..acf540b8c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/heavy_frost_proof_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/heavy_frost_proof_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/heavy_frost_proof_casing.png.mcmeta new file mode 100644 index 000000000..391281823 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/heavy_frost_proof_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/heavy_frost_proof_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/heavy_frost_proof_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/heavy_frost_proof_casing_ctm.png new file mode 100644 index 000000000..e686502f9 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/heavy_frost_proof_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_power_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_power_casing.png.mcmeta new file mode 100644 index 000000000..9868d3f04 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_power_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "gtceu:block/casings/hpca/high_power_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_temperature_fission_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_temperature_fission_casing.png index 5928a0b81..8e73bc0bf 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_temperature_fission_casing.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_temperature_fission_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_temperature_fission_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_temperature_fission_casing_ctm.png index 70abf05e1..9dd8be632 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_temperature_fission_casing_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_temperature_fission_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_tolerance_rhenium_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_tolerance_rhenium_casing.png new file mode 100644 index 000000000..a8a9474a4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_tolerance_rhenium_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_tolerance_rhenium_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_tolerance_rhenium_casing.png.mcmeta new file mode 100644 index 000000000..6b1e53d59 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_tolerance_rhenium_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/high_tolerance_rhenium_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_tolerance_rhenium_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_tolerance_rhenium_casing_ctm.png new file mode 100644 index 000000000..85ef46b5a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/high_tolerance_rhenium_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_conductive_fission_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_conductive_fission_casing.png index 991eb498f..e1d97efbe 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_conductive_fission_casing.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_conductive_fission_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_conductive_fission_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_conductive_fission_casing_ctm.png index cb86218bd..82460a0d3 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_conductive_fission_casing_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_conductive_fission_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_flexible_reinforced_trinavine_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_flexible_reinforced_trinavine_casing.png new file mode 100644 index 000000000..230a67867 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_flexible_reinforced_trinavine_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_flexible_reinforced_trinavine_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_flexible_reinforced_trinavine_casing.png.mcmeta new file mode 100644 index 000000000..21d0f5e97 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_flexible_reinforced_trinavine_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/highly_flexible_reinforced_trinavine_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_flexible_reinforced_trinavine_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_flexible_reinforced_trinavine_casing_ctm.png new file mode 100644 index 000000000..653b13336 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/highly_flexible_reinforced_trinavine_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing.png new file mode 100644 index 000000000..05fa52388 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing.png.mcmeta new file mode 100644 index 000000000..d87330f56 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/light_dawnstone_casing_ctm" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing_ctm.png new file mode 100644 index 000000000..f54c79ff5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/light_dawnstone_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/livingrock_tiles.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/livingrock_tiles.png new file mode 100644 index 000000000..7c1ab7204 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/livingrock_tiles.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/magnet_fusion_grade.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/magnet_fusion_grade.png index f58c583c6..e1d3d20bf 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/magnet_fusion_grade.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/magnet_fusion_grade.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/magnet_fusion_grade_bloom.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/magnet_fusion_grade_bloom.png index 70696c380..b614ba696 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/magnet_fusion_grade_bloom.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/magnet_fusion_grade_bloom.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/magnet_fusion_grade_bloom_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/magnet_fusion_grade_bloom_ctm.png index 62ce82283..f6bfd90d7 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/magnet_fusion_grade_bloom_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/magnet_fusion_grade_bloom_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/magnet_fusion_grade_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/magnet_fusion_grade_ctm.png index ef54ae17a..eb79ec792 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/magnet_fusion_grade_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/magnet_fusion_grade_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/moth_station_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/moth_station_casing.png new file mode 100644 index 000000000..1d0ac9c6c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/moth_station_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/naquadah_pressure_resistant_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/naquadah_pressure_resistant_casing.png index 60d09dff9..123f7af0b 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/naquadah_pressure_resistant_casing.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/naquadah_pressure_resistant_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/naquadah_pressure_resistant_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/naquadah_pressure_resistant_casing_ctm.png index cacd1ef62..6541d2aee 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/naquadah_pressure_resistant_casing_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/naquadah_pressure_resistant_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/neutronium_buoy.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/neutronium_buoy.png new file mode 100644 index 000000000..6c0cb9cb9 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/neutronium_buoy.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/neutronium_buoy.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/neutronium_buoy.png.mcmeta new file mode 100644 index 000000000..35797f0ae --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/neutronium_buoy.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/neutronium_buoy_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/neutronium_buoy_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/neutronium_buoy_ctm.png new file mode 100644 index 000000000..3529a7e3d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/neutronium_buoy_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/oscillating_gilded_pthanterum_casings.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/oscillating_gilded_pthanterum_casings.png new file mode 100644 index 000000000..1d0ac9c6c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/oscillating_gilded_pthanterum_casings.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/oscillating_gilded_pthanterum_casings.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/oscillating_gilded_pthanterum_casings.png.mcmeta new file mode 100644 index 000000000..f416eeeae --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/oscillating_gilded_pthanterum_casings.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/oscillating_gilded_pthanterum_casings_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/oscillating_gilded_pthanterum_casings_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/oscillating_gilded_pthanterum_casings_ctm.png new file mode 100644 index 000000000..5c4b26f40 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/oscillating_gilded_pthanterum_casings_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/plated_aerocloud.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/plated_aerocloud.png index 03bb7e569..225b6c972 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/plated_aerocloud.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/plated_aerocloud.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/plated_aerocloud.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/plated_aerocloud.png.mcmeta new file mode 100644 index 000000000..f5655aed8 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/plated_aerocloud.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/plated_aerocloud_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/plated_aerocloud_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/plated_aerocloud_ctm.png new file mode 100644 index 000000000..e7774f0a6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/plated_aerocloud_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/pressure_containment_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/pressure_containment_casing.png new file mode 100644 index 000000000..3a7c250d9 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/pressure_containment_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/pressure_containment_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/pressure_containment_casing.png.mcmeta new file mode 100644 index 000000000..b15f99473 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/pressure_containment_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/pressure_containment_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/pressure_containment_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/pressure_containment_casing_ctm.png new file mode 100644 index 000000000..76a73ebfd Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/pressure_containment_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/pthanterum_wave_breakers.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/pthanterum_wave_breakers.png new file mode 100644 index 000000000..19d335bf5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/pthanterum_wave_breakers.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/pthanterum_wave_breakers.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/pthanterum_wave_breakers.png.mcmeta new file mode 100644 index 000000000..fc8197f75 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/pthanterum_wave_breakers.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/pthanterum_wave_breakers_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/pthanterum_wave_breakers_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/pthanterum_wave_breakers_ctm.png new file mode 100644 index 000000000..ae727001a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/pthanterum_wave_breakers_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reflective_starmetal_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reflective_starmetal_casing.png new file mode 100644 index 000000000..19a4a0cc9 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reflective_starmetal_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reflective_starmetal_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reflective_starmetal_casing.png.mcmeta new file mode 100644 index 000000000..13fa083ae --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reflective_starmetal_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/reflective_starmetal_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reflective_starmetal_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reflective_starmetal_casing_ctm.png new file mode 100644 index 000000000..02ba17dde Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reflective_starmetal_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing.png new file mode 100644 index 000000000..e5f682487 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing.png.mcmeta new file mode 100644 index 000000000..6efb52b31 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/reinforced_dawnstone_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing_ctm.png new file mode 100644 index 000000000..aeba84212 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_dawnstone_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_naquadria_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_naquadria_casing.png new file mode 100644 index 000000000..d6a472893 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_naquadria_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_naquadria_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_naquadria_casing.png.mcmeta new file mode 100644 index 000000000..dd3f09247 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_naquadria_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/reinforced_naquadria_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_naquadria_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_naquadria_casing_ctm.png new file mode 100644 index 000000000..5d40a67c7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/reinforced_naquadria_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/resonantly_tuned_virtue_meld_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/resonantly_tuned_virtue_meld_casing.png index c37b9b1fe..dddcd8c8a 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/resonantly_tuned_virtue_meld_casing.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/resonantly_tuned_virtue_meld_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/resonantly_tuned_virtue_meld_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/resonantly_tuned_virtue_meld_casing_ctm.png index d2ccace3e..27e839f07 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/resonantly_tuned_virtue_meld_casing_ctm.png and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/resonantly_tuned_virtue_meld_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rigid_high_speed_steel_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rigid_high_speed_steel_casing.png new file mode 100644 index 000000000..9903d1581 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rigid_high_speed_steel_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rigid_high_speed_steel_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rigid_high_speed_steel_casing.png.mcmeta new file mode 100644 index 000000000..fdc049d84 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rigid_high_speed_steel_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/rigid_high_speed_steel_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rigid_high_speed_steel_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rigid_high_speed_steel_casing_ctm.png new file mode 100644 index 000000000..bdb1262c9 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rigid_high_speed_steel_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ritual_stone.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ritual_stone.png new file mode 100644 index 000000000..1001bb274 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ritual_stone.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/royal_ichorium_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/royal_ichorium_casing.png new file mode 100644 index 000000000..5315e71c0 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/royal_ichorium_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/royal_ichorium_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/royal_ichorium_casing.png.mcmeta new file mode 100644 index 000000000..3f3151480 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/royal_ichorium_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/royal_ichorium_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/royal_ichorium_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/royal_ichorium_casing_ctm.png new file mode 100644 index 000000000..2c8c103c6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/royal_ichorium_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ruridit_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ruridit_casing.png new file mode 100644 index 000000000..cde8baf6c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ruridit_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ruridit_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ruridit_casing.png.mcmeta new file mode 100644 index 000000000..c3a32de4f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ruridit_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/ruridit_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ruridit_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ruridit_casing_ctm.png new file mode 100644 index 000000000..3f4df54cd Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/ruridit_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_stained_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_stained_casing.png new file mode 100644 index 000000000..bafa025ae Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_stained_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_stained_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_stained_casing.png.mcmeta new file mode 100644 index 000000000..b15f99473 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_stained_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/pressure_containment_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_stained_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_stained_casing_ctm.png new file mode 100644 index 000000000..1a412bd28 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_stained_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_weave_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_weave_casing.png new file mode 100644 index 000000000..13aa04203 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_weave_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_weave_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_weave_casing.png.mcmeta new file mode 100644 index 000000000..8c0317b4f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_weave_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/rust_weave_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_weave_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_weave_casing_ctm.png new file mode 100644 index 000000000..63fb4c0c6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/rust_weave_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/self_healing_pthanterum_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/self_healing_pthanterum_casing.png new file mode 100644 index 000000000..82ffd3c5e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/self_healing_pthanterum_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/self_healing_pthanterum_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/self_healing_pthanterum_casing.png.mcmeta new file mode 100644 index 000000000..422ad0155 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/self_healing_pthanterum_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/self_healing_pthanterum_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/self_healing_pthanterum_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/self_healing_pthanterum_casing_ctm.png new file mode 100644 index 000000000..12007da8e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/self_healing_pthanterum_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/somarust_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/somarust_casing.png new file mode 100644 index 000000000..5b53395c4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/somarust_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/somarust_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/somarust_casing.png.mcmeta new file mode 100644 index 000000000..79cd22d40 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/somarust_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/somarust_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/somarust_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/somarust_casing_ctm.png new file mode 100644 index 000000000..f221941c5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/somarust_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_muted_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_muted_casing.png new file mode 100644 index 000000000..762fcda5d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_muted_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_muted_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_muted_casing.png.mcmeta new file mode 100644 index 000000000..0d6f3d332 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_muted_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/soul_muted_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_muted_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_muted_casing_ctm.png new file mode 100644 index 000000000..82eb7c210 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_muted_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_stained_steel_aluminium_plated_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_stained_steel_aluminium_plated_casing.png new file mode 100644 index 000000000..30b838828 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_stained_steel_aluminium_plated_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_stained_steel_aluminium_plated_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_stained_steel_aluminium_plated_casing.png.mcmeta new file mode 100644 index 000000000..fde8c8ffd --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_stained_steel_aluminium_plated_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/soul_stained_steel_aluminium_plated_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_stained_steel_aluminium_plated_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_stained_steel_aluminium_plated_casing_ctm.png new file mode 100644 index 000000000..b8b6fb86e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/soul_stained_steel_aluminium_plated_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/steel_plated_bronze_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/steel_plated_bronze_casing.png new file mode 100644 index 000000000..6f29528e6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/steel_plated_bronze_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/steel_plated_bronze_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/steel_plated_bronze_casing.png.mcmeta new file mode 100644 index 000000000..b68db6d17 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/steel_plated_bronze_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/steel_plated_bronze_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/steel_plated_bronze_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/steel_plated_bronze_casing_ctm.png new file mode 100644 index 000000000..fdb52f308 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/steel_plated_bronze_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/stellar_neutronium_grade_magnet.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/stellar_neutronium_grade_magnet.png new file mode 100644 index 000000000..548a57461 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/stellar_neutronium_grade_magnet.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/stellar_neutronium_grade_magnet.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/stellar_neutronium_grade_magnet.png.mcmeta new file mode 100644 index 000000000..04d966545 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/stellar_neutronium_grade_magnet.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/stellar_neutronium_grade_magnet_ctm" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/stellar_neutronium_grade_magnet_bloom.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/stellar_neutronium_grade_magnet_bloom.png new file mode 100644 index 000000000..e005e7ec3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/stellar_neutronium_grade_magnet_bloom.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/stellar_neutronium_grade_magnet_bloom.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/stellar_neutronium_grade_magnet_bloom.png.mcmeta new file mode 100644 index 000000000..85bc80342 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/stellar_neutronium_grade_magnet_bloom.png.mcmeta @@ -0,0 +1,9 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/stellar_neutronium_grade_magnet_bloom_ctm", + "emissive": true + }, + "shimmer": { + "bloom": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/stellar_neutronium_grade_magnet_bloom_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/stellar_neutronium_grade_magnet_bloom_ctm.png new file mode 100644 index 000000000..3e084f51d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/stellar_neutronium_grade_magnet_bloom_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/stellar_neutronium_grade_magnet_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/stellar_neutronium_grade_magnet_ctm.png new file mode 100644 index 000000000..f49bc941e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/stellar_neutronium_grade_magnet_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/superheavy_steel_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/superheavy_steel_casing.png new file mode 100644 index 000000000..2897c291a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/superheavy_steel_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/superheavy_steel_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/superheavy_steel_casing.png.mcmeta new file mode 100644 index 000000000..10c9765cb --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/superheavy_steel_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/superheavy_steel_casing_ctm" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/superheavy_steel_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/superheavy_steel_casing_ctm.png new file mode 100644 index 000000000..30f0945ca Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/superheavy_steel_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing.png new file mode 100644 index 000000000..0c5204b84 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing.png.mcmeta new file mode 100644 index 000000000..5126c7dbf --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing_ctm.png new file mode 100644 index 000000000..46b4c29ed Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/tritanium_lined_heavy_bolted_neutronium_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vibrant_rubidium_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vibrant_rubidium_casing.png new file mode 100644 index 000000000..a89cad3fd Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vibrant_rubidium_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vibrant_rubidium_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vibrant_rubidium_casing.png.mcmeta new file mode 100644 index 000000000..278b06bf1 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vibrant_rubidium_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/vibrant_rubidium_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vibrant_rubidium_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vibrant_rubidium_casing_ctm.png new file mode 100644 index 000000000..37b3beee1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vibrant_rubidium_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_chemically_resistant_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_chemically_resistant_casing.png new file mode 100644 index 000000000..2dc436c60 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_chemically_resistant_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_chemically_resistant_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_chemically_resistant_casing.png.mcmeta new file mode 100644 index 000000000..f43839b5d --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_chemically_resistant_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/vomahine_certified_chemically_resistant_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_chemically_resistant_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_chemically_resistant_casing_ctm.png new file mode 100644 index 000000000..eb7a0bcdd Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_chemically_resistant_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_chemically_resistant_pipe.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_chemically_resistant_pipe.png new file mode 100644 index 000000000..b11411394 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_chemically_resistant_pipe.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_interstellar_grade_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_interstellar_grade_casing.png new file mode 100644 index 000000000..edcb322f9 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_interstellar_grade_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_interstellar_grade_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_interstellar_grade_casing.png.mcmeta new file mode 100644 index 000000000..5cc1741e9 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_interstellar_grade_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/vomahine_certified_interstellar_grade_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_interstellar_grade_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_interstellar_grade_casing_ctm.png new file mode 100644 index 000000000..38a125f9d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_certified_interstellar_grade_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_ultra_powered_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_ultra_powered_casing.png new file mode 100644 index 000000000..ae5ca8896 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_ultra_powered_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_ultra_powered_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_ultra_powered_casing.png.mcmeta new file mode 100644 index 000000000..9231a5f09 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_ultra_powered_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/vomahine_ultra_powered_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_ultra_powered_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_ultra_powered_casing_ctm.png new file mode 100644 index 000000000..0ade3cf1f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/vomahine_ultra_powered_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/wailing_ichor_casing.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/wailing_ichor_casing.png new file mode 100644 index 000000000..9d668beba Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/wailing_ichor_casing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/wailing_ichor_casing.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/wailing_ichor_casing.png.mcmeta new file mode 100644 index 000000000..0fde9d1c8 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/wailing_ichor_casing.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/casings/solid/wailing_ichor_casing_ctm" + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/casings/solid/wailing_ichor_casing_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/wailing_ichor_casing_ctm.png new file mode 100644 index 000000000..18c39ad6c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/casings/solid/wailing_ichor_casing_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/diving_bell_escape_pad.png b/src/main/resources/assets/cosmiccore/textures/block/diving_bell_escape_pad.png new file mode 100644 index 000000000..274c1bd88 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/diving_bell_escape_pad.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/embers/archaic_large_bricks.png b/src/main/resources/assets/cosmiccore/textures/block/embers/archaic_large_bricks.png new file mode 100644 index 000000000..f53b4d57e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/embers/archaic_large_bricks.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_overclock_nutrient.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_overclock_nutrient.png new file mode 100644 index 000000000..ec969cef5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_overclock_nutrient.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_overclock_nutrient.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_overclock_nutrient.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_overclock_nutrient.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_production_nutrient.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_production_nutrient.png new file mode 100644 index 000000000..021aa7f3e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_production_nutrient.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_production_nutrient.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_production_nutrient.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.advanced_production_nutrient.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_overclock_nutrient.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_overclock_nutrient.png new file mode 100644 index 000000000..e043c60a8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_overclock_nutrient.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_overclock_nutrient.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_overclock_nutrient.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_overclock_nutrient.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_production_nutrient.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_production_nutrient.png new file mode 100644 index 000000000..9073459d7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_production_nutrient.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_production_nutrient.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_production_nutrient.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.basic_production_nutrient.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.chlorophyte.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.chlorophyte.png new file mode 100644 index 000000000..31d2edd02 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.chlorophyte.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.chlorophyte.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.chlorophyte.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.chlorophyte.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.enraged_stygian_plague.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.enraged_stygian_plague.png new file mode 100644 index 000000000..a76862bb3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.enraged_stygian_plague.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.enraged_stygian_plague.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.enraged_stygian_plague.png.mcmeta new file mode 100644 index 000000000..9081065ed --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.enraged_stygian_plague.png.mcmeta @@ -0,0 +1,46 @@ +{ + "animation": { + "interpolation": true, + "frametime": 1, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.pale_oil.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.pale_oil.png new file mode 100644 index 000000000..35e88f7f4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.pale_oil.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.pale_oil.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.pale_oil.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.pale_oil.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_overclock_nutrient.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_overclock_nutrient.png new file mode 100644 index 000000000..ab922e10d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_overclock_nutrient.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_overclock_nutrient.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_overclock_nutrient.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_overclock_nutrient.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_production_nutrient.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_production_nutrient.png new file mode 100644 index 000000000..ce17fb8da Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_production_nutrient.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_production_nutrient.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_production_nutrient.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.perfect_production_nutrient.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.prisma.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.prisma.png index 24d4804e6..f6c06ac8d 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.prisma.png and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.prisma.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.stygian_plague.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.stygian_plague.png new file mode 100644 index 000000000..d4d7e6246 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.stygian_plague.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.stygian_plague.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.stygian_plague.png.mcmeta new file mode 100644 index 000000000..7ceb36394 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.stygian_plague.png.mcmeta @@ -0,0 +1,45 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 18, + 17, + 16, + 15, + 14, + 13, + 12, + 11, + 10, + 9, + 8, + 7, + 6, + 5, + 4, + 3, + 2, + 1 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_overclock_nutrient.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_overclock_nutrient.png new file mode 100644 index 000000000..75bc9308d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_overclock_nutrient.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_overclock_nutrient.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_overclock_nutrient.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_overclock_nutrient.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_production_nutrient.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_production_nutrient.png new file mode 100644 index 000000000..3e6db61e6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_production_nutrient.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_production_nutrient.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_production_nutrient.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.super_production_nutrient.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.vitrius.png b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.vitrius.png new file mode 100644 index 000000000..947227707 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.vitrius.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.vitrius.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.vitrius.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/fluids/fluid.vitrius.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/beam_box.png b/src/main/resources/assets/cosmiccore/textures/block/iris/beam_box.png new file mode 100644 index 000000000..15b0ebd76 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/beam_box.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/blood_cube.png b/src/main/resources/assets/cosmiccore/textures/block/iris/blood_cube.png new file mode 100644 index 000000000..efae69096 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/blood_cube.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/blood_cube.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/iris/blood_cube.png.mcmeta new file mode 100644 index 000000000..3479f1d88 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/iris/blood_cube.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 1, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/pentagram.png b/src/main/resources/assets/cosmiccore/textures/block/iris/pentagram.png new file mode 100644 index 000000000..1a685fcf7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/pentagram.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo.png b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo.png new file mode 100644 index 000000000..4bf285c75 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo.png.mcmeta new file mode 100644 index 000000000..75a213b2e --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_cyan.png b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_cyan.png new file mode 100644 index 000000000..44b00e5b4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_cyan.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_cyan_faded.png b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_cyan_faded.png new file mode 100644 index 000000000..f7e7395d8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_cyan_faded.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_cyan_faded.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_cyan_faded.png.mcmeta new file mode 100644 index 000000000..f5a5fd7c2 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_cyan_faded.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_neutronium_faded.png b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_neutronium_faded.png new file mode 100644 index 000000000..42d64ca86 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_neutronium_faded.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_neutronium_faded.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_neutronium_faded.png.mcmeta new file mode 100644 index 000000000..75a213b2e --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_neutronium_faded.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_sol.png b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_sol.png new file mode 100644 index 000000000..e94b13e43 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_sol.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_sol.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_sol.png.mcmeta new file mode 100644 index 000000000..f5a5fd7c2 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/compression_halo_sol.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/halo.png b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/halo.png new file mode 100644 index 000000000..4ce137364 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/halo.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/ingot_hot_overlay.png b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/ingot_hot_overlay.png new file mode 100644 index 000000000..c3d087d31 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/ingot_hot_overlay.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/storm_halo.png b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/storm_halo.png new file mode 100644 index 000000000..6355e9e80 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/storm_halo.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/echo_processor_mainframe.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/storm_halo.png.mcmeta similarity index 100% rename from src/main/resources/assets/cosmiccore/textures/item/echo_processor_mainframe.png.mcmeta rename to src/main/resources/assets/cosmiccore/textures/block/iris/rnd/storm_halo.png.mcmeta diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/tentacle_halo.png b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/tentacle_halo.png new file mode 100644 index 000000000..91333a9ff Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/tentacle_halo.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/tentacle_halo.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/tentacle_halo.png.mcmeta new file mode 100644 index 000000000..c6f8b9bd5 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/tentacle_halo.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/tentacle_halo_glass.png b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/tentacle_halo_glass.png new file mode 100644 index 000000000..67db1bfbd Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/tentacle_halo_glass.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/tentacle_halo_glass.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/tentacle_halo_glass.png.mcmeta new file mode 100644 index 000000000..c6f8b9bd5 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/tentacle_halo_glass.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/tentacle_halo_inv.png b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/tentacle_halo_inv.png new file mode 100644 index 000000000..57855a4b0 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/tentacle_halo_inv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/tentacle_halo_inv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/tentacle_halo_inv.png.mcmeta new file mode 100644 index 000000000..c6f8b9bd5 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/tentacle_halo_inv.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/time_halo.png b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/time_halo.png new file mode 100644 index 000000000..4c2c10024 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/time_halo.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/time_halo.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/time_halo.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/iris/rnd/time_halo.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/star_core.png b/src/main/resources/assets/cosmiccore/textures/block/iris/star_core.png new file mode 100644 index 000000000..ac01afd9f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/star_core.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/star_shell.png b/src/main/resources/assets/cosmiccore/textures/block/iris/star_shell.png new file mode 100644 index 000000000..dbb3d827a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/star_shell.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/star_sphere_inner_dense.png b/src/main/resources/assets/cosmiccore/textures/block/iris/star_sphere_inner_dense.png new file mode 100644 index 000000000..ab446805d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/star_sphere_inner_dense.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/the_hole.png b/src/main/resources/assets/cosmiccore/textures/block/iris/the_hole.png new file mode 100644 index 000000000..b8a2961d2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/the_hole.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/the_ring.png b/src/main/resources/assets/cosmiccore/textures/block/iris/the_ring.png new file mode 100644 index 000000000..e884ec0e6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/the_ring.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/the_ring_white.png b/src/main/resources/assets/cosmiccore/textures/block/iris/the_ring_white.png new file mode 100644 index 000000000..15b0ebd76 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/the_ring_white.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/iris/void_swirl.png b/src/main/resources/assets/cosmiccore/textures/block/iris/void_swirl.png new file mode 100644 index 000000000..78272c4b6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/iris/void_swirl.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern.png b/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern.png new file mode 100644 index 000000000..29305051c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern.png.mcmeta new file mode 100644 index 000000000..5169aabdc --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 8 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern_hanging.png b/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern_hanging.png new file mode 100644 index 000000000..0481704b2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern_hanging.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern_hanging.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern_hanging.png.mcmeta new file mode 100644 index 000000000..5169aabdc --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/lanterns/steel_rose_lantern_hanging.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 8 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front.png new file mode 100644 index 000000000..de1abfe72 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_active.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_active.png new file mode 100644 index 000000000..5b9e6ea67 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_active.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_active_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_active_emissive.png new file mode 100644 index 000000000..aac6af2f3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_active_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_emissive.png new file mode 100644 index 000000000..c60f7cd03 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/dawnforge/overlay_front_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/mantle_bore/overlay_top.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mantle_bore/overlay_top.png new file mode 100644 index 000000000..485830500 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mantle_bore/overlay_top.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/mantle_bore/overlay_top_active.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mantle_bore/overlay_top_active.png new file mode 100644 index 000000000..95deb5df5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mantle_bore/overlay_top_active.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/mantle_bore/overlay_top_active_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mantle_bore/overlay_top_active_emissive.png new file mode 100644 index 000000000..57131d803 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mantle_bore/overlay_top_active_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/mantle_bore/overlay_top_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mantle_bore/overlay_top_emissive.png new file mode 100644 index 000000000..2ddd1581e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mantle_bore/overlay_top_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/mantle_bore/overlay_top_paused.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mantle_bore/overlay_top_paused.png new file mode 100644 index 000000000..328f79943 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mantle_bore/overlay_top_paused.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/mantle_bore/overlay_top_paused_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mantle_bore/overlay_top_paused_emissive.png new file mode 100644 index 000000000..c3d14d6e8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mantle_bore/overlay_top_paused_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/mixing_vessel/overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mixing_vessel/overlay_front.png new file mode 100644 index 000000000..0663c77ba Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mixing_vessel/overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/mixing_vessel/overlay_front_active.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mixing_vessel/overlay_front_active.png new file mode 100644 index 000000000..ae3272f97 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mixing_vessel/overlay_front_active.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/mixing_vessel/overlay_front_active.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mixing_vessel/overlay_front_active.png.mcmeta new file mode 100644 index 000000000..7e77c6485 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mixing_vessel/overlay_front_active.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/mixing_vessel/overlay_front_active_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mixing_vessel/overlay_front_active_emissive.png new file mode 100644 index 000000000..a99798caa Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mixing_vessel/overlay_front_active_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/mixing_vessel/overlay_front_active_emissive.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mixing_vessel/overlay_front_active_emissive.png.mcmeta new file mode 100644 index 000000000..7e77c6485 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mixing_vessel/overlay_front_active_emissive.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/mixing_vessel/overlay_front_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mixing_vessel/overlay_front_emissive.png new file mode 100644 index 000000000..15aa9a7b4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/mixing_vessel/overlay_front_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/solidifier/overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/solidifier/overlay_front.png new file mode 100644 index 000000000..fa51610b5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/solidifier/overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/solidifier/overlay_front_active.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/solidifier/overlay_front_active.png new file mode 100644 index 000000000..775703990 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/solidifier/overlay_front_active.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/solidifier/overlay_front_active.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/multiblock/solidifier/overlay_front_active.png.mcmeta new file mode 100644 index 000000000..4b44756e5 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/multiblock/solidifier/overlay_front_active.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime": 4 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/solidifier/overlay_front_active_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/solidifier/overlay_front_active_emissive.png new file mode 100644 index 000000000..eab219579 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/solidifier/overlay_front_active_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/solidifier/overlay_front_active_emissive.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/multiblock/solidifier/overlay_front_active_emissive.png.mcmeta new file mode 100644 index 000000000..4b44756e5 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/multiblock/solidifier/overlay_front_active_emissive.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime": 4 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/solidifier/overlay_front_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/solidifier/overlay_front_emissive.png new file mode 100644 index 000000000..15aa9a7b4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/solidifier/overlay_front_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/OLDFRONT.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/OLDFRONT.png new file mode 100644 index 000000000..db52e4efe Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/OLDFRONT.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/overlay_front.png new file mode 100644 index 000000000..485830500 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/overlay_front_active.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/overlay_front_active.png new file mode 100644 index 000000000..95deb5df5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/overlay_front_active.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/overlay_front_active_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/overlay_front_active_emissive.png new file mode 100644 index 000000000..57131d803 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/overlay_front_active_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/overlay_front_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/overlay_front_emissive.png new file mode 100644 index 000000000..2ddd1581e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/overlay_front_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/overlay_front_paused.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/overlay_front_paused.png new file mode 100644 index 000000000..328f79943 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/overlay_front_paused.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/overlay_front_paused_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/overlay_front_paused_emissive.png new file mode 100644 index 000000000..c3d14d6e8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/vomahine_chemplant/overlay_front_paused_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/wireless_data_transmitter/overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/wireless_data_transmitter/overlay_front.png new file mode 100644 index 000000000..485830500 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/wireless_data_transmitter/overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/wireless_data_transmitter/overlay_front_active.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/wireless_data_transmitter/overlay_front_active.png new file mode 100644 index 000000000..95deb5df5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/wireless_data_transmitter/overlay_front_active.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/wireless_data_transmitter/overlay_front_active_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/wireless_data_transmitter/overlay_front_active_emissive.png new file mode 100644 index 000000000..57131d803 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/wireless_data_transmitter/overlay_front_active_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/wireless_data_transmitter/overlay_front_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/wireless_data_transmitter/overlay_front_emissive.png new file mode 100644 index 000000000..2ddd1581e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/wireless_data_transmitter/overlay_front_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/wireless_data_transmitter/overlay_front_paused.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/wireless_data_transmitter/overlay_front_paused.png new file mode 100644 index 000000000..328f79943 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/wireless_data_transmitter/overlay_front_paused.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/multiblock/wireless_data_transmitter/overlay_front_paused_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/multiblock/wireless_data_transmitter/overlay_front_paused_emissive.png new file mode 100644 index 000000000..c3d14d6e8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/multiblock/wireless_data_transmitter/overlay_front_paused_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/accelerant.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/accelerant.png new file mode 100644 index 000000000..e17c9c430 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/accelerant.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/cooler.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/cooler.png new file mode 100644 index 000000000..8559d4ecc Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/cooler.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/dryer.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/dryer.png new file mode 100644 index 000000000..e13b81d04 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/dryer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/heater.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/heater.png new file mode 100644 index 000000000..8a6769966 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/heater.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/humidifier.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/humidifier.png new file mode 100644 index 000000000..9aabd1918 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/humidifier.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/lighting.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/lighting.png new file mode 100644 index 000000000..f72fb7a00 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/lighting.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/longevity.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/longevity.png new file mode 100644 index 000000000..606fd62d7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/longevity.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/mutagenic.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/mutagenic.png new file mode 100644 index 000000000..b744ffd02 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/mutagenic.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/productivity.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/productivity.png new file mode 100644 index 000000000..5d6f0fdc0 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/productivity.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/sealing.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/sealing.png new file mode 100644 index 000000000..64fdec58e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/sealing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/sieve.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/sieve.png new file mode 100644 index 000000000..520161a1e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/sieve.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/stabiliser.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/stabiliser.png new file mode 100644 index 000000000..188806775 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/stabiliser.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/territory.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/territory.png new file mode 100644 index 000000000..ccc42374c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/territory.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/weatherproof.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/weatherproof.png new file mode 100644 index 000000000..76e0fd402 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/alveary/weatherproof.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/cleaning_cover.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/cleaning_cover.png new file mode 100644 index 000000000..7fec49320 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/cleaning_cover.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/cleaning_cover_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/cleaning_cover_emissive.png new file mode 100644 index 000000000..c7c22f162 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/cleaning_cover_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/drone_hatch_maint.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/drone_hatch_maint.png new file mode 100644 index 000000000..c1b52b74f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/drone_hatch_maint.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/drone_hatch_maint_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/drone_hatch_maint_emissive.png new file mode 100644 index 000000000..5555402ef Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/drone_hatch_maint_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/ember_input_hatch.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/ember_input_hatch.png new file mode 100644 index 000000000..c8ce43b53 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/ember_input_hatch.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/ember_output_hatch.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/ember_output_hatch.png new file mode 100644 index 000000000..1ec97277b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/ember_output_hatch.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/ember_overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/ember_overlay_front.png new file mode 100644 index 000000000..ad985f716 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/ember_overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/ember_overlay_front.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/overlay/ember_overlay_front.png.mcmeta new file mode 100644 index 000000000..15465094f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/overlay/ember_overlay_front.png.mcmeta @@ -0,0 +1,9 @@ +{ + "animation": { + "interpolate": true, + "frametime": 4 + }, + "ldlib": { + "emissive": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/calx_reactor/overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/calx_reactor/overlay_front.png new file mode 100644 index 000000000..9021e2c87 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/calx_reactor/overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator.png new file mode 100644 index 000000000..10d32b50d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator_green.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator_green.png new file mode 100644 index 000000000..388370d38 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator_green.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator_green.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator_green.png.mcmeta new file mode 100644 index 000000000..1fd8d2fe3 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator_green.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ldlib": { + "emissive": true + }, + "shimmer": { + "bloom": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator_red.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator_red.png new file mode 100644 index 000000000..2891a7b82 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator_red.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator_red.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator_red.png.mcmeta new file mode 100644 index 000000000..1fd8d2fe3 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator_red.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ldlib": { + "emissive": true + }, + "shimmer": { + "bloom": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator_yellow.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator_yellow.png new file mode 100644 index 000000000..1717a9944 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator_yellow.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator_yellow.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator_yellow.png.mcmeta new file mode 100644 index 000000000..1fd8d2fe3 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/hpca/indicator_yellow.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ldlib": { + "emissive": true + }, + "shimmer": { + "bloom": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/industrial_apiary/overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/industrial_apiary/overlay_front.png new file mode 100644 index 000000000..3621367bc Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/industrial_apiary/overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/industrial_apiary/overlay_side.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/industrial_apiary/overlay_side.png new file mode 100644 index 000000000..3621367bc Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/industrial_apiary/overlay_side.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/industrial_apiary/overlay_top.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/industrial_apiary/overlay_top.png new file mode 100644 index 000000000..9884d8bd6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/industrial_apiary/overlay_top.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/mana_leaching_tub/overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/mana_leaching_tub/overlay_front.png new file mode 100644 index 000000000..c895d0094 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/mana_leaching_tub/overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch.png new file mode 100644 index 000000000..91b0b07d1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch_half_px_out.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch_half_px_out.png new file mode 100644 index 000000000..becad5fac Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch_half_px_out.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch_input.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch_input.png new file mode 100644 index 000000000..42561905a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch_input.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch_output.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch_output.png new file mode 100644 index 000000000..56af33b47 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_hatch_output.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_output.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_output.png new file mode 100644 index 000000000..903009bd1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_output.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_output.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_output.png.mcmeta new file mode 100644 index 000000000..97596ba81 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_fluid_output.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_4x.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_4x.png new file mode 100644 index 000000000..8bd50cf86 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_4x.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_in_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_in_emissive.png new file mode 100644 index 000000000..06a1f6795 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_in_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_in_emissive.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_in_emissive.png.mcmeta new file mode 100644 index 000000000..ceecb036f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_in_emissive.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_out_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_out_emissive.png new file mode 100644 index 000000000..0844c5b70 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_out_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_out_emissive.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_out_emissive.png.mcmeta new file mode 100644 index 000000000..ceecb036f --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/overlay_pipe_out_emissive.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/roaster/overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/roaster/overlay_front.png new file mode 100644 index 000000000..f65b1a589 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/roaster/overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/thermomagnitizer/overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/thermomagnitizer/overlay_front.png new file mode 100644 index 000000000..e2388c021 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/thermomagnitizer/overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/vacuum_bubbler/overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/vacuum_bubbler/overlay_front.png new file mode 100644 index 000000000..c0a38c6bc Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/vacuum_bubbler/overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/wireless_charger/overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/wireless_charger/overlay_front.png new file mode 100644 index 000000000..72f17e768 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/wireless_charger/overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/wireless_charger/overlay_front_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/wireless_charger/overlay_front_emissive.png new file mode 100644 index 000000000..c46cc57fb Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/wireless_charger/overlay_front_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/wireless_charger/overlay_front_emissive.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/wireless_charger/overlay_front_emissive.png.mcmeta new file mode 100644 index 000000000..be15ac4f6 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/overlay/machine/wireless_charger/overlay_front_emissive.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime": 5 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/me_assemblyline_overlay_base.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/me_assemblyline_overlay_base.png new file mode 100644 index 000000000..a51deaa43 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/me_assemblyline_overlay_base.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/me_assemblyline_overlay_fluid_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/me_assemblyline_overlay_fluid_emissive.png new file mode 100644 index 000000000..67b10403a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/me_assemblyline_overlay_fluid_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/me_assemblyline_overlay_item_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/me_assemblyline_overlay_item_emissive.png new file mode 100644 index 000000000..5a805da3c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/me_assemblyline_overlay_item_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/module_hatch.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/module_hatch.png new file mode 100644 index 000000000..e0a7319ab Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/module_hatch.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/module_hatch_emissive.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/module_hatch_emissive.png new file mode 100644 index 000000000..760aa101f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/module_hatch_emissive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/soul_input_hatch.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/soul_input_hatch.png index aa3673e91..c8ce43b53 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/overlay/soul_input_hatch.png and b/src/main/resources/assets/cosmiccore/textures/block/overlay/soul_input_hatch.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/soul_output_hatch.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/soul_output_hatch.png index 2b2cb464e..1ec97277b 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/overlay/soul_output_hatch.png and b/src/main/resources/assets/cosmiccore/textures/block/overlay/soul_output_hatch.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/soul_overlay_front.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/soul_overlay_front.png index 0b8c1c096..09d66a9f4 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/block/overlay/soul_overlay_front.png and b/src/main/resources/assets/cosmiccore/textures/block/overlay/soul_overlay_front.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/soul_overlay_front.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/overlay/soul_overlay_front.png.mcmeta index 15465094f..31df3d792 100644 --- a/src/main/resources/assets/cosmiccore/textures/block/overlay/soul_overlay_front.png.mcmeta +++ b/src/main/resources/assets/cosmiccore/textures/block/overlay/soul_overlay_front.png.mcmeta @@ -1,7 +1,7 @@ { "animation": { "interpolate": true, - "frametime": 4 + "frametime": 1 }, "ldlib": { "emissive": true diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/thermia_export.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/thermia_export.png new file mode 100644 index 000000000..914882611 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/thermia_export.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/thermia_import.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/thermia_import.png new file mode 100644 index 000000000..7b0c3aa67 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/thermia_import.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_data_hatch.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_data_hatch.png new file mode 100644 index 000000000..f27b8f9ad Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_data_hatch.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_data_hatch.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_data_hatch.png.mcmeta new file mode 100644 index 000000000..0d3f35ce9 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_data_hatch.png.mcmeta @@ -0,0 +1,8 @@ +{ + "animation": { + "frametime": 2 + }, + "ldlib": { + "emissive": true + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_16a.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_16a.png new file mode 100644 index 000000000..d79a9a9e3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_16a.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_16a.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_16a.png.mcmeta new file mode 100644 index 000000000..8eb976213 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_16a.png.mcmeta @@ -0,0 +1,9 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + }, + "ldlib": { + "emissive": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_1a.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_1a.png new file mode 100644 index 000000000..dfc55121c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_1a.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_1a.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_1a.png.mcmeta new file mode 100644 index 000000000..8eb976213 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_1a.png.mcmeta @@ -0,0 +1,9 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + }, + "ldlib": { + "emissive": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_4a.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_4a.png new file mode 100644 index 000000000..1c97e963f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_4a.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_4a.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_4a.png.mcmeta new file mode 100644 index 000000000..8eb976213 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_4a.png.mcmeta @@ -0,0 +1,9 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + }, + "ldlib": { + "emissive": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_laser.png b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_laser.png new file mode 100644 index 000000000..dc74afe36 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_laser.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_laser.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_laser.png.mcmeta new file mode 100644 index 000000000..a30e30782 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/overlay/wireless_energy_laser.png.mcmeta @@ -0,0 +1,9 @@ +{ + "animation": { + "interpolate": true, + "frametime": 4 + }, + "ldlib": { + "emissive": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_plating_ev.png b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_ev.png new file mode 100644 index 000000000..f995cd654 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_ev.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_plating_hv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_hv.png new file mode 100644 index 000000000..92006c4d2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_hv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_plating_iv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_iv.png new file mode 100644 index 000000000..84fece590 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_iv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_plating_luv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_luv.png new file mode 100644 index 000000000..426d0175c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_luv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_plating_lv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_lv.png new file mode 100644 index 000000000..41a2275ae Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_lv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_plating_mv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_mv.png new file mode 100644 index 000000000..46c54cdc2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_mv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_plating_steam.png b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_steam.png new file mode 100644 index 000000000..135980525 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_steam.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_plating_zpm.png b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_zpm.png new file mode 100644 index 000000000..2bca0b06c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_plating_zpm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_tex_ev.png b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_ev.png new file mode 100644 index 000000000..4a271c4b7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_ev.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_tex_hv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_hv.png new file mode 100644 index 000000000..7fe104407 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_hv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_tex_iv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_iv.png new file mode 100644 index 000000000..ecbee98e7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_iv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_tex_luv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_luv.png new file mode 100644 index 000000000..8af1ac9b7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_luv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_tex_lv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_lv.png new file mode 100644 index 000000000..7acaf20b8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_lv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_tex_mv.png b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_mv.png new file mode 100644 index 000000000..98b1ed345 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_mv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_tex_steam.png b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_steam.png new file mode 100644 index 000000000..b3999dd15 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_steam.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/puff_tex_zpm.png b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_zpm.png new file mode 100644 index 000000000..8800b0804 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/puff_tex_zpm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/variant/heat_fan.png b/src/main/resources/assets/cosmiccore/textures/block/variant/heat_fan.png new file mode 100644 index 000000000..76545159c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/variant/heat_fan.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/variant/heat_fan_active.png b/src/main/resources/assets/cosmiccore/textures/block/variant/heat_fan_active.png new file mode 100644 index 000000000..55b06adea Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/variant/heat_fan_active.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/variant/heat_fan_active.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/variant/heat_fan_active.png.mcmeta new file mode 100644 index 000000000..f96626000 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/variant/heat_fan_active.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":1 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_ludicrous_engine_intake.png b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_ludicrous_engine_intake.png new file mode 100644 index 000000000..b450994ea Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_ludicrous_engine_intake.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_ludicrous_engine_intake_active.png b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_ludicrous_engine_intake_active.png new file mode 100644 index 000000000..b305cdc70 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_ludicrous_engine_intake_active.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_ludicrous_engine_intake_active.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_ludicrous_engine_intake_active.png.mcmeta new file mode 100644 index 000000000..f96626000 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_ludicrous_engine_intake_active.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":1 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter.png b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter.png new file mode 100644 index 000000000..991f05990 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter.png.mcmeta new file mode 100644 index 000000000..f77fe1daf --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter.png.mcmeta @@ -0,0 +1,5 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/variant/machine_casing_radioactive_filter_ctm" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter_active.png b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter_active.png new file mode 100644 index 000000000..8046de3b8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter_active.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter_active.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter_active.png.mcmeta new file mode 100644 index 000000000..b69b620cd --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter_active.png.mcmeta @@ -0,0 +1,8 @@ +{ + "ldlib": { + "connection": "cosmiccore:block/variant/machine_casing_radioactive_filter_ctm_active" + }, + "shimmer": { + "bloom": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter_ctm.png b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter_ctm.png new file mode 100644 index 000000000..ac266a46e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter_ctm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter_ctm_active.png b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter_ctm_active.png new file mode 100644 index 000000000..fae3fe714 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter_ctm_active.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter_ctm_active.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter_ctm_active.png.mcmeta new file mode 100644 index 000000000..e33311881 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_radioactive_filter_ctm_active.png.mcmeta @@ -0,0 +1,5 @@ +{ + "shimmer": { + "bloom": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_ultimate_engine_intake.png b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_ultimate_engine_intake.png new file mode 100644 index 000000000..37484fda6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_ultimate_engine_intake.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_ultimate_engine_intake_active.png b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_ultimate_engine_intake_active.png new file mode 100644 index 000000000..c46267ed2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_ultimate_engine_intake_active.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_ultimate_engine_intake_active.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_ultimate_engine_intake_active.png.mcmeta new file mode 100644 index 000000000..f96626000 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/block/variant/machine_casing_ultimate_engine_intake_active.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation":{ + "frametime":1 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/entity/nebulae.png b/src/main/resources/assets/cosmiccore/textures/entity/nebulae.png new file mode 100644 index 000000000..8980b6b2e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/entity/nebulae.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/environment/blackhole.png b/src/main/resources/assets/cosmiccore/textures/environment/blackhole.png new file mode 100644 index 000000000..dc8ed851e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/environment/blackhole.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/environment/dead_sun.png b/src/main/resources/assets/cosmiccore/textures/environment/dead_sun.png new file mode 100644 index 000000000..e5ecc4a71 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/environment/dead_sun.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/overlay/bee_overlay.png b/src/main/resources/assets/cosmiccore/textures/gui/overlay/bee_overlay.png new file mode 100644 index 000000000..2b8bdaaa1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/overlay/bee_overlay.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/overlay/crop_overlay.png b/src/main/resources/assets/cosmiccore/textures/gui/overlay/crop_overlay.png new file mode 100644 index 000000000..1fc13a1e6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/overlay/crop_overlay.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/overlay/dawnforge_slot.png b/src/main/resources/assets/cosmiccore/textures/gui/overlay/dawnforge_slot.png new file mode 100644 index 000000000..f565b1b13 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/overlay/dawnforge_slot.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/overlay/explosive_overlay.png b/src/main/resources/assets/cosmiccore/textures/gui/overlay/explosive_overlay.png new file mode 100644 index 000000000..233553cca Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/overlay/explosive_overlay.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/overlay/overlay_bee_holder.png b/src/main/resources/assets/cosmiccore/textures/gui/overlay/overlay_bee_holder.png new file mode 100644 index 000000000..7fb22d73b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/overlay/overlay_bee_holder.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/overlay/progress_bar_heavy_assembler.png b/src/main/resources/assets/cosmiccore/textures/gui/overlay/progress_bar_heavy_assembler.png new file mode 100644 index 000000000..77a29e56a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/overlay/progress_bar_heavy_assembler.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/overlay/sigil_overlay.png b/src/main/resources/assets/cosmiccore/textures/gui/overlay/sigil_overlay.png new file mode 100644 index 000000000..21e2d29e8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/overlay/sigil_overlay.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/oxygen_bg.png b/src/main/resources/assets/cosmiccore/textures/gui/oxygen_bg.png new file mode 100644 index 000000000..4d9c51484 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/oxygen_bg.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/oxygen_fill.png b/src/main/resources/assets/cosmiccore/textures/gui/oxygen_fill.png new file mode 100644 index 000000000..eb386aa8f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/oxygen_fill.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/sprites/planets/selection_menu_noland.png b/src/main/resources/assets/cosmiccore/textures/gui/sprites/planets/selection_menu_noland.png new file mode 100644 index 000000000..022d287bf Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/sprites/planets/selection_menu_noland.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_10.png b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_10.png new file mode 100644 index 000000000..a78585904 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_10.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_11.png b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_11.png new file mode 100644 index 000000000..bc7ce7117 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_11.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_12.png b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_12.png new file mode 100644 index 000000000..273419392 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_12.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_13.png b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_13.png new file mode 100644 index 000000000..a33f92d23 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_13.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_14.png b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_14.png new file mode 100644 index 000000000..fad591963 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_14.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_15.png b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_15.png new file mode 100644 index 000000000..e3e36c27f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_15.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_3.png b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_3.png new file mode 100644 index 000000000..0ae175b97 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_4.png b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_4.png new file mode 100644 index 000000000..c4d859bd3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_4.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_5.png b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_5.png new file mode 100644 index 000000000..b319c83dc Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_5.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_6.png b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_6.png new file mode 100644 index 000000000..0e731cbbf Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_6.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_7.png b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_7.png new file mode 100644 index 000000000..2b5224ebb Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_7.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_8.png b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_8.png new file mode 100644 index 000000000..d1ad57d83 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_8.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_9.png b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_9.png new file mode 100644 index 000000000..6eaa374a6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/gui/widget/hpca/component_outline_9.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/aberrant_essence.png b/src/main/resources/assets/cosmiccore/textures/item/aberrant_essence.png new file mode 100644 index 000000000..46e9eb03d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/aberrant_essence.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/aberrant_essence.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/aberrant_essence.png.mcmeta new file mode 100644 index 000000000..ad769e8be --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/aberrant_essence.png.mcmeta @@ -0,0 +1,9 @@ +{ + "animation": { + "interpolate": true, + "frametime": 16, + "frames": [ + 2,1,0 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/abrasive_rosin_millstones.png b/src/main/resources/assets/cosmiccore/textures/item/abrasive_rosin_millstones.png new file mode 100644 index 000000000..7ef648331 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/abrasive_rosin_millstones.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/advanced_gene_kit.png b/src/main/resources/assets/cosmiccore/textures/item/advanced_gene_kit.png new file mode 100644 index 000000000..159afde1a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/advanced_gene_kit.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/advanced_logistics_core.png b/src/main/resources/assets/cosmiccore/textures/item/advanced_logistics_core.png deleted file mode 100644 index 87d1a4901..000000000 Binary files a/src/main/resources/assets/cosmiccore/textures/item/advanced_logistics_core.png and /dev/null differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/air_bladder.png b/src/main/resources/assets/cosmiccore/textures/item/air_bladder.png new file mode 100644 index 000000000..cb885faff Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/air_bladder.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/akashic_processor.png b/src/main/resources/assets/cosmiccore/textures/item/akashic_processor.png new file mode 100644 index 000000000..349d8a058 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/akashic_processor.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/akashic_processor_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/akashic_processor_assembly.png new file mode 100644 index 000000000..111d7a4e2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/akashic_processor_assembly.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/akashic_processor_mainframe.png b/src/main/resources/assets/cosmiccore/textures/item/akashic_processor_mainframe.png new file mode 100644 index 000000000..e4fcc0e03 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/akashic_processor_mainframe.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/akashic_processor_mainframe.png.mcmeta similarity index 100% rename from src/main/resources/assets/cosmiccore/textures/item/macroverse_processor.png.mcmeta rename to src/main/resources/assets/cosmiccore/textures/item/akashic_processor_mainframe.png.mcmeta diff --git a/src/main/resources/assets/cosmiccore/textures/item/akashic_processor_supercomputer.png b/src/main/resources/assets/cosmiccore/textures/item/akashic_processor_supercomputer.png new file mode 100644 index 000000000..9a25e57a1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/akashic_processor_supercomputer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/alchemia_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/alchemia_wafer.png new file mode 100644 index 000000000..cb8f3065c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/alchemia_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/ambrion.png b/src/main/resources/assets/cosmiccore/textures/item/ambrion.png new file mode 100644 index 000000000..a7eb2a1c5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/ambrion.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/aram_chip.png b/src/main/resources/assets/cosmiccore/textures/item/aram_chip.png new file mode 100644 index 000000000..9d6e870ca Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/aram_chip.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/aram_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/aram_wafer.png new file mode 100644 index 000000000..c59a591ab Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/aram_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/archmagebloodorb.png b/src/main/resources/assets/cosmiccore/textures/item/archmagebloodorb.png new file mode 100644 index 000000000..72002b881 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/archmagebloodorb.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_1.png b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_1.png new file mode 100644 index 000000000..31c130af1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_2.png b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_2.png new file mode 100644 index 000000000..09ece7b88 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_3.png b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_3.png new file mode 100644 index 000000000..d0629aa9b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_4.png b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_4.png new file mode 100644 index 000000000..acdb74e7d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_4.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_5.png b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_5.png new file mode 100644 index 000000000..5c0bedb9f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/armored_freight_beetle_grade_5.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/asc_blood_orb.png b/src/main/resources/assets/cosmiccore/textures/item/asc_blood_orb.png new file mode 100644 index 000000000..7581a39ce Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/asc_blood_orb.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/asc_blood_orb.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/asc_blood_orb.png.mcmeta new file mode 100644 index 000000000..3bd0d55ad --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/asc_blood_orb.png.mcmeta @@ -0,0 +1,9 @@ +{ + "animation": { + "interpolate": false, + "frametime": 4, + "frames": [ + 2,1,0 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/asteroid_targeting_chip.png b/src/main/resources/assets/cosmiccore/textures/item/asteroid_targeting_chip.png new file mode 100644 index 000000000..2c95773ac Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/asteroid_targeting_chip.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/auric_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/auric_asteroid.png new file mode 100644 index 000000000..eced51cdd Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/auric_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/basic_gene_kit.png b/src/main/resources/assets/cosmiccore/textures/item/basic_gene_kit.png new file mode 100644 index 000000000..0ee8ea435 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/basic_gene_kit.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/body1.png b/src/main/resources/assets/cosmiccore/textures/item/bee/body1.png new file mode 100644 index 000000000..a475eda1e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/body1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/drone.body2.png b/src/main/resources/assets/cosmiccore/textures/item/bee/drone.body2.png new file mode 100644 index 000000000..574ec7932 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/drone.body2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/drone.body2.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/bee/drone.body2.png.mcmeta new file mode 100644 index 000000000..2856c9eab --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/bee/drone.body2.png.mcmeta @@ -0,0 +1,39 @@ +{ + "animation": { + "frames": [ + { + "index": 0, + "time": 64 + }, + { + "index": 1, + "time": 2 + }, + { + "index": 2, + "time": 2 + }, + { + "index": 1, + "time": 2 + }, + { + "index": 0, + "time": 96 + }, + { + "index": 3, + "time": 4 + }, + { + "index": 0, + "time": 128 + }, + { + "index": 4, + "time": 2 + } + ], + "frametime": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/drone.outline.png b/src/main/resources/assets/cosmiccore/textures/item/bee/drone.outline.png new file mode 100644 index 000000000..aa31dc5d4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/drone.outline.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/drone.outline.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/bee/drone.outline.png.mcmeta new file mode 100644 index 000000000..e6a0a256c --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/bee/drone.outline.png.mcmeta @@ -0,0 +1 @@ +{"animation":{"frametime":1,"frames":[{"index":0,"time":64},{"index":1,"time":2},{"index":2,"time":2},{"index":1,"time":2},{"index":0,"time":96},{"index":3,"time":4},{"index":0,"time":128},{"index":4,"time":2}]}} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body.png b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body.png new file mode 100644 index 000000000..0f63aaf51 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body.png.mcmeta new file mode 100644 index 000000000..9c14fabed --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body.png.mcmeta @@ -0,0 +1 @@ +{"animation":{"frametime":1,"frames":[{"index":0,"time":64},{"index":1,"time":2},{"index":0,"time":48},{"index":1,"time":2}]}} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body2.png b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body2.png new file mode 100644 index 000000000..a50272330 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body2.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body2.png.mcmeta new file mode 100644 index 000000000..9c14fabed --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.body2.png.mcmeta @@ -0,0 +1 @@ +{"animation":{"frametime":1,"frames":[{"index":0,"time":64},{"index":1,"time":2},{"index":0,"time":48},{"index":1,"time":2}]}} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.outline.png b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.outline.png new file mode 100644 index 000000000..44430b19e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.outline.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.outline.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.outline.png.mcmeta new file mode 100644 index 000000000..9c14fabed --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/bee/larvae.outline.png.mcmeta @@ -0,0 +1 @@ +{"animation":{"frametime":1,"frames":[{"index":0,"time":64},{"index":1,"time":2},{"index":0,"time":48},{"index":1,"time":2}]}} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/princess.body2.png b/src/main/resources/assets/cosmiccore/textures/item/bee/princess.body2.png new file mode 100644 index 000000000..3dc16108d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/princess.body2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/princess.body2.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/bee/princess.body2.png.mcmeta new file mode 100644 index 000000000..5663f647c --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/bee/princess.body2.png.mcmeta @@ -0,0 +1 @@ +{"animation":{"frametime":1,"frames":[{"index":0,"time":128},{"index":3,"time":4},{"index":0,"time":96},{"index":1,"time":2},{"index":2,"time":2},{"index":1,"time":2},{"index":0,"time":64},{"index":4,"time":2}]}} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/princess.outline.png b/src/main/resources/assets/cosmiccore/textures/item/bee/princess.outline.png new file mode 100644 index 000000000..aa31dc5d4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/princess.outline.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/princess.outline.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/bee/princess.outline.png.mcmeta new file mode 100644 index 000000000..5663f647c --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/bee/princess.outline.png.mcmeta @@ -0,0 +1 @@ +{"animation":{"frametime":1,"frames":[{"index":0,"time":128},{"index":3,"time":4},{"index":0,"time":96},{"index":1,"time":2},{"index":2,"time":2},{"index":1,"time":2},{"index":0,"time":64},{"index":4,"time":2}]}} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/queen.body2.png b/src/main/resources/assets/cosmiccore/textures/item/bee/queen.body2.png new file mode 100644 index 000000000..6f5e10687 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/queen.body2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/queen.body2.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/bee/queen.body2.png.mcmeta new file mode 100644 index 000000000..db3452220 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/bee/queen.body2.png.mcmeta @@ -0,0 +1 @@ +{"animation":{"frametime":1,"frames":[{"index":0,"time":96},{"index":3,"time":4},{"index":0,"time":64},{"index":4,"time":2},{"index":0,"time":128},{"index":1,"time":2},{"index":2,"time":2},{"index":1,"time":2}]}} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/queen.outline.png b/src/main/resources/assets/cosmiccore/textures/item/bee/queen.outline.png new file mode 100644 index 000000000..aa31dc5d4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/queen.outline.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/queen.outline.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/bee/queen.outline.png.mcmeta new file mode 100644 index 000000000..db3452220 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/bee/queen.outline.png.mcmeta @@ -0,0 +1 @@ +{"animation":{"frametime":1,"frames":[{"index":0,"time":96},{"index":3,"time":4},{"index":0,"time":64},{"index":4,"time":2},{"index":0,"time":128},{"index":1,"time":2},{"index":2,"time":2},{"index":1,"time":2}]}} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/bee/stripes.png b/src/main/resources/assets/cosmiccore/textures/item/bee/stripes.png new file mode 100644 index 000000000..3b82ab3df Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bee/stripes.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bifidobacterium_breve.png b/src/main/resources/assets/cosmiccore/textures/item/bifidobacterium_breve.png new file mode 100644 index 000000000..4bff5a3b5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bifidobacterium_breve.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bifidobacterium_breve_culture.png b/src/main/resources/assets/cosmiccore/textures/item/bifidobacterium_breve_culture.png new file mode 100644 index 000000000..8c2d6f3b7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bifidobacterium_breve_culture.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bitumen_wax.png b/src/main/resources/assets/cosmiccore/textures/item/bitumen_wax.png new file mode 100644 index 000000000..6934fb754 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bitumen_wax.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/black_dye_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/black_dye_spray_can.png new file mode 100644 index 000000000..9bbd9d49f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/black_dye_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/blackstone_pustule.png b/src/main/resources/assets/cosmiccore/textures/item/blackstone_pustule.png index f1648e9dd..fa298c394 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/blackstone_pustule.png and b/src/main/resources/assets/cosmiccore/textures/item/blackstone_pustule.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bladder/bladder-0.png b/src/main/resources/assets/cosmiccore/textures/item/bladder/bladder-0.png new file mode 100644 index 000000000..cb885faff Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bladder/bladder-0.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bladder/bladder-1.png b/src/main/resources/assets/cosmiccore/textures/item/bladder/bladder-1.png new file mode 100644 index 000000000..a59c69d1c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bladder/bladder-1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bladder/bladder-2.png b/src/main/resources/assets/cosmiccore/textures/item/bladder/bladder-2.png new file mode 100644 index 000000000..ddbe6a170 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bladder/bladder-2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bladder/bladder-3.png b/src/main/resources/assets/cosmiccore/textures/item/bladder/bladder-3.png new file mode 100644 index 000000000..7ee25ac9c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bladder/bladder-3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/blazing_mote.png b/src/main/resources/assets/cosmiccore/textures/item/blazing_mote.png new file mode 100644 index 000000000..a3d220500 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/blazing_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/blue_dye_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/blue_dye_spray_can.png new file mode 100644 index 000000000..db28e4186 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/blue_dye_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bright_mote.png b/src/main/resources/assets/cosmiccore/textures/item/bright_mote.png new file mode 100644 index 000000000..2e700ec3c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bright_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/brimstone_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/brimstone_asteroid.png new file mode 100644 index 000000000..4664b4842 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/brimstone_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/bronze_supply_tank.png b/src/main/resources/assets/cosmiccore/textures/item/bronze_supply_tank.png new file mode 100644 index 000000000..01e2673a9 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/bronze_supply_tank.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/brown_dye_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/brown_dye_spray_can.png new file mode 100644 index 000000000..11b5bf080 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/brown_dye_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/capacity_chip.png b/src/main/resources/assets/cosmiccore/textures/item/capacity_chip.png new file mode 100644 index 000000000..a01107d5e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/capacity_chip.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/carbon_asteroid_base.png b/src/main/resources/assets/cosmiccore/textures/item/carbon_asteroid_base.png new file mode 100644 index 000000000..ffd5c418f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/carbon_asteroid_base.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/chronia.png b/src/main/resources/assets/cosmiccore/textures/item/chronia.png new file mode 100644 index 000000000..66e6d339c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/chronia.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/clear_mote.png b/src/main/resources/assets/cosmiccore/textures/item/clear_mote.png new file mode 100644 index 000000000..28501498b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/clear_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/cluster_of_perpetuity.png b/src/main/resources/assets/cosmiccore/textures/item/cluster_of_perpetuity.png new file mode 100644 index 000000000..d2f2fbe92 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/cluster_of_perpetuity.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/cluster_of_perpetuity.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/cluster_of_perpetuity.png.mcmeta new file mode 100644 index 000000000..ac809279e --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/cluster_of_perpetuity.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/abrasive.png b/src/main/resources/assets/cosmiccore/textures/item/comb/abrasive.png new file mode 100644 index 000000000..f77615c8a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/abrasive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/absent.png b/src/main/resources/assets/cosmiccore/textures/item/comb/absent.png new file mode 100644 index 000000000..767dac024 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/absent.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/ambrosic.png b/src/main/resources/assets/cosmiccore/textures/item/comb/ambrosic.png new file mode 100644 index 000000000..d1db6abe4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/ambrosic.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/architect.png b/src/main/resources/assets/cosmiccore/textures/item/comb/architect.png new file mode 100644 index 000000000..1ff29a905 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/architect.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/ashen.png b/src/main/resources/assets/cosmiccore/textures/item/comb/ashen.png new file mode 100644 index 000000000..6875fe736 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/ashen.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/biohazard.png b/src/main/resources/assets/cosmiccore/textures/item/comb/biohazard.png new file mode 100644 index 000000000..5096b5680 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/biohazard.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/citrus_polymer.png b/src/main/resources/assets/cosmiccore/textures/item/comb/citrus_polymer.png new file mode 100644 index 000000000..dc457d67e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/citrus_polymer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/cobbled.png b/src/main/resources/assets/cosmiccore/textures/item/comb/cobbled.png new file mode 100644 index 000000000..6cea2cca2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/cobbled.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/constructive.png b/src/main/resources/assets/cosmiccore/textures/item/comb/constructive.png new file mode 100644 index 000000000..2c6d2d2f8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/constructive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/cosmos.png b/src/main/resources/assets/cosmiccore/textures/item/comb/cosmos.png new file mode 100644 index 000000000..99b3ff574 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/cosmos.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/energized.png b/src/main/resources/assets/cosmiccore/textures/item/comb/energized.png new file mode 100644 index 000000000..d3f1ea587 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/energized.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/exhaustive.png b/src/main/resources/assets/cosmiccore/textures/item/comb/exhaustive.png new file mode 100644 index 000000000..977719b51 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/exhaustive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/fate.png b/src/main/resources/assets/cosmiccore/textures/item/comb/fate.png new file mode 100644 index 000000000..2e037ed77 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/fate.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/fracking.png b/src/main/resources/assets/cosmiccore/textures/item/comb/fracking.png new file mode 100644 index 000000000..4e2c41e48 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/fracking.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/grand_garden.png b/src/main/resources/assets/cosmiccore/textures/item/comb/grand_garden.png new file mode 100644 index 000000000..8b6acea92 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/grand_garden.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/hadal.png b/src/main/resources/assets/cosmiccore/textures/item/comb/hadal.png new file mode 100644 index 000000000..a4d94a23c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/hadal.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/hellsmith.png b/src/main/resources/assets/cosmiccore/textures/item/comb/hellsmith.png new file mode 100644 index 000000000..b3844305d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/hellsmith.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/hydraulic.png b/src/main/resources/assets/cosmiccore/textures/item/comb/hydraulic.png new file mode 100644 index 000000000..0b0afadc6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/hydraulic.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/illusive.png b/src/main/resources/assets/cosmiccore/textures/item/comb/illusive.png new file mode 100644 index 000000000..1ad5f46b7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/illusive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/inquisitive.png b/src/main/resources/assets/cosmiccore/textures/item/comb/inquisitive.png new file mode 100644 index 000000000..6408318d1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/inquisitive.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_argon.png b/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_argon.png new file mode 100644 index 000000000..039254f0e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_argon.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_hydrogen.png b/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_hydrogen.png new file mode 100644 index 000000000..fbc31f75d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_hydrogen.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_nitrogen.png b/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_nitrogen.png new file mode 100644 index 000000000..011b29b0b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_nitrogen.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_oxygen.png b/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_oxygen.png new file mode 100644 index 000000000..2a27a2775 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/lofty_oxygen.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/lunar.png b/src/main/resources/assets/cosmiccore/textures/item/comb/lunar.png new file mode 100644 index 000000000..f00e3215c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/lunar.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/pale.png b/src/main/resources/assets/cosmiccore/textures/item/comb/pale.png new file mode 100644 index 000000000..e9055579f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/pale.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/prismatic.png b/src/main/resources/assets/cosmiccore/textures/item/comb/prismatic.png new file mode 100644 index 000000000..391ea0405 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/prismatic.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/pyrolytic.png b/src/main/resources/assets/cosmiccore/textures/item/comb/pyrolytic.png new file mode 100644 index 000000000..c36371e26 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/pyrolytic.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/radoxia.png b/src/main/resources/assets/cosmiccore/textures/item/comb/radoxia.png new file mode 100644 index 000000000..928c93c46 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/radoxia.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/rose_polymer.png b/src/main/resources/assets/cosmiccore/textures/item/comb/rose_polymer.png new file mode 100644 index 000000000..d05880ac3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/rose_polymer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/runic.png b/src/main/resources/assets/cosmiccore/textures/item/comb/runic.png new file mode 100644 index 000000000..31d971753 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/runic.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/shaman.png b/src/main/resources/assets/cosmiccore/textures/item/comb/shaman.png new file mode 100644 index 000000000..7f0811b17 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/shaman.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/slick.png b/src/main/resources/assets/cosmiccore/textures/item/comb/slick.png new file mode 100644 index 000000000..ecfd5b781 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/slick.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/solar.png b/src/main/resources/assets/cosmiccore/textures/item/comb/solar.png new file mode 100644 index 000000000..4b416c3f6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/solar.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/soul.png b/src/main/resources/assets/cosmiccore/textures/item/comb/soul.png new file mode 100644 index 000000000..cd436b052 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/soul.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/virtue.png b/src/main/resources/assets/cosmiccore/textures/item/comb/virtue.png new file mode 100644 index 000000000..95590f3a0 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/virtue.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/comb/waxy_polymer.png b/src/main/resources/assets/cosmiccore/textures/item/comb/waxy_polymer.png new file mode 100644 index 000000000..f244cdf9e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/comb/waxy_polymer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/computation_support_unit.png b/src/main/resources/assets/cosmiccore/textures/item/computation_support_unit.png new file mode 100644 index 000000000..1a5094033 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/computation_support_unit.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/contaminated_petri_dish.png b/src/main/resources/assets/cosmiccore/textures/item/contaminated_petri_dish.png new file mode 100644 index 000000000..26aaf0ba6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/contaminated_petri_dish.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/cosmic_processor.png b/src/main/resources/assets/cosmiccore/textures/item/cosmic_processor.png deleted file mode 100644 index 170d06bf8..000000000 Binary files a/src/main/resources/assets/cosmiccore/textures/item/cosmic_processor.png and /dev/null differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/cosmic_processor_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/cosmic_processor_assembly.png deleted file mode 100644 index 8e20eccb6..000000000 Binary files a/src/main/resources/assets/cosmiccore/textures/item/cosmic_processor_assembly.png and /dev/null differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/cosmic_processor_mainframe.png b/src/main/resources/assets/cosmiccore/textures/item/cosmic_processor_mainframe.png deleted file mode 100644 index c490c1504..000000000 Binary files a/src/main/resources/assets/cosmiccore/textures/item/cosmic_processor_mainframe.png and /dev/null differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/cosmic_processor_supercomputer.png b/src/main/resources/assets/cosmiccore/textures/item/cosmic_processor_supercomputer.png deleted file mode 100644 index 3d22ac603..000000000 Binary files a/src/main/resources/assets/cosmiccore/textures/item/cosmic_processor_supercomputer.png and /dev/null differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_1.png b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_1.png new file mode 100644 index 000000000..f1d140525 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_2.png b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_2.png new file mode 100644 index 000000000..6d28daf77 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_3.png b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_3.png new file mode 100644 index 000000000..442eae4b5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_4.png b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_4.png new file mode 100644 index 000000000..d6ce04586 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_4.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_5.png b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_5.png new file mode 100644 index 000000000..0b2afbbf6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crucible_mantis_grade_5.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_1.png b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_1.png new file mode 100644 index 000000000..f4e4f460a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_2.png b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_2.png new file mode 100644 index 000000000..73badc8ce Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_3.png b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_3.png new file mode 100644 index 000000000..7bb9d1a64 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_4.png b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_4.png new file mode 100644 index 000000000..3f7baf51b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_4.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_5.png b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_5.png new file mode 100644 index 000000000..f19197fc7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crusher_wasps_grade_5.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crystal_chiplet_base.png b/src/main/resources/assets/cosmiccore/textures/item/crystal_chiplet_base.png new file mode 100644 index 000000000..cbd476671 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crystal_chiplet_base.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crystal_chiplet_mask.png b/src/main/resources/assets/cosmiccore/textures/item/crystal_chiplet_mask.png new file mode 100644 index 000000000..bac6f0df5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crystal_chiplet_mask.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crystala.png b/src/main/resources/assets/cosmiccore/textures/item/crystala.png new file mode 100644 index 000000000..6d634509f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crystala.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crystalline_capacitor.png b/src/main/resources/assets/cosmiccore/textures/item/crystalline_capacitor.png new file mode 100644 index 000000000..3f8490707 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crystalline_capacitor.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crystalline_diode.png b/src/main/resources/assets/cosmiccore/textures/item/crystalline_diode.png new file mode 100644 index 000000000..d6569fa46 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crystalline_diode.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crystalline_inductor.png b/src/main/resources/assets/cosmiccore/textures/item/crystalline_inductor.png new file mode 100644 index 000000000..237d2c7a5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crystalline_inductor.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crystalline_resistor.png b/src/main/resources/assets/cosmiccore/textures/item/crystalline_resistor.png new file mode 100644 index 000000000..5cf39d820 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crystalline_resistor.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/crystalline_transistor.png b/src/main/resources/assets/cosmiccore/textures/item/crystalline_transistor.png new file mode 100644 index 000000000..7f248d430 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/crystalline_transistor.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/cyan_dye_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/cyan_dye_spray_can.png new file mode 100644 index 000000000..1903482ee Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/cyan_dye_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/debug_structure_writer.png b/src/main/resources/assets/cosmiccore/textures/item/debug_structure_writer.png new file mode 100644 index 000000000..bff04f008 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/debug_structure_writer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/decaying.png b/src/main/resources/assets/cosmiccore/textures/item/decaying.png new file mode 100644 index 000000000..117b3c5ba Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/decaying.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/dilumixal_naquadah_doped_silicon_boule.png b/src/main/resources/assets/cosmiccore/textures/item/dilumixal_naquadah_doped_silicon_boule.png new file mode 100644 index 000000000..5379d5972 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/dilumixal_naquadah_doped_silicon_boule.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/dilumixal_naquadah_doped_silicon_boule.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/dilumixal_naquadah_doped_silicon_boule.png.mcmeta new file mode 100644 index 000000000..b8532c359 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/dilumixal_naquadah_doped_silicon_boule.png.mcmeta @@ -0,0 +1,9 @@ +{ + "animation": { + "interpolate": true, + "frametime": 3, + "frames": [ + 0,1,2,3,4,5,6,7,6,5,4,3,2,1,2,3,4,3,2,1,2,3,4,5,6,5,4,3,2,1 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/dilumixal_naquadah_doped_silicon_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/dilumixal_naquadah_doped_silicon_wafer.png new file mode 100644 index 000000000..108f53197 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/dilumixal_naquadah_doped_silicon_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/dilumixal_naquadah_doped_silicon_wafer.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/dilumixal_naquadah_doped_silicon_wafer.png.mcmeta new file mode 100644 index 000000000..b8532c359 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/dilumixal_naquadah_doped_silicon_wafer.png.mcmeta @@ -0,0 +1,9 @@ +{ + "animation": { + "interpolate": true, + "frametime": 3, + "frames": [ + 0,1,2,3,4,5,6,7,6,5,4,3,2,1,2,3,4,3,2,1,2,3,4,5,6,5,4,3,2,1 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/dim_mote.png b/src/main/resources/assets/cosmiccore/textures/item/dim_mote.png new file mode 100644 index 000000000..c70d9c19f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/dim_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/donk.png b/src/main/resources/assets/cosmiccore/textures/item/donk.png index e21e95d19..5fa2be827 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/donk.png and b/src/main/resources/assets/cosmiccore/textures/item/donk.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/drone_frame_1.png b/src/main/resources/assets/cosmiccore/textures/item/drone_frame_1.png new file mode 100644 index 000000000..e7d01a4c5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/drone_frame_1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/drone_frame_2.png b/src/main/resources/assets/cosmiccore/textures/item/drone_frame_2.png new file mode 100644 index 000000000..de51ad418 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/drone_frame_2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/drone_frame_3.png b/src/main/resources/assets/cosmiccore/textures/item/drone_frame_3.png new file mode 100644 index 000000000..235532dcd Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/drone_frame_3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/drone_frame_4.png b/src/main/resources/assets/cosmiccore/textures/item/drone_frame_4.png new file mode 100644 index 000000000..2d524cd3e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/drone_frame_4.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/drone_frame_5.png b/src/main/resources/assets/cosmiccore/textures/item/drone_frame_5.png new file mode 100644 index 000000000..556056dbf Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/drone_frame_5.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/dulia_lily.png b/src/main/resources/assets/cosmiccore/textures/item/dulia_lily.png new file mode 100644 index 000000000..caadc6327 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/dulia_lily.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/dynamia.png b/src/main/resources/assets/cosmiccore/textures/item/dynamia.png new file mode 100644 index 000000000..19966421d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/dynamia.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/echo_processor.png b/src/main/resources/assets/cosmiccore/textures/item/echo_processor.png deleted file mode 100644 index 9afa2a912..000000000 Binary files a/src/main/resources/assets/cosmiccore/textures/item/echo_processor.png and /dev/null differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/echo_processor_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/echo_processor_assembly.png deleted file mode 100644 index 1425e8e72..000000000 Binary files a/src/main/resources/assets/cosmiccore/textures/item/echo_processor_assembly.png and /dev/null differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/echo_processor_mainframe.png b/src/main/resources/assets/cosmiccore/textures/item/echo_processor_mainframe.png deleted file mode 100644 index 9f6eca1fa..000000000 Binary files a/src/main/resources/assets/cosmiccore/textures/item/echo_processor_mainframe.png and /dev/null differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/echo_processor_supercomputer.png b/src/main/resources/assets/cosmiccore/textures/item/echo_processor_supercomputer.png deleted file mode 100644 index ae7669fa5..000000000 Binary files a/src/main/resources/assets/cosmiccore/textures/item/echo_processor_supercomputer.png and /dev/null differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/echon.png b/src/main/resources/assets/cosmiccore/textures/item/echon.png new file mode 100644 index 000000000..20a1370f3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/echon.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/efficacy_chip.png b/src/main/resources/assets/cosmiccore/textures/item/efficacy_chip.png new file mode 100644 index 000000000..1c334d0b4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/efficacy_chip.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/electric_manager_module.png b/src/main/resources/assets/cosmiccore/textures/item/electric_manager_module.png index 7a2d13089..1732e83ca 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/electric_manager_module.png and b/src/main/resources/assets/cosmiccore/textures/item/electric_manager_module.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/empty_fuel_rod.png b/src/main/resources/assets/cosmiccore/textures/item/empty_fuel_rod.png new file mode 100644 index 000000000..445a655a2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/empty_fuel_rod.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/empty_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/empty_spray_can.png new file mode 100644 index 000000000..ceb972774 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/empty_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/energized_silk.png b/src/main/resources/assets/cosmiccore/textures/item/energized_silk.png new file mode 100644 index 000000000..0c6789d2c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/energized_silk.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/engourged_spore.png b/src/main/resources/assets/cosmiccore/textures/item/engourged_spore.png index c0cadc961..1653679ba 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/engourged_spore.png and b/src/main/resources/assets/cosmiccore/textures/item/engourged_spore.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/engraved_crystal_chiplet.png b/src/main/resources/assets/cosmiccore/textures/item/engraved_crystal_chiplet.png new file mode 100644 index 000000000..1ae3cab7b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/engraved_crystal_chiplet.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor.png b/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor.png new file mode 100644 index 000000000..1d08ecf64 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor_assembly.png new file mode 100644 index 000000000..cc42ab2e4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor_assembly.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor_mainframe.png b/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor_mainframe.png new file mode 100644 index 000000000..b7af73a38 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor_mainframe.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor_supercomputer.png b/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor_supercomputer.png new file mode 100644 index 000000000..b3c45e8f3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/enthelic_processor_supercomputer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor.png b/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor.png new file mode 100644 index 000000000..783adb62f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor.png.mcmeta new file mode 100644 index 000000000..319e63a97 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 5 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor_assembly.png new file mode 100644 index 000000000..8d3e3aa96 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor_assembly.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor_assembly.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor_assembly.png.mcmeta new file mode 100644 index 000000000..319e63a97 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor_assembly.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 5 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor_mainframe.png b/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor_mainframe.png new file mode 100644 index 000000000..6ac13f246 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor_mainframe.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor_mainframe.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor_mainframe.png.mcmeta new file mode 100644 index 000000000..319e63a97 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor_mainframe.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 5 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor_supercomputer.png b/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor_supercomputer.png new file mode 100644 index 000000000..ca6802a30 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor_supercomputer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor_supercomputer.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor_supercomputer.png.mcmeta new file mode 100644 index 000000000..319e63a97 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/eschaton_processor_supercomputer.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 5 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/escherichia_coli.png b/src/main/resources/assets/cosmiccore/textures/item/escherichia_coli.png new file mode 100644 index 000000000..c83f1df74 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/escherichia_coli.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/escherichia_coli_culture.png b/src/main/resources/assets/cosmiccore/textures/item/escherichia_coli_culture.png new file mode 100644 index 000000000..8b2a45704 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/escherichia_coli_culture.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/esson.png b/src/main/resources/assets/cosmiccore/textures/item/esson.png new file mode 100644 index 000000000..8722cee7d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/esson.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/eterna_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/eterna_wafer.png new file mode 100644 index 000000000..6ad28d70d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/eterna_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/ether_wisp.png b/src/main/resources/assets/cosmiccore/textures/item/ether_wisp.png new file mode 100644 index 000000000..c4213d4ee Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/ether_wisp.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/ethera.png b/src/main/resources/assets/cosmiccore/textures/item/ethera.png new file mode 100644 index 000000000..6f9c0e78a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/ethera.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/etheric_spirit.png b/src/main/resources/assets/cosmiccore/textures/item/etheric_spirit.png new file mode 100644 index 000000000..7b5f21847 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/etheric_spirit.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/ev_radio_module.png b/src/main/resources/assets/cosmiccore/textures/item/ev_radio_module.png new file mode 100644 index 000000000..186fb59e9 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/ev_radio_module.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/ev_wildfire_core.png b/src/main/resources/assets/cosmiccore/textures/item/ev_wildfire_core.png new file mode 100644 index 000000000..9c64c4a3a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/ev_wildfire_core.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/faint_mote.png b/src/main/resources/assets/cosmiccore/textures/item/faint_mote.png new file mode 100644 index 000000000..367eec78f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/faint_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/fermium_rad_charges.png b/src/main/resources/assets/cosmiccore/textures/item/fermium_rad_charges.png new file mode 100644 index 000000000..1597518fe Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/fermium_rad_charges.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor_assembly.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/fermium_rad_charges.png.mcmeta similarity index 100% rename from src/main/resources/assets/cosmiccore/textures/item/macroverse_processor_assembly.png.mcmeta rename to src/main/resources/assets/cosmiccore/textures/item/fermium_rad_charges.png.mcmeta diff --git a/src/main/resources/assets/cosmiccore/textures/item/ferric_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/ferric_asteroid.png new file mode 100644 index 000000000..5fd0b1b32 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/ferric_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/fiber_mesh_ingot_frame.png b/src/main/resources/assets/cosmiccore/textures/item/fiber_mesh_ingot_frame.png new file mode 100644 index 000000000..4bc55474a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/fiber_mesh_ingot_frame.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/fibroblast_c.png b/src/main/resources/assets/cosmiccore/textures/item/fibroblast_c.png new file mode 100644 index 000000000..7ffd0f421 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/fibroblast_c.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/fibroblast_d.png b/src/main/resources/assets/cosmiccore/textures/item/fibroblast_d.png new file mode 100644 index 000000000..07c7b4ba1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/fibroblast_d.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/fireclay_ball.png b/src/main/resources/assets/cosmiccore/textures/item/fireclay_ball.png new file mode 100644 index 000000000..b10ba70ae Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/fireclay_ball.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/flawed_resonant_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/flawed_resonant_wafer.png new file mode 100644 index 000000000..34213ce95 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/flawed_resonant_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/flawed_resonant_wafer.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/flawed_resonant_wafer.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/flawed_resonant_wafer.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_neptunium_fuel.png b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_neptunium_fuel.png new file mode 100644 index 000000000..cac8210f4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_neptunium_fuel.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_neptunium_fuel.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_neptunium_fuel.png.mcmeta new file mode 100644 index 000000000..e9aa92246 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_neptunium_fuel.png.mcmeta @@ -0,0 +1,15 @@ +{ + "animation": { + "frametime": 1, + "frames": [ + { "index": 0, "time": 10}, + { "index": 1, "time": 2}, + { "index": 2, "time": 10}, + { "index": 3, "time": 2}, + { "index": 4, "time": 10}, + { "index": 5, "time": 2}, + { "index": 6, "time": 10}, + { "index": 7, "time": 2} + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_plutonium_fuel.png b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_plutonium_fuel.png new file mode 100644 index 000000000..d58749b36 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_plutonium_fuel.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_plutonium_fuel.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_plutonium_fuel.png.mcmeta new file mode 100644 index 000000000..e9aa92246 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_plutonium_fuel.png.mcmeta @@ -0,0 +1,15 @@ +{ + "animation": { + "frametime": 1, + "frames": [ + { "index": 0, "time": 10}, + { "index": 1, "time": 2}, + { "index": 2, "time": 10}, + { "index": 3, "time": 2}, + { "index": 4, "time": 10}, + { "index": 5, "time": 2}, + { "index": 6, "time": 10}, + { "index": 7, "time": 2} + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_uranium_fuel.png b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_uranium_fuel.png new file mode 100644 index 000000000..d498035f7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_uranium_fuel.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_uranium_fuel.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_uranium_fuel.png.mcmeta new file mode 100644 index 000000000..e9aa92246 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/flesh_packed_uranium_fuel.png.mcmeta @@ -0,0 +1,15 @@ +{ + "animation": { + "frametime": 1, + "frames": [ + { "index": 0, "time": 10}, + { "index": 1, "time": 2}, + { "index": 2, "time": 10}, + { "index": 3, "time": 2}, + { "index": 4, "time": 10}, + { "index": 5, "time": 2}, + { "index": 6, "time": 10}, + { "index": 7, "time": 2} + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/fleshy_neptunium_waste.png b/src/main/resources/assets/cosmiccore/textures/item/fleshy_neptunium_waste.png new file mode 100644 index 000000000..1dc35fb5d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/fleshy_neptunium_waste.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/fleshy_neptunium_waste.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/fleshy_neptunium_waste.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/fleshy_neptunium_waste.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/fleshy_plutonium_waste.png b/src/main/resources/assets/cosmiccore/textures/item/fleshy_plutonium_waste.png new file mode 100644 index 000000000..700721ca1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/fleshy_plutonium_waste.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/fleshy_plutonium_waste.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/fleshy_plutonium_waste.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/fleshy_plutonium_waste.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/fleshy_uranium_waste.png b/src/main/resources/assets/cosmiccore/textures/item/fleshy_uranium_waste.png new file mode 100644 index 000000000..f7d1d0a32 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/fleshy_uranium_waste.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/fleshy_uranium_waste.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/fleshy_uranium_waste.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/fleshy_uranium_waste.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/fluix_ballast_core.png b/src/main/resources/assets/cosmiccore/textures/item/fluix_ballast_core.png index d56be5b89..3a294dab5 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/fluix_ballast_core.png and b/src/main/resources/assets/cosmiccore/textures/item/fluix_ballast_core.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_1.png b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_1.png new file mode 100644 index 000000000..da77e4bd6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_2.png b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_2.png new file mode 100644 index 000000000..8be9593eb Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_3.png b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_3.png new file mode 100644 index 000000000..f781a2971 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_4.png b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_4.png new file mode 100644 index 000000000..cb01721fc Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_4.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_5.png b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_5.png new file mode 100644 index 000000000..99739dd6c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/freight_beetle_grade_5.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/fused_wafer_of_esoterica.png b/src/main/resources/assets/cosmiccore/textures/item/fused_wafer_of_esoterica.png new file mode 100644 index 000000000..e32c5864b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/fused_wafer_of_esoterica.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/fused_wafer_of_logos.png b/src/main/resources/assets/cosmiccore/textures/item/fused_wafer_of_logos.png new file mode 100644 index 000000000..8e87dbc04 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/fused_wafer_of_logos.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/gelatin_scaffold.png b/src/main/resources/assets/cosmiccore/textures/item/gelatin_scaffold.png new file mode 100644 index 000000000..d9ae6e1bf Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/gelatin_scaffold.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/gray_dye_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/gray_dye_spray_can.png new file mode 100644 index 000000000..ec296d706 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/gray_dye_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/green_dye_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/green_dye_spray_can.png new file mode 100644 index 000000000..0761b4fd8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/green_dye_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/hardened_resin.png b/src/main/resources/assets/cosmiccore/textures/item/hardened_resin.png new file mode 100644 index 000000000..5d9241875 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/hardened_resin.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/harmonic_chiplet_oscillating.png b/src/main/resources/assets/cosmiccore/textures/item/harmonic_chiplet_oscillating.png new file mode 100644 index 000000000..5493b141d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/harmonic_chiplet_oscillating.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/harmonic_chiplet_oscillating.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/harmonic_chiplet_oscillating.png.mcmeta new file mode 100644 index 000000000..0a08b0631 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/harmonic_chiplet_oscillating.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 25 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/harmonic_processor.png b/src/main/resources/assets/cosmiccore/textures/item/harmonic_processor.png new file mode 100644 index 000000000..b5b9367ac Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/harmonic_processor.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/harmonic_processor_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/harmonic_processor_assembly.png new file mode 100644 index 000000000..feb220b28 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/harmonic_processor_assembly.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/harmonic_processor_mainframe.png b/src/main/resources/assets/cosmiccore/textures/item/harmonic_processor_mainframe.png new file mode 100644 index 000000000..c03bbc2a5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/harmonic_processor_mainframe.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/harmonic_processor_mainframe.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/harmonic_processor_mainframe.png.mcmeta new file mode 100644 index 000000000..926199644 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/harmonic_processor_mainframe.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 3 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/harmonic_processor_supercomputer.png b/src/main/resources/assets/cosmiccore/textures/item/harmonic_processor_supercomputer.png new file mode 100644 index 000000000..96a821784 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/harmonic_processor_supercomputer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/harmonically_tuned_circuit_board.png b/src/main/resources/assets/cosmiccore/textures/item/harmonically_tuned_circuit_board.png new file mode 100644 index 000000000..20fdc1773 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/harmonically_tuned_circuit_board.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/harmonically_tuned_printed_circuit_board.png b/src/main/resources/assets/cosmiccore/textures/item/harmonically_tuned_printed_circuit_board.png new file mode 100644 index 000000000..6792823bf Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/harmonically_tuned_printed_circuit_board.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/heme_ring.png b/src/main/resources/assets/cosmiccore/textures/item/heme_ring.png new file mode 100644 index 000000000..fd534e70f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/heme_ring.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/hex_processor.png b/src/main/resources/assets/cosmiccore/textures/item/hex_processor.png new file mode 100644 index 000000000..64ce4fc97 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/hex_processor.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/hex_processor_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/hex_processor_assembly.png new file mode 100644 index 000000000..1f4bd4e79 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/hex_processor_assembly.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/hex_processor_mainframe.png b/src/main/resources/assets/cosmiccore/textures/item/hex_processor_mainframe.png new file mode 100644 index 000000000..3e90df9a5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/hex_processor_mainframe.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/hex_processor_supercomputer.png b/src/main/resources/assets/cosmiccore/textures/item/hex_processor_supercomputer.png new file mode 100644 index 000000000..6d7843be1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/hex_processor_supercomputer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/high_powered_electric_manager_module.png b/src/main/resources/assets/cosmiccore/textures/item/high_powered_electric_manager_module.png index 85338f378..98bf6ccc1 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/high_powered_electric_manager_module.png and b/src/main/resources/assets/cosmiccore/textures/item/high_powered_electric_manager_module.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/hv_radio_module.png b/src/main/resources/assets/cosmiccore/textures/item/hv_radio_module.png new file mode 100644 index 000000000..bb3ea4d8b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/hv_radio_module.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/hv_wildfire_core.png b/src/main/resources/assets/cosmiccore/textures/item/hv_wildfire_core.png new file mode 100644 index 000000000..6ba4eb0d9 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/hv_wildfire_core.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/hydraulic_boots.png b/src/main/resources/assets/cosmiccore/textures/item/hydraulic_boots.png new file mode 100644 index 000000000..5a6a39a03 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/hydraulic_boots.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/incandescent_mote.png b/src/main/resources/assets/cosmiccore/textures/item/incandescent_mote.png new file mode 100644 index 000000000..cf9748f8c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/incandescent_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/industrial_drone.png b/src/main/resources/assets/cosmiccore/textures/item/industrial_drone.png new file mode 100644 index 000000000..16ba3be87 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/industrial_drone.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/inert_fungal_spores.png b/src/main/resources/assets/cosmiccore/textures/item/inert_fungal_spores.png new file mode 100644 index 000000000..1973c505e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/inert_fungal_spores.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/infinite_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/infinite_spray_can.png new file mode 100644 index 000000000..ceb972774 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/infinite_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/intermediate_gene_kit.png b/src/main/resources/assets/cosmiccore/textures/item/intermediate_gene_kit.png new file mode 100644 index 000000000..0bee616e3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/intermediate_gene_kit.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/iv_radio_module.png b/src/main/resources/assets/cosmiccore/textures/item/iv_radio_module.png new file mode 100644 index 000000000..908e9d25c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/iv_radio_module.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/iv_wildfire_core.png b/src/main/resources/assets/cosmiccore/textures/item/iv_wildfire_core.png new file mode 100644 index 000000000..20d724bb4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/iv_wildfire_core.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/large_shard_of_perpetuity.png b/src/main/resources/assets/cosmiccore/textures/item/large_shard_of_perpetuity.png new file mode 100644 index 000000000..e0660c5e0 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/large_shard_of_perpetuity.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/large_shard_of_perpetuity.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/large_shard_of_perpetuity.png.mcmeta new file mode 100644 index 000000000..ac809279e --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/large_shard_of_perpetuity.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/latent_capacity_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/latent_capacity_wafer.png new file mode 100644 index 000000000..4929b1034 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/latent_capacity_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/latent_efficacy_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/latent_efficacy_wafer.png new file mode 100644 index 000000000..166e21dc8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/latent_efficacy_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/latent_potency_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/latent_potency_wafer.png new file mode 100644 index 000000000..43fcbf443 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/latent_potency_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/latent_verbosity_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/latent_verbosity_wafer.png new file mode 100644 index 000000000..455534220 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/latent_verbosity_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/light_blue_dye_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/light_blue_dye_spray_can.png new file mode 100644 index 000000000..ed160a037 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/light_blue_dye_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/light_gray_dye_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/light_gray_dye_spray_can.png new file mode 100644 index 000000000..06d6bd654 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/light_gray_dye_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/lime_dye_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/lime_dye_spray_can.png new file mode 100644 index 000000000..49c3f2d54 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/lime_dye_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/lith_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/lith_asteroid.png new file mode 100644 index 000000000..ca839866a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/lith_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/livingrock_aluminate_boule.png b/src/main/resources/assets/cosmiccore/textures/item/livingrock_aluminate_boule.png new file mode 100644 index 000000000..3ce1e2ab8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/livingrock_aluminate_boule.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/livirock_aluminite_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/livirock_aluminite_wafer.png new file mode 100644 index 000000000..16fb5672b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/livirock_aluminite_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/lucid_cpu_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/lucid_cpu_wafer.png new file mode 100644 index 000000000..5684f5527 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/lucid_cpu_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor.png b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor.png new file mode 100644 index 000000000..623b390e0 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor.png.mcmeta new file mode 100644 index 000000000..ea9cd1fcf --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor.png.mcmeta @@ -0,0 +1,10 @@ +{ + "animation": { + "interpolate": true, + "frametime": 40, + "frames": [ + { "index": 0, "time": 2 }, + { "index": 1, "time": 38 } + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_assembly.png new file mode 100644 index 000000000..7e00afdc2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_assembly.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_assembly.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_assembly.png.mcmeta new file mode 100644 index 000000000..ea9cd1fcf --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_assembly.png.mcmeta @@ -0,0 +1,10 @@ +{ + "animation": { + "interpolate": true, + "frametime": 40, + "frames": [ + { "index": 0, "time": 2 }, + { "index": 1, "time": 38 } + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_mainframe.png b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_mainframe.png new file mode 100644 index 000000000..6a2dfa387 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_mainframe.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_mainframe.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_mainframe.png.mcmeta new file mode 100644 index 000000000..ea9cd1fcf --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_mainframe.png.mcmeta @@ -0,0 +1,10 @@ +{ + "animation": { + "interpolate": true, + "frametime": 40, + "frames": [ + { "index": 0, "time": 2 }, + { "index": 1, "time": 38 } + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_supercomputer.png b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_supercomputer.png new file mode 100644 index 000000000..fb8e548fb Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_supercomputer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_supercomputer.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_supercomputer.png.mcmeta new file mode 100644 index 000000000..ea9cd1fcf --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/lucidic_processor_supercomputer.png.mcmeta @@ -0,0 +1,10 @@ +{ + "animation": { + "interpolate": true, + "frametime": 40, + "frames": [ + { "index": 0, "time": 2 }, + { "index": 1, "time": 38 } + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/lucidity_cpu_mask.png b/src/main/resources/assets/cosmiccore/textures/item/lucidity_cpu_mask.png new file mode 100644 index 000000000..061534e5e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/lucidity_cpu_mask.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/luv_radio_module.png b/src/main/resources/assets/cosmiccore/textures/item/luv_radio_module.png new file mode 100644 index 000000000..839ec6632 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/luv_radio_module.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/luv_wildfire_core.png b/src/main/resources/assets/cosmiccore/textures/item/luv_wildfire_core.png new file mode 100644 index 000000000..c31223ca8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/luv_wildfire_core.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/lv_wildfire_core.png b/src/main/resources/assets/cosmiccore/textures/item/lv_wildfire_core.png new file mode 100644 index 000000000..1ccabe4f0 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/lv_wildfire_core.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor.png b/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor.png deleted file mode 100644 index 8d7398242..000000000 Binary files a/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor.png and /dev/null differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor_assembly.png deleted file mode 100644 index 1cded5828..000000000 Binary files a/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor_assembly.png and /dev/null differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor_mainframe.png b/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor_mainframe.png deleted file mode 100644 index 40ad5f00a..000000000 Binary files a/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor_mainframe.png and /dev/null differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor_mainframe.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor_mainframe.png.mcmeta deleted file mode 100644 index 5628294d2..000000000 --- a/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor_mainframe.png.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "animation": { - "interpolate": true, - "frametime": 6 - } -} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor_supercomputer.png b/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor_supercomputer.png deleted file mode 100644 index d53a6bbce..000000000 Binary files a/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor_supercomputer.png and /dev/null differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor_supercomputer.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor_supercomputer.png.mcmeta deleted file mode 100644 index 5628294d2..000000000 --- a/src/main/resources/assets/cosmiccore/textures/item/macroverse_processor_supercomputer.png.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "animation": { - "interpolate": true, - "frametime": 6 - } -} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/mafic_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/mafic_asteroid.png new file mode 100644 index 000000000..0eaecfc0b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/mafic_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/magenta_dye_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/magenta_dye_spray_can.png new file mode 100644 index 000000000..78fb4696e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/magenta_dye_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/malice_spirit.png b/src/main/resources/assets/cosmiccore/textures/item/malice_spirit.png new file mode 100644 index 000000000..7b5f21847 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/malice_spirit.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/masked_crystal_chiplet_package.png b/src/main/resources/assets/cosmiccore/textures/item/masked_crystal_chiplet_package.png new file mode 100644 index 000000000..9a9695a7a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/masked_crystal_chiplet_package.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/mossy_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/mossy_asteroid.png new file mode 100644 index 000000000..fcd76f90d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/mossy_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/movanon_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/movanon_wafer.png new file mode 100644 index 000000000..16fb5672b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/movanon_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/multilayered_enthel_circuit_board.png b/src/main/resources/assets/cosmiccore/textures/item/multilayered_enthel_circuit_board.png new file mode 100644 index 000000000..40eb11c44 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/multilayered_enthel_circuit_board.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/mv_wildfire_core.png b/src/main/resources/assets/cosmiccore/textures/item/mv_wildfire_core.png new file mode 100644 index 000000000..f19f4dbf8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/mv_wildfire_core.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/mystrix.png b/src/main/resources/assets/cosmiccore/textures/item/mystrix.png new file mode 100644 index 000000000..652d7f38f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/mystrix.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/nano_boots.png b/src/main/resources/assets/cosmiccore/textures/item/nano_boots.png new file mode 100644 index 000000000..35e75ef80 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/nano_boots.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/nano_scythe.png b/src/main/resources/assets/cosmiccore/textures/item/nano_scythe.png new file mode 100644 index 000000000..ad2b29e86 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/nano_scythe.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/neuro_processing_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/neuro_processing_assembly.png new file mode 100644 index 000000000..07bbccb77 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/neuro_processing_assembly.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/null_refined_resonant_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/null_refined_resonant_wafer.png new file mode 100644 index 000000000..04945738d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/null_refined_resonant_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/null_refined_resonant_wafer.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/null_refined_resonant_wafer.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/null_refined_resonant_wafer.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/nullified_harmonics_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/nullified_harmonics_wafer.png new file mode 100644 index 000000000..2f6b154c0 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/nullified_harmonics_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/nullified_harmonics_wafer.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/nullified_harmonics_wafer.png.mcmeta new file mode 100644 index 000000000..0a08b0631 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/nullified_harmonics_wafer.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 25 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/nyxon.png b/src/main/resources/assets/cosmiccore/textures/item/nyxon.png new file mode 100644 index 000000000..61f584672 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/nyxon.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/occult_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/occult_asteroid.png new file mode 100644 index 000000000..29df7a96d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/occult_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit.png new file mode 100644 index 000000000..98d9c6570 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_ev.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_ev.png new file mode 100644 index 000000000..b4c27cd27 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_ev.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_ev.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_ev.png.mcmeta new file mode 100644 index 000000000..abd4bf08c --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_ev.png.mcmeta @@ -0,0 +1,16 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1, + "frames": [ + 0, + 1, + 2, + { "index": 3, "time": 2 }, + { "index": 4, "time": 2 }, + { "index": 5, "time": 3 }, + { "index": 6, "time": 7 }, + 6 + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_hv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_hv.png new file mode 100644 index 000000000..634f18be1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_hv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_hv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_hv.png.mcmeta new file mode 100644 index 000000000..c4f1b30ec --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_hv.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 8 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_iv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_iv.png new file mode 100644 index 000000000..8f652dd41 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_iv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_iv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_iv.png.mcmeta new file mode 100644 index 000000000..8a6e059cf --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_iv.png.mcmeta @@ -0,0 +1,9 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2, + "frames": [ + 0, 1, 2, 3, 4, 3, 2, 1 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_luv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_luv.png new file mode 100644 index 000000000..b23f43dfc Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_luv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_luv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_luv.png.mcmeta new file mode 100644 index 000000000..0866333e6 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_luv.png.mcmeta @@ -0,0 +1,14 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2, + "frames": [ + { "index": 0, "time": 9 }, + 0, + 1, + 2, + 3, + 4 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_lv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_lv.png new file mode 100644 index 000000000..ecff3ad23 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_lv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_lv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_lv.png.mcmeta new file mode 100644 index 000000000..ba6e9aa61 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_lv.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 16 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_mv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_mv.png new file mode 100644 index 000000000..7f2a268ec Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_mv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_mv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_mv.png.mcmeta new file mode 100644 index 000000000..006df43d9 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_mv.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 12 + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_opv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_opv.png new file mode 100644 index 000000000..bad2db74a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_opv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_opv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_opv.png.mcmeta new file mode 100644 index 000000000..fda8ba7d6 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_opv.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 6 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uev.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uev.png new file mode 100644 index 000000000..1e7bfc487 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uev.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uev.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uev.png.mcmeta new file mode 100644 index 000000000..232d8cf26 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uev.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 3 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uhv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uhv.png new file mode 100644 index 000000000..19ce1c57f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uhv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uhv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uhv.png.mcmeta new file mode 100644 index 000000000..fb20356f7 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uhv.png.mcmeta @@ -0,0 +1,37 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2, + "frames": [ + { "index": 1, "time": 40 }, + 0, + 2, + { "index": 4, "time": 60 }, + 6, + 7, + 6, + 2, + { "index": 3, "time": 50 }, + 0, + { "index": 5, "time": 30 }, + 6, + 7, + 6, + { "index": 1, "time": 40 }, + 0, + 2, + { "index": 4, "time": 60 }, + 6, + 7, + 6, + 2, + { "index": 3, "time": 50 }, + 0, + { "index": 5, "time": 30 }, + { "index": 0, "time": 120 }, + 6, + 7, + 6 + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uiv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uiv.png new file mode 100644 index 000000000..7ceec5565 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uiv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uiv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uiv.png.mcmeta new file mode 100644 index 000000000..f07dc8e17 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uiv.png.mcmeta @@ -0,0 +1,16 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1, + "frames": [ + { "index": 0, "time": 2 }, + { "index": 1, "time": 3 }, + { "index": 2, "time": 2 }, + { "index": 3, "time": 3 }, + { "index": 4, "time": 2 }, + { "index": 5, "time": 3 }, + { "index": 6, "time": 2 }, + { "index": 7, "time": 3 } + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uv.png new file mode 100644 index 000000000..a597b9bf7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uv.png.mcmeta new file mode 100644 index 000000000..1321b296e --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uv.png.mcmeta @@ -0,0 +1,9 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2, + "frames": [ + 0, 1, 2, 3, 4, 5, 6, 7 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uxv.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uxv.png new file mode 100644 index 000000000..c49d6fa9c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uxv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uxv.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uxv.png.mcmeta new file mode 100644 index 000000000..151deedaf --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_uxv.png.mcmeta @@ -0,0 +1,9 @@ +{ + "animation": { + "interpolate": true, + "frametime": 3, + "frames": [ + 0,1,2,3,4,5,6,7,8,9,10,11,11,11 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_zpm.png b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_zpm.png new file mode 100644 index 000000000..9958c5b33 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_zpm.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_zpm.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_zpm.png.mcmeta new file mode 100644 index 000000000..e87e67b18 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/omnia_circuit_zpm.png.mcmeta @@ -0,0 +1,16 @@ +{ + "animation": { + "interpolate": true, + "frametime": 3, + "frames": [ + { "index": 0, "time": 9 }, + 0, + 1, + 2, + 3, + 4, + 5, + 6 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/oneiric_signet_t1.png b/src/main/resources/assets/cosmiccore/textures/item/oneiric_signet_t1.png new file mode 100644 index 000000000..b164d7deb Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/oneiric_signet_t1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/oneiric_signet_t2.png b/src/main/resources/assets/cosmiccore/textures/item/oneiric_signet_t2.png new file mode 100644 index 000000000..749ceb54b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/oneiric_signet_t2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/oneiric_signet_t3.png b/src/main/resources/assets/cosmiccore/textures/item/oneiric_signet_t3.png new file mode 100644 index 000000000..57a716138 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/oneiric_signet_t3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/oneiric_signet_t4.png b/src/main/resources/assets/cosmiccore/textures/item/oneiric_signet_t4.png new file mode 100644 index 000000000..ec249a82f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/oneiric_signet_t4.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/oneiric_signet_t5.png b/src/main/resources/assets/cosmiccore/textures/item/oneiric_signet_t5.png new file mode 100644 index 000000000..c0904d46a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/oneiric_signet_t5.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/optical_processing_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/optical_processing_assembly.png new file mode 100644 index 000000000..8d7acc283 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/optical_processing_assembly.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/optical_processor.png b/src/main/resources/assets/cosmiccore/textures/item/optical_processor.png index 2656b9057..47d33fa20 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/optical_processor.png and b/src/main/resources/assets/cosmiccore/textures/item/optical_processor.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/optical_processor_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/optical_processor_assembly.png index ba9fb5b79..9f14c0a6e 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/optical_processor_assembly.png and b/src/main/resources/assets/cosmiccore/textures/item/optical_processor_assembly.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/optical_processor_mainframe.png b/src/main/resources/assets/cosmiccore/textures/item/optical_processor_mainframe.png index b11989ac5..a59e6bebe 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/optical_processor_mainframe.png and b/src/main/resources/assets/cosmiccore/textures/item/optical_processor_mainframe.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/optical_processor_mainframe.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/optical_processor_mainframe.png.mcmeta index e0e053573..9f2405098 100644 --- a/src/main/resources/assets/cosmiccore/textures/item/optical_processor_mainframe.png.mcmeta +++ b/src/main/resources/assets/cosmiccore/textures/item/optical_processor_mainframe.png.mcmeta @@ -1,9 +1,16 @@ { "animation": { "interpolate": true, - "frametime": 3, + "frametime": 1, "frames": [ - 0,1,2,3,4,5,6,7,8,9,10,11,11,11 + { "index": 0, "time": 2 }, + { "index": 1, "time": 3 }, + { "index": 2, "time": 2 }, + { "index": 3, "time": 3 }, + { "index": 4, "time": 2 }, + { "index": 5, "time": 3 }, + { "index": 6, "time": 2 }, + { "index": 7, "time": 3 } ] } } \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/optical_processor_supercomputer.png b/src/main/resources/assets/cosmiccore/textures/item/optical_processor_supercomputer.png index 6c581edda..802a82464 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/optical_processor_supercomputer.png and b/src/main/resources/assets/cosmiccore/textures/item/optical_processor_supercomputer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/optically_refined_circuit_board.png b/src/main/resources/assets/cosmiccore/textures/item/optically_refined_circuit_board.png new file mode 100644 index 000000000..89439f0e2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/optically_refined_circuit_board.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/optically_refined_printed_circuit_board.png b/src/main/resources/assets/cosmiccore/textures/item/optically_refined_printed_circuit_board.png new file mode 100644 index 000000000..e03d00f67 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/optically_refined_printed_circuit_board.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/opv_gyroscope.png b/src/main/resources/assets/cosmiccore/textures/item/opv_gyroscope.png new file mode 100644 index 000000000..1f3ba6d72 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/opv_gyroscope.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/opv_powercell.png b/src/main/resources/assets/cosmiccore/textures/item/opv_powercell.png new file mode 100644 index 000000000..d9c048f36 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/opv_powercell.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/opv_radio_module.png b/src/main/resources/assets/cosmiccore/textures/item/opv_radio_module.png new file mode 100644 index 000000000..1a997e202 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/opv_radio_module.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/opv_thruster.png b/src/main/resources/assets/cosmiccore/textures/item/opv_thruster.png new file mode 100644 index 000000000..45a1fcab7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/opv_thruster.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/orange_dye_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/orange_dye_spray_can.png new file mode 100644 index 000000000..306b4cdb1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/orange_dye_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/overloaded_pearls.png b/src/main/resources/assets/cosmiccore/textures/item/overloaded_pearls.png index 684b26513..f3caa6034 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/overloaded_pearls.png and b/src/main/resources/assets/cosmiccore/textures/item/overloaded_pearls.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/oxide_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/oxide_asteroid.png new file mode 100644 index 000000000..4b9d90ea2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/oxide_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pale_mote.png b/src/main/resources/assets/cosmiccore/textures/item/pale_mote.png new file mode 100644 index 000000000..25ffa6a03 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pale_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pale_saw.png b/src/main/resources/assets/cosmiccore/textures/item/pale_saw.png new file mode 100644 index 000000000..b65b665d3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pale_saw.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pale_scrap.png b/src/main/resources/assets/cosmiccore/textures/item/pale_scrap.png new file mode 100644 index 000000000..067a89727 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pale_scrap.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/para_mod_1.png b/src/main/resources/assets/cosmiccore/textures/item/para_mod_1.png new file mode 100644 index 000000000..8fb57a137 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/para_mod_1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/para_mod_2.png b/src/main/resources/assets/cosmiccore/textures/item/para_mod_2.png new file mode 100644 index 000000000..25aee3f49 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/para_mod_2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/para_mod_3.png b/src/main/resources/assets/cosmiccore/textures/item/para_mod_3.png new file mode 100644 index 000000000..16ec7cf2c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/para_mod_3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/para_mod_4.png b/src/main/resources/assets/cosmiccore/textures/item/para_mod_4.png new file mode 100644 index 000000000..b21b7c014 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/para_mod_4.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/persona_core_assisted_circuit_board.png b/src/main/resources/assets/cosmiccore/textures/item/persona_core_assisted_circuit_board.png new file mode 100644 index 000000000..89df1424e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/persona_core_assisted_circuit_board.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/persona_core_assisted_printed_circuit_board.png b/src/main/resources/assets/cosmiccore/textures/item/persona_core_assisted_printed_circuit_board.png new file mode 100644 index 000000000..76a232d9f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/persona_core_assisted_printed_circuit_board.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/phantnon.png b/src/main/resources/assets/cosmiccore/textures/item/phantnon.png new file mode 100644 index 000000000..560a5b3b3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/phantnon.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pink_dye_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/pink_dye_spray_can.png new file mode 100644 index 000000000..2593ad75f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pink_dye_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/plasmatic_drone.png b/src/main/resources/assets/cosmiccore/textures/item/plasmatic_drone.png new file mode 100644 index 000000000..3fb9ff8d7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/plasmatic_drone.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/plasmatic_drone.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/plasmatic_drone.png.mcmeta new file mode 100644 index 000000000..b2e2153a4 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/plasmatic_drone.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 4 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/plastic_circuit_board.png b/src/main/resources/assets/cosmiccore/textures/item/plastic_circuit_board.png new file mode 100644 index 000000000..674824c0e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/plastic_circuit_board.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/portable_gravity_core.png b/src/main/resources/assets/cosmiccore/textures/item/portable_gravity_core.png new file mode 100644 index 000000000..fb5df4a51 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/portable_gravity_core.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/potency_chip.png b/src/main/resources/assets/cosmiccore/textures/item/potency_chip.png new file mode 100644 index 000000000..136207b03 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/potency_chip.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/prepared_lucid_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/prepared_lucid_wafer.png new file mode 100644 index 000000000..481b64e1f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/prepared_lucid_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/prepared_petri_dish.png b/src/main/resources/assets/cosmiccore/textures/item/prepared_petri_dish.png new file mode 100644 index 000000000..35635483c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/prepared_petri_dish.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pressurized_rebreather.png b/src/main/resources/assets/cosmiccore/textures/item/pressurized_rebreather.png new file mode 100644 index 000000000..be1c7b687 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pressurized_rebreather.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/prideful_spirit.png b/src/main/resources/assets/cosmiccore/textures/item/prideful_spirit.png new file mode 100644 index 000000000..7b5f21847 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/prideful_spirit.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/prod_mod_1.png b/src/main/resources/assets/cosmiccore/textures/item/prod_mod_1.png new file mode 100644 index 000000000..32a9f7099 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/prod_mod_1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/prod_mod_2.png b/src/main/resources/assets/cosmiccore/textures/item/prod_mod_2.png new file mode 100644 index 000000000..6c35452aa Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/prod_mod_2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/prod_mod_3.png b/src/main/resources/assets/cosmiccore/textures/item/prod_mod_3.png new file mode 100644 index 000000000..d3fde595f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/prod_mod_3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/prod_mod_4.png b/src/main/resources/assets/cosmiccore/textures/item/prod_mod_4.png new file mode 100644 index 000000000..e180baaff Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/prod_mod_4.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/programmable_mote.png b/src/main/resources/assets/cosmiccore/textures/item/programmable_mote.png new file mode 100644 index 000000000..47a490c39 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/programmable_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/programmable_mote.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/programmable_mote.png.mcmeta new file mode 100644 index 000000000..75a213b2e --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/programmable_mote.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/protocyte_mod.png b/src/main/resources/assets/cosmiccore/textures/item/protocyte_mod.png new file mode 100644 index 000000000..2f0b53ca3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/protocyte_mod.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/psionic_processor.png b/src/main/resources/assets/cosmiccore/textures/item/psionic_processor.png deleted file mode 100644 index 88251fc7b..000000000 Binary files a/src/main/resources/assets/cosmiccore/textures/item/psionic_processor.png and /dev/null differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/psionic_processor_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/psionic_processor_assembly.png deleted file mode 100644 index 29cec6497..000000000 Binary files a/src/main/resources/assets/cosmiccore/textures/item/psionic_processor_assembly.png and /dev/null differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/psionic_processor_mainframe.png b/src/main/resources/assets/cosmiccore/textures/item/psionic_processor_mainframe.png deleted file mode 100644 index 7ed3ca56f..000000000 Binary files a/src/main/resources/assets/cosmiccore/textures/item/psionic_processor_mainframe.png and /dev/null differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/psionic_processor_mainframe.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/psionic_processor_mainframe.png.mcmeta deleted file mode 100644 index 5628294d2..000000000 --- a/src/main/resources/assets/cosmiccore/textures/item/psionic_processor_mainframe.png.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "animation": { - "interpolate": true, - "frametime": 6 - } -} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/psionic_processor_supercomputer.png b/src/main/resources/assets/cosmiccore/textures/item/psionic_processor_supercomputer.png deleted file mode 100644 index 47a0aacf8..000000000 Binary files a/src/main/resources/assets/cosmiccore/textures/item/psionic_processor_supercomputer.png and /dev/null differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_1.png b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_1.png new file mode 100644 index 000000000..f0d993244 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_2.png b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_2.png new file mode 100644 index 000000000..089381631 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_3.png b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_3.png new file mode 100644 index 000000000..145a213ad Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_4.png b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_4.png new file mode 100644 index 000000000..b0bf4ae1d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_4.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_5.png b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_5.png new file mode 100644 index 000000000..75122e976 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pulverizing_beetle_grade_5.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/purple_dye_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/purple_dye_spray_can.png new file mode 100644 index 000000000..5aaceff38 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/purple_dye_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pyretic_ichor.png b/src/main/resources/assets/cosmiccore/textures/item/pyretic_ichor.png new file mode 100644 index 000000000..9dbc6600d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pyretic_ichor.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/pyrith.png b/src/main/resources/assets/cosmiccore/textures/item/pyrith.png new file mode 100644 index 000000000..a82814e98 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/pyrith.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/quantum_scythe.png b/src/main/resources/assets/cosmiccore/textures/item/quantum_scythe.png new file mode 100644 index 000000000..51d360ce2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/quantum_scythe.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/quark_boots.png b/src/main/resources/assets/cosmiccore/textures/item/quark_boots.png new file mode 100644 index 000000000..7c5b6ad27 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/quark_boots.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/radiant_mote.png b/src/main/resources/assets/cosmiccore/textures/item/radiant_mote.png new file mode 100644 index 000000000..ea9f6058d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/radiant_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/rare_metals_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/rare_metals_asteroid.png new file mode 100644 index 000000000..c3b5d6c72 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/rare_metals_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/raymarching_dandilifeon.png b/src/main/resources/assets/cosmiccore/textures/item/raymarching_dandilifeon.png new file mode 100644 index 000000000..dd692279f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/raymarching_dandilifeon.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_1.png b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_1.png new file mode 100644 index 000000000..2497216fa Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_1.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_2.png b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_2.png new file mode 100644 index 000000000..7c90f25e0 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_2.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_3.png b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_3.png new file mode 100644 index 000000000..07c3a4267 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_3.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_4.png b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_4.png new file mode 100644 index 000000000..1aa1d8c91 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_4.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_5.png b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_5.png new file mode 100644 index 000000000..1d2c567cf Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/razor_hornet_grade_5.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/record_keeping_processor_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/record_keeping_processor_assembly.png new file mode 100644 index 000000000..f81ec64ad Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/record_keeping_processor_assembly.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/record_kept_circuit_board.png b/src/main/resources/assets/cosmiccore/textures/item/record_kept_circuit_board.png new file mode 100644 index 000000000..eb65adeb8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/record_kept_circuit_board.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/record_kept_printed_circuit_board.png b/src/main/resources/assets/cosmiccore/textures/item/record_kept_printed_circuit_board.png new file mode 100644 index 000000000..9e0a30b34 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/record_kept_printed_circuit_board.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/red_dye_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/red_dye_spray_can.png new file mode 100644 index 000000000..93866fde4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/red_dye_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/refined_harmonics_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/refined_harmonics_wafer.png new file mode 100644 index 000000000..58929b52b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/refined_harmonics_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/refined_harmonics_wafer.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/refined_harmonics_wafer.png.mcmeta new file mode 100644 index 000000000..0a08b0631 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/refined_harmonics_wafer.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 25 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/refined_resonant_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/refined_resonant_wafer.png new file mode 100644 index 000000000..3678376ac Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/refined_resonant_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/refined_resonant_wafer.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/refined_resonant_wafer.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/refined_resonant_wafer.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/reflection_mirror.png b/src/main/resources/assets/cosmiccore/textures/item/reflection_mirror.png new file mode 100644 index 000000000..f66098920 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/reflection_mirror.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/resipiratory_sculk_hemocytoblast.png b/src/main/resources/assets/cosmiccore/textures/item/resipiratory_sculk_hemocytoblast.png new file mode 100644 index 000000000..c88b1b1bb Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/resipiratory_sculk_hemocytoblast.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/resonant_mod.png b/src/main/resources/assets/cosmiccore/textures/item/resonant_mod.png new file mode 100644 index 000000000..b28766956 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/resonant_mod.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/robust_drone.png b/src/main/resources/assets/cosmiccore/textures/item/robust_drone.png new file mode 100644 index 000000000..f23ba0703 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/robust_drone.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/rune_conjunction_arklythar.png b/src/main/resources/assets/cosmiccore/textures/item/rune_conjunction_arklythar.png new file mode 100644 index 000000000..92df5133c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/rune_conjunction_arklythar.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/rune_conjunction_kholys.png b/src/main/resources/assets/cosmiccore/textures/item/rune_conjunction_kholys.png new file mode 100644 index 000000000..353e9ad15 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/rune_conjunction_kholys.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/rune_conjunction_valkruth.png b/src/main/resources/assets/cosmiccore/textures/item/rune_conjunction_valkruth.png new file mode 100644 index 000000000..4dd14a8bb Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/rune_conjunction_valkruth.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/rune_slate_arklys.png b/src/main/resources/assets/cosmiccore/textures/item/rune_slate_arklys.png new file mode 100644 index 000000000..a514eca56 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/rune_slate_arklys.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/rune_slate_khoruth.png b/src/main/resources/assets/cosmiccore/textures/item/rune_slate_khoruth.png new file mode 100644 index 000000000..98c174d27 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/rune_slate_khoruth.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/rune_slate_tenura.png b/src/main/resources/assets/cosmiccore/textures/item/rune_slate_tenura.png new file mode 100644 index 000000000..1e1d47b20 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/rune_slate_tenura.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/rune_slate_tylomir.png b/src/main/resources/assets/cosmiccore/textures/item/rune_slate_tylomir.png new file mode 100644 index 000000000..9beb67b8b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/rune_slate_tylomir.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/rune_slate_valdris.png b/src/main/resources/assets/cosmiccore/textures/item/rune_slate_valdris.png new file mode 100644 index 000000000..36731f890 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/rune_slate_valdris.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/rune_slate_zelothar.png b/src/main/resources/assets/cosmiccore/textures/item/rune_slate_zelothar.png new file mode 100644 index 000000000..198bed4e2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/rune_slate_zelothar.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/runewoven_plastic_circuit_board.png b/src/main/resources/assets/cosmiccore/textures/item/runewoven_plastic_circuit_board.png new file mode 100644 index 000000000..8c04c1449 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/runewoven_plastic_circuit_board.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/runic_hex_cpu.png b/src/main/resources/assets/cosmiccore/textures/item/runic_hex_cpu.png new file mode 100644 index 000000000..4f72d1665 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/runic_hex_cpu.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/runic_hex_cpu_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/runic_hex_cpu_wafer.png new file mode 100644 index 000000000..bb2cd65ad Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/runic_hex_cpu_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/rusty_drone.png b/src/main/resources/assets/cosmiccore/textures/item/rusty_drone.png new file mode 100644 index 000000000..e0180c625 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/rusty_drone.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/sanguine_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/sanguine_asteroid.png new file mode 100644 index 000000000..edacbe4e7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/sanguine_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/sanguine_boots.png b/src/main/resources/assets/cosmiccore/textures/item/sanguine_boots.png new file mode 100644 index 000000000..e6db71437 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/sanguine_boots.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/sanguine_drone.png b/src/main/resources/assets/cosmiccore/textures/item/sanguine_drone.png new file mode 100644 index 000000000..d27342e9d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/sanguine_drone.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/sanguine_scythe.png b/src/main/resources/assets/cosmiccore/textures/item/sanguine_scythe.png new file mode 100644 index 000000000..10240dd26 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/sanguine_scythe.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/sanguine_scythe.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/sanguine_scythe.png.mcmeta new file mode 100644 index 000000000..f5a5fd7c2 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/sanguine_scythe.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/sanguine_warptech_boots.png b/src/main/resources/assets/cosmiccore/textures/item/sanguine_warptech_boots.png new file mode 100644 index 000000000..ee59312c2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/sanguine_warptech_boots.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/sanguine_warptech_chestplate.png b/src/main/resources/assets/cosmiccore/textures/item/sanguine_warptech_chestplate.png new file mode 100644 index 000000000..6ce261a4e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/sanguine_warptech_chestplate.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/sanguine_warptech_helmet.png b/src/main/resources/assets/cosmiccore/textures/item/sanguine_warptech_helmet.png new file mode 100644 index 000000000..89390ccc0 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/sanguine_warptech_helmet.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/sanguine_warptech_leggings.png b/src/main/resources/assets/cosmiccore/textures/item/sanguine_warptech_leggings.png new file mode 100644 index 000000000..5f551997a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/sanguine_warptech_leggings.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/saturated_sculk_hemocytoblast.png b/src/main/resources/assets/cosmiccore/textures/item/saturated_sculk_hemocytoblast.png new file mode 100644 index 000000000..96f72a43d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/saturated_sculk_hemocytoblast.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/sculk_fibroblast.png b/src/main/resources/assets/cosmiccore/textures/item/sculk_fibroblast.png new file mode 100644 index 000000000..bd5c79bb5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/sculk_fibroblast.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/sculk_myofibroblast.png b/src/main/resources/assets/cosmiccore/textures/item/sculk_myofibroblast.png new file mode 100644 index 000000000..1e79a98cd Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/sculk_myofibroblast.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/self_aware_processing_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/self_aware_processing_assembly.png new file mode 100644 index 000000000..dca327aec Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/self_aware_processing_assembly.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/seraphon.png b/src/main/resources/assets/cosmiccore/textures/item/seraphon.png new file mode 100644 index 000000000..8a8842291 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/seraphon.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/shard_of_perpetuity.png b/src/main/resources/assets/cosmiccore/textures/item/shard_of_perpetuity.png new file mode 100644 index 000000000..ac2744357 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/shard_of_perpetuity.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/shard_of_perpetuity.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/shard_of_perpetuity.png.mcmeta new file mode 100644 index 000000000..b4e1b3cd7 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/shard_of_perpetuity.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/silver_dye_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/silver_dye_spray_can.png new file mode 100644 index 000000000..bc2788a15 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/silver_dye_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/simple_rebreather.png b/src/main/resources/assets/cosmiccore/textures/item/simple_rebreather.png new file mode 100644 index 000000000..929f21035 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/simple_rebreather.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/solvent_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/solvent_spray_can.png new file mode 100644 index 000000000..0714b3a3a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/solvent_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/somatic_processing_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/somatic_processing_assembly.png new file mode 100644 index 000000000..9e3049d21 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/somatic_processing_assembly.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/somnolent_dew.png b/src/main/resources/assets/cosmiccore/textures/item/somnolent_dew.png new file mode 100644 index 000000000..7343b4b04 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/somnolent_dew.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/sonic_processor_mainframe.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/sonic_processor_mainframe.png.mcmeta deleted file mode 100644 index e0e053573..000000000 --- a/src/main/resources/assets/cosmiccore/textures/item/sonic_processor_mainframe.png.mcmeta +++ /dev/null @@ -1,9 +0,0 @@ -{ - "animation": { - "interpolate": true, - "frametime": 3, - "frames": [ - 0,1,2,3,4,5,6,7,8,9,10,11,11,11 - ] - } -} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/soul_cut_lucid_cpu_chip.png b/src/main/resources/assets/cosmiccore/textures/item/soul_cut_lucid_cpu_chip.png new file mode 100644 index 000000000..4632e6b27 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/soul_cut_lucid_cpu_chip.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/soul_mutilator.png b/src/main/resources/assets/cosmiccore/textures/item/soul_mutilator.png new file mode 100644 index 000000000..ad2b29e86 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/soul_mutilator.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/soul_reader.png b/src/main/resources/assets/cosmiccore/textures/item/soul_reader.png new file mode 100644 index 000000000..b900d2016 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/soul_reader.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/sov_blood_orb.png b/src/main/resources/assets/cosmiccore/textures/item/sov_blood_orb.png new file mode 100644 index 000000000..58d7df14d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/sov_blood_orb.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/space_advanced_nanomuscle_chestplate.png b/src/main/resources/assets/cosmiccore/textures/item/space_advanced_nanomuscle_chestplate.png index 102e810e1..56dc72185 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/space_advanced_nanomuscle_chestplate.png and b/src/main/resources/assets/cosmiccore/textures/item/space_advanced_nanomuscle_chestplate.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/space_advanced_quarktech_chestplate.png b/src/main/resources/assets/cosmiccore/textures/item/space_advanced_quarktech_chestplate.png index 87b22413f..1fd0513ab 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/space_advanced_quarktech_chestplate.png and b/src/main/resources/assets/cosmiccore/textures/item/space_advanced_quarktech_chestplate.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/space_nanomuscle_chestplate.png b/src/main/resources/assets/cosmiccore/textures/item/space_nanomuscle_chestplate.png index b3dba3de1..5c74aecd0 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/space_nanomuscle_chestplate.png and b/src/main/resources/assets/cosmiccore/textures/item/space_nanomuscle_chestplate.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/space_quarktech_chestplate.png b/src/main/resources/assets/cosmiccore/textures/item/space_quarktech_chestplate.png index fb17a86f4..1b1836acd 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/space_quarktech_chestplate.png and b/src/main/resources/assets/cosmiccore/textures/item/space_quarktech_chestplate.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/space_radio.png b/src/main/resources/assets/cosmiccore/textures/item/space_radio.png new file mode 100644 index 000000000..2edb56a28 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/space_radio.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/spectil.png b/src/main/resources/assets/cosmiccore/textures/item/spectil.png new file mode 100644 index 000000000..d7b2057fb Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/spectil.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_neptunium_fuel.png b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_neptunium_fuel.png new file mode 100644 index 000000000..5c8216a25 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_neptunium_fuel.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_neptunium_fuel.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_neptunium_fuel.png.mcmeta new file mode 100644 index 000000000..e9aa92246 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_neptunium_fuel.png.mcmeta @@ -0,0 +1,15 @@ +{ + "animation": { + "frametime": 1, + "frames": [ + { "index": 0, "time": 10}, + { "index": 1, "time": 2}, + { "index": 2, "time": 10}, + { "index": 3, "time": 2}, + { "index": 4, "time": 10}, + { "index": 5, "time": 2}, + { "index": 6, "time": 10}, + { "index": 7, "time": 2} + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_plutonium_fuel.png b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_plutonium_fuel.png new file mode 100644 index 000000000..fe6e1c2eb Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_plutonium_fuel.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_plutonium_fuel.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_plutonium_fuel.png.mcmeta new file mode 100644 index 000000000..e9aa92246 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_plutonium_fuel.png.mcmeta @@ -0,0 +1,15 @@ +{ + "animation": { + "frametime": 1, + "frames": [ + { "index": 0, "time": 10}, + { "index": 1, "time": 2}, + { "index": 2, "time": 10}, + { "index": 3, "time": 2}, + { "index": 4, "time": 10}, + { "index": 5, "time": 2}, + { "index": 6, "time": 10}, + { "index": 7, "time": 2} + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_uranium_fuel.png b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_uranium_fuel.png new file mode 100644 index 000000000..abebd2dd5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_uranium_fuel.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_uranium_fuel.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_uranium_fuel.png.mcmeta new file mode 100644 index 000000000..e9aa92246 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/spent_flesh_packed_uranium_fuel.png.mcmeta @@ -0,0 +1,15 @@ +{ + "animation": { + "frametime": 1, + "frames": [ + { "index": 0, "time": 10}, + { "index": 1, "time": 2}, + { "index": 2, "time": 10}, + { "index": 3, "time": 2}, + { "index": 4, "time": 10}, + { "index": 5, "time": 2}, + { "index": 6, "time": 10}, + { "index": 7, "time": 2} + ] + } +} diff --git a/src/main/resources/assets/cosmiccore/textures/item/spirit_engraved_enthel_circuit_board.png b/src/main/resources/assets/cosmiccore/textures/item/spirit_engraved_enthel_circuit_board.png new file mode 100644 index 000000000..68ff30535 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/spirit_engraved_enthel_circuit_board.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/spirit_runed_enthel_cpu.png b/src/main/resources/assets/cosmiccore/textures/item/spirit_runed_enthel_cpu.png new file mode 100644 index 000000000..42c1bfd4b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/spirit_runed_enthel_cpu.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/spirit_runed_enthel_cpu_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/spirit_runed_enthel_cpu_wafer.png new file mode 100644 index 000000000..b9449ff6a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/spirit_runed_enthel_cpu_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/stasis_brine.png b/src/main/resources/assets/cosmiccore/textures/item/stasis_brine.png new file mode 100644 index 000000000..f6530434c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/stasis_brine.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/steel_supply_tank.png b/src/main/resources/assets/cosmiccore/textures/item/steel_supply_tank.png new file mode 100644 index 000000000..f3c8e7913 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/steel_supply_tank.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/streptococcus_pyogenes.png b/src/main/resources/assets/cosmiccore/textures/item/streptococcus_pyogenes.png new file mode 100644 index 000000000..5625ca558 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/streptococcus_pyogenes.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/streptococcus_pyogenes_culture.png b/src/main/resources/assets/cosmiccore/textures/item/streptococcus_pyogenes_culture.png new file mode 100644 index 000000000..90db308f5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/streptococcus_pyogenes_culture.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/suelescent_processor.png b/src/main/resources/assets/cosmiccore/textures/item/suelescent_processor.png new file mode 100644 index 000000000..a917cb301 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/suelescent_processor.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/suelescent_processor_assembly.png b/src/main/resources/assets/cosmiccore/textures/item/suelescent_processor_assembly.png new file mode 100644 index 000000000..7345982d8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/suelescent_processor_assembly.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/suelescent_processor_mainframe.png b/src/main/resources/assets/cosmiccore/textures/item/suelescent_processor_mainframe.png new file mode 100644 index 000000000..2f9290f19 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/suelescent_processor_mainframe.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/cosmic_processor_mainframe.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/suelescent_processor_mainframe.png.mcmeta similarity index 100% rename from src/main/resources/assets/cosmiccore/textures/item/cosmic_processor_mainframe.png.mcmeta rename to src/main/resources/assets/cosmiccore/textures/item/suelescent_processor_mainframe.png.mcmeta diff --git a/src/main/resources/assets/cosmiccore/textures/item/suelescent_processor_supercomputer.png b/src/main/resources/assets/cosmiccore/textures/item/suelescent_processor_supercomputer.png new file mode 100644 index 000000000..f531ab140 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/suelescent_processor_supercomputer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/superheated_fuel_rod.png b/src/main/resources/assets/cosmiccore/textures/item/superheated_fuel_rod.png new file mode 100644 index 000000000..1a279306c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/superheated_fuel_rod.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/targeting_chip.png b/src/main/resources/assets/cosmiccore/textures/item/targeting_chip.png new file mode 100644 index 000000000..f77310e65 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/targeting_chip.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tau_fruit.png b/src/main/resources/assets/cosmiccore/textures/item/tau_fruit.png new file mode 100644 index 000000000..7b15150b4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tau_fruit.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tau_oil.png b/src/main/resources/assets/cosmiccore/textures/item/tau_oil.png new file mode 100644 index 000000000..09897e33d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tau_oil.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/temporal_reinforced_lucid_circuit_board.png b/src/main/resources/assets/cosmiccore/textures/item/temporal_reinforced_lucid_circuit_board.png new file mode 100644 index 000000000..0bdef6c9b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/temporal_reinforced_lucid_circuit_board.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/temporal_reinforced_lucid_printed_circuit_board.png b/src/main/resources/assets/cosmiccore/textures/item/temporal_reinforced_lucid_printed_circuit_board.png new file mode 100644 index 000000000..9cc41d442 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/temporal_reinforced_lucid_printed_circuit_board.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/temporal_stable_thundering_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/temporal_stable_thundering_wafer.png new file mode 100644 index 000000000..b0bf1f515 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/temporal_stable_thundering_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tenaebrum.png b/src/main/resources/assets/cosmiccore/textures/item/tenaebrum.png new file mode 100644 index 000000000..c7d80a019 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tenaebrum.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/terminal/linked_terminal.png b/src/main/resources/assets/cosmiccore/textures/item/terminal/linked_terminal.png new file mode 100644 index 000000000..00cf8ff62 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/terminal/linked_terminal.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/terminal/linked_terminal.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/terminal/linked_terminal.png.mcmeta new file mode 100644 index 000000000..034019ff9 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/terminal/linked_terminal.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 3 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/terminal/terminal_overlay.png b/src/main/resources/assets/cosmiccore/textures/item/terminal/terminal_overlay.png new file mode 100644 index 000000000..78de130b0 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/terminal/terminal_overlay.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/terminal/terminal_overlay.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/terminal/terminal_overlay.png.mcmeta new file mode 100644 index 000000000..6cc687f6b --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/terminal/terminal_overlay.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 5 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/tessaron.png b/src/main/resources/assets/cosmiccore/textures/item/tessaron.png new file mode 100644 index 000000000..cf5e3d0e0 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tessaron.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tethering_resin.png b/src/main/resources/assets/cosmiccore/textures/item/tethering_resin.png new file mode 100644 index 000000000..302735572 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tethering_resin.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/thaumica_wafer.png b/src/main/resources/assets/cosmiccore/textures/item/thaumica_wafer.png new file mode 100644 index 000000000..ee2a17e31 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/thaumica_wafer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/the_one_ring.png b/src/main/resources/assets/cosmiccore/textures/item/the_one_ring.png new file mode 100644 index 000000000..2bd4d7cda Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/the_one_ring.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/thermal_chain_agent.png b/src/main/resources/assets/cosmiccore/textures/item/thermal_chain_agent.png new file mode 100644 index 000000000..7ebb684a3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/thermal_chain_agent.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/transcendent_mote.png b/src/main/resources/assets/cosmiccore/textures/item/transcendent_mote.png new file mode 100644 index 000000000..8e0288206 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/transcendent_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/trinavine_nanolattice_spool.png b/src/main/resources/assets/cosmiccore/textures/item/trinavine_nanolattice_spool.png new file mode 100644 index 000000000..d14584a59 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/trinavine_nanolattice_spool.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/tungstensteel_nanolattice_spool.png b/src/main/resources/assets/cosmiccore/textures/item/tungstensteel_nanolattice_spool.png new file mode 100644 index 000000000..a4d0f6489 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/tungstensteel_nanolattice_spool.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uev_gyroscope.png b/src/main/resources/assets/cosmiccore/textures/item/uev_gyroscope.png new file mode 100644 index 000000000..0f1fba8d1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uev_gyroscope.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uev_powercell.png b/src/main/resources/assets/cosmiccore/textures/item/uev_powercell.png new file mode 100644 index 000000000..f063ea104 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uev_powercell.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uev_radio_module.png b/src/main/resources/assets/cosmiccore/textures/item/uev_radio_module.png new file mode 100644 index 000000000..0e28d6d80 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uev_radio_module.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uev_thruster.png b/src/main/resources/assets/cosmiccore/textures/item/uev_thruster.png new file mode 100644 index 000000000..67d37d3b5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uev_thruster.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uhv_gyroscope.png b/src/main/resources/assets/cosmiccore/textures/item/uhv_gyroscope.png new file mode 100644 index 000000000..baec47044 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uhv_gyroscope.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uhv_powercell.png b/src/main/resources/assets/cosmiccore/textures/item/uhv_powercell.png new file mode 100644 index 000000000..6d658587a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uhv_powercell.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uhv_radio_module.png b/src/main/resources/assets/cosmiccore/textures/item/uhv_radio_module.png new file mode 100644 index 000000000..f4b455a75 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uhv_radio_module.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uhv_thruster.png b/src/main/resources/assets/cosmiccore/textures/item/uhv_thruster.png new file mode 100644 index 000000000..b14c14ccb Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uhv_thruster.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uiv_gyroscope.png b/src/main/resources/assets/cosmiccore/textures/item/uiv_gyroscope.png new file mode 100644 index 000000000..56da208a5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uiv_gyroscope.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uiv_powercell.png b/src/main/resources/assets/cosmiccore/textures/item/uiv_powercell.png new file mode 100644 index 000000000..7dd614e2a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uiv_powercell.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uiv_radio_module.png b/src/main/resources/assets/cosmiccore/textures/item/uiv_radio_module.png new file mode 100644 index 000000000..2fe9416f5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uiv_radio_module.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uiv_thruster.png b/src/main/resources/assets/cosmiccore/textures/item/uiv_thruster.png new file mode 100644 index 000000000..2d4871e24 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uiv_thruster.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/ultrasonic_homogenizer.png b/src/main/resources/assets/cosmiccore/textures/item/ultrasonic_homogenizer.png new file mode 100644 index 000000000..b6d08e46c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/ultrasonic_homogenizer.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/unsealed_crystal_cpu.png b/src/main/resources/assets/cosmiccore/textures/item/unsealed_crystal_cpu.png new file mode 100644 index 000000000..1d743341e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/unsealed_crystal_cpu.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uv_gyroscope.png b/src/main/resources/assets/cosmiccore/textures/item/uv_gyroscope.png new file mode 100644 index 000000000..ab41f53f1 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uv_gyroscope.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uv_powercell.png b/src/main/resources/assets/cosmiccore/textures/item/uv_powercell.png new file mode 100644 index 000000000..8b0d1af55 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uv_powercell.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uv_radio_module.png b/src/main/resources/assets/cosmiccore/textures/item/uv_radio_module.png new file mode 100644 index 000000000..3476fcbf9 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uv_radio_module.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uv_thruster.png b/src/main/resources/assets/cosmiccore/textures/item/uv_thruster.png new file mode 100644 index 000000000..5789895fb Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uv_thruster.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uxv_gyroscope.png b/src/main/resources/assets/cosmiccore/textures/item/uxv_gyroscope.png new file mode 100644 index 000000000..e186dde49 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uxv_gyroscope.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uxv_powercell.png b/src/main/resources/assets/cosmiccore/textures/item/uxv_powercell.png new file mode 100644 index 000000000..2bc14597b Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uxv_powercell.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uxv_radio_module.png b/src/main/resources/assets/cosmiccore/textures/item/uxv_radio_module.png new file mode 100644 index 000000000..1ad425fbc Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uxv_radio_module.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/uxv_thruster.png b/src/main/resources/assets/cosmiccore/textures/item/uxv_thruster.png new file mode 100644 index 000000000..6a23fbd74 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/uxv_thruster.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/vein_survey_scanner_hv.png b/src/main/resources/assets/cosmiccore/textures/item/vein_survey_scanner_hv.png new file mode 100644 index 000000000..58af96129 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/vein_survey_scanner_hv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/vein_survey_scanner_lv.png b/src/main/resources/assets/cosmiccore/textures/item/vein_survey_scanner_lv.png new file mode 100644 index 000000000..486d1ac49 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/vein_survey_scanner_lv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/vein_survey_scanner_mv.png b/src/main/resources/assets/cosmiccore/textures/item/vein_survey_scanner_mv.png new file mode 100644 index 000000000..06e11ff5e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/vein_survey_scanner_mv.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/verbosity_chip.png b/src/main/resources/assets/cosmiccore/textures/item/verbosity_chip.png new file mode 100644 index 000000000..3f20cb7b2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/verbosity_chip.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/verdant_anima.png b/src/main/resources/assets/cosmiccore/textures/item/verdant_anima.png new file mode 100644 index 000000000..ec1b8f748 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/verdant_anima.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/vexiun.png b/src/main/resources/assets/cosmiccore/textures/item/vexiun.png new file mode 100644 index 000000000..7f1aeae69 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/vexiun.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/vivid_mote.png b/src/main/resources/assets/cosmiccore/textures/item/vivid_mote.png new file mode 100644 index 000000000..7890deeb8 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/vivid_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/void_blood_orb.png b/src/main/resources/assets/cosmiccore/textures/item/void_blood_orb.png new file mode 100644 index 000000000..78432e84f Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/void_blood_orb.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/void_blood_orb.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/void_blood_orb.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/void_blood_orb.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_boots.png b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_boots.png new file mode 100644 index 000000000..b0f3bbde6 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_boots.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_boots.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_boots.png.mcmeta new file mode 100644 index 000000000..b4e1b3cd7 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_boots.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_chestplate.png b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_chestplate.png new file mode 100644 index 000000000..f66dda0d0 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_chestplate.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_chestplate.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_chestplate.png.mcmeta new file mode 100644 index 000000000..b4e1b3cd7 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_chestplate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_gravplate.png b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_gravplate.png new file mode 100644 index 000000000..e59e253ad Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_gravplate.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_gravplate.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_gravplate.png.mcmeta new file mode 100644 index 000000000..b4e1b3cd7 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_gravplate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_helmet.png b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_helmet.png new file mode 100644 index 000000000..4366b8d24 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_helmet.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_helmet.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_helmet.png.mcmeta new file mode 100644 index 000000000..b4e1b3cd7 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_helmet.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_leggings.png b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_leggings.png new file mode 100644 index 000000000..a049613de Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_leggings.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_leggings.png.mcmeta b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_leggings.png.mcmeta new file mode 100644 index 000000000..b4e1b3cd7 --- /dev/null +++ b/src/main/resources/assets/cosmiccore/textures/item/vomahine_warptech_leggings.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/cosmiccore/textures/item/wafer_pragmiso.png b/src/main/resources/assets/cosmiccore/textures/item/wafer_pragmiso.png new file mode 100644 index 000000000..aa687a6e5 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wafer_pragmiso.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wailing.png b/src/main/resources/assets/cosmiccore/textures/item/wailing.png new file mode 100644 index 000000000..911ae49a4 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wailing.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wasteland_asteroid.png b/src/main/resources/assets/cosmiccore/textures/item/wasteland_asteroid.png new file mode 100644 index 000000000..1fe855836 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wasteland_asteroid.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/waxed_leather.png b/src/main/resources/assets/cosmiccore/textures/item/waxed_leather.png index 8a106e7a4..5953fe7ff 100644 Binary files a/src/main/resources/assets/cosmiccore/textures/item/waxed_leather.png and b/src/main/resources/assets/cosmiccore/textures/item/waxed_leather.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/white_dye_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/white_dye_spray_can.png new file mode 100644 index 000000000..c626292eb Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/white_dye_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wicked_essence.png b/src/main/resources/assets/cosmiccore/textures/item/wicked_essence.png new file mode 100644 index 000000000..e6433824c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wicked_essence.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wired_petri_dish.png b/src/main/resources/assets/cosmiccore/textures/item/wired_petri_dish.png new file mode 100644 index 000000000..65cf1c088 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wired_petri_dish.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wireless_pda.png b/src/main/resources/assets/cosmiccore/textures/item/wireless_pda.png new file mode 100644 index 000000000..2edb56a28 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wireless_pda.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wrapped_blazing_mote.png b/src/main/resources/assets/cosmiccore/textures/item/wrapped_blazing_mote.png new file mode 100644 index 000000000..c915c0114 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wrapped_blazing_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wrapped_bright_mote.png b/src/main/resources/assets/cosmiccore/textures/item/wrapped_bright_mote.png new file mode 100644 index 000000000..6847068d9 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wrapped_bright_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wrapped_clear_mote.png b/src/main/resources/assets/cosmiccore/textures/item/wrapped_clear_mote.png new file mode 100644 index 000000000..73dc77b7a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wrapped_clear_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wrapped_dim_mote.png b/src/main/resources/assets/cosmiccore/textures/item/wrapped_dim_mote.png new file mode 100644 index 000000000..47b4c2f3a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wrapped_dim_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wrapped_faint_mote.png b/src/main/resources/assets/cosmiccore/textures/item/wrapped_faint_mote.png new file mode 100644 index 000000000..fcd2c639a Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wrapped_faint_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wrapped_incandescent_mote.png b/src/main/resources/assets/cosmiccore/textures/item/wrapped_incandescent_mote.png new file mode 100644 index 000000000..316c1cba7 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wrapped_incandescent_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wrapped_pale_mote.png b/src/main/resources/assets/cosmiccore/textures/item/wrapped_pale_mote.png new file mode 100644 index 000000000..06ed4ff7c Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wrapped_pale_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wrapped_radiant_mote.png b/src/main/resources/assets/cosmiccore/textures/item/wrapped_radiant_mote.png new file mode 100644 index 000000000..8dcc784d3 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wrapped_radiant_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wrapped_transcendent_mote.png b/src/main/resources/assets/cosmiccore/textures/item/wrapped_transcendent_mote.png new file mode 100644 index 000000000..eaa46271d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wrapped_transcendent_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wrapped_vivid_mote.png b/src/main/resources/assets/cosmiccore/textures/item/wrapped_vivid_mote.png new file mode 100644 index 000000000..cd72c5b23 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wrapped_vivid_mote.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/wrathful_spirit.png b/src/main/resources/assets/cosmiccore/textures/item/wrathful_spirit.png new file mode 100644 index 000000000..7b5f21847 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/wrathful_spirit.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/yellow_dye_spray_can.png b/src/main/resources/assets/cosmiccore/textures/item/yellow_dye_spray_can.png new file mode 100644 index 000000000..b900d2016 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/yellow_dye_spray_can.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/zpm_radio_module.png b/src/main/resources/assets/cosmiccore/textures/item/zpm_radio_module.png new file mode 100644 index 000000000..84eca242d Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/zpm_radio_module.png differ diff --git a/src/main/resources/assets/cosmiccore/textures/item/zpm_wildfire_core.png b/src/main/resources/assets/cosmiccore/textures/item/zpm_wildfire_core.png new file mode 100644 index 000000000..195017bb2 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/textures/item/zpm_wildfire_core.png differ diff --git a/src/main/resources/assets/cosmiccore/ui/recipe_type/celestial_bore.rtui b/src/main/resources/assets/cosmiccore/ui/recipe_type/celestial_bore.rtui new file mode 100644 index 000000000..39202c083 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/ui/recipe_type/celestial_bore.rtui differ diff --git a/src/main/resources/assets/cosmiccore/ui/recipe_type/dawn_forge.rtui b/src/main/resources/assets/cosmiccore/ui/recipe_type/dawn_forge.rtui new file mode 100644 index 000000000..8f18e304e Binary files /dev/null and b/src/main/resources/assets/cosmiccore/ui/recipe_type/dawn_forge.rtui differ diff --git a/src/main/resources/assets/cosmiccore/ui/recipe_type/industrial_stoneworks.rtui b/src/main/resources/assets/cosmiccore/ui/recipe_type/industrial_stoneworks.rtui new file mode 100644 index 000000000..b339fe807 Binary files /dev/null and b/src/main/resources/assets/cosmiccore/ui/recipe_type/industrial_stoneworks.rtui differ diff --git a/src/main/resources/assets/gtceu/models/block/cube_3_layer/all.json b/src/main/resources/assets/gtceu/models/block/cube_3_layer/all.json new file mode 100644 index 000000000..bd4649c5f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/cube_3_layer/all.json @@ -0,0 +1,24 @@ +{ + "parent": "gtceu:block/cube_3_layer/default", + "textures": { + "particle": "#bot_all", + "bot_down": "#bot_all", + "bot_up": "#bot_all", + "bot_north": "#bot_all", + "bot_east": "#bot_all", + "bot_south": "#bot_all", + "bot_west": "#bot_all", + "mid_down": "#mid_all", + "mid_up": "#mid_all", + "mid_north": "#mid_all", + "mid_east": "#mid_all", + "mid_south": "#mid_all", + "mid_west": "#mid_all", + "top_down": "#top_all", + "top_up": "#top_all", + "top_north": "#top_all", + "top_east": "#top_all", + "top_south": "#top_all", + "top_west": "#top_all" + } +} diff --git a/src/main/resources/assets/gtceu/models/block/cube_3_layer/all_translucent.json b/src/main/resources/assets/gtceu/models/block/cube_3_layer/all_translucent.json new file mode 100644 index 000000000..7e9b40eb4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/cube_3_layer/all_translucent.json @@ -0,0 +1,25 @@ +{ + "parent": "gtceu:block/cube_3_layer/default", + "render_type": "translucent", + "textures": { + "particle": "#bot_all", + "bot_down": "#bot_all", + "bot_up": "#bot_all", + "bot_north": "#bot_all", + "bot_east": "#bot_all", + "bot_south": "#bot_all", + "bot_west": "#bot_all", + "mid_down": "#mid_all", + "mid_up": "#mid_all", + "mid_north": "#mid_all", + "mid_east": "#mid_all", + "mid_south": "#mid_all", + "mid_west": "#mid_all", + "top_down": "#top_all", + "top_up": "#top_all", + "top_north": "#top_all", + "top_east": "#top_all", + "top_south": "#top_all", + "top_west": "#top_all" + } +} diff --git a/src/main/resources/assets/gtceu/models/block/cube_3_layer/default.json b/src/main/resources/assets/gtceu/models/block/cube_3_layer/default.json new file mode 100644 index 000000000..4919daa49 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/cube_3_layer/default.json @@ -0,0 +1,43 @@ +{ + "parent": "block/block", + "elements": [ + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "faces": { + "down": { "texture": "#bot_down", "cullface": "down", "tintindex": 0 }, + "up": { "texture": "#bot_up", "cullface": "up", "tintindex": 0 }, + "north": { "texture": "#bot_north", "cullface": "north", "tintindex": 0 }, + "south": { "texture": "#bot_south", "cullface": "south", "tintindex": 0 }, + "west": { "texture": "#bot_west", "cullface": "west", "tintindex": 0 }, + "east": { "texture": "#bot_east", "cullface": "east", "tintindex": 0 } + } + }, + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "shade": false, + "faces": { + "down": { "texture": "#mid_down", "cullface": "down", "tintindex": 1 }, + "up": { "texture": "#mid_up", "cullface": "up", "tintindex": 1 }, + "north": { "texture": "#mid_north", "cullface": "north", "tintindex": 1 }, + "south": { "texture": "#mid_south", "cullface": "south", "tintindex": 1 }, + "west": { "texture": "#mid_west", "cullface": "west", "tintindex": 1 }, + "east": { "texture": "#mid_east", "cullface": "east", "tintindex": 1 } + } + }, + { + "from": [ 0, 0, 0 ], + "to": [ 16, 16, 16 ], + "shade": false, + "faces": { + "down": { "texture": "#top_down", "cullface": "down", "tintindex": 2 }, + "up": { "texture": "#top_up", "cullface": "up", "tintindex": 2 }, + "north": { "texture": "#top_north", "cullface": "north", "tintindex": 2 }, + "south": { "texture": "#top_south", "cullface": "south", "tintindex": 2 }, + "west": { "texture": "#top_west", "cullface": "west", "tintindex": 2 }, + "east": { "texture": "#top_east", "cullface": "east", "tintindex": 2 } + } + } + ] +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/chlorophyte/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/chlorophyte/block.json new file mode 100644 index 000000000..05ac1cd18 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/chlorophyte/block.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/cube/tinted/all_0", + "textures": { + "all": "gtceu:block/material_sets/chlorophyte/block" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/chlorophyte/frame_gt.json b/src/main/resources/assets/gtceu/models/block/material_sets/chlorophyte/frame_gt.json new file mode 100644 index 000000000..bafde684c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/chlorophyte/frame_gt.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/cube/tinted/all_0", + "textures": { + "all": "gtceu:block/material_sets/chlorophyte/frame_gt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/chonky/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/chonky/block.json new file mode 100644 index 000000000..9f753d696 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/chonky/block.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:block/cube_3_layer/all", + "textures": { + "bot_all": "gtceu:block/material_sets/chonky/block", + "mid_all": "gtceu:block/material_sets/chonky/block_secondary", + "top_all": "gtceu:block/material_sets/chonky/block_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/chonky/frame_gt.json b/src/main/resources/assets/gtceu/models/block/material_sets/chonky/frame_gt.json new file mode 100644 index 000000000..e98a4e16d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/chonky/frame_gt.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:block/cube_3_layer/all_translucent", + "textures": { + "bot_all": "gtceu:block/material_sets/chonky/frame_gt", + "mid_all": "gtceu:block/material_sets/chonky/frame_gt_secondary", + "top_all": "gtceu:block/material_sets/chonky/frame_gt_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/crystal/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/crystal/block.json new file mode 100644 index 000000000..cab879c38 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/crystal/block.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:block/cube_3_layer/all", + "textures": { + "bot_all": "gtceu:block/material_sets/crystal/block", + "mid_all": "gtceu:block/material_sets/crystal/block_secondary", + "top_all": "gtceu:block/material_sets/crystal/block_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/crystal/frame_gt.json b/src/main/resources/assets/gtceu/models/block/material_sets/crystal/frame_gt.json new file mode 100644 index 000000000..a8563a9c2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/crystal/frame_gt.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:block/cube_3_layer/all", + "textures": { + "bot_all": "gtceu:block/material_sets/crystal/frame_gt", + "mid_all": "gtceu:block/material_sets/crystal/frame_gt_secondary", + "top_all": "gtceu:block/material_sets/crystal/frame_gt_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/infinity/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/infinity/block.json new file mode 100644 index 000000000..59846a448 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/infinity/block.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/cube/tinted/all_0", + "textures": { + "all": "gtceu:block/material_sets/infinity/block" + } + } diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/infinity/frame_gt.json b/src/main/resources/assets/gtceu/models/block/material_sets/infinity/frame_gt.json new file mode 100644 index 000000000..f1fc03b53 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/infinity/frame_gt.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/cube/tinted/all_0", + "textures": { + "all": "gtceu:block/material_sets/infinity/frame_gt" + } + } diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/magic/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/magic/block.json new file mode 100644 index 000000000..5bb11a408 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/magic/block.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:block/cube_3_layer/all", + "textures": { + "bot_all": "gtceu:block/material_sets/magic/block", + "mid_all": "gtceu:block/material_sets/magic/block_secondary", + "top_all": "gtceu:block/material_sets/magic/block_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/magic/frame_gt.json b/src/main/resources/assets/gtceu/models/block/material_sets/magic/frame_gt.json new file mode 100644 index 000000000..5d9bf53cb --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/magic/frame_gt.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:block/cube_3_layer/all_translucent", + "textures": { + "bot_all": "gtceu:block/material_sets/magic/frame_gt", + "mid_all": "gtceu:block/material_sets/magic/frame_gt_secondary", + "top_all": "gtceu:block/material_sets/magic/frame_gt_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/neutronite/block.json b/src/main/resources/assets/gtceu/models/block/material_sets/neutronite/block.json new file mode 100644 index 000000000..be8cec6e6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/neutronite/block.json @@ -0,0 +1,11 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "up": "gtceu:block/material_sets/neutronite/block_up", + "down": "gtceu:block/material_sets/neutronite/block_down", + "north": "gtceu:block/material_sets/neutronite/block_side", + "east": "gtceu:block/material_sets/neutronite/block_side", + "south": "gtceu:block/material_sets/neutronite/block_side", + "west": "gtceu:block/material_sets/neutronite/block_side" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/block/material_sets/neutronite/frame_gt.json b/src/main/resources/assets/gtceu/models/block/material_sets/neutronite/frame_gt.json new file mode 100644 index 000000000..afb86b2ef --- /dev/null +++ b/src/main/resources/assets/gtceu/models/block/material_sets/neutronite/frame_gt.json @@ -0,0 +1,11 @@ +{ + "parent": "minecraft:block/cube", + "textures": { + "up": "gtceu:block/material_sets/neutronite/frame_gt_up", + "down": "gtceu:block/material_sets/neutronite/frame_gt_down", + "north": "gtceu:block/material_sets/neutronite/frame_gt_side", + "east": "gtceu:block/material_sets/neutronite/frame_gt_side", + "south": "gtceu:block/material_sets/neutronite/frame_gt_side", + "west": "gtceu:block/material_sets/neutronite/frame_gt_side" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/indestructible_fluid_cell.json b/src/main/resources/assets/gtceu/models/item/indestructible_fluid_cell.json new file mode 100644 index 000000000..c1de5b0aa --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/indestructible_fluid_cell.json @@ -0,0 +1,9 @@ +{ + "loader": "forge:fluid_container", + "parent": "forge:item/default", + "textures": { + "base": "gtceu:item/indestructible_fluid_cell/base", + "fluid": "gtceu:item/indestructible_fluid_cell/overlay" + }, + "fluid": "minecraft:empty" +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/bright/alve_foil_insulator.json b/src/main/resources/assets/gtceu/models/item/material_sets/bright/alve_foil_insulator.json new file mode 100644 index 000000000..d5a3f441a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/bright/alve_foil_insulator.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/bright/alve_foil_insulator", + "layer1": "gtceu:item/material_sets/bright/alve_foil_insulator_secondary", + "layer2": "gtceu:item/material_sets/bright/alve_foil_insulator_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/bright/heavy_beam.json b/src/main/resources/assets/gtceu/models/item/material_sets/bright/heavy_beam.json new file mode 100644 index 000000000..3f751d983 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/bright/heavy_beam.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/bright/heavy_beam", + "layer1": "gtceu:item/material_sets/bright/heavy_beam_secondary", + "layer2": "gtceu:item/material_sets/bright/heavy_beam_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/bright/modular_shelling.json b/src/main/resources/assets/gtceu/models/item/material_sets/bright/modular_shelling.json new file mode 100644 index 000000000..e2368918b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/bright/modular_shelling.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/bright/modular_shelling", + "layer1": "gtceu:item/material_sets/bright/modular_shelling_secondary", + "layer2": "gtceu:item/material_sets/bright/modular_shelling_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/bright/shape_memory_foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/bright/shape_memory_foil.json new file mode 100644 index 000000000..a2524f045 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/bright/shape_memory_foil.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/bright/shape_memory_foil", + "layer1": "gtceu:item/material_sets/bright/shape_memory_foil_secondary", + "layer2": "gtceu:item/material_sets/bright/shape_memory_foil_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/bright/ultra_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/bright/ultra_dense.json new file mode 100644 index 000000000..566f48ca6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/bright/ultra_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/bright/ultradense_plate", + "layer1": "gtceu:item/material_sets/bright/ultradense_plate_secondary", + "layer2": "gtceu:item/material_sets/bright/ultradense_plate_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/alve_foil_insulator.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/alve_foil_insulator.json new file mode 100644 index 000000000..636a6bd00 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/alve_foil_insulator.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/alve_foil_insulator" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/bolt.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/bolt.json new file mode 100644 index 000000000..18caf55a4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/bolt.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/bolt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/dust.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/dust.json new file mode 100644 index 000000000..28ef2b2c0 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/dust.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/dust" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/dust_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/dust_small.json new file mode 100644 index 000000000..b4c58160f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/dust_small.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/dust_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/dust_tiny.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/dust_tiny.json new file mode 100644 index 000000000..c035f5fd0 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/dust_tiny.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/dust_tiny" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/foil.json new file mode 100644 index 000000000..15e90ef6c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/foil.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/foil" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/gear.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/gear.json new file mode 100644 index 000000000..32bd392fe --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/gear.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/gear" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/gear_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/gear_small.json new file mode 100644 index 000000000..f48a11ed5 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/gear_small.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/gear_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/heavy_beam.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/heavy_beam.json new file mode 100644 index 000000000..a8889038d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/heavy_beam.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/heavy_beam" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/ingot.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/ingot.json new file mode 100644 index 000000000..9c127bff2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/ingot.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/ingot" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/ingot_hot.json new file mode 100644 index 000000000..4fc2b675e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/ingot_hot.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:item/material_sets/chlorophyte/ingot", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/ingot_hot" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/modular_shelling.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/modular_shelling.json new file mode 100644 index 000000000..5b0e39234 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/modular_shelling.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/modular_shelling" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/nugget.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/nugget.json new file mode 100644 index 000000000..052ff2d30 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/nugget.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/nugget" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/plate.json new file mode 100644 index 000000000..87ee9fe27 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/plate.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/plate" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/plate_dense.json new file mode 100644 index 000000000..404363d8d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/plate_dense.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/plate_dense" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/plate_double.json new file mode 100644 index 000000000..dcb002ac9 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/plate_double.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/plate_double" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/ring.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/ring.json new file mode 100644 index 000000000..70fb799b2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/ring.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/ring" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/rod.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/rod.json new file mode 100644 index 000000000..b9ef8bf4a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/rod.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/rod" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/rod_long.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/rod_long.json new file mode 100644 index 000000000..7152168f6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/rod_long.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/rod_long" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/rotor.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/rotor.json new file mode 100644 index 000000000..319ea2031 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/rotor.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/rotor" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/round.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/round.json new file mode 100644 index 000000000..2552e99ba --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/round.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/round" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/screw.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/screw.json new file mode 100644 index 000000000..ccf9b3962 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/screw.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/screw" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/shape_memory_foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/shape_memory_foil.json new file mode 100644 index 000000000..65283f4f3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/shape_memory_foil.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/shape_memory_foil" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/spring.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/spring.json new file mode 100644 index 000000000..510666943 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/spring.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/spring" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/spring_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/spring_small.json new file mode 100644 index 000000000..24ebf4f19 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/spring_small.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/spring_small" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/turbine_blade.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/turbine_blade.json new file mode 100644 index 000000000..00e77dcf3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/turbine_blade.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/turbine_blade" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/ultra_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/ultra_dense.json new file mode 100644 index 000000000..e6fe41494 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/ultra_dense.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/ultradense_plate" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/wire_fine.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/wire_fine.json new file mode 100644 index 000000000..5a0cc898a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/wire_fine.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/wire_fine", + "layer1": "gtceu:item/material_sets/chlorophyte/wire_fine_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/wire_spool.json b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/wire_spool.json new file mode 100644 index 000000000..624617368 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chlorophyte/wire_spool.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chlorophyte/wire_spool", + "layer1": "gtceu:item/material_sets/chlorophyte/wire_spool_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/alve_foil_insulator.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/alve_foil_insulator.json new file mode 100644 index 000000000..2316988d3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/alve_foil_insulator.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/alve_foil_insulator", + "layer1": "gtceu:item/material_sets/chonky/alve_foil_insulator_secondary", + "layer2": "gtceu:item/material_sets/chonky/alve_foil_insulator_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/bolt.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/bolt.json new file mode 100644 index 000000000..a320e0449 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/bolt.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/bolt", + "layer1": "gtceu:item/material_sets/chonky/bolt_secondary", + "layer2": "gtceu:item/material_sets/chonky/bolt_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/dust.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/dust.json new file mode 100644 index 000000000..00fd8c915 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/dust.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/dust", + "layer1": "gtceu:item/material_sets/chonky/dust_secondary", + "layer2": "gtceu:item/material_sets/chonky/dust_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/dust_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/dust_small.json new file mode 100644 index 000000000..27f42c2f8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/dust_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/dust_small", + "layer1": "gtceu:item/material_sets/chonky/dust_small_secondary", + "layer2": "gtceu:item/material_sets/chonky/dust_small_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/dust_tiny.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/dust_tiny.json new file mode 100644 index 000000000..c747f635b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/dust_tiny.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/dust_tiny", + "layer1": "gtceu:item/material_sets/chonky/dust_tiny_secondary", + "layer2": "gtceu:item/material_sets/chonky/dust_tiny_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/foil.json new file mode 100644 index 000000000..5544d9ad3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/foil.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/foil", + "layer1": "gtceu:item/material_sets/chonky/foil_secondary", + "layer2": "gtceu:item/material_sets/chonky/foil_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/gear.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/gear.json new file mode 100644 index 000000000..82ca9663b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/gear.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/gear", + "layer1": "gtceu:item/material_sets/chonky/gear_secondary", + "layer2": "gtceu:item/material_sets/chonky/gear_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/gear_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/gear_small.json new file mode 100644 index 000000000..acb67309f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/gear_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/gear_small", + "layer1": "gtceu:item/material_sets/chonky/gear_small_secondary", + "layer2": "gtceu:item/material_sets/chonky/gear_small_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/heavy_beam.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/heavy_beam.json new file mode 100644 index 000000000..714978e02 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/heavy_beam.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/heavy_beam", + "layer1": "gtceu:item/material_sets/chonky/heavy_beam_secondary", + "layer2": "gtceu:item/material_sets/chonky/heavy_beam_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ingot.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ingot.json new file mode 100644 index 000000000..10d721696 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ingot.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/ingot", + "layer1": "gtceu:item/material_sets/chonky/ingot_secondary", + "layer2": "gtceu:item/material_sets/chonky/ingot_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ingot_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ingot_double.json new file mode 100644 index 000000000..e175b53d1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ingot_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/ingot_double", + "layer1": "gtceu:item/material_sets/chonky/ingot_double_secondary", + "layer2": "gtceu:item/material_sets/chonky/ingot_double_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ingot_hot.json new file mode 100644 index 000000000..db6a4ec37 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ingot_hot.json @@ -0,0 +1,9 @@ +{ + "parent": "gtceu:item/material_sets/chonky/ingot", + "textures": { + "layer0":"gtceu:item/material_sets/chonky/ingot", + "layer1":"gtceu:item/material_sets/chonky/ingot_secondary", + "layer2":"gtceu:item/material_sets/chonky/ingot_overlay", + "layer3":"gtceu:item/material_sets/chonky/ingot_hot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/modular_shelling.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/modular_shelling.json new file mode 100644 index 000000000..6dbbd5396 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/modular_shelling.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/modular_shelling", + "layer1": "gtceu:item/material_sets/chonky/modular_shelling_secondary", + "layer2": "gtceu:item/material_sets/chonky/modular_shelling_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/nugget.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/nugget.json new file mode 100644 index 000000000..d51b9e8d0 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/nugget.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/nugget", + "layer1": "gtceu:item/material_sets/chonky/nugget_secondary", + "layer2": "gtceu:item/material_sets/chonky/nugget_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/plate.json new file mode 100644 index 000000000..ef4fa68c4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/plate.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/plate", + "layer1": "gtceu:item/material_sets/chonky/plate_secondary", + "layer2": "gtceu:item/material_sets/chonky/plate_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/plate_dense.json new file mode 100644 index 000000000..8a6c53480 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/plate_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/plate_dense", + "layer1": "gtceu:item/material_sets/chonky/plate_dense_secondary", + "layer2": "gtceu:item/material_sets/chonky/plate_dense_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/plate_double.json new file mode 100644 index 000000000..7c028a4d2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/plate_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/plate_double", + "layer1": "gtceu:item/material_sets/chonky/plate_double_secondary", + "layer2": "gtceu:item/material_sets/chonky/plate_double_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ring.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ring.json new file mode 100644 index 000000000..44baf2309 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ring.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/ring", + "layer1": "gtceu:item/material_sets/chonky/ring_secondary", + "layer2": "gtceu:item/material_sets/chonky/ring_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/rod.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/rod.json new file mode 100644 index 000000000..ce7de469e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/rod.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/rod", + "layer1": "gtceu:item/material_sets/chonky/rod_secondary", + "layer2": "gtceu:item/material_sets/chonky/rod_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/rod_long.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/rod_long.json new file mode 100644 index 000000000..8dbd0c5d7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/rod_long.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/rod_long", + "layer1": "gtceu:item/material_sets/chonky/rod_long_secondary", + "layer2": "gtceu:item/material_sets/chonky/rod_long_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/rotor.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/rotor.json new file mode 100644 index 000000000..812ddd3af --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/rotor.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/rotor", + "layer1": "gtceu:item/material_sets/chonky/rotor_secondary", + "layer2": "gtceu:item/material_sets/chonky/rotor_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/round.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/round.json new file mode 100644 index 000000000..2e38b4bdb --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/round.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/round", + "layer1": "gtceu:item/material_sets/chonky/round_secondary", + "layer2": "gtceu:item/material_sets/chonky/round_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/screw.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/screw.json new file mode 100644 index 000000000..654403324 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/screw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/screw", + "layer1": "gtceu:item/material_sets/chonky/screw_secondary", + "layer2": "gtceu:item/material_sets/chonky/screw_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/shape_memory_foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/shape_memory_foil.json new file mode 100644 index 000000000..5441d2d58 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/shape_memory_foil.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/shape_memory_foil", + "layer1": "gtceu:item/material_sets/chonky/shape_memory_foil_secondary", + "layer2": "gtceu:item/material_sets/chonky/shape_memory_foil_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/spring.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/spring.json new file mode 100644 index 000000000..47f8e0738 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/spring.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/spring", + "layer1": "gtceu:item/material_sets/chonky/spring_secondary", + "layer2": "gtceu:item/material_sets/chonky/spring_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/spring_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/spring_small.json new file mode 100644 index 000000000..c3bf346c7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/spring_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/spring_small", + "layer1": "gtceu:item/material_sets/chonky/spring_small_secondary", + "layer2": "gtceu:item/material_sets/chonky/spring_small_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_buzz_saw.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_buzz_saw.json new file mode 100644 index 000000000..d4fc54bcc --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_buzz_saw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/tool_head_buzz_saw", + "layer1": "gtceu:item/material_sets/chonky/tool_head_buzz_saw_secondary", + "layer2": "gtceu:item/material_sets/chonky/tool_head_buzz_saw_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_chainsaw.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_chainsaw.json new file mode 100644 index 000000000..506a80994 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_chainsaw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/tool_head_chainsaw", + "layer1": "gtceu:item/material_sets/chonky/tool_head_chainsaw_secondary", + "layer2": "gtceu:item/material_sets/chonky/tool_head_chainsaw_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_drill.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_drill.json new file mode 100644 index 000000000..d49501db4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_drill.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/tool_head_drill", + "layer1": "gtceu:item/material_sets/chonky/tool_head_drill_secondary", + "layer2": "gtceu:item/material_sets/chonky/tool_head_drill_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_screwdriver.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_screwdriver.json new file mode 100644 index 000000000..68cfe62b1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_screwdriver.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/tool_head_screwdriver", + "layer1": "gtceu:item/material_sets/chonky/tool_head_screwdriver_secondary", + "layer2": "gtceu:item/material_sets/chonky/tool_head_screwdriver_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_wrench.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_wrench.json new file mode 100644 index 000000000..8a6646c14 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/tool_head_wrench.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/tool_head_wrench", + "layer1": "gtceu:item/material_sets/chonky/tool_head_wrench_secondary", + "layer2": "gtceu:item/material_sets/chonky/tool_head_wrench_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/turbine_blade.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/turbine_blade.json new file mode 100644 index 000000000..a501a9d22 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/turbine_blade.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/turbine_blade", + "layer1": "gtceu:item/material_sets/chonky/turbine_blade_secondary", + "layer2": "gtceu:item/material_sets/chonky/turbine_blade_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ultra_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ultra_dense.json new file mode 100644 index 000000000..3914227de --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ultra_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/ultradense_plate", + "layer1": "gtceu:item/material_sets/chonky/ultradense_plate_secondary", + "layer2": "gtceu:item/material_sets/chonky/ultradense_plate_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ultradense_plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ultradense_plate.json new file mode 100644 index 000000000..3914227de --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/ultradense_plate.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/ultradense_plate", + "layer1": "gtceu:item/material_sets/chonky/ultradense_plate_secondary", + "layer2": "gtceu:item/material_sets/chonky/ultradense_plate_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/wire_fine.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/wire_fine.json new file mode 100644 index 000000000..7de8d6973 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/wire_fine.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/wire_fine", + "layer1": "gtceu:item/material_sets/chonky/wire_fine_secondary", + "layer2": "gtceu:item/material_sets/chonky/wire_fine_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chonky/wire_spool.json b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/wire_spool.json new file mode 100644 index 000000000..12148397b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chonky/wire_spool.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chonky/wire_spool", + "layer1": "gtceu:item/material_sets/chonky/wire_spool_secondary", + "layer2": "gtceu:item/material_sets/chonky/wire_spool_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/alve_foil_insulator.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/alve_foil_insulator.json new file mode 100644 index 000000000..443000ff6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/alve_foil_insulator.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/alve_foil_insulator" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/bolt.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/bolt.json new file mode 100644 index 000000000..365350403 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/bolt.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/bolt" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/crushed.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/crushed.json new file mode 100644 index 000000000..4a27f897d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/crushed.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/crushed" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/crushed_purified.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/crushed_purified.json new file mode 100644 index 000000000..34d5a04d8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/crushed_purified.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/crushed_purified", + "layer1": "gtceu:item/material_sets/chronon/crushed_purified" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/crushed_refined.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/crushed_refined.json new file mode 100644 index 000000000..ad3487f1f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/crushed_refined.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/crushed_refined" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust.json new file mode 100644 index 000000000..fda2a4e15 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/dust" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust_impure.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust_impure.json new file mode 100644 index 000000000..1dc324be4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust_impure.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/dust_impure" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust_pure.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust_pure.json new file mode 100644 index 000000000..e15dd8619 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust_pure.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/dust_pure" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust_small.json new file mode 100644 index 000000000..189ee4812 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust_small.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/dust_small" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust_tiny.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust_tiny.json new file mode 100644 index 000000000..8e0a8f6f7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/dust_tiny.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/dust_tiny" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/foil.json new file mode 100644 index 000000000..f5871bf55 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/foil.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/foil" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gear.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gear.json new file mode 100644 index 000000000..528cd1245 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gear.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/gear" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gear_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gear_small.json new file mode 100644 index 000000000..b571bb458 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gear_small.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/gear_small" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem.json new file mode 100644 index 000000000..0919a32d8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/gem" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_chipped.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_chipped.json new file mode 100644 index 000000000..915525da9 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_chipped.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/gem_chipped" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_exquisite.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_exquisite.json new file mode 100644 index 000000000..c7fb00dc1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_exquisite.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/gem_exquisite" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_flawed.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_flawed.json new file mode 100644 index 000000000..0c13e7bde --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_flawed.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/gem_flawed" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_flawless.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_flawless.json new file mode 100644 index 000000000..7283e1a35 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/gem_flawless.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/gem_flawless" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/heavy_beam.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/heavy_beam.json new file mode 100644 index 000000000..52374925d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/heavy_beam.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/heavy_beam" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ingot.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ingot.json new file mode 100644 index 000000000..c7ce2f6c5 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ingot.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/ingot" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ingot_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ingot_double.json new file mode 100644 index 000000000..7adb4b0ac --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ingot_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/material_sets/chronon/ingot", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/ingot_double" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ingot_hot.json new file mode 100644 index 000000000..3830cd9a7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ingot_hot.json @@ -0,0 +1,9 @@ +{ + "parent": "gtceu:item/material_sets/chronon/ingot", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/ingot", + "layer3": "gtceu:item/material_sets/chronon/ingot_hot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/lens.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/lens.json new file mode 100644 index 000000000..ee9726fb1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/lens.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/lens" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/modular_shelling.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/modular_shelling.json new file mode 100644 index 000000000..d3de641ce --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/modular_shelling.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/modular_shelling" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/nugget.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/nugget.json new file mode 100644 index 000000000..f3d16f17c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/nugget.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/shiny/nugget", + "layer1": "gtceu:item/material_sets/shiny/nugget_secondary", + "layer2": "gtceu:item/material_sets/shiny/nugget_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/plate.json new file mode 100644 index 000000000..af4e9bcd3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/plate.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/plate" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/plate_dense.json new file mode 100644 index 000000000..abcdc73af --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/plate_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/plate_dense" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/plate_double.json new file mode 100644 index 000000000..5588c9764 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/plate_double.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/plate_double", + "layer1": "gtceu:item/material_sets/dull/plate_double_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/raw_ore.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/raw_ore.json new file mode 100644 index 000000000..59190d700 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/raw_ore.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/raw_ore", + "layer1": "gtceu:item/material_sets/chronon/raw_ore" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ring.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ring.json new file mode 100644 index 000000000..dfc6faa20 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ring.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/ring" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/rod.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/rod.json new file mode 100644 index 000000000..e2a249816 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/rod.json @@ -0,0 +1,6 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/rod" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/rod_long.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/rod_long.json new file mode 100644 index 000000000..8b744b4a7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/rod_long.json @@ -0,0 +1,6 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/rod_long" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/rotor.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/rotor.json new file mode 100644 index 000000000..331dab0e7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/rotor.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/rotor" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/round.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/round.json new file mode 100644 index 000000000..2f309542f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/round.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/round" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/screw.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/screw.json new file mode 100644 index 000000000..7a1ecf6d4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/screw.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/screw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/shape_memory_foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/shape_memory_foil.json new file mode 100644 index 000000000..039d82e0d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/shape_memory_foil.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/shape_memory_foil" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/spring.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/spring.json new file mode 100644 index 000000000..2b4ca1930 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/spring.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/spring" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/spring_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/spring_small.json new file mode 100644 index 000000000..6968a9ea4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/spring_small.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/spring_small" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_buzz_saw.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_buzz_saw.json new file mode 100644 index 000000000..f10feecbe --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_buzz_saw.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/tool_head_buzz_saw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_chainsaw.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_chainsaw.json new file mode 100644 index 000000000..e9bf2e206 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_chainsaw.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/tool_head_chainsaw", + "layer1": "gtceu:item/material_sets/chronon/tool_head_chainsaw" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_drill.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_drill.json new file mode 100644 index 000000000..0d950c3d6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_drill.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/tool_head_drill", + "layer1": "gtceu:item/material_sets/chronon/tool_head_drill" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_screwdriver.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_screwdriver.json new file mode 100644 index 000000000..a7e8127e4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_screwdriver.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/tool_head_screwdriver" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_wire_cutter.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_wire_cutter.json new file mode 100644 index 000000000..1d5fa34fa --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_wire_cutter.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/tool_head_wirecutter" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_wrench.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_wrench.json new file mode 100644 index 000000000..bb27f9712 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/tool_head_wrench.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/tool_head_wrench" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/turbine_blade.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/turbine_blade.json new file mode 100644 index 000000000..80fa95834 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/turbine_blade.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/turbine_blade" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ultra_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ultra_dense.json new file mode 100644 index 000000000..1eed162f1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/ultra_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/ultradense_plate" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/wire_fine.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/wire_fine.json new file mode 100644 index 000000000..219636b65 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/wire_fine.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/chronon/wire_fine", + "layer1": "gtceu:item/material_sets/chronon/wire_fine_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/chronon/wire_spool.json b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/wire_spool.json new file mode 100644 index 000000000..047503d91 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/chronon/wire_spool.json @@ -0,0 +1,9 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/chronon/wire_spool", + "layer3": "gtceu:item/material_sets/dull/wire_spool_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/bolt.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/bolt.json new file mode 100644 index 000000000..41c2d13c3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/bolt.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/bolt", + "layer1": "gtceu:item/material_sets/crystal/bolt_secondary", + "layer2": "gtceu:item/material_sets/crystal/bolt_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/crushed.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/crushed.json new file mode 100644 index 000000000..24199fd9a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/crushed.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/crushed", + "layer1": "gtceu:item/material_sets/crystal/crushed_secondary", + "layer2": "gtceu:item/material_sets/crystal/crushed_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/crushed_purified.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/crushed_purified.json new file mode 100644 index 000000000..59ac95cd4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/crushed_purified.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/crushed", + "layer1": "gtceu:item/material_sets/crystal/crushed_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/crushed_refined.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/crushed_refined.json new file mode 100644 index 000000000..6e77d63df --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/crushed_refined.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/crushed_refined", + "layer1": "gtceu:item/material_sets/crystal/crushed_refined_secondary", + "layer2": "gtceu:item/material_sets/crystal/crushed_refined_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust.json new file mode 100644 index 000000000..53a19126b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/dust", + "layer1": "gtceu:item/material_sets/crystal/dust_secondary", + "layer2": "gtceu:item/material_sets/crystal/dust_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_impure.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_impure.json new file mode 100644 index 000000000..4b4d25c05 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_impure.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/dust_impure", + "layer1": "gtceu:item/material_sets/crystal/dust_impure_secondary", + "layer2": "gtceu:item/material_sets/crystal/dust_impure_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_pure.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_pure.json new file mode 100644 index 000000000..bb0e69716 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_pure.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/dust_pure", + "layer1": "gtceu:item/material_sets/crystal/dust_pure_secondary", + "layer2": "gtceu:item/material_sets/crystal/dust_pure_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_small.json new file mode 100644 index 000000000..efe1ef9d9 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_small.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/dust_small", + "layer1": "gtceu:item/material_sets/crystal/dust_small_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_tiny.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_tiny.json new file mode 100644 index 000000000..d37b600a6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/dust_tiny.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/dust_tiny", + "layer1": "gtceu:item/material_sets/crystal/dust_tiny_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/foil.json new file mode 100644 index 000000000..113b794c7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/foil.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/foil", + "layer1": "gtceu:item/material_sets/crystal/foil_secondary", + "layer2": "gtceu:item/material_sets/crystal/foil_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gear.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gear.json new file mode 100644 index 000000000..0e2169e96 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gear.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/gear", + "layer1": "gtceu:item/material_sets/crystal/gear_secondary", + "layer2": "gtceu:item/material_sets/crystal/gear_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gear_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gear_small.json new file mode 100644 index 000000000..842096d7f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gear_small.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/gear_small", + "layer1": "gtceu:item/material_sets/crystal/gear_small_secondary", + "layer2": "gtceu:item/material_sets/crystal/gear_small_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem.json new file mode 100644 index 000000000..59d82bda6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/gem", + "layer1": "gtceu:item/material_sets/crystal/gem_secondary", + "layer2": "gtceu:item/material_sets/crystal/gem_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_chipped.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_chipped.json new file mode 100644 index 000000000..ffd2c4aae --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_chipped.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/gem_chipped", + "layer1": "gtceu:item/material_sets/crystal/gem_chipped_secondary", + "layer2": "gtceu:item/material_sets/crystal/gem_chipped_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_exquisite.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_exquisite.json new file mode 100644 index 000000000..266e125b2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_exquisite.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/gem_exquisite", + "layer1": "gtceu:item/material_sets/crystal/gem_exquisite_secondary", + "layer2": "gtceu:item/material_sets/crystal/gem_exquisite_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_flawed.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_flawed.json new file mode 100644 index 000000000..5a579ca95 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_flawed.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/gem_flawed", + "layer1": "gtceu:item/material_sets/crystal/gem_flawed_secondary", + "layer2": "gtceu:item/material_sets/crystal/gem_flawed_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_flawless.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_flawless.json new file mode 100644 index 000000000..50f8f6f60 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/gem_flawless.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/gem_flawless", + "layer1": "gtceu:item/material_sets/crystal/gem_flawless_secondary", + "layer2": "gtceu:item/material_sets/crystal/gem_flawless_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ingot.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ingot.json new file mode 100644 index 000000000..e6240a4be --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ingot.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/ingot", + "layer1": "gtceu:item/material_sets/crystal/ingot_secondary", + "layer2": "gtceu:item/material_sets/crystal/ingot_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ingot_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ingot_double.json new file mode 100644 index 000000000..8c602ab46 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ingot_double.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:item/material_sets/crystal/ingot", + "textures": { + "layer3": "gtceu:item/material_sets/crystal/ingot_double_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ingot_hot.json new file mode 100644 index 000000000..5f2e94d61 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ingot_hot.json @@ -0,0 +1,9 @@ +{ + "parent": "gtceu:item/material_sets/crystal/ingot", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/ingot", + "layer1": "gtceu:item/material_sets/crystal/ingot_secondary", + "layer2": "gtceu:item/material_sets/crystal/ingot_overlay", + "layer3": "gtceu:item/material_sets/crystal/ingot_hot_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/lens.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/lens.json new file mode 100644 index 000000000..e109ed826 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/lens.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/lens", + "layer1": "gtceu:item/material_sets/crystal/lens_secondary", + "layer2": "gtceu:item/material_sets/crystal/lens_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/nugget.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/nugget.json new file mode 100644 index 000000000..aa744db29 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/nugget.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/nugget", + "layer1": "gtceu:item/material_sets/crystal/nugget_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/plate.json new file mode 100644 index 000000000..bb347443e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/plate.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/plate", + "layer1": "gtceu:item/material_sets/crystal/plate_secondary", + "layer2": "gtceu:item/material_sets/crystal/plate_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/plate_dense.json new file mode 100644 index 000000000..d2cba3267 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/plate_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/plate_dense", + "layer1": "gtceu:item/material_sets/crystal/plate_dense_secondary", + "layer2": "gtceu:item/material_sets/crystal/plate_dense_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/plate_double.json new file mode 100644 index 000000000..a673d985e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/plate_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/material_sets/crystal/plate", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/plate_double", + "layer1": "gtceu:item/material_sets/crystal/plate_double_secondary", + "layer2": "gtceu:item/material_sets/crystal/plate_double_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/raw_ore.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/raw_ore.json new file mode 100644 index 000000000..b04a43478 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/raw_ore.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/raw_ore", + "layer1": "gtceu:item/material_sets/crystal/raw_ore_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ring.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ring.json new file mode 100644 index 000000000..56f828d5f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/ring.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/ring", + "layer1": "gtceu:item/material_sets/crystal/ring_secondary", + "layer2": "gtceu:item/material_sets/crystal/ring_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/rod.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/rod.json new file mode 100644 index 000000000..383d94059 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/rod.json @@ -0,0 +1,7 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/rod", + "layer1": "gtceu:item/material_sets/crystal/rod_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/rod_long.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/rod_long.json new file mode 100644 index 000000000..be204bff5 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/rod_long.json @@ -0,0 +1,7 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/rod_long", + "layer1": "gtceu:item/material_sets/crystal/rod_long_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/rotor.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/rotor.json new file mode 100644 index 000000000..b6791a910 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/rotor.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/rotor", + "layer1": "gtceu:item/material_sets/crystal/rotor_secondary", + "layer2": "gtceu:item/material_sets/crystal/rotor_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/round.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/round.json new file mode 100644 index 000000000..40d0f623a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/round.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/round", + "layer1": "gtceu:item/material_sets/crystal/round_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/screw.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/screw.json new file mode 100644 index 000000000..d5af7dae8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/screw.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/screw", + "layer1": "gtceu:item/material_sets/crystal/screw_secondary", + "layer2": "gtceu:item/material_sets/crystal/screw_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/spring.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/spring.json new file mode 100644 index 000000000..f4982245e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/spring.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/spring", + "layer1": "gtceu:item/material_sets/crystal/spring_secondary", + "layer2": "gtceu:item/material_sets/crystal/spring_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/spring_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/spring_small.json new file mode 100644 index 000000000..face67b7d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/spring_small.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/spring_small", + "layer1": "gtceu:item/material_sets/crystal/spring_small_secondary", + "layer2": "gtceu:item/material_sets/crystal/spring_small_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_buzz_saw.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_buzz_saw.json new file mode 100644 index 000000000..4440e6b49 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_buzz_saw.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/tool_head_buzz_saw", + "layer1": "gtceu:item/material_sets/crystal/tool_head_buzz_saw_secondary", + "layer2": "gtceu:item/material_sets/crystal/tool_head_buzz_saw_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_chainsaw.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_chainsaw.json new file mode 100644 index 000000000..8d2cd191c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_chainsaw.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/tool_head_chainsaw", + "layer1": "gtceu:item/material_sets/crystal/tool_head_chainsaw_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_drill.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_drill.json new file mode 100644 index 000000000..4c7afcab5 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_drill.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/tool_head_drill", + "layer1": "gtceu:item/material_sets/crystal/tool_head_drill_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_screwdriver.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_screwdriver.json new file mode 100644 index 000000000..733be1cbd --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_screwdriver.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/tool_head_screwdriver", + "layer1": "gtceu:item/material_sets/crystal/tool_head_screwdriver_secondary", + "layer2": "gtceu:item/material_sets/crystal/tool_head_screwdriver_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_wire_cutter.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_wire_cutter.json new file mode 100644 index 000000000..3f8dd5851 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_wire_cutter.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/tool_head_wirecutter" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_wrench.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_wrench.json new file mode 100644 index 000000000..2dcfb14bd --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/tool_head_wrench.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/tool_head_wrench", + "layer1": "gtceu:item/material_sets/crystal/tool_head_wrench_secondary", + "layer2": "gtceu:item/material_sets/crystal/tool_head_wrench_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/turbine_blade.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/turbine_blade.json new file mode 100644 index 000000000..e6cd960c3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/turbine_blade.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/turbine_blade", + "layer1": "gtceu:item/material_sets/crystal/turbine_blade_secondary", + "layer2": "gtceu:item/material_sets/crystal/turbine_blade_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/crystal/wire_fine.json b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/wire_fine.json new file mode 100644 index 000000000..e2ff07596 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/crystal/wire_fine.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/crystal/wire_fine", + "layer1": "gtceu:item/material_sets/crystal/wire_fine_secondary", + "layer2": "gtceu:item/material_sets/crystal/wire_fine_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/diamond/raw_ore_cubic.json b/src/main/resources/assets/gtceu/models/item/material_sets/diamond/raw_ore_cubic.json new file mode 100644 index 000000000..97bf25c1d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/diamond/raw_ore_cubic.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/diamond/raw_ore_cubic", + "layer1": "gtceu:item/material_sets/diamond/raw_ore_cubic_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/dull/alve_foil_insulator.json b/src/main/resources/assets/gtceu/models/item/material_sets/dull/alve_foil_insulator.json new file mode 100644 index 000000000..435d9514c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/dull/alve_foil_insulator.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/dull/alve_foil_insulator", + "layer1": "gtceu:item/material_sets/dull/alve_foil_insulator_secondary", + "layer2": "gtceu:item/material_sets/dull/alve_foil_insulator_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/dull/heavy_beam.json b/src/main/resources/assets/gtceu/models/item/material_sets/dull/heavy_beam.json new file mode 100644 index 000000000..9c8874be6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/dull/heavy_beam.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/dull/heavy_beam", + "layer1": "gtceu:item/material_sets/dull/heavy_beam_secondary", + "layer2": "gtceu:item/material_sets/dull/heavy_beam_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/dull/modular_shelling.json b/src/main/resources/assets/gtceu/models/item/material_sets/dull/modular_shelling.json new file mode 100644 index 000000000..00cb890fe --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/dull/modular_shelling.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/dull/modular_shelling", + "layer1": "gtceu:item/material_sets/dull/modular_shelling_secondary", + "layer2": "gtceu:item/material_sets/dull/modular_shelling_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/dull/plasmites.json b/src/main/resources/assets/gtceu/models/item/material_sets/dull/plasmites.json new file mode 100644 index 000000000..004d90c85 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/dull/plasmites.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/dull/plasmites" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/dull/raw_ore_cubic.json b/src/main/resources/assets/gtceu/models/item/material_sets/dull/raw_ore_cubic.json new file mode 100644 index 000000000..cdf71ed56 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/dull/raw_ore_cubic.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/dull/raw_ore_cubic", + "layer1": "gtceu:item/material_sets/dull/raw_ore_cubic_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/dull/shape_memory_foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/dull/shape_memory_foil.json new file mode 100644 index 000000000..b6f6e074d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/dull/shape_memory_foil.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/dull/shape_memory_foil", + "layer1": "gtceu:item/material_sets/dull/shape_memory_foil_secondary", + "layer2": "gtceu:item/material_sets/dull/shape_memory_foil_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/dull/ultra_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/dull/ultra_dense.json new file mode 100644 index 000000000..0db7ab645 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/dull/ultra_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/dull/ultradense_plate", + "layer1": "gtceu:item/material_sets/dull/ultradense_plate_secondary", + "layer2": "gtceu:item/material_sets/dull/ultradense_plate_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/dull/wire_spool.json b/src/main/resources/assets/gtceu/models/item/material_sets/dull/wire_spool.json new file mode 100644 index 000000000..187aa6a2c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/dull/wire_spool.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/dull/wire_spool", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/dull/wire_spool_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/fine/raw_ore_cubic.json b/src/main/resources/assets/gtceu/models/item/material_sets/fine/raw_ore_cubic.json new file mode 100644 index 000000000..9d94ccf29 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/fine/raw_ore_cubic.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/fine/raw_ore_cubic", + "layer1": "gtceu:item/material_sets/fine/raw_ore_cubic_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/alve_foil_insulator.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/alve_foil_insulator.json new file mode 100644 index 000000000..3ae1693ec --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/alve_foil_insulator.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/infinity/alve_foil_insulator" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/bolt.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/bolt.json new file mode 100644 index 000000000..d716207a3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/bolt.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/bolt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/crushed.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/crushed.json new file mode 100644 index 000000000..b08f376e7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/crushed.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/crushed" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/crushed_purified.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/crushed_purified.json new file mode 100644 index 000000000..67e6fc76b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/crushed_purified.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/infinity/crushed_purified", + "layer1": "gtceu:item/material_sets/infinity/crushed_purified" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/crushed_refined.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/crushed_refined.json new file mode 100644 index 000000000..b25d6eb5f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/crushed_refined.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/crushed_refined" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/dust.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/dust.json new file mode 100644 index 000000000..60a50fed1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/dust.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/dust" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/dust_impure.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/dust_impure.json new file mode 100644 index 000000000..bb1f02394 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/dust_impure.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/dust_impure" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/dust_pure.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/dust_pure.json new file mode 100644 index 000000000..e1930b2f6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/dust_pure.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/dust_pure" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/dust_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/dust_small.json new file mode 100644 index 000000000..4d7996709 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/dust_small.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/dust_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/dust_tiny.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/dust_tiny.json new file mode 100644 index 000000000..4ce339654 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/dust_tiny.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/dust_tiny" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/foil.json new file mode 100644 index 000000000..3a339400a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/foil.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/foil" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gear.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gear.json new file mode 100644 index 000000000..b90b58dfd --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gear.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/gear" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gear_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gear_small.json new file mode 100644 index 000000000..9211e04b8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gear_small.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/gear_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gem.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gem.json new file mode 100644 index 000000000..dc474014c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gem.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/infinity/gem" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gem_chipped.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gem_chipped.json new file mode 100644 index 000000000..49ecd682c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gem_chipped.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/infinity/gem_chipped" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gem_exquisite.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gem_exquisite.json new file mode 100644 index 000000000..93d985e3a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gem_exquisite.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/infinity/gem_exquisite" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gem_flawed.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gem_flawed.json new file mode 100644 index 000000000..16ae197a5 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gem_flawed.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/infinity/gem_flawed" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gem_flawless.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gem_flawless.json new file mode 100644 index 000000000..67cb19d01 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/gem_flawless.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/infinity/gem_flawless" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/heavy_beam.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/heavy_beam.json new file mode 100644 index 000000000..8346ad408 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/heavy_beam.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/heavy_beam" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/ingot.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/ingot.json new file mode 100644 index 000000000..3e74b7f03 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/ingot.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/ingot" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/ingot_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/ingot_double.json new file mode 100644 index 000000000..ae5c6f72e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/ingot_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/material_sets/infinity/ingot", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/ingot_double" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/ingot_hot.json new file mode 100644 index 000000000..1632b9aaa --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/ingot_hot.json @@ -0,0 +1,9 @@ +{ + "parent": "gtceu:item/material_sets/infinity/ingot", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/ingot", + "layer3": "gtceu:item/material_sets/infinity/ingot_hot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/lens.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/lens.json new file mode 100644 index 000000000..85c0bd99a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/lens.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/infinity/lens" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/modular_shelling.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/modular_shelling.json new file mode 100644 index 000000000..3859179c2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/modular_shelling.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/modular_shelling" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/nugget.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/nugget.json new file mode 100644 index 000000000..5dc9c45b3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/nugget.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/nugget" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/plate.json new file mode 100644 index 000000000..e571adacb --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/plate.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/plate" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/plate_dense.json new file mode 100644 index 000000000..1cdf0df14 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/plate_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/plate_dense" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/plate_double.json new file mode 100644 index 000000000..39d0f49a8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/plate_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/material_sets/infinity/plate", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/plate_double" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/raw_ore.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/raw_ore.json new file mode 100644 index 000000000..4cee5e330 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/raw_ore.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/infinity/raw_ore", + "layer1": "gtceu:item/material_sets/infinity/raw_ore" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/ring.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/ring.json new file mode 100644 index 000000000..d4b86b86c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/ring.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/ring" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/rod.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/rod.json new file mode 100644 index 000000000..3dcc45388 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/rod.json @@ -0,0 +1,8 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/rod" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/rod_long.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/rod_long.json new file mode 100644 index 000000000..0d3b95f32 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/rod_long.json @@ -0,0 +1,8 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/rod_long" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/rotor.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/rotor.json new file mode 100644 index 000000000..394f5e9a9 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/rotor.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/rotor" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/round.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/round.json new file mode 100644 index 000000000..8f96b14ab --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/round.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/round" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/screw.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/screw.json new file mode 100644 index 000000000..191cce16e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/screw.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/screw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/shape_memory_foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/shape_memory_foil.json new file mode 100644 index 000000000..39657a9de --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/shape_memory_foil.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/infinity/shape_memory_foil" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/spring.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/spring.json new file mode 100644 index 000000000..e36117022 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/spring.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/spring" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/spring_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/spring_small.json new file mode 100644 index 000000000..7a1af42ac --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/spring_small.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/spring_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/tool_head_buzz_saw.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/tool_head_buzz_saw.json new file mode 100644 index 000000000..7ca422501 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/tool_head_buzz_saw.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/tool_head_buzz_saw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/tool_head_chainsaw.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/tool_head_chainsaw.json new file mode 100644 index 000000000..d9311bc9a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/tool_head_chainsaw.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/infinity/tool_head_chainsaw", + "layer1": "gtceu:item/material_sets/infinity/tool_head_chainsaw" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/tool_head_drill.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/tool_head_drill.json new file mode 100644 index 000000000..c64165c8f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/tool_head_drill.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/infinity/tool_head_drill", + "layer1": "gtceu:item/material_sets/infinity/tool_head_drill" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/tool_head_screwdriver.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/tool_head_screwdriver.json new file mode 100644 index 000000000..c29fbf46b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/tool_head_screwdriver.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/tool_head_screwdriver" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/tool_head_wire_cutter.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/tool_head_wire_cutter.json new file mode 100644 index 000000000..7fb74e97d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/tool_head_wire_cutter.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/infinity/tool_head_wirecutter" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/tool_head_wrench.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/tool_head_wrench.json new file mode 100644 index 000000000..254321400 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/tool_head_wrench.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/tool_head_wrench" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/turbine_blade.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/turbine_blade.json new file mode 100644 index 000000000..19d7785d2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/turbine_blade.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/infinity/turbine_blade" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/ultra_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/ultra_dense.json new file mode 100644 index 000000000..d36e03bf4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/ultra_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/ultradense_plate" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/wire_fine.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/wire_fine.json new file mode 100644 index 000000000..f6b4cbef6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/wire_fine.json @@ -0,0 +1,9 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/wire_fine", + "layer3": "gtceu:item/material_sets/dull/wire_fine_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/infinity/wire_spool.json b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/wire_spool.json new file mode 100644 index 000000000..5a905f0dd --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/infinity/wire_spool.json @@ -0,0 +1,9 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/infinity/wire_spool", + "layer3": "gtceu:item/material_sets/dull/wire_spool_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/bolt.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/bolt.json new file mode 100644 index 000000000..ee44fdfe4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/bolt.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/bolt", + "layer1": "gtceu:item/material_sets/magic/bolt_secondary", + "layer2": "gtceu:item/material_sets/magic/bolt_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/dust.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/dust.json new file mode 100644 index 000000000..80dee3061 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/dust.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/dust", + "layer1": "gtceu:item/material_sets/magic/dust_secondary", + "layer2": "gtceu:item/material_sets/magic/dust_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/dust_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/dust_small.json new file mode 100644 index 000000000..a4be87088 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/dust_small.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/dust_small", + "layer1": "gtceu:item/material_sets/magic/dust_small_secondary", + "layer2": "gtceu:item/material_sets/magic/dust_small_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/dust_tiny.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/dust_tiny.json new file mode 100644 index 000000000..673b2d253 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/dust_tiny.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/dust_tiny", + "layer1": "gtceu:item/material_sets/magic/dust_tiny_secondary", + "layer2": "gtceu:item/material_sets/magic/dust_tiny_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/foil.json new file mode 100644 index 000000000..1160deeae --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/foil.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/foil", + "layer1": "gtceu:item/material_sets/magic/foil_secondary", + "layer2": "gtceu:item/material_sets/magic/foil_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/gear.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/gear.json new file mode 100644 index 000000000..e597f873b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/gear.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/gear", + "layer1": "gtceu:item/material_sets/magic/gear_secondary", + "layer2": "gtceu:item/material_sets/magic/gear_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/gear_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/gear_small.json new file mode 100644 index 000000000..99bd8cca1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/gear_small.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/gear_small", + "layer1": "gtceu:item/material_sets/magic/gear_small_secondary", + "layer2": "gtceu:item/material_sets/magic/gear_small_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/ingot.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/ingot.json new file mode 100644 index 000000000..042ade59e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/ingot.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/ingot", + "layer1": "gtceu:item/material_sets/magic/ingot_secondary", + "layer2": "gtceu:item/material_sets/magic/ingot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/ingot_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/ingot_double.json new file mode 100644 index 000000000..3f11da2e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/ingot_double.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/ingot_double", + "layer1": "gtceu:item/material_sets/magic/ingot_double_secondary", + "layer2": "gtceu:item/material_sets/magic/ingot_double_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/ingot_hot.json new file mode 100644 index 000000000..e9ec24c61 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/ingot_hot.json @@ -0,0 +1,9 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/ingot", + "layer1": "gtceu:item/material_sets/magic/ingot_secondary", + "layer2": "gtceu:item/material_sets/magic/ingot_overlay", + "layer3": "gtceu:item/material_sets/metallic/ingot_hot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/nugget.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/nugget.json new file mode 100644 index 000000000..b634bf27c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/nugget.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/nugget", + "layer1": "gtceu:item/material_sets/magic/nugget_secondary", + "layer2": "gtceu:item/material_sets/magic/nugget_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/plate.json new file mode 100644 index 000000000..116a184ca --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/plate.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/plate", + "layer1": "gtceu:item/material_sets/magic/plate_secondary", + "layer2": "gtceu:item/material_sets/magic/plate_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/plate_dense.json new file mode 100644 index 000000000..5432eb1fc --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/plate_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/plate_dense", + "layer1": "gtceu:item/material_sets/magic/plate_dense_secondary", + "layer2": "gtceu:item/material_sets/magic/plate_dense_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/plate_double.json new file mode 100644 index 000000000..20600e177 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/plate_double.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/plate_double", + "layer1": "gtceu:item/material_sets/magic/plate_double_secondary", + "layer2": "gtceu:item/material_sets/magic/plate_double_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/ring.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/ring.json new file mode 100644 index 000000000..2c7477ac1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/ring.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/ring", + "layer1": "gtceu:item/material_sets/magic/ring_secondary", + "layer2": "gtceu:item/material_sets/magic/ring_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/rod.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/rod.json new file mode 100644 index 000000000..4d12f6f2b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/rod.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/rod", + "layer1": "gtceu:item/material_sets/magic/rod_secondary", + "layer2": "gtceu:item/material_sets/magic/rod_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/rod_long.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/rod_long.json new file mode 100644 index 000000000..f503360cc --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/rod_long.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/rod_long", + "layer1": "gtceu:item/material_sets/magic/rod_long_secondary", + "layer2": "gtceu:item/material_sets/magic/rod_long_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/rotor.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/rotor.json new file mode 100644 index 000000000..0f40bd619 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/rotor.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/rotor", + "layer1": "gtceu:item/material_sets/magic/rotor_secondary", + "layer2": "gtceu:item/material_sets/magic/rotor_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/round.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/round.json new file mode 100644 index 000000000..124f5c5f3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/round.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/round", + "layer1": "gtceu:item/material_sets/magic/round_secondary", + "layer2": "gtceu:item/material_sets/magic/round_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/screw.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/screw.json new file mode 100644 index 000000000..81750edec --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/screw.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/screw", + "layer1": "gtceu:item/material_sets/magic/screw_secondary", + "layer2": "gtceu:item/material_sets/magic/screw_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/spring.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/spring.json new file mode 100644 index 000000000..9ec19f58e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/spring.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/spring", + "layer1": "gtceu:item/material_sets/magic/spring_secondary", + "layer2": "gtceu:item/material_sets/magic/spring_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/spring_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/spring_small.json new file mode 100644 index 000000000..ad9212bc6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/spring_small.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/spring_small", + "layer1": "gtceu:item/material_sets/magic/spring_small_secondary", + "layer2": "gtceu:item/material_sets/magic/spring_small_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic/wire_fine.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic/wire_fine.json new file mode 100644 index 000000000..7c7a4005a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic/wire_fine.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic/wire_fine", + "layer1": "gtceu:item/material_sets/magic/wire_fine_secondary", + "layer2": "gtceu:item/material_sets/magic/wire_fine_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/ingot.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/ingot.json new file mode 100644 index 000000000..5d3ddbe67 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/ingot.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic_terra/ingot", + "layer1": "gtceu:item/material_sets/magic_terra/ingot_secondary", + "layer2": "gtceu:item/material_sets/magic_terra/ingot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/ingot_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/ingot_double.json new file mode 100644 index 000000000..987afd9a1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/ingot_double.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic_terra/ingot_double", + "layer1": "gtceu:item/material_sets/magic_terra/ingot_double_secondary", + "layer2": "gtceu:item/material_sets/magic_terra/ingot_double_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/ingot_hot.json new file mode 100644 index 000000000..312dfb2cf --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/ingot_hot.json @@ -0,0 +1,9 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic_terra/ingot", + "layer1": "gtceu:item/material_sets/magic_terra/ingot_secondary", + "layer2": "gtceu:item/material_sets/magic_terra/ingot_overlay", + "layer3": "gtceu:item/material_sets/metallic/ingot_hot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/nugget.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/nugget.json new file mode 100644 index 000000000..5c66d1e5b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/nugget.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic_terra/nugget", + "layer1": "gtceu:item/material_sets/magic_terra/nugget_secondary", + "layer2": "gtceu:item/material_sets/magic_terra/nugget_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/plate.json new file mode 100644 index 000000000..09739d0a6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/plate.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic_terra/plate", + "layer1": "gtceu:item/material_sets/magic_terra/plate_secondary", + "layer2": "gtceu:item/material_sets/magic_terra/plate_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/plate_dense.json new file mode 100644 index 000000000..b1a5faea9 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/plate_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic_terra/plate_dense", + "layer1": "gtceu:item/material_sets/magic_terra/plate_dense_secondary", + "layer2": "gtceu:item/material_sets/magic_terra/plate_dense_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/plate_double.json new file mode 100644 index 000000000..d08030e81 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/magic_terra/plate_double.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/magic_terra/plate_double", + "layer1": "gtceu:item/material_sets/magic_terra/plate_double_secondary", + "layer2": "gtceu:item/material_sets/magic_terra/plate_double_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/metallic/alve_foil_insulator.json b/src/main/resources/assets/gtceu/models/item/material_sets/metallic/alve_foil_insulator.json new file mode 100644 index 000000000..4194fb5dd --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/metallic/alve_foil_insulator.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/metallic/alve_foil_insulator", + "layer1": "gtceu:item/material_sets/metallic/alve_foil_insulator_secondary", + "layer2": "gtceu:item/material_sets/metallic/alve_foil_insulator_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/metallic/heavy_beam.json b/src/main/resources/assets/gtceu/models/item/material_sets/metallic/heavy_beam.json new file mode 100644 index 000000000..f878dfec6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/metallic/heavy_beam.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/metallic/heavy_beam", + "layer1": "gtceu:item/material_sets/metallic/heavy_beam_secondary", + "layer2": "gtceu:item/material_sets/metallic/heavy_beam_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/metallic/modular_shelling.json b/src/main/resources/assets/gtceu/models/item/material_sets/metallic/modular_shelling.json new file mode 100644 index 000000000..d35927c3e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/metallic/modular_shelling.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/metallic/modular_shelling", + "layer1": "gtceu:item/material_sets/metallic/modular_shelling_secondary", + "layer2": "gtceu:item/material_sets/metallic/modular_shelling_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/metallic/raw_ore_cubic.json b/src/main/resources/assets/gtceu/models/item/material_sets/metallic/raw_ore_cubic.json new file mode 100644 index 000000000..dae4bdb22 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/metallic/raw_ore_cubic.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/metallic/raw_ore_cubic", + "layer1": "gtceu:item/material_sets/metallic/raw_ore_cubic_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/metallic/shape_memory_foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/metallic/shape_memory_foil.json new file mode 100644 index 000000000..82868b633 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/metallic/shape_memory_foil.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/metallic/shape_memory_foil", + "layer1": "gtceu:item/material_sets/metallic/shape_memory_foil_secondary", + "layer2": "gtceu:item/material_sets/metallic/shape_memory_foil_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/metallic/ultra_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/metallic/ultra_dense.json new file mode 100644 index 000000000..f4c819b3b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/metallic/ultra_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/metallic/ultradense_plate", + "layer1": "gtceu:item/material_sets/metallic/ultradense_plate_secondary", + "layer2": "gtceu:item/material_sets/metallic/ultradense_plate_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/block.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/block.json new file mode 100644 index 000000000..aec70ed1d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/block.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/cube/tinted/all_0", + "textures": { + "all": "gtceu:item/material_sets/neutronite/block" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/bolt.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/bolt.json new file mode 100644 index 000000000..bc565d4f7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/bolt.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/bolt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/dust.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/dust.json new file mode 100644 index 000000000..5670b9b52 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/dust.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/dust" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/dust_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/dust_small.json new file mode 100644 index 000000000..44e5f6635 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/dust_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/dust_small" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/dust_tiny.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/dust_tiny.json new file mode 100644 index 000000000..bf7783eb6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/dust_tiny.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/dust_tiny" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/foil.json new file mode 100644 index 000000000..121923f75 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/foil.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/foil" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/frame_gt.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/frame_gt.json new file mode 100644 index 000000000..2f581d086 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/frame_gt.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:block/cube/tinted/all_0", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "all": "gtceu:item/material_sets/neutronite/frame_gt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/gear.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/gear.json new file mode 100644 index 000000000..030eafb70 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/gear.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/gear" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/gear_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/gear_small.json new file mode 100644 index 000000000..bae7ffbac --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/gear_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/gear_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/heavy_beam.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/heavy_beam.json new file mode 100644 index 000000000..4e784098c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/heavy_beam.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/heavy_beam" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/ingot.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/ingot.json new file mode 100644 index 000000000..7114d7fdb --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/ingot.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/ingot" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/ingot_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/ingot_double.json new file mode 100644 index 000000000..c26b9c264 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/ingot_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/ingot_double" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/ingot_hot.json new file mode 100644 index 000000000..3cce47f91 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/ingot_hot.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/ingot_hot" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/modular_shelling.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/modular_shelling.json new file mode 100644 index 000000000..40fe46b4b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/modular_shelling.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/modular_shelling" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/nugget.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/nugget.json new file mode 100644 index 000000000..4bd117a97 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/nugget.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/nugget" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/plate.json new file mode 100644 index 000000000..244b80ac2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/plate.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/plate" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/plate_dense.json new file mode 100644 index 000000000..6044c3b20 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/plate_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/plate_dense" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/plate_double.json new file mode 100644 index 000000000..0a3faaa35 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/plate_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/plate_double" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/ring.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/ring.json new file mode 100644 index 000000000..69a4219fa --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/ring.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/ring" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/rod.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/rod.json new file mode 100644 index 000000000..80a17a151 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/rod.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/rod" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/rod_long.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/rod_long.json new file mode 100644 index 000000000..614dc13ea --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/rod_long.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/rod_long" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/rotor.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/rotor.json new file mode 100644 index 000000000..1e148354a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/rotor.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/rotor" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/round.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/round.json new file mode 100644 index 000000000..554b1f068 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/round.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/round" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/screw.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/screw.json new file mode 100644 index 000000000..c64072555 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/screw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/screw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/spring.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/spring.json new file mode 100644 index 000000000..b49107d49 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/spring.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/spring" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/spring_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/spring_small.json new file mode 100644 index 000000000..041b00d31 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/spring_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/spring_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/tool_head_buzz_saw.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/tool_head_buzz_saw.json new file mode 100644 index 000000000..6d82a3473 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/tool_head_buzz_saw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/tool_head_buzz_saw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/tool_head_chainsaw.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/tool_head_chainsaw.json new file mode 100644 index 000000000..cd9bf9f8c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/tool_head_chainsaw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/tool_head_chainsaw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/tool_head_drill.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/tool_head_drill.json new file mode 100644 index 000000000..3163e05ee --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/tool_head_drill.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/tool_head_drill" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/tool_head_screwdriver.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/tool_head_screwdriver.json new file mode 100644 index 000000000..edddf95c9 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/tool_head_screwdriver.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/tool_head_screwdriver" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/tool_head_wirecutter.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/tool_head_wirecutter.json new file mode 100644 index 000000000..f60ae5683 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/tool_head_wirecutter.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/tool_head_wirecutter" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/tool_head_wrench.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/tool_head_wrench.json new file mode 100644 index 000000000..6c19a98ee --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/tool_head_wrench.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/tool_head_wrench" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/turbine_blade.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/turbine_blade.json new file mode 100644 index 000000000..91eb5d983 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/turbine_blade.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/turbine_blade" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/ultra_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/ultra_dense.json new file mode 100644 index 000000000..77bd879eb --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/ultra_dense.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/ultradense_plate" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/wire_fine.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/wire_fine.json new file mode 100644 index 000000000..9b36c959a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite/wire_fine.json @@ -0,0 +1,9 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronite/wire_fine", + "layer3": "gtceu:item/material_sets/neutronite/wire_fine_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/bolt.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/bolt.json new file mode 100644 index 000000000..dce978191 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/bolt.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/bolt", + "layer1": "gtceu:item/material_sets/neutronite/bolt_secondary", + "layer2": "gtceu:item/material_sets/neutronite/bolt_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/crushed.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/crushed.json new file mode 100644 index 000000000..657272372 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/crushed.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/crushed", + "layer1": "gtceu:item/material_sets/neutronite/crushed_secondary", + "layer2": "gtceu:item/material_sets/neutronite/crushed_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/crushed_purified.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/crushed_purified.json new file mode 100644 index 000000000..132328b0f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/crushed_purified.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/crushed_purified", + "layer1": "gtceu:item/material_sets/neutronite/crushed_purified_secondary" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/crushed_refined.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/crushed_refined.json new file mode 100644 index 000000000..18ee699c5 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/crushed_refined.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/crushed_refine", + "layer1": "gtceu:item/material_sets/neutronite/crushed_refined_secondary", + "layer2": "gtceu:item/material_sets/neutronite/crushed_refined_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/dust.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/dust.json new file mode 100644 index 000000000..3f183dac6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/dust.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/dust", + "layer1": "gtceu:item/material_sets/neutronite/dust_secondary" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/dust_impure.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/dust_impure.json new file mode 100644 index 000000000..29b16614c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/dust_impure.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/dust_impure", + "layer1": "gtceu:item/material_sets/neutronite/dust_impure_secondary", + "layer2": "gtceu:item/material_sets/neutronite/dust_impure_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/dust_pure.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/dust_pure.json new file mode 100644 index 000000000..2f5727344 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/dust_pure.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/dust_pure", + "layer1": "gtceu:item/material_sets/neutronite/dust_pure_secondary", + "layer2": "gtceu:item/material_sets/neutronite/dust_pure_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/dust_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/dust_small.json new file mode 100644 index 000000000..e6a161d17 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/dust_small.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/dust_small", + "layer1": "gtceu:item/material_sets/neutronite/dust_small_secondary" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/dust_tiny.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/dust_tiny.json new file mode 100644 index 000000000..7cf1adc9b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/dust_tiny.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/dust_tiny", + "layer1": "gtceu:item/material_sets/neutronite/dust_tiny_secondary" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/foil.json new file mode 100644 index 000000000..67d5cdd8e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/foil.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/foil", + "layer1": "gtceu:item/material_sets/neutronite/foil_secondary", + "layer2": "gtceu:item/material_sets/neutronite/foil_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gear.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gear.json new file mode 100644 index 000000000..96e9611c3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gear.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/gear", + "layer1": "gtceu:item/material_sets/neutronite/gear_secondary" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gear_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gear_small.json new file mode 100644 index 000000000..3a5ca2bdb --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gear_small.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/gear_small", + "layer1": "gtceu:item/material_sets/neutronite/gear_small_secondary" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gem.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gem.json new file mode 100644 index 000000000..a6fe5599f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gem.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/gem" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gem_chipped.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gem_chipped.json new file mode 100644 index 000000000..4ba40def3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gem_chipped.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/gem_chipped" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gem_exquisite.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gem_exquisite.json new file mode 100644 index 000000000..66d3626c4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gem_exquisite.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/gem_exquisite" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gem_flawed.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gem_flawed.json new file mode 100644 index 000000000..f09f5bb00 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gem_flawed.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/gem_flawed" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gem_flawless.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gem_flawless.json new file mode 100644 index 000000000..b4d329de6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/gem_flawless.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/gem_flawless" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/ingot.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/ingot.json new file mode 100644 index 000000000..cb4df1f8d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/ingot.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/ingot", + "layer1": "gtceu:item/material_sets/neutronite/ingot_secondary", + "layer2": "gtceu:item/material_sets/neutronite/ingot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/ingot_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/ingot_double.json new file mode 100644 index 000000000..174b498f8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/ingot_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/material_sets/neutronite/ingot", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/ingot_double", + "layer1": "gtceu:item/material_sets/neutronite/ingot_double_secondary", + "layer2": "gtceu:item/material_sets/neutronite/ingot_double_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/ingot_hot.json new file mode 100644 index 000000000..8068a5012 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/ingot_hot.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/material_sets/neutronite/ingot", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/ingot", + "layer1": "gtceu:item/material_sets/neutronite/ingot_secondary", + "layer2": "gtceu:item/material_sets/neutronite/ingot_hot_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/lens.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/lens.json new file mode 100644 index 000000000..28902d956 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/lens.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/lens" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/nugget.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/nugget.json new file mode 100644 index 000000000..eba6f995c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/nugget.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/nugget", + "layer1": "gtceu:item/material_sets/neutronite/nugget_secondary", + "layer2": "gtceu:item/material_sets/neutronite/nugget_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/plate.json new file mode 100644 index 000000000..2a0baa5b6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/plate.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/plate", + "layer1": "gtceu:item/material_sets/neutronite/plate_secondary", + "layer2": "gtceu:item/material_sets/neutronite/plate_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/plate_dense.json new file mode 100644 index 000000000..19c826384 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/plate_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/plate_dense", + "layer1": "gtceu:item/material_sets/neutronite/plate_dense_secondary", + "layer2": "gtceu:item/material_sets/neutronite/plate_dense_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/plate_double.json new file mode 100644 index 000000000..75846f462 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/plate_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/material_sets/neutronite/plate", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/plate_double", + "layer1": "gtceu:item/material_sets/neutronite/plate_double_secondary", + "layer2": "gtceu:item/material_sets/neutronite/plate_double_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/raw_ore.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/raw_ore.json new file mode 100644 index 000000000..a2d795df5 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/raw_ore.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/raw_ore", + "layer1": "gtceu:item/material_sets/neutronite/raw_ore_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/ring.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/ring.json new file mode 100644 index 000000000..951de48be --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/ring.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/ring", + "layer1": "gtceu:item/material_sets/neutronite/ring_secondary", + "layer2": "gtceu:item/material_sets/neutronite/ring_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/rod.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/rod.json new file mode 100644 index 000000000..7fd4f88ae --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/rod.json @@ -0,0 +1,8 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/rod", + "layer1": "gtceu:item/material_sets/neutronite/rod_secondary", + "layer2": "gtceu:item/material_sets/neutronite/rod_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/rod_long.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/rod_long.json new file mode 100644 index 000000000..894d5deb2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/rod_long.json @@ -0,0 +1,8 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/rod_long", + "layer1": "gtceu:item/material_sets/neutronite/rod_long_secondary", + "layer2": "gtceu:item/material_sets/neutronite/rod_long_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/rotor.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/rotor.json new file mode 100644 index 000000000..62fb5e9ac --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/rotor.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/rotor", + "layer1": "gtceu:item/material_sets/neutronite/rotor_secondary", + "layer2": "gtceu:item/material_sets/neutronite/rotor_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/round.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/round.json new file mode 100644 index 000000000..208db7543 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/round.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/round", + "layer1": "gtceu:item/material_sets/neutronite/round_secondary", + "layer2": "gtceu:item/material_sets/neutronite/round_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/screw.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/screw.json new file mode 100644 index 000000000..05559d302 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/screw.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/screw", + "layer1": "gtceu:item/material_sets/neutronite/screw_secondary", + "layer2": "gtceu:item/material_sets/neutronite/screw_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/spring.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/spring.json new file mode 100644 index 000000000..d56128623 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/spring.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/spring", + "layer1": "gtceu:item/material_sets/neutronite/spring_secondary", + "layer2": "gtceu:item/material_sets/neutronite/spring_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/spring_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/spring_small.json new file mode 100644 index 000000000..0cf3ce0d2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/spring_small.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/spring_small", + "layer1": "gtceu:item/material_sets/neutronite/spring_small_secondary", + "layer2": "gtceu:item/material_sets/neutronite/spring_small_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/tool_head_buzz_saw.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/tool_head_buzz_saw.json new file mode 100644 index 000000000..ca82208b1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/tool_head_buzz_saw.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/tool_head_buzz_saw", + "layer1": "gtceu:item/material_sets/neutronite/tool_head_buzz_saw_secondary", + "layer2": "gtceu:item/material_sets/neutronite/tool_head_buzz_saw_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/tool_head_chainsaw.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/tool_head_chainsaw.json new file mode 100644 index 000000000..aa48fd3ce --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/tool_head_chainsaw.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/tool_head_chainsaw", + "layer1": "gtceu:item/material_sets/neutronite/tool_head_chainsaw_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/tool_head_drill.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/tool_head_drill.json new file mode 100644 index 000000000..f0b5504d9 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/tool_head_drill.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/tool_head_drill", + "layer1": "gtceu:item/material_sets/neutronite/tool_head_drill_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/tool_head_screwdriver.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/tool_head_screwdriver.json new file mode 100644 index 000000000..9aebc6640 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/tool_head_screwdriver.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/tool_head_screwdriver", + "layer1": "gtceu:item/material_sets/neutronite/tool_head_screwdriver_secondary", + "layer2": "gtceu:item/material_sets/neutronite/tool_head_screwdriver_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/tool_head_wire_cutter.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/tool_head_wire_cutter.json new file mode 100644 index 000000000..9709f8ab2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/tool_head_wire_cutter.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/tool_head_wirecutter" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/tool_head_wrench.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/tool_head_wrench.json new file mode 100644 index 000000000..d75ceee65 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/tool_head_wrench.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/tool_head_wrench", + "layer1": "gtceu:item/material_sets/neutronite/tool_head_wrench_secondary", + "layer2": "gtceu:item/material_sets/neutronite/tool_head_wrench_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/turbine_blade.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/turbine_blade.json new file mode 100644 index 000000000..fcc6f7515 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/turbine_blade.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/turbine_blade", + "layer1": "gtceu:item/material_sets/neutronite/turbine_blade_secondary", + "layer2": "gtceu:item/material_sets/neutronite/turbine_blade_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/wire_fine.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/wire_fine.json new file mode 100644 index 000000000..21d1c200d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronite_old/wire_fine.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronite/wire_fine", + "layer1": "gtceu:item/material_sets/neutronite/wire_fine_secondary", + "layer2": "gtceu:item/material_sets/neutronite/wire_fine_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/block.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/block.json new file mode 100644 index 000000000..bb2efd67c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/block.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/cube/tinted/all_0", + "textures": { + "all": "gtceu:item/material_sets/neutronium/block" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/bolt.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/bolt.json new file mode 100644 index 000000000..16c557049 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/bolt.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/bolt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/dust.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/dust.json new file mode 100644 index 000000000..148be4b24 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/dust.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/dust" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/dust_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/dust_small.json new file mode 100644 index 000000000..8fc1d68ce --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/dust_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/dust_small" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/dust_tiny.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/dust_tiny.json new file mode 100644 index 000000000..bed523c60 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/dust_tiny.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/dust_tiny" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/foil.json new file mode 100644 index 000000000..be7ef4569 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/foil.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/foil" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/frame_gt.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/frame_gt.json new file mode 100644 index 000000000..7a6bd385d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/frame_gt.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:block/cube/tinted/all_0", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "all": "gtceu:item/material_sets/neutronium/frame_gt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/gear.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/gear.json new file mode 100644 index 000000000..2b7d82c4e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/gear.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/gear" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/gear_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/gear_small.json new file mode 100644 index 000000000..11d80c717 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/gear_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/gear_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/heavy_beam.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/heavy_beam.json new file mode 100644 index 000000000..a02a1e818 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/heavy_beam.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronium/heavy_beam" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/ingot.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/ingot.json new file mode 100644 index 000000000..5176ff7f2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/ingot.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/ingot" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/ingot_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/ingot_double.json new file mode 100644 index 000000000..9da81bdef --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/ingot_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/ingot_double" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/ingot_hot.json new file mode 100644 index 000000000..091ffcca8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/ingot_hot.json @@ -0,0 +1,9 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/ingot_hot", + "layer3": "gtceu:item/material_sets/voidspark/ingot_hot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/modular_shelling.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/modular_shelling.json new file mode 100644 index 000000000..9fde29437 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/modular_shelling.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronium/modular_shelling" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/nugget.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/nugget.json new file mode 100644 index 000000000..20edf3cd5 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/nugget.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/nugget" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/plate.json new file mode 100644 index 000000000..b97abde4f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/plate.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/plate" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/plate_dense.json new file mode 100644 index 000000000..37fdbee37 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/plate_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/plate_dense" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/plate_double.json new file mode 100644 index 000000000..2be168ebd --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/plate_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/plate_double" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/ring.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/ring.json new file mode 100644 index 000000000..5084bab97 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/ring.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/ring" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/rod.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/rod.json new file mode 100644 index 000000000..ba39e1d72 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/rod.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/rod" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/rod_long.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/rod_long.json new file mode 100644 index 000000000..6c1881b8e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/rod_long.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/rod_long" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/rotor.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/rotor.json new file mode 100644 index 000000000..334bf9598 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/rotor.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/rotor" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/round.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/round.json new file mode 100644 index 000000000..2c9135048 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/round.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/round" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/screw.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/screw.json new file mode 100644 index 000000000..577289a36 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/screw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/screw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/spring.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/spring.json new file mode 100644 index 000000000..42da6d51c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/spring.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/spring" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/spring_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/spring_small.json new file mode 100644 index 000000000..85bb71e8e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/spring_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/spring_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/tool_head_buzz_saw.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/tool_head_buzz_saw.json new file mode 100644 index 000000000..eb57196f2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/tool_head_buzz_saw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/tool_head_buzz_saw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/tool_head_chainsaw.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/tool_head_chainsaw.json new file mode 100644 index 000000000..3a5c68e85 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/tool_head_chainsaw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/tool_head_chainsaw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/tool_head_drill.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/tool_head_drill.json new file mode 100644 index 000000000..51da06d47 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/tool_head_drill.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/tool_head_drill" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/tool_head_screwdriver.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/tool_head_screwdriver.json new file mode 100644 index 000000000..347762c5d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/tool_head_screwdriver.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/tool_head_screwdriver" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/tool_head_wirecutter.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/tool_head_wirecutter.json new file mode 100644 index 000000000..de04a7667 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/tool_head_wirecutter.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/tool_head_wirecutter" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/tool_head_wrench.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/tool_head_wrench.json new file mode 100644 index 000000000..98c950b48 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/tool_head_wrench.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/tool_head_wrench" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/turbine_blade.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/turbine_blade.json new file mode 100644 index 000000000..776d10154 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/turbine_blade.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/turbine_blade" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/ultra_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/ultra_dense.json new file mode 100644 index 000000000..f6f0f945d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/ultra_dense.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/neutronium/ultradense_plate" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/wire_fine.json b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/wire_fine.json new file mode 100644 index 000000000..0bff59d59 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/neutronium/wire_fine.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/neutronium/wire_fine" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/alve_foil_insulator.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/alve_foil_insulator.json new file mode 100644 index 000000000..2ede53c99 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/alve_foil_insulator.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/alve_foil_insulator" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/block.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/block.json new file mode 100644 index 000000000..e60cfb00a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/block.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/cube/tinted/all_0", + "textures": { + "all": "gtceu:item/material_sets/nevramite/block" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/bolt.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/bolt.json new file mode 100644 index 000000000..f376ea4d4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/bolt.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/bolt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/dust.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/dust.json new file mode 100644 index 000000000..938f30341 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/dust.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/dust" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/dust_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/dust_small.json new file mode 100644 index 000000000..0aa3d6098 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/dust_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/dust_small" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/dust_tiny.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/dust_tiny.json new file mode 100644 index 000000000..0231bb7db --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/dust_tiny.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/dust_tiny" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/foil.json new file mode 100644 index 000000000..16dd79ce6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/foil.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/foil" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/frame_gt.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/frame_gt.json new file mode 100644 index 000000000..39e9d4954 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/frame_gt.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:block/cube/tinted/all_0", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "all": "gtceu:item/material_sets/nevramite/frame_gt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/gear.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/gear.json new file mode 100644 index 000000000..2e766f3cf --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/gear.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/gear" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/gear_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/gear_small.json new file mode 100644 index 000000000..1c6a52724 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/gear_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/gear_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/heavy_beam.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/heavy_beam.json new file mode 100644 index 000000000..0449e6f97 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/heavy_beam.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/heavy_beam" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/ingot.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/ingot.json new file mode 100644 index 000000000..d9eab6127 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/ingot.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/ingot" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/ingot_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/ingot_double.json new file mode 100644 index 000000000..1a42c2e96 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/ingot_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/ingot_double" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/ingot_hot.json new file mode 100644 index 000000000..f1105d2b3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/ingot_hot.json @@ -0,0 +1,9 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/ingot_hot", + "layer3": "gtceu:item/material_sets/voidspark/ingot_hot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/modular_shelling.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/modular_shelling.json new file mode 100644 index 000000000..b12976da1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/modular_shelling.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/modular_shelling" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/nugget.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/nugget.json new file mode 100644 index 000000000..8c76bb490 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/nugget.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/nugget" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/plasmites.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/plasmites.json new file mode 100644 index 000000000..6c17022b2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/plasmites.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/plasmites" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/plate.json new file mode 100644 index 000000000..1b3880107 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/plate.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/plate" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/plate_dense.json new file mode 100644 index 000000000..bf35a74bf --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/plate_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/plate_dense" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/plate_double.json new file mode 100644 index 000000000..3cd6fc5b2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/plate_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/plate_double" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/ring.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/ring.json new file mode 100644 index 000000000..a6e9947c7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/ring.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/ring" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/rod.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/rod.json new file mode 100644 index 000000000..7dea52c87 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/rod.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/rod" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/rod_long.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/rod_long.json new file mode 100644 index 000000000..7de4d3cd6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/rod_long.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/rod_long" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/rotor.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/rotor.json new file mode 100644 index 000000000..c6bfb1e85 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/rotor.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/rotor" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/round.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/round.json new file mode 100644 index 000000000..6b25d0bca --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/round.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/round" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/screw.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/screw.json new file mode 100644 index 000000000..dde9ff560 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/screw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/screw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/shape_memory_foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/shape_memory_foil.json new file mode 100644 index 000000000..0649304b5 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/shape_memory_foil.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/shape_memory_foil" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/spring.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/spring.json new file mode 100644 index 000000000..8099f8b6e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/spring.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/spring" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/spring_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/spring_small.json new file mode 100644 index 000000000..a6d930c8e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/spring_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/spring_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/tool_head_buzz_saw.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/tool_head_buzz_saw.json new file mode 100644 index 000000000..80f63cf90 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/tool_head_buzz_saw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/tool_head_buzz_saw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/tool_head_chainsaw.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/tool_head_chainsaw.json new file mode 100644 index 000000000..d39c216fe --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/tool_head_chainsaw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/tool_head_chainsaw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/tool_head_drill.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/tool_head_drill.json new file mode 100644 index 000000000..b8ace5a71 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/tool_head_drill.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/tool_head_drill" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/tool_head_screwdriver.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/tool_head_screwdriver.json new file mode 100644 index 000000000..eee9e5b92 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/tool_head_screwdriver.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/tool_head_screwdriver" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/tool_head_wirecutter.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/tool_head_wirecutter.json new file mode 100644 index 000000000..149e4075c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/tool_head_wirecutter.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/tool_head_wirecutter" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/tool_head_wrench.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/tool_head_wrench.json new file mode 100644 index 000000000..40e96065d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/tool_head_wrench.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/tool_head_wrench" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/turbine_blade.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/turbine_blade.json new file mode 100644 index 000000000..30be463eb --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/turbine_blade.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/turbine_blade" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/ultra_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/ultra_dense.json new file mode 100644 index 000000000..57c358e83 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/ultra_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/ultradense_plate" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/wire_fine.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/wire_fine.json new file mode 100644 index 000000000..052f3586d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/wire_fine.json @@ -0,0 +1,9 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/wire_fine", + "layer3": "gtceu:item/material_sets/dull/wire_fine_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/wire_spool.json b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/wire_spool.json new file mode 100644 index 000000000..7381e9a34 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/nevramite/wire_spool.json @@ -0,0 +1,9 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/nevramite/wire_spool", + "layer3": "gtceu:item/material_sets/dull/wire_spool_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/shiny/alve_foil_insulator.json b/src/main/resources/assets/gtceu/models/item/material_sets/shiny/alve_foil_insulator.json new file mode 100644 index 000000000..b6891bd46 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/shiny/alve_foil_insulator.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/shiny/alve_foil_insulator", + "layer1": "gtceu:item/material_sets/shiny/alve_foil_insulator_secondary", + "layer2": "gtceu:item/material_sets/shiny/alve_foil_insulator_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/shiny/heavy_beam.json b/src/main/resources/assets/gtceu/models/item/material_sets/shiny/heavy_beam.json new file mode 100644 index 000000000..02e3859a0 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/shiny/heavy_beam.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/shiny/heavy_beam", + "layer1": "gtceu:item/material_sets/shiny/heavy_beam_secondary", + "layer2": "gtceu:item/material_sets/shiny/heavy_beam_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/shiny/modular_shelling.json b/src/main/resources/assets/gtceu/models/item/material_sets/shiny/modular_shelling.json new file mode 100644 index 000000000..bc4e57eda --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/shiny/modular_shelling.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/shiny/modular_shelling", + "layer1": "gtceu:item/material_sets/shiny/modular_shelling_secondary", + "layer2": "gtceu:item/material_sets/shiny/modular_shelling_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/shiny/raw_ore_cubic.json b/src/main/resources/assets/gtceu/models/item/material_sets/shiny/raw_ore_cubic.json new file mode 100644 index 000000000..bd8bf4055 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/shiny/raw_ore_cubic.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/shiny/raw_ore_cubic", + "layer1": "gtceu:item/material_sets/shiny/raw_ore_cubic_secondary", + "layer2": "gtceu:item/material_sets/shiny/raw_ore_cubic_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/shiny/shape_memory_foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/shiny/shape_memory_foil.json new file mode 100644 index 000000000..9797e12b5 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/shiny/shape_memory_foil.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/shiny/shape_memory_foil", + "layer1": "gtceu:item/material_sets/shiny/shape_memory_foil_secondary", + "layer2": "gtceu:item/material_sets/shiny/shape_memory_foil_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/shiny/ultra_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/shiny/ultra_dense.json new file mode 100644 index 000000000..e74d15546 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/shiny/ultra_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/shiny/ultradense_plate", + "layer1": "gtceu:item/material_sets/shiny/ultradense_plate_secondary", + "layer2": "gtceu:item/material_sets/shiny/ultradense_plate_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/block.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/block.json new file mode 100644 index 000000000..123bf394a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/block.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/cube/tinted/all_0", + "textures": { + "all": "gtceu:item/material_sets/sol/block" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/bolt.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/bolt.json new file mode 100644 index 000000000..3e2c80b30 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/bolt.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/bolt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/dust.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/dust.json new file mode 100644 index 000000000..70548b45f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/dust.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/dust" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/dust_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/dust_small.json new file mode 100644 index 000000000..4c117b8c8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/dust_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/dust_small" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/dust_tiny.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/dust_tiny.json new file mode 100644 index 000000000..dfbb4e1a8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/dust_tiny.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/dust_tiny" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/foil.json new file mode 100644 index 000000000..0506636c4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/foil.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/foil" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/frame_gt.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/frame_gt.json new file mode 100644 index 000000000..e78f4ec60 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/frame_gt.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:block/cube/tinted/all_0", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "all": "gtceu:item/material_sets/sol/frame_gt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/gear.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/gear.json new file mode 100644 index 000000000..071601a21 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/gear.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/gear" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/gear_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/gear_small.json new file mode 100644 index 000000000..46b3f41f9 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/gear_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/gear_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/heavy_beam.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/heavy_beam.json new file mode 100644 index 000000000..909b0b129 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/heavy_beam.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/heavy_beam" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/ingot.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/ingot.json new file mode 100644 index 000000000..a7b6f5e1d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/ingot.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/ingot" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/ingot_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/ingot_double.json new file mode 100644 index 000000000..77925542d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/ingot_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/ingot_double" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/ingot_hot.json new file mode 100644 index 000000000..4b7f4410e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/ingot_hot.json @@ -0,0 +1,9 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/ingot_hot", + "layer3": "gtceu:item/material_sets/voidspark/ingot_hot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/modular_shelling.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/modular_shelling.json new file mode 100644 index 000000000..df7fd1f97 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/modular_shelling.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/modular_shelling" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/nugget.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/nugget.json new file mode 100644 index 000000000..ae56872d2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/nugget.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/nugget" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/plasmites.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/plasmites.json new file mode 100644 index 000000000..fd386de26 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/plasmites.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/sol/plasmites" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/plate.json new file mode 100644 index 000000000..17e914480 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/plate.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/plate" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/plate_dense.json new file mode 100644 index 000000000..9c773469d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/plate_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/plate_dense" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/plate_double.json new file mode 100644 index 000000000..b5f559e43 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/plate_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/plate_double" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/ring.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/ring.json new file mode 100644 index 000000000..9690e46e5 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/ring.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/ring" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/rod.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/rod.json new file mode 100644 index 000000000..5bbc14a6d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/rod.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/rod" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/rod_long.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/rod_long.json new file mode 100644 index 000000000..f695c55d1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/rod_long.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/rod_long" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/rotor.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/rotor.json new file mode 100644 index 000000000..0e91d66fb --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/rotor.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/rotor" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/round.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/round.json new file mode 100644 index 000000000..703c7757d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/round.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/round" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/screw.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/screw.json new file mode 100644 index 000000000..e49272717 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/screw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/screw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/spring.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/spring.json new file mode 100644 index 000000000..4cb174170 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/spring.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/spring" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/spring_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/spring_small.json new file mode 100644 index 000000000..e66527a82 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/spring_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/spring_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/tool_head_buzz_saw.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/tool_head_buzz_saw.json new file mode 100644 index 000000000..b079418ff --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/tool_head_buzz_saw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/tool_head_buzz_saw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/tool_head_chainsaw.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/tool_head_chainsaw.json new file mode 100644 index 000000000..d0ea9bba6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/tool_head_chainsaw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/tool_head_chainsaw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/tool_head_drill.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/tool_head_drill.json new file mode 100644 index 000000000..81bfa2040 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/tool_head_drill.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/tool_head_drill" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/tool_head_screwdriver.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/tool_head_screwdriver.json new file mode 100644 index 000000000..6db38704f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/tool_head_screwdriver.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/tool_head_screwdriver" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/tool_head_wirecutter.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/tool_head_wirecutter.json new file mode 100644 index 000000000..541b48111 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/tool_head_wirecutter.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/tool_head_wirecutter" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/tool_head_wrench.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/tool_head_wrench.json new file mode 100644 index 000000000..5202923f0 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/tool_head_wrench.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/tool_head_wrench" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/turbine_blade.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/turbine_blade.json new file mode 100644 index 000000000..061d6fcf2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/turbine_blade.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/turbine_blade" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/ultra_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/ultra_dense.json new file mode 100644 index 000000000..016ee6b5e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/ultra_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/ultradense_plate" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/wire_fine.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/wire_fine.json new file mode 100644 index 000000000..e7899bf19 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/wire_fine.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/wire_fine" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/sol/wire_spool.json b/src/main/resources/assets/gtceu/models/item/material_sets/sol/wire_spool.json new file mode 100644 index 000000000..c94878fa8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/sol/wire_spool.json @@ -0,0 +1,9 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/sol/wire_spool", + "layer3": "gtceu:item/material_sets/sol/wire_spool_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/block.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/block.json new file mode 100644 index 000000000..5a0303911 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/block.json @@ -0,0 +1,6 @@ +{ + "parent": "gtceu:block/cube/tinted/all_0", + "textures": { + "all": "gtceu:item/material_sets/starmetal/block" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/bolt.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/bolt.json new file mode 100644 index 000000000..aba35ec3b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/bolt.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/bolt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/dust.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/dust.json new file mode 100644 index 000000000..ee4246302 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/dust.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/dust" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/dust_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/dust_small.json new file mode 100644 index 000000000..f61dd4339 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/dust_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/dust_small" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/dust_tiny.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/dust_tiny.json new file mode 100644 index 000000000..06621dde6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/dust_tiny.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/dust_tiny" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/foil.json new file mode 100644 index 000000000..0158eaea8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/foil.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/foil" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/frame_gt.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/frame_gt.json new file mode 100644 index 000000000..b1a34c4b5 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/frame_gt.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:block/cube/tinted/all_0", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "all": "gtceu:item/material_sets/starmetal/frame_gt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/gear.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/gear.json new file mode 100644 index 000000000..47889f67d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/gear.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/gear" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/gear_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/gear_small.json new file mode 100644 index 000000000..4e3ef72db --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/gear_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/gear_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/heavy_beam.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/heavy_beam.json new file mode 100644 index 000000000..73570b7eb --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/heavy_beam.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/heavy_beam" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/ingot.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/ingot.json new file mode 100644 index 000000000..371cc83e8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/ingot.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/ingot" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/ingot_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/ingot_double.json new file mode 100644 index 000000000..d4b04fe12 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/ingot_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/ingot_double" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/ingot_hot.json new file mode 100644 index 000000000..c538f2f51 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/ingot_hot.json @@ -0,0 +1,9 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/ingot_hot", + "layer3": "gtceu:item/material_sets/voidspark/ingot_hot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/modular_shelling.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/modular_shelling.json new file mode 100644 index 000000000..8f25945c7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/modular_shelling.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/modular_shelling" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/nugget.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/nugget.json new file mode 100644 index 000000000..d609f6814 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/nugget.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/nugget" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/plasmites.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/plasmites.json new file mode 100644 index 000000000..2cc0cd808 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/plasmites.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/plasmites" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/plate.json new file mode 100644 index 000000000..4b8d38c74 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/plate.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/plate" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/plate_dense.json new file mode 100644 index 000000000..9c8fb09d7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/plate_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/plate_dense" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/plate_double.json new file mode 100644 index 000000000..9750facb7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/plate_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/plate_double" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/ring.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/ring.json new file mode 100644 index 000000000..bfabd9705 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/ring.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/ring" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/rod.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/rod.json new file mode 100644 index 000000000..a2c8e3292 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/rod.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/rod" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/rod_long.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/rod_long.json new file mode 100644 index 000000000..58c982b78 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/rod_long.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/rod_long" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/rotor.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/rotor.json new file mode 100644 index 000000000..a9e428db7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/rotor.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/rotor" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/round.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/round.json new file mode 100644 index 000000000..4c23e79c8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/round.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/round" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/screw.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/screw.json new file mode 100644 index 000000000..23063bb3d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/screw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/screw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/spring.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/spring.json new file mode 100644 index 000000000..e225136a8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/spring.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/spring" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/spring_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/spring_small.json new file mode 100644 index 000000000..1c0ae4f1d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/spring_small.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/spring_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/tool_head_buzz_saw.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/tool_head_buzz_saw.json new file mode 100644 index 000000000..1e9adb908 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/tool_head_buzz_saw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/tool_head_buzz_saw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/tool_head_chainsaw.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/tool_head_chainsaw.json new file mode 100644 index 000000000..9aef105f9 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/tool_head_chainsaw.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/tool_head_chainsaw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/tool_head_drill.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/tool_head_drill.json new file mode 100644 index 000000000..2529c88c5 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/tool_head_drill.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/tool_head_drill" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/tool_head_screwdriver.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/tool_head_screwdriver.json new file mode 100644 index 000000000..9bde2e3af --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/tool_head_screwdriver.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/tool_head_screwdriver" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/tool_head_wirecutter.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/tool_head_wirecutter.json new file mode 100644 index 000000000..cd9268ad8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/tool_head_wirecutter.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/tool_head_wirecutter" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/tool_head_wrench.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/tool_head_wrench.json new file mode 100644 index 000000000..661cb2e14 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/tool_head_wrench.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/tool_head_wrench" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/turbine_blade.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/turbine_blade.json new file mode 100644 index 000000000..b96b59f35 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/turbine_blade.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/turbine_blade" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/ultra_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/ultra_dense.json new file mode 100644 index 000000000..4a15a2dca --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/ultra_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/ultradense_plate" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/wire_fine.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/wire_fine.json new file mode 100644 index 000000000..da1e6e752 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/wire_fine.json @@ -0,0 +1,9 @@ +{ + "parent": "gtceu:item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/wire_fine", + "layer3": "gtceu:item/material_sets/dull/wire_fine_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/wire_spool.json b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/wire_spool.json new file mode 100644 index 000000000..8ca80770c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/starmetal/wire_spool.json @@ -0,0 +1,9 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/starmetal/wire_spool", + "layer3": "gtceu:item/material_sets/dull/wire_spool_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/bolt.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/bolt.json new file mode 100644 index 000000000..437307af4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/bolt.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/bolt", + "layer1": "gtceu:item/material_sets/trinavine/bolt_secondary", + "layer2": "gtceu:item/material_sets/trinavine/bolt_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/crushed.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/crushed.json new file mode 100644 index 000000000..3a7708653 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/crushed.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/crushed", + "layer1": "gtceu:item/material_sets/trinavine/crushed_secondary", + "layer2": "gtceu:item/material_sets/trinavine/crushed_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/crushed_purified.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/crushed_purified.json new file mode 100644 index 000000000..06f5789fe --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/crushed_purified.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/crushed_purified", + "layer1": "gtceu:item/material_sets/trinavine/crushed_purified_secondary" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/crushed_refined.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/crushed_refined.json new file mode 100644 index 000000000..f1963793a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/crushed_refined.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/crushed_refine", + "layer1": "gtceu:item/material_sets/trinavine/crushed_refined_secondary", + "layer2": "gtceu:item/material_sets/trinavine/crushed_refined_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/dust.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/dust.json new file mode 100644 index 000000000..7ffa3527c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/dust.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/dust", + "layer1": "gtceu:item/material_sets/trinavine/dust_secondary" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/dust_impure.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/dust_impure.json new file mode 100644 index 000000000..a167f29c7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/dust_impure.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/dust_impure", + "layer1": "gtceu:item/material_sets/trinavine/dust_impure_secondary", + "layer2": "gtceu:item/material_sets/trinavine/dust_impure_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/dust_pure.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/dust_pure.json new file mode 100644 index 000000000..68008157f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/dust_pure.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/dust_pure", + "layer1": "gtceu:item/material_sets/trinavine/dust_pure_secondary", + "layer2": "gtceu:item/material_sets/trinavine/dust_pure_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/dust_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/dust_small.json new file mode 100644 index 000000000..6480d46df --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/dust_small.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/dust_small", + "layer1": "gtceu:item/material_sets/trinavine/dust_small_secondary" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/dust_tiny.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/dust_tiny.json new file mode 100644 index 000000000..a9a5085ce --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/dust_tiny.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/dust_tiny", + "layer1": "gtceu:item/material_sets/trinavine/dust_tiny_secondary" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/foil.json new file mode 100644 index 000000000..129a42149 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/foil.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/foil", + "layer1": "gtceu:item/material_sets/trinavine/foil_secondary", + "layer2": "gtceu:item/material_sets/trinavine/foil_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gear.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gear.json new file mode 100644 index 000000000..713296902 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gear.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/gear", + "layer1": "gtceu:item/material_sets/trinavine/gear_secondary" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gear_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gear_small.json new file mode 100644 index 000000000..1870e9418 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gear_small.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/gear_small", + "layer1": "gtceu:item/material_sets/trinavine/gear_small_secondary" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gem.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gem.json new file mode 100644 index 000000000..558e1f501 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gem.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/gem" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gem_chipped.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gem_chipped.json new file mode 100644 index 000000000..14579138f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gem_chipped.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/gem_chipped" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gem_exquisite.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gem_exquisite.json new file mode 100644 index 000000000..aca816661 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gem_exquisite.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/gem_exquisite" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gem_flawed.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gem_flawed.json new file mode 100644 index 000000000..db7f381d4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gem_flawed.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/gem_flawed" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gem_flawless.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gem_flawless.json new file mode 100644 index 000000000..28fdb7ab7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/gem_flawless.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/gem_flawless" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/heavy_beam.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/heavy_beam.json new file mode 100644 index 000000000..9860e5e65 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/heavy_beam.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/heavy_beam" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/ingot.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/ingot.json new file mode 100644 index 000000000..eebfcf8b2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/ingot.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/ingot", + "layer1": "gtceu:item/material_sets/trinavine/ingot_secondary", + "layer2": "gtceu:item/material_sets/trinavine/ingot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/ingot_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/ingot_double.json new file mode 100644 index 000000000..cd682e7d9 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/ingot_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/material_sets/trinavine/ingot", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/ingot_double", + "layer1": "gtceu:item/material_sets/trinavine/ingot_double_secondary", + "layer2": "gtceu:item/material_sets/trinavine/ingot_double_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/ingot_hot.json new file mode 100644 index 000000000..c6ce88543 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/ingot_hot.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/material_sets/trinavine/ingot", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/ingot", + "layer1": "gtceu:item/material_sets/trinavine/ingot_secondary", + "layer2": "gtceu:item/material_sets/trinavine/ingot_hot_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/lens.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/lens.json new file mode 100644 index 000000000..c2d694dce --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/lens.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/lens" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/modular_shelling.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/modular_shelling.json new file mode 100644 index 000000000..f112a1c68 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/modular_shelling.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/modular_shelling" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/nugget.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/nugget.json new file mode 100644 index 000000000..f4de57a50 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/nugget.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/nugget", + "layer1": "gtceu:item/material_sets/trinavine/nugget_secondary", + "layer2": "gtceu:item/material_sets/trinavine/nugget_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/plate.json new file mode 100644 index 000000000..fbc2cbc43 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/plate.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/plate", + "layer1": "gtceu:item/material_sets/trinavine/plate_secondary", + "layer2": "gtceu:item/material_sets/trinavine/plate_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/plate_dense.json new file mode 100644 index 000000000..2220d102a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/plate_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/plate_dense", + "layer1": "gtceu:item/material_sets/trinavine/plate_dense_secondary", + "layer2": "gtceu:item/material_sets/trinavine/plate_dense_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/plate_double.json new file mode 100644 index 000000000..146763950 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/plate_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/material_sets/trinavine/plate", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/plate_double", + "layer1": "gtceu:item/material_sets/trinavine/plate_double_secondary", + "layer2": "gtceu:item/material_sets/trinavine/plate_double_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/raw_ore.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/raw_ore.json new file mode 100644 index 000000000..f6d675fe7 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/raw_ore.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/raw_ore", + "layer1": "gtceu:item/material_sets/trinavine/raw_ore_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/ring.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/ring.json new file mode 100644 index 000000000..07fe96f4f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/ring.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/ring", + "layer1": "gtceu:item/material_sets/trinavine/ring_secondary", + "layer2": "gtceu:item/material_sets/trinavine/ring_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/rod.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/rod.json new file mode 100644 index 000000000..93bad6574 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/rod.json @@ -0,0 +1,8 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/rod", + "layer1": "gtceu:item/material_sets/trinavine/rod_secondary", + "layer2": "gtceu:item/material_sets/trinavine/rod_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/rod_long.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/rod_long.json new file mode 100644 index 000000000..b92906730 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/rod_long.json @@ -0,0 +1,8 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/rod_long", + "layer1": "gtceu:item/material_sets/trinavine/rod_long_secondary", + "layer2": "gtceu:item/material_sets/trinavine/rod_long_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/rotor.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/rotor.json new file mode 100644 index 000000000..4a3904547 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/rotor.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/rotor", + "layer1": "gtceu:item/material_sets/trinavine/rotor_secondary", + "layer2": "gtceu:item/material_sets/trinavine/rotor_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/round.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/round.json new file mode 100644 index 000000000..ff139eb4c --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/round.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/round", + "layer1": "gtceu:item/material_sets/trinavine/round_secondary", + "layer2": "gtceu:item/material_sets/trinavine/round_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/screw.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/screw.json new file mode 100644 index 000000000..9f8c675c8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/screw.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/screw", + "layer1": "gtceu:item/material_sets/trinavine/screw_secondary", + "layer2": "gtceu:item/material_sets/trinavine/screw_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/spring.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/spring.json new file mode 100644 index 000000000..34c7f9173 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/spring.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/spring", + "layer1": "gtceu:item/material_sets/trinavine/spring_secondary", + "layer2": "gtceu:item/material_sets/trinavine/spring_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/spring_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/spring_small.json new file mode 100644 index 000000000..8b3156d4b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/spring_small.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/spring_small", + "layer1": "gtceu:item/material_sets/trinavine/spring_small_secondary", + "layer2": "gtceu:item/material_sets/trinavine/spring_small_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/tool_head_buzz_saw.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/tool_head_buzz_saw.json new file mode 100644 index 000000000..11ab0942f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/tool_head_buzz_saw.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/tool_head_buzz_saw", + "layer1": "gtceu:item/material_sets/trinavine/tool_head_buzz_saw_secondary", + "layer2": "gtceu:item/material_sets/trinavine/tool_head_buzz_saw_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/tool_head_chainsaw.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/tool_head_chainsaw.json new file mode 100644 index 000000000..175e3844d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/tool_head_chainsaw.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/tool_head_chainsaw", + "layer1": "gtceu:item/material_sets/trinavine/tool_head_chainsaw_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/tool_head_drill.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/tool_head_drill.json new file mode 100644 index 000000000..4b9e5728b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/tool_head_drill.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/tool_head_drill", + "layer1": "gtceu:item/material_sets/trinavine/tool_head_drill_secondary" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/tool_head_screwdriver.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/tool_head_screwdriver.json new file mode 100644 index 000000000..b9f62ab87 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/tool_head_screwdriver.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/tool_head_screwdiver", + "layer1": "gtceu:item/material_sets/trinavine/tool_head_screwdiver_secondary", + "layer2": "gtceu:item/material_sets/trinavine/tool_head_screwdriver_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/tool_head_wire_cutter.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/tool_head_wire_cutter.json new file mode 100644 index 000000000..94ca2a992 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/tool_head_wire_cutter.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/tool_head_wirecutter" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/tool_head_wrench.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/tool_head_wrench.json new file mode 100644 index 000000000..6946c402e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/tool_head_wrench.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/tool_head_wrench", + "layer1": "gtceu:item/material_sets/trinavine/tool_head_wrench_secondary", + "layer2": "gtceu:item/material_sets/trinavine/tool_head_wrench_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/turbine_blade.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/turbine_blade.json new file mode 100644 index 000000000..4a61b87bd --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/turbine_blade.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/turbine_blade" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/ultra_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/ultra_dense.json new file mode 100644 index 000000000..94a324a11 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/ultra_dense.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/ultradense_plate" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/wire_fine.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/wire_fine.json new file mode 100644 index 000000000..7394cc392 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/wire_fine.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/wire_fine", + "layer1": "gtceu:item/material_sets/trinavine/wire_fine_secondary", + "layer2": "gtceu:item/material_sets/trinavine/wire_fine_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/wire_spool.json b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/wire_spool.json new file mode 100644 index 000000000..1852aa791 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/trinavine/wire_spool.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/trinavine/wire_spool", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/dull/wire_spool_overlay" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/bolt.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/bolt.json new file mode 100644 index 000000000..39523842e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/bolt.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/bolt" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/crushed.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/crushed.json new file mode 100644 index 000000000..18cef2cee --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/crushed.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/crushed" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/crushed_purified.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/crushed_purified.json new file mode 100644 index 000000000..69cf92c6f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/crushed_purified.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/voidspark/crushed_purified", + "layer1": "gtceu:item/material_sets/voidspark/crushed_purified" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/crushed_refined.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/crushed_refined.json new file mode 100644 index 000000000..aee427b28 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/crushed_refined.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/crushed_refined" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/dust.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/dust.json new file mode 100644 index 000000000..d41213a43 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/dust.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/dust" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/dust_impure.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/dust_impure.json new file mode 100644 index 000000000..e1e098763 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/dust_impure.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/dust_impure" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/dust_pure.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/dust_pure.json new file mode 100644 index 000000000..9b549f121 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/dust_pure.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/dust_pure" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/dust_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/dust_small.json new file mode 100644 index 000000000..9b4cedd09 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/dust_small.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/dust_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/dust_tiny.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/dust_tiny.json new file mode 100644 index 000000000..eff8fc503 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/dust_tiny.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/dust_tiny" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/foil.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/foil.json new file mode 100644 index 000000000..b5147cae4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/foil.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/foil" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gear.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gear.json new file mode 100644 index 000000000..bc793db26 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gear.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/gear" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gear_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gear_small.json new file mode 100644 index 000000000..821df872a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gear_small.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/gear_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gem.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gem.json new file mode 100644 index 000000000..1628c8a5b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gem.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/voidspark/gem" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gem_chipped.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gem_chipped.json new file mode 100644 index 000000000..105fb8a5e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gem_chipped.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/voidspark/gem_chipped" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gem_exquisite.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gem_exquisite.json new file mode 100644 index 000000000..0856191c0 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gem_exquisite.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/voidspark/gem_exquisite" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gem_flawed.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gem_flawed.json new file mode 100644 index 000000000..4b9b6b182 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gem_flawed.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/voidspark/gem_flawed" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gem_flawless.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gem_flawless.json new file mode 100644 index 000000000..ce07344b6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/gem_flawless.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/voidspark/gem_flawless" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/heavy_beam.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/heavy_beam.json new file mode 100644 index 000000000..abac0fdfe --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/heavy_beam.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/heavy_beam" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/ingot.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/ingot.json new file mode 100644 index 000000000..2a1892796 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/ingot.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/ingot" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/ingot_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/ingot_double.json new file mode 100644 index 000000000..7f389fee8 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/ingot_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/material_sets/voidspark/ingot", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/ingot_double" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/ingot_hot.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/ingot_hot.json new file mode 100644 index 000000000..0e473de54 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/ingot_hot.json @@ -0,0 +1,9 @@ +{ + "parent": "gtceu:item/material_sets/voidspark/ingot", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/ingot", + "layer3": "gtceu:item/material_sets/voidspark/ingot_hot_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/lens.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/lens.json new file mode 100644 index 000000000..dc584453b --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/lens.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/voidspark/lens" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/modular_shelling.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/modular_shelling.json new file mode 100644 index 000000000..373403a68 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/modular_shelling.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/modular_shelling" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/nugget.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/nugget.json new file mode 100644 index 000000000..e0476a9af --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/nugget.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/nugget" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/plate.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/plate.json new file mode 100644 index 000000000..7f2e710e6 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/plate.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/plate" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/plate_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/plate_dense.json new file mode 100644 index 000000000..c95ae8242 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/plate_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/plate_dense" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/plate_double.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/plate_double.json new file mode 100644 index 000000000..ecc61bd34 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/plate_double.json @@ -0,0 +1,8 @@ +{ + "parent": "gtceu:item/material_sets/voidspark/plate", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/plate_double" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/raw_ore.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/raw_ore.json new file mode 100644 index 000000000..04bdf9609 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/raw_ore.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/voidspark/raw_ore", + "layer1": "gtceu:item/material_sets/voidspark/raw_ore" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/ring.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/ring.json new file mode 100644 index 000000000..2c7215e12 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/ring.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/ring" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/rod.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/rod.json new file mode 100644 index 000000000..e301441fb --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/rod.json @@ -0,0 +1,8 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/rod" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/rod_long.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/rod_long.json new file mode 100644 index 000000000..99022c2a0 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/rod_long.json @@ -0,0 +1,8 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/rod_long" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/rotor.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/rotor.json new file mode 100644 index 000000000..38b4784d3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/rotor.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/rotor" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/round.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/round.json new file mode 100644 index 000000000..f6b919679 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/round.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/round" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/screw.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/screw.json new file mode 100644 index 000000000..6f3081ca1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/screw.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/screw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/spring.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/spring.json new file mode 100644 index 000000000..351c0fc64 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/spring.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/spring" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/spring_small.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/spring_small.json new file mode 100644 index 000000000..52f911e1a --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/spring_small.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/spring_small" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/tool_head_buzz_saw.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/tool_head_buzz_saw.json new file mode 100644 index 000000000..05467f6b2 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/tool_head_buzz_saw.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/tool_head_buzz_saw" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/tool_head_chainsaw.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/tool_head_chainsaw.json new file mode 100644 index 000000000..056a5fda1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/tool_head_chainsaw.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/voidspark/tool_head_chainsaw", + "layer1": "gtceu:item/material_sets/voidspark/tool_head_chainsaw" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/tool_head_drill.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/tool_head_drill.json new file mode 100644 index 000000000..1ade559af --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/tool_head_drill.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/voidspark/tool_head_drill", + "layer1": "gtceu:item/material_sets/voidspark/tool_head_drill" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/tool_head_screwdriver.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/tool_head_screwdriver.json new file mode 100644 index 000000000..b7c56eb49 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/tool_head_screwdriver.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/tool_head_screwdriver" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/tool_head_wire_cutter.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/tool_head_wire_cutter.json new file mode 100644 index 000000000..3416c5af4 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/tool_head_wire_cutter.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/voidspark/tool_head_wirecutter" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/tool_head_wrench.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/tool_head_wrench.json new file mode 100644 index 000000000..2361b97b3 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/tool_head_wrench.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/tool_head_wrench" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/turbine_blade.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/turbine_blade.json new file mode 100644 index 000000000..5ec5b71f1 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/turbine_blade.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/material_sets/voidspark/turbine_blade" + } +} diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/ultra_dense.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/ultra_dense.json new file mode 100644 index 000000000..38785d09d --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/ultra_dense.json @@ -0,0 +1,8 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/ultradense_plate" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/wire_fine.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/wire_fine.json new file mode 100644 index 000000000..3e058a864 --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/wire_fine.json @@ -0,0 +1,9 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/wire_fine", + "layer3": "gtceu:item/material_sets/dull/wire_fine_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/wire_spool.json b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/wire_spool.json new file mode 100644 index 000000000..bbb7fc87e --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/material_sets/voidspark/wire_spool.json @@ -0,0 +1,9 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "gtceu:item/void", + "layer1": "gtceu:item/void", + "layer2": "gtceu:item/material_sets/voidspark/wire_spool", + "layer3": "gtceu:item/material_sets/dull/wire_spool_overlay" + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/models/item/tools/luv_meld_tool.json b/src/main/resources/assets/gtceu/models/item/tools/luv_meld_tool.json new file mode 100644 index 000000000..89b0fd58f --- /dev/null +++ b/src/main/resources/assets/gtceu/models/item/tools/luv_meld_tool.json @@ -0,0 +1,18 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "gtceu:item/tools/meld" + }, + "display": { + "thirdperson_righthand": { + "rotation": [0, -90, 55], + "translation": [0, -1, -3.25], + "scale": [0.85, 0.85, 0.85] + }, + "thirdperson_lefthand": { + "rotation": [0, -90, -55], + "translation": [0, -1, -3.25], + "scale": [0.85, 0.85, 0.85] + } + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/generators/naquahine_mini_reactor/overlay_back.png b/src/main/resources/assets/gtceu/textures/block/generators/naquahine_mini_reactor/overlay_back.png new file mode 100644 index 000000000..19332dc92 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/generators/naquahine_mini_reactor/overlay_back.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/generators/naquahine_mini_reactor/overlay_back_active.png b/src/main/resources/assets/gtceu/textures/block/generators/naquahine_mini_reactor/overlay_back_active.png new file mode 100644 index 000000000..aa7d6b386 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/generators/naquahine_mini_reactor/overlay_back_active.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/generators/naquahine_mini_reactor/overlay_side.png b/src/main/resources/assets/gtceu/textures/block/generators/naquahine_mini_reactor/overlay_side.png new file mode 100644 index 000000000..19332dc92 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/generators/naquahine_mini_reactor/overlay_side.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/generators/naquahine_mini_reactor/overlay_side_active.png b/src/main/resources/assets/gtceu/textures/block/generators/naquahine_mini_reactor/overlay_side_active.png new file mode 100644 index 000000000..aa7d6b386 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/generators/naquahine_mini_reactor/overlay_side_active.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/generators/naquahine_mini_reactor/overlay_top.png b/src/main/resources/assets/gtceu/textures/block/generators/naquahine_mini_reactor/overlay_top.png new file mode 100644 index 000000000..98e8dccda Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/generators/naquahine_mini_reactor/overlay_top.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/generators/naquahine_mini_reactor/overlay_top_active.png b/src/main/resources/assets/gtceu/textures/block/generators/naquahine_mini_reactor/overlay_top_active.png new file mode 100644 index 000000000..13add8493 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/generators/naquahine_mini_reactor/overlay_top_active.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/chlorophyte/block.png b/src/main/resources/assets/gtceu/textures/block/material_sets/chlorophyte/block.png new file mode 100644 index 000000000..5b7835a5e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/chlorophyte/block.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/chlorophyte/frame_gt.png b/src/main/resources/assets/gtceu/textures/block/material_sets/chlorophyte/frame_gt.png new file mode 100644 index 000000000..a1cdf621d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/chlorophyte/frame_gt.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/block.png b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/block.png new file mode 100644 index 000000000..d456c5965 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/block.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/block_overlay.png b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/block_overlay.png new file mode 100644 index 000000000..baf443562 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/block_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/block_secondary.png b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/block_secondary.png new file mode 100644 index 000000000..6b7c18018 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/block_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/frame_gt.png b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/frame_gt.png new file mode 100644 index 000000000..d4ad8581b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/frame_gt.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/frame_gt_overlay.png b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/frame_gt_overlay.png new file mode 100644 index 000000000..bf82e85e4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/frame_gt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/frame_gt_secondary.png b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/frame_gt_secondary.png new file mode 100644 index 000000000..bf4df82cf Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/chonky/frame_gt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/block.png b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/block.png new file mode 100644 index 000000000..5492f0dfd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/block.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/block_overlay.png b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/block_overlay.png new file mode 100644 index 000000000..156bd6232 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/block_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/block_secondary.png b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/block_secondary.png new file mode 100644 index 000000000..26b264721 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/block_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/frame_gt.png b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/frame_gt.png new file mode 100644 index 000000000..ee8aa5b6b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/frame_gt.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/frame_gt_overlay.png b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/frame_gt_overlay.png new file mode 100644 index 000000000..7178b23cd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/frame_gt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/frame_gt_secondary.png b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/frame_gt_secondary.png new file mode 100644 index 000000000..abe137d0b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/crystal/frame_gt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/block.png b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/block.png new file mode 100644 index 000000000..9387193bb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/block.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/block.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/block.png.mcmeta new file mode 100644 index 000000000..9b47a9d6a --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/block.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": true, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/frame_gt.png b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/frame_gt.png new file mode 100644 index 000000000..df16fc207 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/frame_gt.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/frame_gt.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/frame_gt.png.mcmeta new file mode 100644 index 000000000..9b47a9d6a --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/frame_gt.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": true, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/wire.png b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/wire.png new file mode 100644 index 000000000..5dd83e89e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/wire.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/wire.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/wire.png.mcmeta new file mode 100644 index 000000000..9b47a9d6a --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/wire.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": true, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/wire_end.png b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/wire_end.png new file mode 100644 index 000000000..5dd83e89e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/wire_end.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/wire_end.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/wire_end.png.mcmeta new file mode 100644 index 000000000..9b47a9d6a --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/wire_end.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": true, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/wire_side.png b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/wire_side.png new file mode 100644 index 000000000..5dd83e89e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/wire_side.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/wire_side.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/wire_side.png.mcmeta new file mode 100644 index 000000000..9b47a9d6a --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/material_sets/infinity/wire_side.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": true, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/magic/block.png b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/block.png new file mode 100644 index 000000000..82232a5bd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/block.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/magic/block_overlay.png b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/block_overlay.png new file mode 100644 index 000000000..834a3b8b2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/block_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/magic/block_secondary.png b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/block_secondary.png new file mode 100644 index 000000000..97248af65 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/block_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/magic/frame_gt.png b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/frame_gt.png new file mode 100644 index 000000000..79692ec92 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/frame_gt.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/magic/frame_gt_overlay.png b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/frame_gt_overlay.png new file mode 100644 index 000000000..841d5b049 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/frame_gt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/magic/frame_gt_secondary.png b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/frame_gt_secondary.png new file mode 100644 index 000000000..76490fb4b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/magic/frame_gt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/block_down.png b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/block_down.png new file mode 100644 index 000000000..53ed12816 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/block_down.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/block_down.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/block_down.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/block_down.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/block_side.png b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/block_side.png new file mode 100644 index 000000000..ecb8085b1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/block_side.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/block_side.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/block_side.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/block_side.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/block_up.png b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/block_up.png new file mode 100644 index 000000000..7ecfed4e9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/block_up.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/block_up.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/block_up.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/block_up.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/frame_gt_down.png b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/frame_gt_down.png new file mode 100644 index 000000000..6b38d8f27 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/frame_gt_down.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/frame_gt_down.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/frame_gt_down.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/frame_gt_down.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/frame_gt_side.png b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/frame_gt_side.png new file mode 100644 index 000000000..d27d9382f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/frame_gt_side.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/frame_gt_side.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/frame_gt_side.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/frame_gt_side.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/frame_gt_up.png b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/frame_gt_up.png new file mode 100644 index 000000000..1e075f603 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/frame_gt_up.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/frame_gt_up.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/frame_gt_up.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/frame_gt_up.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/wire.png b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/wire.png new file mode 100644 index 000000000..90696fad0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/wire.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/wire.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/wire.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/wire.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/wire_end.png b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/wire_end.png new file mode 100644 index 000000000..8fb0ac426 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/wire_end.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/wire_end.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/wire_end.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/wire_end.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/wire_side.png b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/wire_side.png new file mode 100644 index 000000000..90696fad0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/wire_side.png differ diff --git a/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/wire_side.png.mcmeta b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/wire_side.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/block/material_sets/neutronite/wire_side.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/indestructible_fluid_cell/base.png b/src/main/resources/assets/gtceu/textures/item/indestructible_fluid_cell/base.png new file mode 100644 index 000000000..078af1e89 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/indestructible_fluid_cell/base.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/indestructible_fluid_cell/overlay.png b/src/main/resources/assets/gtceu/textures/item/indestructible_fluid_cell/overlay.png new file mode 100644 index 000000000..01ed41e09 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/indestructible_fluid_cell/overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/indestructible_fluid_cell/overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/indestructible_fluid_cell/overlay.png.mcmeta new file mode 100644 index 000000000..f13b90910 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/indestructible_fluid_cell/overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "frametime": 10, + "interpolate": true + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/alve_foil_insulator.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/alve_foil_insulator.png new file mode 100644 index 000000000..70b7494be Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/alve_foil_insulator.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/alve_foil_insulator_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/alve_foil_insulator_overlay.png new file mode 100644 index 000000000..146a0b56d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/alve_foil_insulator_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/alve_foil_insulator_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/alve_foil_insulator_secondary.png new file mode 100644 index 000000000..e508ab7b5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/alve_foil_insulator_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/heavy_beam.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/heavy_beam.png new file mode 100644 index 000000000..7da3a23e7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/heavy_beam.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/heavy_beam_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/heavy_beam_overlay.png new file mode 100644 index 000000000..86272d4af Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/heavy_beam_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/heavy_beam_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/heavy_beam_secondary.png new file mode 100644 index 000000000..f571aa25c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/heavy_beam_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/modular_shelling.png new file mode 100644 index 000000000..a6124a74e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/modular_shelling_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/modular_shelling_overlay.png new file mode 100644 index 000000000..64b7ee825 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/modular_shelling_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/modular_shelling_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/modular_shelling_secondary.png new file mode 100644 index 000000000..c0398c6d5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/modular_shelling_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/shape_memory_foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/shape_memory_foil.png new file mode 100644 index 000000000..9bf0be809 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/shape_memory_foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/shape_memory_foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/shape_memory_foil_overlay.png new file mode 100644 index 000000000..c2a4482e7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/shape_memory_foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/shape_memory_foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/shape_memory_foil_secondary.png new file mode 100644 index 000000000..5d0627d68 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/shape_memory_foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/ultradense_plate.png new file mode 100644 index 000000000..4bcfb79ed Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/ultradense_plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/ultradense_plate_overlay.png new file mode 100644 index 000000000..3586b7b8f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/ultradense_plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/bright/ultradense_plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/ultradense_plate_secondary.png new file mode 100644 index 000000000..6bb28753a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/bright/ultradense_plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/alve_foil_insulator.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/alve_foil_insulator.png new file mode 100644 index 000000000..3ec1366e3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/alve_foil_insulator.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/bolt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/bolt.png new file mode 100644 index 000000000..acfdf3929 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/bolt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/dust.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/dust.png new file mode 100644 index 000000000..8b616c994 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/dust.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/dust_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/dust_small.png new file mode 100644 index 000000000..a3ca7d580 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/dust_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/dust_tiny.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/dust_tiny.png new file mode 100644 index 000000000..fb6684451 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/dust_tiny.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/foil.png new file mode 100644 index 000000000..33719a87a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/gear.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/gear.png new file mode 100644 index 000000000..8f79425b5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/gear.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/gear_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/gear_small.png new file mode 100644 index 000000000..afc55daac Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/gear_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/heavy_beam.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/heavy_beam.png new file mode 100644 index 000000000..6641ab277 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/heavy_beam.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/ingot.png new file mode 100644 index 000000000..13f8ac962 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/ingot_hot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/ingot_hot.png new file mode 100644 index 000000000..379150feb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/ingot_hot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/modular_shelling.png new file mode 100644 index 000000000..a78028be1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/nugget.png new file mode 100644 index 000000000..5ec91689c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/plate.png new file mode 100644 index 000000000..55217de3f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/plate_dense.png new file mode 100644 index 000000000..45fc3579f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/plate_double.png new file mode 100644 index 000000000..11bbe02a2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/ring.png new file mode 100644 index 000000000..f0607dba2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/rod.png new file mode 100644 index 000000000..64043f5f7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/rod_long.png new file mode 100644 index 000000000..218a8929b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/rotor.png new file mode 100644 index 000000000..5829e7d67 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/round.png new file mode 100644 index 000000000..3a8029231 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/screw.png new file mode 100644 index 000000000..1595de9f5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/shape_memory_foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/shape_memory_foil.png new file mode 100644 index 000000000..e6258359d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/shape_memory_foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/spring.png new file mode 100644 index 000000000..6e3689af7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/spring_small.png new file mode 100644 index 000000000..4ddbb1791 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/turbine_blade.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/turbine_blade.png new file mode 100644 index 000000000..b233b0720 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/turbine_blade.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/ultradense_plate.png new file mode 100644 index 000000000..31828ccb8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/wire_fine.png new file mode 100644 index 000000000..a6163b5ae Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/wire_fine_overlay.png new file mode 100644 index 000000000..4677e9060 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/wire_spool.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/wire_spool.png new file mode 100644 index 000000000..acc85c6e4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/wire_spool.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/wire_spool_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/wire_spool_overlay.png new file mode 100644 index 000000000..060dbb9b3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chlorophyte/wire_spool_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/modular_shelling.png new file mode 100644 index 000000000..5e71e2053 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/modular_shelling_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/modular_shelling_overlay.png new file mode 100644 index 000000000..a9630b3ff Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/modular_shelling_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/modular_shelling_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/modular_shelling_secondary.png new file mode 100644 index 000000000..484c0636d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/modular_shelling_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/nugget.png new file mode 100644 index 000000000..2950dd58f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/nugget_overlay.png new file mode 100644 index 000000000..2012f8c33 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/nugget_secondary.png new file mode 100644 index 000000000..8a2166461 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate.png new file mode 100644 index 000000000..c5852b31f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_dense.png new file mode 100644 index 000000000..f402c662d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_dense_overlay.png new file mode 100644 index 000000000..881627b64 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_dense_secondary.png new file mode 100644 index 000000000..ec537401b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_double.png new file mode 100644 index 000000000..eb91a8825 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_double_overlay.png new file mode 100644 index 000000000..cc7c6e60a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_double_secondary.png new file mode 100644 index 000000000..df0a19900 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_overlay.png new file mode 100644 index 000000000..98bb6f503 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_secondary.png new file mode 100644 index 000000000..89211c946 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ring.png new file mode 100644 index 000000000..37fd22e4d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ring_overlay.png new file mode 100644 index 000000000..4cb2f1b8c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ring_secondary.png new file mode 100644 index 000000000..00c57fd32 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod.png new file mode 100644 index 000000000..7861a5568 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_long.png new file mode 100644 index 000000000..aac16b378 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_long_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_long_overlay.png new file mode 100644 index 000000000..bf3ff7771 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_long_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_long_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_long_secondary.png new file mode 100644 index 000000000..b36c0bb6c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_long_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_overlay.png new file mode 100644 index 000000000..9063b94be Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_secondary.png new file mode 100644 index 000000000..e77a57cb3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rod_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rotor.png new file mode 100644 index 000000000..12733d7d4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rotor_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rotor_overlay.png new file mode 100644 index 000000000..d567d4eb2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rotor_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rotor_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rotor_secondary.png new file mode 100644 index 000000000..d6bfa4c80 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/rotor_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/round.png new file mode 100644 index 000000000..b85f9e915 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/round_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/round_overlay.png new file mode 100644 index 000000000..05589c8cc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/round_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/round_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/round_secondary.png new file mode 100644 index 000000000..1c99631cd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/round_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/screw.png new file mode 100644 index 000000000..980f4e98a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/screw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/screw_overlay.png new file mode 100644 index 000000000..b287140b2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/screw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/screw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/screw_secondary.png new file mode 100644 index 000000000..d80e57b98 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/screw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/shape_memory_foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/shape_memory_foil.png new file mode 100644 index 000000000..a5a109d02 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/shape_memory_foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/shape_memory_foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/shape_memory_foil_overlay.png new file mode 100644 index 000000000..6ba863507 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/shape_memory_foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/shape_memory_foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/shape_memory_foil_secondary.png new file mode 100644 index 000000000..e2fb2caf4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/shape_memory_foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring.png new file mode 100644 index 000000000..c4c81adf0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_overlay.png new file mode 100644 index 000000000..53d28ec22 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_secondary.png new file mode 100644 index 000000000..f9d70dabc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_small.png new file mode 100644 index 000000000..a8975e211 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_small_overlay.png new file mode 100644 index 000000000..401a0972b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_small_secondary.png new file mode 100644 index 000000000..71fc8e5e7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/spring_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_buzz_saw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_buzz_saw.png new file mode 100644 index 000000000..9ef67bf86 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_buzz_saw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_buzz_saw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_buzz_saw_overlay.png new file mode 100644 index 000000000..bdae8fcf8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_buzz_saw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_buzz_saw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_buzz_saw_secondary.png new file mode 100644 index 000000000..485a43548 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_buzz_saw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_chainsaw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_chainsaw.png new file mode 100644 index 000000000..da3df1085 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_chainsaw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_chainsaw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_chainsaw_overlay.png new file mode 100644 index 000000000..4d2ba9f4d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_chainsaw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_chainsaw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_chainsaw_secondary.png new file mode 100644 index 000000000..03bbe678f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_chainsaw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_drill.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_drill.png new file mode 100644 index 000000000..a941ed464 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_drill.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_drill_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_drill_overlay.png new file mode 100644 index 000000000..97569c6c5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_drill_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_drill_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_drill_secondary.png new file mode 100644 index 000000000..5ebc3dcc4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_drill_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_screwdriver.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_screwdriver.png new file mode 100644 index 000000000..69e290f23 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_screwdriver.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_screwdriver_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_screwdriver_overlay.png new file mode 100644 index 000000000..ef831b9cc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_screwdriver_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_screwdriver_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_screwdriver_secondary.png new file mode 100644 index 000000000..78760659e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_screwdriver_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_wrench.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_wrench.png new file mode 100644 index 000000000..a3898bc25 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_wrench.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_wrench_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_wrench_overlay.png new file mode 100644 index 000000000..f26a211aa Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_wrench_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_wrench_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_wrench_secondary.png new file mode 100644 index 000000000..217cb691c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/tool_head_wrench_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/turbine_blade.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/turbine_blade.png new file mode 100644 index 000000000..46349c3c7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/turbine_blade.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/turbine_blade_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/turbine_blade_overlay.png new file mode 100644 index 000000000..74ffd68e7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/turbine_blade_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/turbine_blade_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/turbine_blade_secondary.png new file mode 100644 index 000000000..e1f7d5ff5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/turbine_blade_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ultradense_plate.png new file mode 100644 index 000000000..cae134466 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ultradense_plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ultradense_plate_overlay.png new file mode 100644 index 000000000..c19b76d4b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ultradense_plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ultradense_plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ultradense_plate_secondary.png new file mode 100644 index 000000000..0071301cd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/ultradense_plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_fine.png new file mode 100644 index 000000000..9dd582679 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_fine_overlay.png new file mode 100644 index 000000000..8cc50d44b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_fine_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_fine_secondary.png new file mode 100644 index 000000000..de7589ef7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_fine_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_spool.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_spool.png new file mode 100644 index 000000000..9e5bd8ad7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_spool.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_spool_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_spool_overlay.png new file mode 100644 index 000000000..bea2dd86d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_spool_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_spool_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_spool_secondary.png new file mode 100644 index 000000000..8b5da4665 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chonky/wire_spool_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator.png new file mode 100644 index 000000000..d79fcdf16 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_overlay.png new file mode 100644 index 000000000..181255fc0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_secondary.png new file mode 100644 index 000000000..9b46abae8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/alve_foil_insulator_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/blank.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/blank.png new file mode 100644 index 000000000..2f714f749 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/blank.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/blank.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/blank.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/blank.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt.png new file mode 100644 index 000000000..cd7d2ee45 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_overlay.png new file mode 100644 index 000000000..9be671def Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_secondary.png new file mode 100644 index 000000000..c56aad7d5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/bolt_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed.png new file mode 100644 index 000000000..4d8d41a90 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_overlay.png new file mode 100644 index 000000000..5d88a2220 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified.png new file mode 100644 index 000000000..4d8d41a90 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified_secondary.png new file mode 100644 index 000000000..5ae5fd624 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_purified_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined.png new file mode 100644 index 000000000..4d8d41a90 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_overlay.png new file mode 100644 index 000000000..71b79d3eb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_secondary.png new file mode 100644 index 000000000..5ae5fd624 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_refined_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_secondary.png new file mode 100644 index 000000000..5ae5fd624 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/crushed_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust.png new file mode 100644 index 000000000..48940ed7e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure.png new file mode 100644 index 000000000..48940ed7e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_overlay.png new file mode 100644 index 000000000..a5202ab2b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_secondary.png new file mode 100644 index 000000000..f3891bd86 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_impure_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure.png new file mode 100644 index 000000000..e10e135f3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_overlay.png new file mode 100644 index 000000000..798fa4c2b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_secondary.png new file mode 100644 index 000000000..a514bea98 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_pure_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_secondary.png new file mode 100644 index 000000000..f3891bd86 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small.png new file mode 100644 index 000000000..1d0d93421 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small_secondary.png new file mode 100644 index 000000000..9a9c897cc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_small_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny.png new file mode 100644 index 000000000..f966d6319 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny_secondary.png new file mode 100644 index 000000000..1b0250c69 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/dust_tiny_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil.png new file mode 100644 index 000000000..9dd5503c3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_overlay.png new file mode 100644 index 000000000..e63e561b9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_secondary.png new file mode 100644 index 000000000..96c242dbd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/foil_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed.png new file mode 100644 index 000000000..17342c37c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_overlay_glint.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_overlay_glint.png new file mode 100644 index 000000000..09ff111dc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_overlay_glint.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_overlay_glint.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_overlay_glint.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_overlay_glint.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_secondary.png new file mode 100644 index 000000000..a77e6353d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/frothed_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear.png new file mode 100644 index 000000000..39d181a83 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_overlay.png new file mode 100644 index 000000000..30607fe0c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_secondary.png new file mode 100644 index 000000000..5920418bf Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small.png new file mode 100644 index 000000000..59fa1ce69 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_overlay.png new file mode 100644 index 000000000..69dd3c233 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_secondary.png new file mode 100644 index 000000000..3a153aa37 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gear_small_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem.png new file mode 100644 index 000000000..24507da00 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped.png new file mode 100644 index 000000000..cf14f27e0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_overlay.png new file mode 100644 index 000000000..a0879c428 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_secondary.png new file mode 100644 index 000000000..229b3305c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_chipped_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed.png new file mode 100644 index 000000000..dc2a72d5b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_overlay.png new file mode 100644 index 000000000..4cca85812 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_secondary.png new file mode 100644 index 000000000..0d06a0fd9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawed_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless.png new file mode 100644 index 000000000..b12bf28e0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_overlay.png new file mode 100644 index 000000000..ad365b0c1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_secondary.png new file mode 100644 index 000000000..b200e4261 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_flawless_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_overlay.png new file mode 100644 index 000000000..49d236e64 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_secondary.png new file mode 100644 index 000000000..eb76dc79e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/gem_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/halo.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/halo.png new file mode 100644 index 000000000..bf419489a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/halo.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/halo.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/halo.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/halo.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam.png new file mode 100644 index 000000000..66cff4496 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_overlay.png new file mode 100644 index 000000000..61a360b8b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_secondary.png new file mode 100644 index 000000000..109428552 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/heavy_beam_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot.png new file mode 100644 index 000000000..fac2fdb8e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double.png new file mode 100644 index 000000000..6c65f6624 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_overlay.png new file mode 100644 index 000000000..7f326e556 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_secondary.png new file mode 100644 index 000000000..ef85a657b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_double_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot_secondary.png new file mode 100644 index 000000000..9f94e470f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_hot_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_overlay.png new file mode 100644 index 000000000..5368f6b23 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_secondary.png new file mode 100644 index 000000000..612a7c199 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ingot_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached.png new file mode 100644 index 000000000..c7aab6888 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached_secondary.png new file mode 100644 index 000000000..9107eb7e6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/leached_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens.png new file mode 100644 index 000000000..7c60bbcf2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_overlay.png new file mode 100644 index 000000000..2c2923d46 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_secondary.png new file mode 100644 index 000000000..b1a2a2c1c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/lens_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling.png new file mode 100644 index 000000000..6d2aecadf Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_overlay.png new file mode 100644 index 000000000..dd69984e4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_secondary.png new file mode 100644 index 000000000..8edd6e664 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/modular_shelling_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget.png new file mode 100644 index 000000000..83a1e5410 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_overlay.png new file mode 100644 index 000000000..321e5ea07 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_secondary.png new file mode 100644 index 000000000..092c5c1c3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/nugget_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plasmites.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plasmites.png new file mode 100644 index 000000000..5110a0d19 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plasmites.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plasmites.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plasmites.png.mcmeta new file mode 100644 index 000000000..6a199bf8f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plasmites.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate.png new file mode 100644 index 000000000..8350704f8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense.png new file mode 100644 index 000000000..36e476943 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_overlay.png new file mode 100644 index 000000000..41d349f33 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_secondary.png new file mode 100644 index 000000000..f23327429 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_dense_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double.png new file mode 100644 index 000000000..f9e11bc4a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_overlay.png new file mode 100644 index 000000000..ab1dd8879 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_secondary.png new file mode 100644 index 000000000..ce132685d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_double_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_overlay.png new file mode 100644 index 000000000..6224446d2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_secondary.png new file mode 100644 index 000000000..0a66304f1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/plate_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore.png new file mode 100644 index 000000000..ef47d8d30 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic.png new file mode 100644 index 000000000..c645cd70f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic_secondary.png new file mode 100644 index 000000000..745b94a91 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_cubic_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_secondary.png new file mode 100644 index 000000000..886fc3ec8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/raw_ore_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring.png new file mode 100644 index 000000000..f964010e5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_overlay.png new file mode 100644 index 000000000..54a5cea49 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_secondary.png new file mode 100644 index 000000000..3e499b9f8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ring_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod.png new file mode 100644 index 000000000..471f46fd5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long.png new file mode 100644 index 000000000..697b24e86 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long_secondary.png new file mode 100644 index 000000000..771bb4d83 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_long_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_secondary.png new file mode 100644 index 000000000..ef5d1018d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rod_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor.png new file mode 100644 index 000000000..b61c86f93 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_overlay.png new file mode 100644 index 000000000..0a43ae385 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_secondary.png new file mode 100644 index 000000000..1f4c8bbb9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/rotor_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round.png new file mode 100644 index 000000000..6602c151f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round_secondary.png new file mode 100644 index 000000000..0ff4ba116 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/round_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw.png new file mode 100644 index 000000000..b2140182c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_overlay.png new file mode 100644 index 000000000..571696b88 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_secondary.png new file mode 100644 index 000000000..769e68c50 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/screw_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil.png new file mode 100644 index 000000000..f7d3d92b4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_overlay.png new file mode 100644 index 000000000..230c139c3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_secondary.png new file mode 100644 index 000000000..6a7ded3ac Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/shape_memory_foil_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring.png new file mode 100644 index 000000000..2ed477acb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_overlay.png new file mode 100644 index 000000000..a445ed373 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_secondary.png new file mode 100644 index 000000000..6359adc20 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small.png new file mode 100644 index 000000000..918e8d155 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_overlay.png new file mode 100644 index 000000000..b5da1db29 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_secondary.png new file mode 100644 index 000000000..d8bca4f19 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/spring_small_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/time_halo.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/time_halo.png new file mode 100644 index 000000000..6403d8bf9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/time_halo.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/time_halo.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/time_halo.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/time_halo.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw.png new file mode 100644 index 000000000..b0a77c2bb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_overlay.png new file mode 100644 index 000000000..77fc59410 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_secondary.png new file mode 100644 index 000000000..7f4f3c76f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_buzz_saw_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw.png new file mode 100644 index 000000000..08a68b292 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw_secondary.png new file mode 100644 index 000000000..34bf6cdcc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_chainsaw_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill.png new file mode 100644 index 000000000..b5a232bc6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill_secondary.png new file mode 100644 index 000000000..aa3eb7613 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_drill_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver.png new file mode 100644 index 000000000..e02ee3e14 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_overlay.png new file mode 100644 index 000000000..5270c4bf3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_secondary.png new file mode 100644 index 000000000..86fd33e5f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_screwdriver_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wirecutter.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wirecutter.png new file mode 100644 index 000000000..f2508fc2a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wirecutter.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wirecutter.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wirecutter.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wirecutter.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench.png new file mode 100644 index 000000000..20e67006b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_overlay.png new file mode 100644 index 000000000..c018f15dd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_secondary.png new file mode 100644 index 000000000..c4c941c9a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/tool_head_wrench_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade.png new file mode 100644 index 000000000..a100ad5fb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_overlay.png new file mode 100644 index 000000000..0e163f6e3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_secondary.png new file mode 100644 index 000000000..6004a4330 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/turbine_blade_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate.png new file mode 100644 index 000000000..a55d70e34 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_overlay.png new file mode 100644 index 000000000..fbb24cf34 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_secondary.png new file mode 100644 index 000000000..f23ef21c8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/ultradense_plate_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine.png new file mode 100644 index 000000000..aa59a971e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_overlay.png new file mode 100644 index 000000000..596c55984 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_secondary.png new file mode 100644 index 000000000..911da2d9e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_fine_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool.png new file mode 100644 index 000000000..872067f6e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool_overlay.png new file mode 100644 index 000000000..ef2cc4866 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/chronon/wire_spool_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/block.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/block.png new file mode 100644 index 000000000..5492f0dfd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/block.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/block_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/block_overlay.png new file mode 100644 index 000000000..156bd6232 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/block_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/block_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/block_secondary.png new file mode 100644 index 000000000..26b264721 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/block_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/bolt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/bolt.png new file mode 100644 index 000000000..2d88257ff Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/bolt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/bolt_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/bolt_overlay.png new file mode 100644 index 000000000..797e4bf4e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/bolt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/bolt_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/bolt_secondary.png new file mode 100644 index 000000000..d2c8b2d90 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/bolt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust.png new file mode 100644 index 000000000..500535508 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_overlay.png new file mode 100644 index 000000000..0101b0b70 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_secondary.png new file mode 100644 index 000000000..e5ac75829 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_small.png new file mode 100644 index 000000000..4815aab97 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_small_overlay.png new file mode 100644 index 000000000..b50452c63 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_small_secondary.png new file mode 100644 index 000000000..09b86215b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_tiny.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_tiny.png new file mode 100644 index 000000000..26f5700de Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_tiny.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_tiny_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_tiny_overlay.png new file mode 100644 index 000000000..497ded000 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_tiny_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_tiny_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_tiny_secondary.png new file mode 100644 index 000000000..92c4e554c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/dust_tiny_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/foil.png new file mode 100644 index 000000000..99c5a618d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/foil_overlay.png new file mode 100644 index 000000000..0310a86c1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/foil_secondary.png new file mode 100644 index 000000000..f4cf6e2e4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt.png new file mode 100644 index 000000000..b7964c974 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_ctm.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_ctm.png new file mode 100644 index 000000000..f67a4737e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_ctm.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_ctm_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_ctm_overlay.png new file mode 100644 index 000000000..eebf1d8eb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_ctm_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_ctm_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_ctm_secondary.png new file mode 100644 index 000000000..82d9c49c0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_ctm_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_overlay.png new file mode 100644 index 000000000..aa5c129c2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_secondary.png new file mode 100644 index 000000000..abe137d0b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/frame_gt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear.png new file mode 100644 index 000000000..1f09eff94 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_overlay.png new file mode 100644 index 000000000..c9116fe5c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_secondary.png new file mode 100644 index 000000000..38ad9b0ee Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_small.png new file mode 100644 index 000000000..7c08cfcd6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_small_overlay.png new file mode 100644 index 000000000..11583ee26 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_small_secondary.png new file mode 100644 index 000000000..b070e0964 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/gear_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot.png new file mode 100644 index 000000000..8da72a6a0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_double.png new file mode 100644 index 000000000..7a8ac22da Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_double_overlay.png new file mode 100644 index 000000000..77b3f45b6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_double_secondary.png new file mode 100644 index 000000000..5b0d167fd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_hot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_hot.png new file mode 100644 index 000000000..8da72a6a0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_hot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_hot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_hot_overlay.png new file mode 100644 index 000000000..55b9fa6ab Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_hot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_hot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_hot_secondary.png new file mode 100644 index 000000000..375275f28 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_hot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_overlay.png new file mode 100644 index 000000000..16839bdf4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_secondary.png new file mode 100644 index 000000000..375275f28 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ingot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/nugget.png new file mode 100644 index 000000000..826621c0e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/nugget_overlay.png new file mode 100644 index 000000000..229164a88 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/nugget_secondary.png new file mode 100644 index 000000000..4d425ae6d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate.png new file mode 100644 index 000000000..456305e41 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_dense.png new file mode 100644 index 000000000..8026897a0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_dense_overlay.png new file mode 100644 index 000000000..280006fbf Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_dense_secondary.png new file mode 100644 index 000000000..806fb4328 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_double.png new file mode 100644 index 000000000..7d2f6f0ab Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_double_overlay.png new file mode 100644 index 000000000..88c0d13fd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_double_secondary.png new file mode 100644 index 000000000..3daf76174 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_overlay.png new file mode 100644 index 000000000..34dae1487 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_secondary.png new file mode 100644 index 000000000..e6f7efee6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ring.png new file mode 100644 index 000000000..79492a134 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ring_overlay.png new file mode 100644 index 000000000..0e2dc9219 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ring_secondary.png new file mode 100644 index 000000000..6cbc89fbb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/ring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod.png new file mode 100644 index 000000000..76fdfb3d2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_long.png new file mode 100644 index 000000000..a4802f058 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_long_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_long_overlay.png new file mode 100644 index 000000000..840d0ffe5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_long_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_long_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_long_secondary.png new file mode 100644 index 000000000..f843b6c8d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_long_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_overlay.png new file mode 100644 index 000000000..c1a681173 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_secondary.png new file mode 100644 index 000000000..733e77c87 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rod_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rotor.png new file mode 100644 index 000000000..23a1c5e89 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rotor_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rotor_overlay.png new file mode 100644 index 000000000..be2ebaaa9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rotor_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rotor_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rotor_secondary.png new file mode 100644 index 000000000..c1d2c1634 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/rotor_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/round.png new file mode 100644 index 000000000..fa1cde6e9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/round_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/round_overlay.png new file mode 100644 index 000000000..75ba2b221 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/round_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/round_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/round_secondary.png new file mode 100644 index 000000000..a6df7388f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/round_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/screw.png new file mode 100644 index 000000000..0aa05ff99 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/screw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/screw_overlay.png new file mode 100644 index 000000000..01233d72d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/screw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/screw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/screw_secondary.png new file mode 100644 index 000000000..2dea42e1c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/screw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring.png new file mode 100644 index 000000000..18218959a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_overlay.png new file mode 100644 index 000000000..2439729f0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_secondary.png new file mode 100644 index 000000000..8ccd983bd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_small.png new file mode 100644 index 000000000..17f42466e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_small_overlay.png new file mode 100644 index 000000000..d851f2fa7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_small_secondary.png new file mode 100644 index 000000000..afc33b72f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/spring_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/wire_fine.png new file mode 100644 index 000000000..6482b62be Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/wire_fine_overlay.png new file mode 100644 index 000000000..84d6732fe Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/wire_fine_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/wire_fine_secondary.png new file mode 100644 index 000000000..3ca1baa7f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/crystal/wire_fine_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/diamond/raw_ore_cubic.png b/src/main/resources/assets/gtceu/textures/item/material_sets/diamond/raw_ore_cubic.png new file mode 100644 index 000000000..5cbad6c8b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/diamond/raw_ore_cubic.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/diamond/raw_ore_cubic_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/diamond/raw_ore_cubic_secondary.png new file mode 100644 index 000000000..735e42b9e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/diamond/raw_ore_cubic_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/alve_foil_insulator.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/alve_foil_insulator.png new file mode 100644 index 000000000..48de10d3f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/alve_foil_insulator.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/alve_foil_insulator_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/alve_foil_insulator_overlay.png new file mode 100644 index 000000000..7defae615 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/alve_foil_insulator_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/alve_foil_insulator_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/alve_foil_insulator_secondary.png new file mode 100644 index 000000000..668eb1815 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/alve_foil_insulator_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/blank.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/blank.png new file mode 100644 index 000000000..d1feb07ab Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/blank.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/frothed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/frothed.png index ddc4c7b33..64cca59b7 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/frothed.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/frothed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/frothed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/frothed_overlay.png index 665ea587b..b05747343 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/frothed_overlay.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/frothed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/frothed_overlay_glint.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/frothed_overlay_glint.png index f8384c673..fc216b23a 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/frothed_overlay_glint.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/frothed_overlay_glint.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/frothed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/frothed_secondary.png index 1fa1bb1fa..959070c8b 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/frothed_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/frothed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/heavy_beam.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/heavy_beam.png new file mode 100644 index 000000000..e31a1edd9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/heavy_beam.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/heavy_beam_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/heavy_beam_overlay.png new file mode 100644 index 000000000..18b553170 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/heavy_beam_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/heavy_beam_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/heavy_beam_secondary.png new file mode 100644 index 000000000..5713f2436 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/heavy_beam_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/leached.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/leached.png index 430bcf174..a16c50ce4 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/leached.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/leached.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/leached_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/leached_secondary.png index 7b7ecd4c3..f30743333 100644 Binary files a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/leached_secondary.png and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/leached_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/modular_shelling.png new file mode 100644 index 000000000..e0b9053fa Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/modular_shelling_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/modular_shelling_overlay.png new file mode 100644 index 000000000..b5c17bd59 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/modular_shelling_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/modular_shelling_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/modular_shelling_secondary.png new file mode 100644 index 000000000..318fb8eb7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/modular_shelling_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/plasmites.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/plasmites.png new file mode 100644 index 000000000..5110a0d19 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/plasmites.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/plasmites.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/plasmites.png.mcmeta new file mode 100644 index 000000000..6a199bf8f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/plasmites.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/raw_ore_cubic.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/raw_ore_cubic.png new file mode 100644 index 000000000..c3b4178c2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/raw_ore_cubic.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/raw_ore_cubic_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/raw_ore_cubic_secondary.png new file mode 100644 index 000000000..a31bd4ba0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/raw_ore_cubic_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/shape_memory_foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/shape_memory_foil.png new file mode 100644 index 000000000..db665cc7c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/shape_memory_foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/shape_memory_foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/shape_memory_foil_overlay.png new file mode 100644 index 000000000..0a7a99169 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/shape_memory_foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/shape_memory_foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/shape_memory_foil_secondary.png new file mode 100644 index 000000000..ec41a2e89 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/shape_memory_foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/ultradense_plate.png new file mode 100644 index 000000000..1872f53ca Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/ultradense_plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/ultradense_plate_overlay.png new file mode 100644 index 000000000..a748047eb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/ultradense_plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/ultradense_plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/ultradense_plate_secondary.png new file mode 100644 index 000000000..197a921e4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/ultradense_plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/wire_spool.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/wire_spool.png new file mode 100644 index 000000000..79ca90be9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/wire_spool.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/dull/wire_spool_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/wire_spool_overlay.png new file mode 100644 index 000000000..03303e63b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/dull/wire_spool_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/fine/raw_ore_cubic.png b/src/main/resources/assets/gtceu/textures/item/material_sets/fine/raw_ore_cubic.png new file mode 100644 index 000000000..f2e239d52 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/fine/raw_ore_cubic.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/fine/raw_ore_cubic_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/fine/raw_ore_cubic_secondary.png new file mode 100644 index 000000000..2c2b5d85f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/fine/raw_ore_cubic_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator.png new file mode 100644 index 000000000..98fb810f9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_overlay.png new file mode 100644 index 000000000..1f47f7ed6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_secondary.png new file mode 100644 index 000000000..dc715dca4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/alve_foil_insulator_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/blank.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/blank.png new file mode 100644 index 000000000..9b7ec38f5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/blank.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/blank.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/blank.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/blank.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt.png new file mode 100644 index 000000000..4f22bc43a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_overlay.png new file mode 100644 index 000000000..0cdde644e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_secondary.png new file mode 100644 index 000000000..180e4e1b2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/bolt_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed.png new file mode 100644 index 000000000..7c99d0417 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_overlay.png new file mode 100644 index 000000000..27d7d2e56 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified.png new file mode 100644 index 000000000..7c99d0417 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified_secondary.png new file mode 100644 index 000000000..297306f1e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_purified_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined.png new file mode 100644 index 000000000..7c99d0417 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_overlay.png new file mode 100644 index 000000000..5c3d7e56d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_secondary.png new file mode 100644 index 000000000..297306f1e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_refined_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_secondary.png new file mode 100644 index 000000000..297306f1e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/crushed_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust.png new file mode 100644 index 000000000..202e52457 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure.png new file mode 100644 index 000000000..202e52457 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_overlay.png new file mode 100644 index 000000000..b407a76bd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_secondary.png new file mode 100644 index 000000000..8d69c4535 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_impure_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure.png new file mode 100644 index 000000000..629a11138 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_overlay.png new file mode 100644 index 000000000..4c25b9053 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_secondary.png new file mode 100644 index 000000000..ec59a26c4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_pure_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_secondary.png new file mode 100644 index 000000000..8d69c4535 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small.png new file mode 100644 index 000000000..771cfd57a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small_secondary.png new file mode 100644 index 000000000..0568aeb68 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_small_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny.png new file mode 100644 index 000000000..c46c5f72d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny_secondary.png new file mode 100644 index 000000000..327266874 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/dust_tiny_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil.png new file mode 100644 index 000000000..66bb75676 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_overlay.png new file mode 100644 index 000000000..b3b1f91c9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_secondary.png new file mode 100644 index 000000000..5f07ee8e6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/foil_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed.png new file mode 100644 index 000000000..62c1a023f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_overlay_glint.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_overlay_glint.png new file mode 100644 index 000000000..39caa7a36 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_overlay_glint.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_overlay_glint.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_overlay_glint.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_overlay_glint.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_secondary.png new file mode 100644 index 000000000..e7d6e1452 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/frothed_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear.png new file mode 100644 index 000000000..e6fbf2009 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_overlay.png new file mode 100644 index 000000000..687d573f1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_secondary.png new file mode 100644 index 000000000..fabcc9699 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small.png new file mode 100644 index 000000000..d6285c6de Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_overlay.png new file mode 100644 index 000000000..eef1c93ed Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_secondary.png new file mode 100644 index 000000000..ab3bd8e3e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gear_small_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem.png new file mode 100644 index 000000000..d3c931855 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped.png new file mode 100644 index 000000000..14d59a6e6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_overlay.png new file mode 100644 index 000000000..5f1c7d0c7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_secondary.png new file mode 100644 index 000000000..142954ad5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_chipped_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed.png new file mode 100644 index 000000000..6133f52ff Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_overlay.png new file mode 100644 index 000000000..fa46fad6a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_secondary.png new file mode 100644 index 000000000..eed4867bf Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawed_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless.png new file mode 100644 index 000000000..b928191d3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_overlay.png new file mode 100644 index 000000000..32d32be7f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_secondary.png new file mode 100644 index 000000000..6eec5a65f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_flawless_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_overlay.png new file mode 100644 index 000000000..410669777 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_secondary.png new file mode 100644 index 000000000..13c581745 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/gem_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam.png new file mode 100644 index 000000000..a06defbb2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_overlay.png new file mode 100644 index 000000000..5fef3b998 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_secondary.png new file mode 100644 index 000000000..6df6bd9f4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/heavy_beam_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot.png new file mode 100644 index 000000000..bae1259e9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double.png new file mode 100644 index 000000000..7e46cccda Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_overlay.png new file mode 100644 index 000000000..56a75bd25 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_secondary.png new file mode 100644 index 000000000..e20984033 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_double_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot.png new file mode 100644 index 000000000..c48c5f0ab Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_overlay.png new file mode 100644 index 000000000..c2513e04f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_secondary.png new file mode 100644 index 000000000..d4d08c411 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_hot_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_overlay.png new file mode 100644 index 000000000..531b67182 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_secondary.png new file mode 100644 index 000000000..d39d2e323 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ingot_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached.png new file mode 100644 index 000000000..5e82ce940 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached_secondary.png new file mode 100644 index 000000000..2f9043af2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/leached_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens.png new file mode 100644 index 000000000..e82766e0c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_overlay.png new file mode 100644 index 000000000..c2e3e9f2b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_secondary.png new file mode 100644 index 000000000..0b3307930 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/lens_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling.png new file mode 100644 index 000000000..b5305b4a1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_overlay.png new file mode 100644 index 000000000..b6985d514 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_secondary.png new file mode 100644 index 000000000..c548f6144 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/modular_shelling_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget.png new file mode 100644 index 000000000..6cb079731 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_overlay.png new file mode 100644 index 000000000..ff854547e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_secondary.png new file mode 100644 index 000000000..ecb0277e4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/nugget_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate.png new file mode 100644 index 000000000..255238069 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense.png new file mode 100644 index 000000000..00358108a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_overlay.png new file mode 100644 index 000000000..37630ac77 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_secondary.png new file mode 100644 index 000000000..518c4b4cc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_dense_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double.png new file mode 100644 index 000000000..c6b7eab59 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_overlay.png new file mode 100644 index 000000000..a755cc77f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_secondary.png new file mode 100644 index 000000000..3a4b87a38 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_double_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_overlay.png new file mode 100644 index 000000000..f637c11e1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_secondary.png new file mode 100644 index 000000000..e7b3a8316 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/plate_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore.png new file mode 100644 index 000000000..60f2edff1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic.png new file mode 100644 index 000000000..e33463a7a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic_secondary.png new file mode 100644 index 000000000..f68cb25c1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_cubic_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_secondary.png new file mode 100644 index 000000000..16048422d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/raw_ore_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring.png new file mode 100644 index 000000000..445c55b2c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_overlay.png new file mode 100644 index 000000000..0b1c017aa Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_secondary.png new file mode 100644 index 000000000..97410608e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ring_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod.png new file mode 100644 index 000000000..0511b1148 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long.png new file mode 100644 index 000000000..389e9ebfb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long_secondary.png new file mode 100644 index 000000000..88792558a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_long_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_secondary.png new file mode 100644 index 000000000..67831b355 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rod_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor.png new file mode 100644 index 000000000..2ab82238c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_overlay.png new file mode 100644 index 000000000..2d390fd72 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_secondary.png new file mode 100644 index 000000000..8460a60b2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/rotor_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round.png new file mode 100644 index 000000000..dfb7cbceb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round_secondary.png new file mode 100644 index 000000000..9db14e3dd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/round_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw.png new file mode 100644 index 000000000..90d3e91de Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_overlay.png new file mode 100644 index 000000000..2d8775663 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_secondary.png new file mode 100644 index 000000000..f6a44cab6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/screw_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil.png new file mode 100644 index 000000000..fe60c2e22 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_overlay.png new file mode 100644 index 000000000..c8a137785 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_secondary.png new file mode 100644 index 000000000..4f6dab7ca Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/shape_memory_foil_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring.png new file mode 100644 index 000000000..a27ce0828 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_overlay.png new file mode 100644 index 000000000..0c645c33b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_secondary.png new file mode 100644 index 000000000..1322aa57f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small.png new file mode 100644 index 000000000..806f18810 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_overlay.png new file mode 100644 index 000000000..a28be7ef3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_secondary.png new file mode 100644 index 000000000..c053afcf0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/spring_small_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw.png new file mode 100644 index 000000000..9ec95518c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_overlay.png new file mode 100644 index 000000000..efa329970 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_secondary.png new file mode 100644 index 000000000..2c22bed73 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_buzz_saw_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw.png new file mode 100644 index 000000000..6eb3e2383 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw_secondary.png new file mode 100644 index 000000000..6ab6d76de Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_chainsaw_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill.png new file mode 100644 index 000000000..5af9d2dfb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill_secondary.png new file mode 100644 index 000000000..c68a6e40b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_drill_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver.png new file mode 100644 index 000000000..9f40a8084 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_overlay.png new file mode 100644 index 000000000..2fc8bf432 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_secondary.png new file mode 100644 index 000000000..9ace22bad Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_screwdriver_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wirecutter.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wirecutter.png new file mode 100644 index 000000000..88ba7302c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wirecutter.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wirecutter.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wirecutter.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wirecutter.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench.png new file mode 100644 index 000000000..248a91e00 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_overlay.png new file mode 100644 index 000000000..92455d744 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_secondary.png new file mode 100644 index 000000000..88f9d9a34 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/tool_head_wrench_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade.png new file mode 100644 index 000000000..6c5dfdaa8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_overlay.png new file mode 100644 index 000000000..4bb5673ab Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_secondary.png new file mode 100644 index 000000000..64736434b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/turbine_blade_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate.png new file mode 100644 index 000000000..266053b9a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_overlay.png new file mode 100644 index 000000000..99f08fc8f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_secondary.png new file mode 100644 index 000000000..3711cbec7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/ultradense_plate_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine.png new file mode 100644 index 000000000..8253ab6da Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_overlay.png new file mode 100644 index 000000000..304564656 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_overlay.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_secondary.png new file mode 100644 index 000000000..2a7d4a993 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_secondary.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_fine_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_spool.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_spool.png new file mode 100644 index 000000000..27960221c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_spool.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_spool_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_spool_overlay.png new file mode 100644 index 000000000..d9f3a28b9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity/wire_spool_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/alve_foil_insulator.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/alve_foil_insulator.png new file mode 100644 index 000000000..f81690978 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/alve_foil_insulator.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/alve_foil_insulator.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/alve_foil_insulator.png.mcmeta new file mode 100644 index 000000000..a075072e1 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/alve_foil_insulator.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 2 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/blank.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/blank.png new file mode 100644 index 000000000..19089da08 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/blank.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/blank.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/blank.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/blank.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/block.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/block.png new file mode 100644 index 000000000..9387193bb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/block.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/block.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/block.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/block.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt.png new file mode 100644 index 000000000..f516bebe9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_overlay.png new file mode 100644 index 000000000..5090100a5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_secondary.png new file mode 100644 index 000000000..04ba90a36 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/bolt_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed.png new file mode 100644 index 000000000..93b4b168f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_overlay.png new file mode 100644 index 000000000..25a0a7704 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified.png new file mode 100644 index 000000000..93b4b168f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified_secondary.png new file mode 100644 index 000000000..326745ddb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_purified_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined.png new file mode 100644 index 000000000..93b4b168f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_overlay.png new file mode 100644 index 000000000..a49618715 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_secondary.png new file mode 100644 index 000000000..326745ddb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_refined_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_secondary.png new file mode 100644 index 000000000..326745ddb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/crushed_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust.png new file mode 100644 index 000000000..15e36da6a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure.png new file mode 100644 index 000000000..15e36da6a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_overlay.png new file mode 100644 index 000000000..5f7a97e08 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_secondary.png new file mode 100644 index 000000000..e5da0006b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_impure_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure.png new file mode 100644 index 000000000..7de319813 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_overlay.png new file mode 100644 index 000000000..606025793 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_secondary.png new file mode 100644 index 000000000..7ace5c2d1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_pure_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_secondary.png new file mode 100644 index 000000000..e5da0006b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small.png new file mode 100644 index 000000000..7f41b5f42 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small_secondary.png new file mode 100644 index 000000000..e31e42cac Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_small_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny.png new file mode 100644 index 000000000..ec91a4350 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny_secondary.png new file mode 100644 index 000000000..1c280a759 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/dust_tiny_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil.png new file mode 100644 index 000000000..b345bd033 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_overlay.png new file mode 100644 index 000000000..cb8c123f4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_secondary.png new file mode 100644 index 000000000..987e0412e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/foil_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frame_gt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frame_gt.png new file mode 100644 index 000000000..df16fc207 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frame_gt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frame_gt.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frame_gt.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frame_gt.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed.png new file mode 100644 index 000000000..13f6a310a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_overlay_glint.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_overlay_glint.png new file mode 100644 index 000000000..08d848db1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_overlay_glint.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_overlay_glint.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_overlay_glint.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_overlay_glint.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_secondary.png new file mode 100644 index 000000000..27c7beb27 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/frothed_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear.png new file mode 100644 index 000000000..ece3871d8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_overlay.png new file mode 100644 index 000000000..c2807ee06 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_secondary.png new file mode 100644 index 000000000..28f4b1f13 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small.png new file mode 100644 index 000000000..1ceeeec8e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_overlay.png new file mode 100644 index 000000000..8bd603217 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_secondary.png new file mode 100644 index 000000000..2be8eeaf1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gear_small_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem.png new file mode 100644 index 000000000..5d416bd61 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped.png new file mode 100644 index 000000000..c33edfb61 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_overlay.png new file mode 100644 index 000000000..61983aeb2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_secondary.png new file mode 100644 index 000000000..93c519ca7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_chipped_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite.png new file mode 100644 index 000000000..866be8d17 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite_secondary.png new file mode 100644 index 000000000..28cc4f519 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_exquisite_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed.png new file mode 100644 index 000000000..2fa9545ee Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_overlay.png new file mode 100644 index 000000000..8a0e893a2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_secondary.png new file mode 100644 index 000000000..505dc22e1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawed_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless.png new file mode 100644 index 000000000..ea4b8dbd5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_overlay.png new file mode 100644 index 000000000..a429ee069 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_secondary.png new file mode 100644 index 000000000..d5deea546 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_flawless_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_overlay.png new file mode 100644 index 000000000..919d83caf Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_secondary.png new file mode 100644 index 000000000..53551b0e9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/gem_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/heavy_beam.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/heavy_beam.png new file mode 100644 index 000000000..485044577 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/heavy_beam.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/heavy_beam.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/heavy_beam.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/heavy_beam.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot.png new file mode 100644 index 000000000..fae3f9416 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double.png new file mode 100644 index 000000000..2ef6c4a88 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_overlay.png new file mode 100644 index 000000000..beb92c289 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_secondary.png new file mode 100644 index 000000000..38578963b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_double_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot.png new file mode 100644 index 000000000..67b4c7ad8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_overlay.png new file mode 100644 index 000000000..1dc388fc0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_secondary.png new file mode 100644 index 000000000..892d8add5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_hot_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_overlay.png new file mode 100644 index 000000000..ba7b3d355 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_secondary.png new file mode 100644 index 000000000..ac26fbbc0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ingot_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached.png new file mode 100644 index 000000000..64c66f817 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached_secondary.png new file mode 100644 index 000000000..45534dfe3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/leached_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens.png new file mode 100644 index 000000000..ee202ece1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_overlay.png new file mode 100644 index 000000000..2dd82aabc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_secondary.png new file mode 100644 index 000000000..5288abc51 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/lens_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/modular_shelling.png new file mode 100644 index 000000000..25c1a181e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/modular_shelling.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/modular_shelling.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/modular_shelling.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget.png new file mode 100644 index 000000000..72aad21f4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_overlay.png new file mode 100644 index 000000000..3c839b658 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_secondary.png new file mode 100644 index 000000000..2d521044b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/nugget_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate.png new file mode 100644 index 000000000..3e4275b3a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense.png new file mode 100644 index 000000000..64add763b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_overlay.png new file mode 100644 index 000000000..69a2a7030 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_secondary.png new file mode 100644 index 000000000..5be147f7e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_dense_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double.png new file mode 100644 index 000000000..dbcc596fe Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_overlay.png new file mode 100644 index 000000000..12adf3d90 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_secondary.png new file mode 100644 index 000000000..28e1d4bf6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_double_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_overlay.png new file mode 100644 index 000000000..365d2eff6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_secondary.png new file mode 100644 index 000000000..c18d674df Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/plate_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore.png new file mode 100644 index 000000000..a429ff9e1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore_secondary.png new file mode 100644 index 000000000..04f873be4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/raw_ore_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring.png new file mode 100644 index 000000000..af372b5ed Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_overlay.png new file mode 100644 index 000000000..315e95b51 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_secondary.png new file mode 100644 index 000000000..264b9d010 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ring_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod.png new file mode 100644 index 000000000..8254d7f5e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long.png new file mode 100644 index 000000000..d53881a59 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long_secondary.png new file mode 100644 index 000000000..a87c8c06d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_long_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_secondary.png new file mode 100644 index 000000000..3f32ecdb3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rod_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor.png new file mode 100644 index 000000000..1b352e48d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_overlay.png new file mode 100644 index 000000000..e3d5a7a34 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_secondary.png new file mode 100644 index 000000000..59d87d9a4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/rotor_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round.png new file mode 100644 index 000000000..436f3a7cc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round_secondary.png new file mode 100644 index 000000000..7d78ba045 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/round_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw.png new file mode 100644 index 000000000..6ae19f9cb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_overlay.png new file mode 100644 index 000000000..694932e06 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_secondary.png new file mode 100644 index 000000000..b7651b3a3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/screw_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/shape_memory_foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/shape_memory_foil.png new file mode 100644 index 000000000..b3b4eb0cb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/shape_memory_foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/shape_memory_foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/shape_memory_foil.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/shape_memory_foil.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring.png new file mode 100644 index 000000000..7255fb5ed Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_overlay.png new file mode 100644 index 000000000..647460ae2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_secondary.png new file mode 100644 index 000000000..cc7131f13 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small.png new file mode 100644 index 000000000..2bcf88507 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_overlay.png new file mode 100644 index 000000000..720e83e57 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_secondary.png new file mode 100644 index 000000000..3423defe3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/spring_small_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw.png new file mode 100644 index 000000000..6faebad76 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_overlay.png new file mode 100644 index 000000000..74b186509 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_secondary.png new file mode 100644 index 000000000..2ec9122a1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_buzz_saw_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw.png new file mode 100644 index 000000000..badcc8a83 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw_secondary.png new file mode 100644 index 000000000..dae78eba1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_chainsaw_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill.png new file mode 100644 index 000000000..33c782a2c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill_secondary.png new file mode 100644 index 000000000..abe76be08 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_drill_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver.png new file mode 100644 index 000000000..111403300 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_overlay.png new file mode 100644 index 000000000..e0a36b763 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_secondary.png new file mode 100644 index 000000000..68ea77328 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_screwdriver_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wirecutter.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wirecutter.png new file mode 100644 index 000000000..e1591cedc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wirecutter.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wirecutter.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wirecutter.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wirecutter.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench.png new file mode 100644 index 000000000..7cc029224 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_overlay.png new file mode 100644 index 000000000..3ab52817f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_secondary.png new file mode 100644 index 000000000..b4fac9b39 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/tool_head_wrench_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade.png new file mode 100644 index 000000000..c10d423fb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_overlay.png new file mode 100644 index 000000000..9cf3278c5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_secondary.png new file mode 100644 index 000000000..5a3f37007 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/turbine_blade_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate.png new file mode 100644 index 000000000..49f4c468c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate_overlay.png new file mode 100644 index 000000000..da1b8a649 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/ultradense_plate_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire.png new file mode 100644 index 000000000..5dd83e89e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_end.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_end.png new file mode 100644 index 000000000..5dd83e89e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_end.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_end.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_end.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_end.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine.png new file mode 100644 index 000000000..ddddb831d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_overlay.png new file mode 100644 index 000000000..d328a62ef Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_secondary.png new file mode 100644 index 000000000..2f5d6101c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_secondary.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_fine_secondary.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_side.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_side.png new file mode 100644 index 000000000..5dd83e89e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_side.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_side.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_side.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_side.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool.png new file mode 100644 index 000000000..a9ac6ae16 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool_overlay.png new file mode 100644 index 000000000..7f2493a34 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool_overlay.png.mcmeta new file mode 100644 index 000000000..afdb2c14b --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/infinity_old/wire_spool_overlay.png.mcmeta @@ -0,0 +1 @@ +{ "animation": { "interpolate": false, "frametime": 3 } } \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/bolt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/bolt.png new file mode 100644 index 000000000..15c8f20e8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/bolt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/bolt_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/bolt_overlay.png new file mode 100644 index 000000000..bfcccb010 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/bolt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/bolt_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/bolt_secondary.png new file mode 100644 index 000000000..f7d40f2f8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/bolt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust.png new file mode 100644 index 000000000..a58fdcdf8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_overlay.png new file mode 100644 index 000000000..4f18cfeb0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_secondary.png new file mode 100644 index 000000000..2f788ed41 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_small.png new file mode 100644 index 000000000..40406c895 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_small_overlay.png new file mode 100644 index 000000000..eb1f99e6b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_small_secondary.png new file mode 100644 index 000000000..3455201dd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_tiny.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_tiny.png new file mode 100644 index 000000000..34eeb9478 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_tiny.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_tiny_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_tiny_overlay.png new file mode 100644 index 000000000..017f06018 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_tiny_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_tiny_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_tiny_secondary.png new file mode 100644 index 000000000..bc2b8764b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/dust_tiny_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/foil.png new file mode 100644 index 000000000..6f4e3af0a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/foil_overlay.png new file mode 100644 index 000000000..e6692629b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/foil_secondary.png new file mode 100644 index 000000000..f5a93e213 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear.png new file mode 100644 index 000000000..cd3a68612 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_overlay.png new file mode 100644 index 000000000..1e2dabd59 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_secondary.png new file mode 100644 index 000000000..490cb64c1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_small.png new file mode 100644 index 000000000..163cacda5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_small_overlay.png new file mode 100644 index 000000000..13e6de5ab Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_small_secondary.png new file mode 100644 index 000000000..b9813613c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/gear_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot.png new file mode 100644 index 000000000..fafdb0126 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_double.png new file mode 100644 index 000000000..e6e2de76a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_double_overlay.png new file mode 100644 index 000000000..065dcaf5b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_double_secondary.png new file mode 100644 index 000000000..d2b693131 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_overlay.png new file mode 100644 index 000000000..ca2ec7381 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_secondary.png new file mode 100644 index 000000000..fe79e4e4b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ingot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/nugget.png new file mode 100644 index 000000000..9cb14039d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/nugget_overlay.png new file mode 100644 index 000000000..e5caa954b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/nugget_secondary.png new file mode 100644 index 000000000..4db80f012 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate.png new file mode 100644 index 000000000..15ab75d0b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_dense.png new file mode 100644 index 000000000..98f1e563b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_dense_overlay.png new file mode 100644 index 000000000..f43038265 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_dense_secondary.png new file mode 100644 index 000000000..e1c099740 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_double.png new file mode 100644 index 000000000..bc51c951a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_double_overlay.png new file mode 100644 index 000000000..a2005a803 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_double_secondary.png new file mode 100644 index 000000000..db078e08a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_overlay.png new file mode 100644 index 000000000..6b130a93a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_secondary.png new file mode 100644 index 000000000..4b9432505 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ring.png new file mode 100644 index 000000000..ef59c35d9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ring_overlay.png new file mode 100644 index 000000000..2fa010e6b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ring_secondary.png new file mode 100644 index 000000000..368272449 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/ring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod.png new file mode 100644 index 000000000..cfdd6427c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_long.png new file mode 100644 index 000000000..97c72a490 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_long_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_long_overlay.png new file mode 100644 index 000000000..72f63cc83 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_long_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_long_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_long_secondary.png new file mode 100644 index 000000000..921e06395 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_long_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_overlay.png new file mode 100644 index 000000000..d81be40ba Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_secondary.png new file mode 100644 index 000000000..964fefbde Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rod_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rotor.png new file mode 100644 index 000000000..e02883861 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rotor_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rotor_overlay.png new file mode 100644 index 000000000..77a6d6e65 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rotor_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rotor_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rotor_secondary.png new file mode 100644 index 000000000..d9c2e6c3e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/rotor_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/round.png new file mode 100644 index 000000000..c0c970359 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/round_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/round_overlay.png new file mode 100644 index 000000000..47f7fba0f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/round_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/round_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/round_secondary.png new file mode 100644 index 000000000..915d42e56 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/round_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/screw.png new file mode 100644 index 000000000..37c645be7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/screw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/screw_overlay.png new file mode 100644 index 000000000..d44904fdc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/screw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/screw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/screw_secondary.png new file mode 100644 index 000000000..64e686eb8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/screw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring.png new file mode 100644 index 000000000..43a12bef2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_overlay.png new file mode 100644 index 000000000..b63a76a70 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_secondary.png new file mode 100644 index 000000000..c067d439a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_small.png new file mode 100644 index 000000000..2bae27fee Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_small_overlay.png new file mode 100644 index 000000000..cccd52cfc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_small_secondary.png new file mode 100644 index 000000000..988b8bb68 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/spring_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/wire_fine.png new file mode 100644 index 000000000..52a08b850 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/wire_fine_overlay.png new file mode 100644 index 000000000..9911fc4a7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic/wire_fine_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/wire_fine_secondary.png new file mode 100644 index 000000000..0b1e94b96 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic/wire_fine_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot.png new file mode 100644 index 000000000..3ee86e678 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_double.png new file mode 100644 index 000000000..4a929155d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_double_overlay.png new file mode 100644 index 000000000..623370742 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_double_secondary.png new file mode 100644 index 000000000..4bcf58b11 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_hot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_hot.png new file mode 100644 index 000000000..3ee86e678 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_hot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_hot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_hot_overlay.png new file mode 100644 index 000000000..5060a681c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_hot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_hot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_hot_secondary.png new file mode 100644 index 000000000..76188827a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_hot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_overlay.png new file mode 100644 index 000000000..5060a681c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_secondary.png new file mode 100644 index 000000000..76188827a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/ingot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/nugget.png new file mode 100644 index 000000000..f1edb247a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/nugget_overlay.png new file mode 100644 index 000000000..b24ad2602 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/nugget_secondary.png new file mode 100644 index 000000000..d80b701ff Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate.png new file mode 100644 index 000000000..2b1c84338 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_dense.png new file mode 100644 index 000000000..6409b27bf Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_dense_overlay.png new file mode 100644 index 000000000..c3fe7b52b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_dense_secondary.png new file mode 100644 index 000000000..b3523c16e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_double.png new file mode 100644 index 000000000..714d84e68 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_double_overlay.png new file mode 100644 index 000000000..c54c530d4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_double_secondary.png new file mode 100644 index 000000000..2e52b57cc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_overlay.png new file mode 100644 index 000000000..1f6158615 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_secondary.png new file mode 100644 index 000000000..32e47e1e7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/magic_terra/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/alve_foil_insulator.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/alve_foil_insulator.png new file mode 100644 index 000000000..a2098d509 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/alve_foil_insulator.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/alve_foil_insulator_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/alve_foil_insulator_overlay.png new file mode 100644 index 000000000..0a4f7efa5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/alve_foil_insulator_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/alve_foil_insulator_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/alve_foil_insulator_secondary.png new file mode 100644 index 000000000..7dde24631 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/alve_foil_insulator_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/heavy_beam.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/heavy_beam.png new file mode 100644 index 000000000..8c7b29ae7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/heavy_beam.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/heavy_beam_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/heavy_beam_overlay.png new file mode 100644 index 000000000..4a7007c60 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/heavy_beam_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/heavy_beam_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/heavy_beam_secondary.png new file mode 100644 index 000000000..e4e0563aa Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/heavy_beam_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/modular_shelling.png new file mode 100644 index 000000000..192a0a00b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/modular_shelling_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/modular_shelling_overlay.png new file mode 100644 index 000000000..1a068552b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/modular_shelling_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/modular_shelling_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/modular_shelling_secondary.png new file mode 100644 index 000000000..2c9466ec4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/modular_shelling_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/raw_ore_cubic.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/raw_ore_cubic.png new file mode 100644 index 000000000..275bd843f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/raw_ore_cubic.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/raw_ore_cubic_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/raw_ore_cubic_secondary.png new file mode 100644 index 000000000..4861a8989 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/raw_ore_cubic_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/shape_memory_foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/shape_memory_foil.png new file mode 100644 index 000000000..ac4aeca8e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/shape_memory_foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/shape_memory_foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/shape_memory_foil_overlay.png new file mode 100644 index 000000000..8f08c753a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/shape_memory_foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/shape_memory_foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/shape_memory_foil_secondary.png new file mode 100644 index 000000000..03bab733e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/shape_memory_foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/ultradense_plate.png new file mode 100644 index 000000000..aac086d7c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/ultradense_plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/ultradense_plate_overlay.png new file mode 100644 index 000000000..7d4d64f2a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/ultradense_plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/ultradense_plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/ultradense_plate_secondary.png new file mode 100644 index 000000000..4160bfd55 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/metallic/ultradense_plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/bolt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/bolt.png new file mode 100644 index 000000000..419b6bcbb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/bolt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/bolt.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/bolt.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/bolt.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/crushed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/crushed.png new file mode 100644 index 000000000..eb102c1b4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/crushed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/crushed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/crushed.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/crushed.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/crushed_purified.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/crushed_purified.png new file mode 100644 index 000000000..eb102c1b4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/crushed_purified.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/crushed_purified.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/crushed_purified.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/crushed_purified.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust.png new file mode 100644 index 000000000..6bf0bac4f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_impure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_impure.png new file mode 100644 index 000000000..3626e283b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_impure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_impure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_impure.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_impure.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_pure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_pure.png new file mode 100644 index 000000000..3e5d7e126 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_pure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_pure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_pure.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_pure.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_small.png new file mode 100644 index 000000000..0986fcf5a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_small.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_tiny.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_tiny.png new file mode 100644 index 000000000..fe5ef1da8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_tiny.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_tiny.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_tiny.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/dust_tiny.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/foil.png new file mode 100644 index 000000000..2509316cc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/foil.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/foil.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/gear.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/gear.png new file mode 100644 index 000000000..6903649ed Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/gear.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/gear.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/gear.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/gear.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/gear_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/gear_small.png new file mode 100644 index 000000000..e52b2cdb7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/gear_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/gear_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/gear_small.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/gear_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/heavy_beam.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/heavy_beam.png new file mode 100644 index 000000000..edd435580 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/heavy_beam.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/heavy_beam.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/heavy_beam.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/heavy_beam.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot.png new file mode 100644 index 000000000..387c98589 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot_double.png new file mode 100644 index 000000000..3a86e4e92 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot_double.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot_double.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot_hot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot_hot.png new file mode 100644 index 000000000..9882b57db Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot_hot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot_hot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot_hot.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot_hot.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot_hot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot_hot_overlay.png new file mode 100644 index 000000000..73b00fd78 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ingot_hot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/modular_shelling.png new file mode 100644 index 000000000..ec7db780e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/modular_shelling.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/modular_shelling.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/modular_shelling.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/nugget.png new file mode 100644 index 000000000..6f777e99a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/nugget.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/nugget.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/nugget.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/plate.png new file mode 100644 index 000000000..6369141bc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/plate.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/plate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/plate_dense.png new file mode 100644 index 000000000..ceb06d616 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/plate_dense.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/plate_dense.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/plate_dense.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/plate_double.png new file mode 100644 index 000000000..64c4fc87f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/plate_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/plate_double.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/plate_double.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/raw_ore.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/raw_ore.png new file mode 100644 index 000000000..591f08741 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/raw_ore.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/raw_ore.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/raw_ore.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/raw_ore.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ring.png new file mode 100644 index 000000000..01ac75617 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ring.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ring.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/rod.png new file mode 100644 index 000000000..0d653c9f9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/rod.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/rod.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/rod.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/rod_long.png new file mode 100644 index 000000000..b64fe6707 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/rod_long.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/rod_long.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/rod_long.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/rotor.png new file mode 100644 index 000000000..11728ab95 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/rotor.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/rotor.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/rotor.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/round.png new file mode 100644 index 000000000..58fc0ff50 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/round.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/round.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/round.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/screw.png new file mode 100644 index 000000000..763935899 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/screw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/screw.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/screw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/spring.png new file mode 100644 index 000000000..cc8e64070 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/spring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/spring.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/spring.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/spring_small.png new file mode 100644 index 000000000..8fddc1e50 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/spring_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/spring_small.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/spring_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_buzz_saw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_buzz_saw.png new file mode 100644 index 000000000..535388e2b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_buzz_saw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_buzz_saw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_buzz_saw.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_buzz_saw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_chainsaw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_chainsaw.png new file mode 100644 index 000000000..2d2701435 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_chainsaw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_chainsaw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_chainsaw.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_chainsaw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_drill.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_drill.png new file mode 100644 index 000000000..41c67b984 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_drill.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_drill.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_drill.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_drill.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_screwdriver.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_screwdriver.png new file mode 100644 index 000000000..e13f2534a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_screwdriver.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_screwdriver.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_screwdriver.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_screwdriver.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_wirecutter.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_wirecutter.png new file mode 100644 index 000000000..77982f105 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_wirecutter.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_wirecutter.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_wirecutter.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_wirecutter.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_wrench.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_wrench.png new file mode 100644 index 000000000..c2a2fbcbc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_wrench.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_wrench.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_wrench.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/tool_head_wrench.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/turbine_blade.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/turbine_blade.png new file mode 100644 index 000000000..9c0889d2b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/turbine_blade.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/turbine_blade.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/turbine_blade.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/turbine_blade.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ultradense_plate.png new file mode 100644 index 000000000..3acecb02c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ultradense_plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ultradense_plate.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/ultradense_plate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/wire_fine.png new file mode 100644 index 000000000..972ea648f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/wire_fine.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/wire_fine.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/wire_fine.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/wire_fine_overlay.png new file mode 100644 index 000000000..d25cc6811 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/bolt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/bolt.png new file mode 100644 index 000000000..115aae95b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/bolt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/bolt.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/bolt.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/bolt.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/bolt_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/bolt_overlay.png new file mode 100644 index 000000000..8c20244a5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/bolt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/bolt_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/bolt_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/bolt_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/bolt_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/bolt_secondary.png new file mode 100644 index 000000000..2e82154ce Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/bolt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/bolt_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/bolt_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/bolt_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed.png new file mode 100644 index 000000000..2548f5f03 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_overlay.png new file mode 100644 index 000000000..d86bb9c55 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_purified.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_purified.png new file mode 100644 index 000000000..2548f5f03 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_purified.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_purified.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_purified.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_purified.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_purified_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_purified_secondary.png new file mode 100644 index 000000000..70752f403 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_purified_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_purified_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_purified_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_purified_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_refined.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_refined.png new file mode 100644 index 000000000..2548f5f03 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_refined.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_refined.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_refined.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_refined.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_refined_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_refined_overlay.png new file mode 100644 index 000000000..76f1bc4f2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_refined_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_refined_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_refined_secondary.png new file mode 100644 index 000000000..70752f403 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_refined_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_refined_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_refined_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_refined_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_secondary.png new file mode 100644 index 000000000..70752f403 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/crushed_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust.png new file mode 100644 index 000000000..ab051a35f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_impure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_impure.png new file mode 100644 index 000000000..baffced38 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_impure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_impure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_impure.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_impure.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_impure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_impure_overlay.png new file mode 100644 index 000000000..05f5d750d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_impure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_impure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_impure_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_impure_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_impure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_impure_secondary.png new file mode 100644 index 000000000..558ae58aa Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_impure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_impure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_impure_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_impure_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_pure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_pure.png new file mode 100644 index 000000000..a4f07d881 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_pure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_pure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_pure.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_pure.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_pure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_pure_overlay.png new file mode 100644 index 000000000..016f5b629 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_pure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_pure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_pure_secondary.png new file mode 100644 index 000000000..288de21d4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_pure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_pure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_pure_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_pure_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_secondary.png new file mode 100644 index 000000000..558ae58aa Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_small.png new file mode 100644 index 000000000..767457aaa Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_small.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_small_secondary.png new file mode 100644 index 000000000..08cfe0c0f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_small_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_small_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_tiny.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_tiny.png new file mode 100644 index 000000000..9b0b23970 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_tiny.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_tiny.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_tiny.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_tiny.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_tiny_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_tiny_secondary.png new file mode 100644 index 000000000..1862c889b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_tiny_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_tiny_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_tiny_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/dust_tiny_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/foil.png new file mode 100644 index 000000000..e1c0d0896 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/foil.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/foil.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/foil_overlay.png new file mode 100644 index 000000000..3da58b38d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/foil_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/foil_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/foil_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/foil_secondary.png new file mode 100644 index 000000000..2e77e45e0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/foil_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/foil_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/foil_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear.png new file mode 100644 index 000000000..2024771cb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_secondary.png new file mode 100644 index 000000000..9dcee283c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_small.png new file mode 100644 index 000000000..69ceca415 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_small.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_small_seconadry.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_small_seconadry.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_small_seconadry.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_small_secondary.png new file mode 100644 index 000000000..887b46d91 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_small_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/gear_small_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot.png new file mode 100644 index 000000000..e5dcefd29 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_double.png new file mode 100644 index 000000000..f05419ec9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_double.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_double.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_double_overlay.png new file mode 100644 index 000000000..c6743e564 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_double_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_double_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_double_secondary.png new file mode 100644 index 000000000..5839859e0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_double_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_double_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_hot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_hot.png new file mode 100644 index 000000000..1fd7b8daf Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_hot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_hot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_hot.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_hot.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_hot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_hot_overlay.png new file mode 100644 index 000000000..6df6eae07 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_hot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_hot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_hot_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_hot_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_overlay.png new file mode 100644 index 000000000..a783c4885 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_secondary.png new file mode 100644 index 000000000..1546d3cfe Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ingot_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/nugget.png new file mode 100644 index 000000000..f06cf8d6e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/nugget.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/nugget.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/nugget.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/nugget_overlay.png new file mode 100644 index 000000000..c52fee3e0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/nugget_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/nugget_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/nugget_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/nugget_secondary.png new file mode 100644 index 000000000..c3dacbe4b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/nugget_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/nugget_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/nugget_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate.png new file mode 100644 index 000000000..071bcab5e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_dense.png new file mode 100644 index 000000000..665e72dd8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_dense.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_dense.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_dense.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_dense_overlay.png new file mode 100644 index 000000000..51a8272fe Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_dense_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_dense_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_dense_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_dense_secondary.png new file mode 100644 index 000000000..e0d70f4f2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_dense_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_dense_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_dense_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_double.png new file mode 100644 index 000000000..89bb4ec1a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_double.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_double.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_double_overlay.png new file mode 100644 index 000000000..b0a689834 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_double_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_double_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_double_secondary.png new file mode 100644 index 000000000..15852488b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_double_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_double_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_overlay.png new file mode 100644 index 000000000..920bd7b60 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_secondary.png new file mode 100644 index 000000000..61e1b3480 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/plate_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/raw_ore.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/raw_ore.png new file mode 100644 index 000000000..34bf44aff Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/raw_ore.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/raw_ore.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/raw_ore.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/raw_ore.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/raw_ore_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/raw_ore_secondary.png new file mode 100644 index 000000000..a9faf2650 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/raw_ore_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/raw_ore_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/raw_ore_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/raw_ore_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ring.png new file mode 100644 index 000000000..562752af8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ring.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ring.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ring_overlay.png new file mode 100644 index 000000000..73ddc0140 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ring_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ring_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ring_secondary.png new file mode 100644 index 000000000..803f04796 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ring_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/ring_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod.png new file mode 100644 index 000000000..14852326b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_long.png new file mode 100644 index 000000000..5fec89b66 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_long.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_long.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_long.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_long_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_long_overlay.png new file mode 100644 index 000000000..ef5b531b7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_long_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_long_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_long_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_long_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_long_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_long_secondary.png new file mode 100644 index 000000000..ac2dcb403 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_long_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_long_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_long_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_long_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_overlay.png new file mode 100644 index 000000000..51240e7d7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_secondary.png new file mode 100644 index 000000000..4e56f92da Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rod_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rotor.png new file mode 100644 index 000000000..ad846da90 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rotor.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rotor.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rotor.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rotor_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rotor_overlay.png new file mode 100644 index 000000000..8eec24f13 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rotor_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rotor_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rotor_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rotor_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rotor_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rotor_secondary.png new file mode 100644 index 000000000..af7bcd235 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rotor_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rotor_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rotor_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/rotor_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/round.png new file mode 100644 index 000000000..90a3d58f4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/round.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/round.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/round.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/round_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/round_overlay.png new file mode 100644 index 000000000..28db2ad18 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/round_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/round_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/round_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/round_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/round_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/round_secondary.png new file mode 100644 index 000000000..4544d62ac Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/round_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/round_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/round_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/round_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/screw.png new file mode 100644 index 000000000..ff9f50c86 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/screw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/screw.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/screw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/screw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/screw_overlay.png new file mode 100644 index 000000000..317ce73db Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/screw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/screw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/screw_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/screw_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/screw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/screw_secondary.png new file mode 100644 index 000000000..fc714a55e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/screw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/screw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/screw_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/screw_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring.png new file mode 100644 index 000000000..e66bb7f63 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_overlay.png new file mode 100644 index 000000000..5547da48f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_secondary.png new file mode 100644 index 000000000..deb38300a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_small.png new file mode 100644 index 000000000..b4ced0036 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_small.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_small_overlay.png new file mode 100644 index 000000000..de9e49136 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_small_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_small_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_small_secondary.png new file mode 100644 index 000000000..eaf66c8d6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_small_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/spring_small_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_buzz_saw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_buzz_saw.png new file mode 100644 index 000000000..5b13a27b7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_buzz_saw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_buzz_saw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_buzz_saw.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_buzz_saw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_buzz_saw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_buzz_saw_overlay.png new file mode 100644 index 000000000..c591bcf13 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_buzz_saw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_buzz_saw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_buzz_saw_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_buzz_saw_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_buzz_saw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_buzz_saw_secondary.png new file mode 100644 index 000000000..1002d1754 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_buzz_saw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_buzz_saw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_buzz_saw_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_buzz_saw_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_chainsaw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_chainsaw.png new file mode 100644 index 000000000..4ee8ad218 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_chainsaw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_chainsaw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_chainsaw.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_chainsaw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_chainsaw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_chainsaw_secondary.png new file mode 100644 index 000000000..6df3baca7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_chainsaw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_chainsaw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_chainsaw_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_chainsaw_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_drill.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_drill.png new file mode 100644 index 000000000..7be7ac48f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_drill.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_drill.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_drill.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_drill.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_drill_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_drill_secondary.png new file mode 100644 index 000000000..73fb10dca Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_drill_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_drill_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_drill_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_drill_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_screwdriver.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_screwdriver.png new file mode 100644 index 000000000..5ee67ace3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_screwdriver.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_screwdriver.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_screwdriver.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_screwdriver.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_screwdriver_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_screwdriver_overlay.png new file mode 100644 index 000000000..32a1269ba Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_screwdriver_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_screwdriver_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_screwdriver_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_screwdriver_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_screwdriver_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_screwdriver_secondary.png new file mode 100644 index 000000000..bdd91292d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_screwdriver_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_screwdriver_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_screwdriver_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_screwdriver_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wirecutter.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wirecutter.png new file mode 100644 index 000000000..ed18fc82f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wirecutter.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wirecutter.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wirecutter.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wirecutter.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wrench.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wrench.png new file mode 100644 index 000000000..c2a2fbcbc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wrench.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wrench.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wrench.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wrench.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wrench_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wrench_overlay.png new file mode 100644 index 000000000..5f22ab7f2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wrench_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wrench_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wrench_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wrench_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wrench_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wrench_secondary.png new file mode 100644 index 000000000..70b49f6a5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wrench_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wrench_secondary.png - Copy.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wrench_secondary.png - Copy.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/tool_head_wrench_secondary.png - Copy.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/turbine_blade.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/turbine_blade.png new file mode 100644 index 000000000..26f1b0bbe Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/turbine_blade.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/turbine_blade.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/turbine_blade.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/turbine_blade.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/turbine_blade_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/turbine_blade_overlay.png new file mode 100644 index 000000000..f2a05be48 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/turbine_blade_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/turbine_blade_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/turbine_blade_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/turbine_blade_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/turbine_blade_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/turbine_blade_secondary.png new file mode 100644 index 000000000..6e053d2a4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/turbine_blade_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/turbine_blade_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/turbine_blade_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/turbine_blade_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/wire_fine.png new file mode 100644 index 000000000..489ee5d81 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/wire_fine.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/wire_fine.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/wire_fine.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/wire_fine_overlay.png new file mode 100644 index 000000000..d25cc6811 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/wire_fine_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/wire_fine_secondary.png new file mode 100644 index 000000000..ccdc69499 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/wire_fine_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/wire_fine_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/wire_fine_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronite_old/wire_fine_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/bolt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/bolt.png new file mode 100644 index 000000000..b86af57fa Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/bolt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/bolt.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/bolt.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/bolt.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/crushed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/crushed.png new file mode 100644 index 000000000..cfe2b248e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/crushed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/crushed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/crushed.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/crushed.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/crushed_purified.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/crushed_purified.png new file mode 100644 index 000000000..cfe2b248e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/crushed_purified.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/crushed_purified.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/crushed_purified.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/crushed_purified.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust.png new file mode 100644 index 000000000..93948a518 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_impure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_impure.png new file mode 100644 index 000000000..55ecfbfd8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_impure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_impure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_impure.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_impure.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_pure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_pure.png new file mode 100644 index 000000000..4b67f5def Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_pure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_pure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_pure.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_pure.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_small.png new file mode 100644 index 000000000..521e48e80 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_small.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_tiny.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_tiny.png new file mode 100644 index 000000000..32b2e905b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_tiny.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_tiny.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_tiny.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/dust_tiny.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/foil.png new file mode 100644 index 000000000..56bcc088c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/foil.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/foil.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/gear.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/gear.png new file mode 100644 index 000000000..3cc170c85 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/gear.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/gear.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/gear.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/gear.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/gear_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/gear_small.png new file mode 100644 index 000000000..dbf179be0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/gear_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/gear_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/gear_small.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/gear_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/heavy_beam.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/heavy_beam.png new file mode 100644 index 000000000..490eca7c1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/heavy_beam.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/heavy_beam.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/heavy_beam.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/heavy_beam.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot.png new file mode 100644 index 000000000..4de5d875a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot_double.png new file mode 100644 index 000000000..49d520c9f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot_double.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot_double.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot_hot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot_hot.png new file mode 100644 index 000000000..a7f74dd0c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot_hot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot_hot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot_hot.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot_hot.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot_hot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot_hot_overlay.png new file mode 100644 index 000000000..73b00fd78 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ingot_hot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/modular_shelling.png new file mode 100644 index 000000000..545b5eed3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/modular_shelling.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/modular_shelling.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/modular_shelling.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/nugget.png new file mode 100644 index 000000000..cc31e0de7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/nugget.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/nugget.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/nugget.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/plate.png new file mode 100644 index 000000000..87dde3ee0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/plate.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/plate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/plate_dense.png new file mode 100644 index 000000000..69069538a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/plate_dense.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/plate_dense.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/plate_dense.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/plate_double.png new file mode 100644 index 000000000..312dee36d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/plate_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/plate_double.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/plate_double.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/raw_ore.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/raw_ore.png new file mode 100644 index 000000000..d2061acb8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/raw_ore.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/raw_ore.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/raw_ore.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/raw_ore.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ring.png new file mode 100644 index 000000000..6a1bb66a1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ring.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ring.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/rod.png new file mode 100644 index 000000000..3a3910669 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/rod.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/rod.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/rod.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/rod_long.png new file mode 100644 index 000000000..46460dd3e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/rod_long.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/rod_long.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/rod_long.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/rotor.png new file mode 100644 index 000000000..37e3f3c2d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/rotor.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/rotor.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/rotor.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/round.png new file mode 100644 index 000000000..0d22af8e7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/round.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/round.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/round.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/screw.png new file mode 100644 index 000000000..2d69895a7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/screw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/screw.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/screw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/spring.png new file mode 100644 index 000000000..50e3e9ca1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/spring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/spring.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/spring.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/spring_small.png new file mode 100644 index 000000000..5d9dc02fd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/spring_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/spring_small.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/spring_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_buzz_saw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_buzz_saw.png new file mode 100644 index 000000000..b05924a2f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_buzz_saw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_buzz_saw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_buzz_saw.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_buzz_saw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_chainsaw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_chainsaw.png new file mode 100644 index 000000000..4ec38c1a4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_chainsaw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_chainsaw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_chainsaw.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_chainsaw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_drill.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_drill.png new file mode 100644 index 000000000..b2d524703 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_drill.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_drill.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_drill.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_drill.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_screwdriver.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_screwdriver.png new file mode 100644 index 000000000..db1ef10a1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_screwdriver.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_screwdriver.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_screwdriver.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_screwdriver.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_wirecutter.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_wirecutter.png new file mode 100644 index 000000000..dc292db07 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_wirecutter.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_wirecutter.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_wirecutter.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_wirecutter.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_wrench.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_wrench.png new file mode 100644 index 000000000..adef534d8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_wrench.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_wrench.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_wrench.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/tool_head_wrench.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/turbine_blade.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/turbine_blade.png new file mode 100644 index 000000000..9699fa835 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/turbine_blade.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/turbine_blade.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/turbine_blade.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/turbine_blade.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ultradense_plate.png new file mode 100644 index 000000000..d44e7b13c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ultradense_plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ultradense_plate.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/ultradense_plate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/wire_fine.png new file mode 100644 index 000000000..0ade861e2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/wire_fine.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/wire_fine.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/wire_fine.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/wire_fine_overlay.png new file mode 100644 index 000000000..d25cc6811 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/neutronium/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/alve_foil_insulator.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/alve_foil_insulator.png new file mode 100644 index 000000000..276fccc6c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/alve_foil_insulator.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/alve_foil_insulator.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/alve_foil_insulator.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/alve_foil_insulator.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/bolt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/bolt.png new file mode 100644 index 000000000..4e07968de Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/bolt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/bolt.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/bolt.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/bolt.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/bolt_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/bolt_overlay.png new file mode 100644 index 000000000..3d424935d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/bolt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/bolt_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/bolt_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/bolt_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/bolt_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/bolt_secondary.png new file mode 100644 index 000000000..6e9124b33 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/bolt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/bolt_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/bolt_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/bolt_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed.png new file mode 100644 index 000000000..b4a113d7a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_overlay.png new file mode 100644 index 000000000..aeb2c28a2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_purified.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_purified.png new file mode 100644 index 000000000..b4a113d7a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_purified.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_purified.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_purified.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_purified.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_purified_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_purified_secondary.png new file mode 100644 index 000000000..417c889a4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_purified_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_purified_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_purified_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_purified_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_refined.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_refined.png new file mode 100644 index 000000000..b4a113d7a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_refined.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_refined.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_refined.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_refined.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_refined_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_refined_overlay.png new file mode 100644 index 000000000..fc2217d97 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_refined_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_refined_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_refined_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_refined_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_refined_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_refined_secondary.png new file mode 100644 index 000000000..417c889a4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_refined_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_refined_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_refined_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_refined_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_secondary.png new file mode 100644 index 000000000..417c889a4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/crushed_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust.png new file mode 100644 index 000000000..5c03fec2e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_impure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_impure.png new file mode 100644 index 000000000..5c03fec2e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_impure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_impure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_impure.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_impure.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_impure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_impure_overlay.png new file mode 100644 index 000000000..fdf32e05f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_impure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_impure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_impure_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_impure_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_impure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_impure_secondary.png new file mode 100644 index 000000000..a309d7679 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_impure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_impure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_impure_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_impure_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_pure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_pure.png new file mode 100644 index 000000000..323152d79 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_pure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_pure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_pure.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_pure.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_pure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_pure_overlay.png new file mode 100644 index 000000000..7e105d498 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_pure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_pure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_pure_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_pure_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_pure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_pure_secondary.png new file mode 100644 index 000000000..17f8993c9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_pure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_pure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_pure_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_pure_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_secondary.png new file mode 100644 index 000000000..a309d7679 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_small.png new file mode 100644 index 000000000..e791ba1df Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_small.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_small_secondary.png new file mode 100644 index 000000000..458ae6634 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_small_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_small_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_tiny.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_tiny.png new file mode 100644 index 000000000..2a580fb41 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_tiny.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_tiny.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_tiny.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_tiny.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_tiny_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_tiny_secondary.png new file mode 100644 index 000000000..b4ea2bb11 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_tiny_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_tiny_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_tiny_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/dust_tiny_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/foil.png new file mode 100644 index 000000000..386c50af3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/foil.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/foil.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/foil_overlay.png new file mode 100644 index 000000000..f6bae421b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/foil_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/foil_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/foil_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/foil_secondary.png new file mode 100644 index 000000000..27a8fec70 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/foil_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/foil_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/foil_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/frothed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/frothed.png new file mode 100644 index 000000000..2dc3d5c53 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/frothed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/frothed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/frothed.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/frothed.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/frothed_overlay_glint.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/frothed_overlay_glint.png new file mode 100644 index 000000000..4d06f449d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/frothed_overlay_glint.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/frothed_overlay_glint.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/frothed_overlay_glint.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/frothed_overlay_glint.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/frothed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/frothed_secondary.png new file mode 100644 index 000000000..8974aa8db Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/frothed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/frothed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/frothed_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/frothed_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear.png new file mode 100644 index 000000000..d3989cf60 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_overlay.png new file mode 100644 index 000000000..3a667d5c8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_secondary.png new file mode 100644 index 000000000..afa61e3bd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_small.png new file mode 100644 index 000000000..a7558ecfa Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_small.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_small_overlay.png new file mode 100644 index 000000000..57e9dc5a7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_small_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_small_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_small_secondary.png new file mode 100644 index 000000000..8151f22d3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_small_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gear_small_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem.png new file mode 100644 index 000000000..f403e62e6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_chipped.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_chipped.png new file mode 100644 index 000000000..dfeaefea3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_chipped.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_chipped.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_chipped.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_chipped.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_chipped_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_chipped_overlay.png new file mode 100644 index 000000000..ca9d1f30f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_chipped_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_chipped_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_chipped_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_chipped_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_chipped_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_chipped_secondary.png new file mode 100644 index 000000000..85e2598d4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_chipped_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_chipped_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_chipped_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_chipped_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawed.png new file mode 100644 index 000000000..7cf10421e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawed.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawed.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawed_overlay.png new file mode 100644 index 000000000..903ffc76c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawed_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawed_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawed_secondary.png new file mode 100644 index 000000000..ef2d83ce2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawed_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawed_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawless.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawless.png new file mode 100644 index 000000000..fa8535f06 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawless.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawless.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawless.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawless.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawless_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawless_overlay.png new file mode 100644 index 000000000..3e0e567c7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawless_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawless_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawless_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawless_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawless_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawless_secondary.png new file mode 100644 index 000000000..b9e2a1806 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawless_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawless_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawless_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_flawless_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_overlay.png new file mode 100644 index 000000000..dc48146df Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_secondary.png new file mode 100644 index 000000000..57e9e92e7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/gem_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/heavy_beam.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/heavy_beam.png new file mode 100644 index 000000000..49d158852 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/heavy_beam.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/heavy_beam.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/heavy_beam.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/heavy_beam.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot.png new file mode 100644 index 000000000..be206cc8c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_double.png new file mode 100644 index 000000000..312f36875 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_double.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_double.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_double_overlay.png new file mode 100644 index 000000000..d63ad0ae4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_double_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_double_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_double_secondary.png new file mode 100644 index 000000000..2383b55e2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_double_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_double_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_hot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_hot.png new file mode 100644 index 000000000..3fb39d899 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_hot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_hot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_hot.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_hot.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_hot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_hot_overlay.png new file mode 100644 index 000000000..2a4988b34 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_hot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_hot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_hot_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_hot_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_hot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_hot_secondary.png new file mode 100644 index 000000000..eb346ae91 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_hot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_hot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_hot_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_hot_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_overlay.png new file mode 100644 index 000000000..4a9005ebb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_secondary.png new file mode 100644 index 000000000..60075a993 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ingot_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/leached.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/leached.png new file mode 100644 index 000000000..8f0dc561f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/leached.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/leached.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/leached.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/leached.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/leached_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/leached_secondary.png new file mode 100644 index 000000000..676fe9f81 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/leached_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/leached_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/leached_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/leached_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/lens.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/lens.png new file mode 100644 index 000000000..bd4c0207e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/lens.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/lens.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/lens.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/lens.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/lens_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/lens_overlay.png new file mode 100644 index 000000000..cde9e663c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/lens_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/lens_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/lens_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/lens_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/lens_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/lens_secondary.png new file mode 100644 index 000000000..afa84082b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/lens_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/lens_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/lens_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/lens_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/modular_shelling.png new file mode 100644 index 000000000..03745c0dd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/modular_shelling.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/modular_shelling.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/modular_shelling.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/nugget.png new file mode 100644 index 000000000..4fecede52 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/nugget.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/nugget.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/nugget.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/nugget_overlay.png new file mode 100644 index 000000000..e39ed255a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/nugget_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/nugget_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/nugget_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/nugget_secondary.png new file mode 100644 index 000000000..fd884531c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/nugget_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/nugget_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/nugget_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plasmites.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plasmites.png new file mode 100644 index 000000000..06ef30b0b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plasmites.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plasmites.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plasmites.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plasmites.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate.png new file mode 100644 index 000000000..e198faad1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_dense.png new file mode 100644 index 000000000..2fdcc0b3e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_dense.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_dense.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_dense.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_dense_overlay.png new file mode 100644 index 000000000..f98b61b66 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_dense_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_dense_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_dense_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_dense_secondary.png new file mode 100644 index 000000000..b4b0d46e0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_dense_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_dense_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_dense_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_double.png new file mode 100644 index 000000000..9bdef5418 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_double.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_double.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_double_overlay.png new file mode 100644 index 000000000..0899f35bd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_double_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_double_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_double_secondary.png new file mode 100644 index 000000000..19f4a2c7f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_double_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_double_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_overlay.png new file mode 100644 index 000000000..a399d79e4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_secondary.png new file mode 100644 index 000000000..48e54ee17 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/plate_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/raw_ore.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/raw_ore.png new file mode 100644 index 000000000..0e753ffdd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/raw_ore.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/raw_ore.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/raw_ore.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/raw_ore.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/raw_ore_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/raw_ore_secondary.png new file mode 100644 index 000000000..187f92590 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/raw_ore_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/raw_ore_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/raw_ore_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/raw_ore_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ring.png new file mode 100644 index 000000000..96f3e8db8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ring.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ring.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ring_overlay.png new file mode 100644 index 000000000..ea0b0d99d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ring_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ring_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ring_secondary.png new file mode 100644 index 000000000..dd7cc0af1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ring_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ring_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod.png new file mode 100644 index 000000000..3defa6eb4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod_long.png new file mode 100644 index 000000000..882e403ac Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod_long.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod_long.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod_long.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod_long_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod_long_secondary.png new file mode 100644 index 000000000..7416a03af Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod_long_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod_long_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod_long_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod_long_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod_secondary.png new file mode 100644 index 000000000..314dd4af6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rod_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rotor.png new file mode 100644 index 000000000..565e415d6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rotor.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rotor.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rotor.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rotor_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rotor_overlay.png new file mode 100644 index 000000000..f5d142197 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rotor_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rotor_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rotor_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rotor_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rotor_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rotor_secondary.png new file mode 100644 index 000000000..393dfb308 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rotor_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rotor_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rotor_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/rotor_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/round.png new file mode 100644 index 000000000..d61c94506 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/round.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/round.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/round.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/round_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/round_secondary.png new file mode 100644 index 000000000..0c961d567 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/round_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/round_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/round_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/round_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/screw.png new file mode 100644 index 000000000..46d015b85 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/screw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/screw.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/screw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/screw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/screw_overlay.png new file mode 100644 index 000000000..16c493a5b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/screw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/screw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/screw_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/screw_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/screw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/screw_secondary.png new file mode 100644 index 000000000..077da98c3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/screw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/screw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/screw_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/screw_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/shape_memory_foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/shape_memory_foil.png new file mode 100644 index 000000000..94b2273d1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/shape_memory_foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/shape_memory_foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/shape_memory_foil.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/shape_memory_foil.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring.png new file mode 100644 index 000000000..5a07594a6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_overlay.png new file mode 100644 index 000000000..8e7a6a25b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_secondary.png new file mode 100644 index 000000000..64f0947c7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_small.png new file mode 100644 index 000000000..25521ca00 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_small.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_small_overlay.png new file mode 100644 index 000000000..26f9cf321 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_small_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_small_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_small_secondary.png new file mode 100644 index 000000000..2fa7eb3ed Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_small_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/spring_small_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_buzz_saw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_buzz_saw.png new file mode 100644 index 000000000..d89062960 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_buzz_saw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_buzz_saw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_buzz_saw.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_buzz_saw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_buzz_saw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_buzz_saw_overlay.png new file mode 100644 index 000000000..583c0d964 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_buzz_saw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_buzz_saw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_buzz_saw_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_buzz_saw_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_buzz_saw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_buzz_saw_secondary.png new file mode 100644 index 000000000..9fd5b080d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_buzz_saw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_buzz_saw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_buzz_saw_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_buzz_saw_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_chainsaw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_chainsaw.png new file mode 100644 index 000000000..aed61b2eb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_chainsaw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_chainsaw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_chainsaw.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_chainsaw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_chainsaw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_chainsaw_secondary.png new file mode 100644 index 000000000..d483f5e7c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_chainsaw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_chainsaw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_chainsaw_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_chainsaw_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_drill.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_drill.png new file mode 100644 index 000000000..e9ea69fe6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_drill.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_drill.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_drill.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_drill.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_drill_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_drill_secondary.png new file mode 100644 index 000000000..39eea2057 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_drill_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_drill_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_drill_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_drill_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_screwdriver.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_screwdriver.png new file mode 100644 index 000000000..2d8c160b6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_screwdriver.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_screwdriver.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_screwdriver.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_screwdriver.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_screwdriver_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_screwdriver_overlay.png new file mode 100644 index 000000000..064f13732 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_screwdriver_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_screwdriver_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_screwdriver_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_screwdriver_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_screwdriver_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_screwdriver_secondary.png new file mode 100644 index 000000000..acab9258e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_screwdriver_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_screwdriver_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_screwdriver_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_screwdriver_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wirecutter.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wirecutter.png new file mode 100644 index 000000000..37852aa8b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wirecutter.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wirecutter.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wirecutter.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wirecutter.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wrench.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wrench.png new file mode 100644 index 000000000..5b125bc70 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wrench.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wrench.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wrench.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wrench.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wrench_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wrench_overlay.png new file mode 100644 index 000000000..463fd660d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wrench_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wrench_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wrench_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wrench_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wrench_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wrench_secondary.png new file mode 100644 index 000000000..d78539bfa Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wrench_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wrench_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wrench_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/tool_head_wrench_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/turbine_blade.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/turbine_blade.png new file mode 100644 index 000000000..7925d9d12 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/turbine_blade.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/turbine_blade.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/turbine_blade.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/turbine_blade.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/turbine_blade_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/turbine_blade_overlay.png new file mode 100644 index 000000000..1e004050e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/turbine_blade_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/turbine_blade_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/turbine_blade_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/turbine_blade_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/turbine_blade_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/turbine_blade_secondary.png new file mode 100644 index 000000000..f1bf7f474 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/turbine_blade_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/turbine_blade_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/turbine_blade_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/turbine_blade_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ultradense_plate.png new file mode 100644 index 000000000..e142516ba Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ultradense_plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ultradense_plate.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ultradense_plate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ultradense_plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ultradense_plate_overlay.png new file mode 100644 index 000000000..cd72f8f71 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ultradense_plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ultradense_plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ultradense_plate_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/ultradense_plate_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_fine.png new file mode 100644 index 000000000..c31b95b52 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_fine.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_fine.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_fine.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_fine_overlay.png new file mode 100644 index 000000000..064a2f333 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_fine_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_fine_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_fine_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_fine_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_fine_secondary.png new file mode 100644 index 000000000..757aeeb2d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_fine_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_fine_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_fine_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_fine_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_spool.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_spool.png new file mode 100644 index 000000000..b2deb3436 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_spool.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_spool.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_spool.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_spool.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_spool_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_spool_overlay.png new file mode 100644 index 000000000..b2d5ff8eb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_spool_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_spool_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_spool_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/nevramite/wire_spool_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/alve_foil_insulator.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/alve_foil_insulator.png new file mode 100644 index 000000000..e08286335 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/alve_foil_insulator.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/alve_foil_insulator_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/alve_foil_insulator_overlay.png new file mode 100644 index 000000000..681e0eb89 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/alve_foil_insulator_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/alve_foil_insulator_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/alve_foil_insulator_secondary.png new file mode 100644 index 000000000..ad05464f1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/alve_foil_insulator_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/heavy_beam.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/heavy_beam.png new file mode 100644 index 000000000..c06a7a88d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/heavy_beam.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/heavy_beam_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/heavy_beam_overlay.png new file mode 100644 index 000000000..a1f1099ff Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/heavy_beam_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/heavy_beam_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/heavy_beam_secondary.png new file mode 100644 index 000000000..efa2472d0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/heavy_beam_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/modular_shelling.png new file mode 100644 index 000000000..61d64ad6f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/modular_shelling_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/modular_shelling_overlay.png new file mode 100644 index 000000000..f29b927ed Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/modular_shelling_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/modular_shelling_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/modular_shelling_secondary.png new file mode 100644 index 000000000..af92db314 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/modular_shelling_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/raw_ore_cubic.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/raw_ore_cubic.png new file mode 100644 index 000000000..6086e06e6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/raw_ore_cubic.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/raw_ore_cubic_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/raw_ore_cubic_overlay.png new file mode 100644 index 000000000..905def89f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/raw_ore_cubic_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/raw_ore_cubic_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/raw_ore_cubic_secondary.png new file mode 100644 index 000000000..48c9dfdb0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/raw_ore_cubic_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/shape_memory_foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/shape_memory_foil.png new file mode 100644 index 000000000..aba3b8778 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/shape_memory_foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/shape_memory_foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/shape_memory_foil_overlay.png new file mode 100644 index 000000000..0be8cefdb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/shape_memory_foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/shape_memory_foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/shape_memory_foil_secondary.png new file mode 100644 index 000000000..7b72bb1b2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/shape_memory_foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/ultradense_plate.png new file mode 100644 index 000000000..2cbe1abaf Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/ultradense_plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/ultradense_plate_overlay.png new file mode 100644 index 000000000..1cea278ba Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/ultradense_plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/ultradense_plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/ultradense_plate_secondary.png new file mode 100644 index 000000000..6fbb77492 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/shiny/ultradense_plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/blank.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/blank.png new file mode 100644 index 000000000..46e56a1e6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/blank.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/blank.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/blank.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/blank.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/block.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/block.png new file mode 100644 index 000000000..cb08602fd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/block.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/block.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/block.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/block.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/bolt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/bolt.png new file mode 100644 index 000000000..a2810f7dd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/bolt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/bolt.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/bolt.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/bolt.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/bolt_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/bolt_overlay.png new file mode 100644 index 000000000..3a9d5ea94 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/bolt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/bolt_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/bolt_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/bolt_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/bolt_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/bolt_secondary.png new file mode 100644 index 000000000..9009c7362 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/bolt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/bolt_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/bolt_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/bolt_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed.png new file mode 100644 index 000000000..0bdc38d2d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_overlay.png new file mode 100644 index 000000000..d3a921b69 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_purified.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_purified.png new file mode 100644 index 000000000..0bdc38d2d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_purified.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_purified.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_purified.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_purified.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_purified_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_purified_secondary.png new file mode 100644 index 000000000..8c5010179 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_purified_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_purified_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_purified_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_purified_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_refined.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_refined.png new file mode 100644 index 000000000..0bdc38d2d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_refined.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_refined.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_refined.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_refined.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_refined_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_refined_overlay.png new file mode 100644 index 000000000..25c63d199 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_refined_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_refined_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_refined_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_refined_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_refined_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_refined_secondary.png new file mode 100644 index 000000000..8c5010179 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_refined_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_refined_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_refined_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_refined_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_secondary.png new file mode 100644 index 000000000..8c5010179 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/crushed_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust.png new file mode 100644 index 000000000..d5aec1679 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_impure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_impure.png new file mode 100644 index 000000000..d5aec1679 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_impure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_impure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_impure.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_impure.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_impure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_impure_overlay.png new file mode 100644 index 000000000..83546100b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_impure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_impure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_impure_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_impure_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_impure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_impure_secondary.png new file mode 100644 index 000000000..9252f3657 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_impure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_impure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_impure_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_impure_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_pure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_pure.png new file mode 100644 index 000000000..58311edea Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_pure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_pure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_pure.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_pure.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_pure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_pure_overlay.png new file mode 100644 index 000000000..20148ef96 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_pure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_pure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_pure_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_pure_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_pure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_pure_secondary.png new file mode 100644 index 000000000..4134bf0e1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_pure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_pure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_pure_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_pure_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_secondary.png new file mode 100644 index 000000000..9252f3657 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_small.png new file mode 100644 index 000000000..112180f80 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_small.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_small_secondary.png new file mode 100644 index 000000000..6ae2d839d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_small_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_small_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_tiny.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_tiny.png new file mode 100644 index 000000000..7061cb841 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_tiny.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_tiny.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_tiny.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_tiny.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_tiny_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_tiny_secondary.png new file mode 100644 index 000000000..0e4b4595f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_tiny_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_tiny_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_tiny_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/dust_tiny_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/foil.png new file mode 100644 index 000000000..30d7d7a27 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/foil.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/foil.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/foil_overlay.png new file mode 100644 index 000000000..4cd03f94a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/foil_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/foil_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/foil_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/foil_secondary.png new file mode 100644 index 000000000..ca9235a48 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/foil_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/foil_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/foil_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frame_gt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frame_gt.png new file mode 100644 index 000000000..aeb5e933e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frame_gt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frame_gt.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frame_gt.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frame_gt.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frothed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frothed.png new file mode 100644 index 000000000..6f97fce3d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frothed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frothed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frothed.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frothed.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frothed_overlay_glint.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frothed_overlay_glint.png new file mode 100644 index 000000000..1f6f03a43 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frothed_overlay_glint.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frothed_overlay_glint.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frothed_overlay_glint.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frothed_overlay_glint.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frothed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frothed_secondary.png new file mode 100644 index 000000000..701af8241 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frothed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frothed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frothed_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/frothed_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear.png new file mode 100644 index 000000000..5fbeedc99 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_overlay.png new file mode 100644 index 000000000..83df4147f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_secondary.png new file mode 100644 index 000000000..09d889d95 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_small.png new file mode 100644 index 000000000..1c1a4784b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_small.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_small_overlay.png new file mode 100644 index 000000000..ff3e135da Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_small_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_small_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_small_secondary.png new file mode 100644 index 000000000..9fda28e91 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_small_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gear_small_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem.png new file mode 100644 index 000000000..eef94a8f8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_chipped.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_chipped.png new file mode 100644 index 000000000..9aed5e91c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_chipped.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_chipped.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_chipped.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_chipped.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_chipped_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_chipped_overlay.png new file mode 100644 index 000000000..b79d6c97a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_chipped_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_chipped_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_chipped_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_chipped_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_chipped_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_chipped_secondary.png new file mode 100644 index 000000000..957b01c84 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_chipped_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_chipped_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_chipped_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_chipped_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawed.png new file mode 100644 index 000000000..1c4b5f1c2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawed.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawed.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawed_overlay.png new file mode 100644 index 000000000..85b03952a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawed_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawed_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawed_secondary.png new file mode 100644 index 000000000..40a58cbb7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawed_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawed_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawless.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawless.png new file mode 100644 index 000000000..b9126ec91 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawless.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawless.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawless.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawless.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawless_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawless_overlay.png new file mode 100644 index 000000000..d5c9a9a85 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawless_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawless_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawless_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawless_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawless_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawless_secondary.png new file mode 100644 index 000000000..2468ac96e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawless_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawless_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawless_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_flawless_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_overlay.png new file mode 100644 index 000000000..6e4864da2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_secondary.png new file mode 100644 index 000000000..ed5625327 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/gem_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/heavy_beam.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/heavy_beam.png new file mode 100644 index 000000000..8aafec96a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/heavy_beam.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/heavy_beam.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/heavy_beam.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/heavy_beam.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot.png new file mode 100644 index 000000000..d4caa7710 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_double.png new file mode 100644 index 000000000..d16a4fc8f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_double.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_double.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_double_overlay.png new file mode 100644 index 000000000..efd6b99e9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_double_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_double_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_double_secondary.png new file mode 100644 index 000000000..6c04aaaab Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_double_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_double_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_hot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_hot.png new file mode 100644 index 000000000..05bd60092 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_hot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_hot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_hot.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_hot.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_hot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_hot_overlay.png new file mode 100644 index 000000000..c7b8d8a48 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_hot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_hot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_hot_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_hot_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_hot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_hot_secondary.png new file mode 100644 index 000000000..f564132ec Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_hot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_hot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_hot_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_hot_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_overlay.png new file mode 100644 index 000000000..9a49ce01a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_secondary.png new file mode 100644 index 000000000..cfba6b365 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ingot_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/leached.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/leached.png new file mode 100644 index 000000000..14e84852b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/leached.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/leached.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/leached.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/leached.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/leached_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/leached_secondary.png new file mode 100644 index 000000000..5ee8dab1f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/leached_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/leached_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/leached_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/leached_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/lens.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/lens.png new file mode 100644 index 000000000..4e866548f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/lens.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/lens.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/lens.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/lens.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/lens_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/lens_overlay.png new file mode 100644 index 000000000..66a47d571 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/lens_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/lens_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/lens_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/lens_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/lens_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/lens_secondary.png new file mode 100644 index 000000000..01fd4f751 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/lens_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/lens_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/lens_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/lens_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/modular_shelling.png new file mode 100644 index 000000000..bd210047c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/modular_shelling.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/modular_shelling.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/modular_shelling.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/nugget.png new file mode 100644 index 000000000..636264e63 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/nugget.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/nugget.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/nugget.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/nugget_overlay.png new file mode 100644 index 000000000..ef037f110 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/nugget_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/nugget_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/nugget_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/nugget_secondary.png new file mode 100644 index 000000000..df9083ec3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/nugget_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/nugget_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/nugget_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plasmites.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plasmites.png new file mode 100644 index 000000000..5110a0d19 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plasmites.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plasmites.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plasmites.png.mcmeta new file mode 100644 index 000000000..6a199bf8f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plasmites.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate.png new file mode 100644 index 000000000..236583065 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_dense.png new file mode 100644 index 000000000..d7822aabe Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_dense.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_dense.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_dense.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_dense_overlay.png new file mode 100644 index 000000000..12844dd0f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_dense_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_dense_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_dense_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_dense_secondary.png new file mode 100644 index 000000000..79414d37d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_dense_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_dense_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_dense_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_double.png new file mode 100644 index 000000000..98185b282 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_double.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_double.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_double_overlay.png new file mode 100644 index 000000000..2af8c1c8e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_double_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_double_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_double_secondary.png new file mode 100644 index 000000000..97ae6ac48 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_double_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_double_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_overlay.png new file mode 100644 index 000000000..e1af00678 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_secondary.png new file mode 100644 index 000000000..ee16f1059 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/plate_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/raw_ore.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/raw_ore.png new file mode 100644 index 000000000..56c79eb70 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/raw_ore.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/raw_ore.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/raw_ore.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/raw_ore.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/raw_ore_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/raw_ore_secondary.png new file mode 100644 index 000000000..0c6291084 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/raw_ore_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/raw_ore_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/raw_ore_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/raw_ore_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ring.png new file mode 100644 index 000000000..6c4a887f4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ring.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ring.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ring_overlay.png new file mode 100644 index 000000000..ff099f614 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ring_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ring_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ring_secondary.png new file mode 100644 index 000000000..a18305edd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ring_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ring_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod.png new file mode 100644 index 000000000..0cac8167a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod_long.png new file mode 100644 index 000000000..21a2b1fb4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod_long.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod_long.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod_long.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod_long_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod_long_secondary.png new file mode 100644 index 000000000..2ea7a427f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod_long_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod_long_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod_long_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod_long_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod_secondary.png new file mode 100644 index 000000000..5c0d43451 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rod_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rotor.png new file mode 100644 index 000000000..46135c303 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rotor.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rotor.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rotor.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rotor_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rotor_overlay.png new file mode 100644 index 000000000..6f02ab63d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rotor_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rotor_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rotor_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rotor_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rotor_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rotor_secondary.png new file mode 100644 index 000000000..2850ab6fc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rotor_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rotor_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rotor_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/rotor_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/round.png new file mode 100644 index 000000000..c1f9abd5b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/round.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/round.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/round.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/round_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/round_secondary.png new file mode 100644 index 000000000..75fef359b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/round_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/round_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/round_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/round_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/screw.png new file mode 100644 index 000000000..0ab9a8f75 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/screw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/screw.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/screw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/screw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/screw_overlay.png new file mode 100644 index 000000000..fa4fff068 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/screw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/screw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/screw_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/screw_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/screw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/screw_secondary.png new file mode 100644 index 000000000..bcdbfdcec Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/screw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/screw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/screw_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/screw_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring.png new file mode 100644 index 000000000..0a0d56777 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_overlay.png new file mode 100644 index 000000000..965331b80 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_secondary.png new file mode 100644 index 000000000..587630f95 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_small.png new file mode 100644 index 000000000..159bacc76 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_small.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_small_overlay.png new file mode 100644 index 000000000..8b5cdf0e0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_small_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_small_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_small_secondary.png new file mode 100644 index 000000000..d80d56a39 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_small_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/spring_small_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_buzz_saw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_buzz_saw.png new file mode 100644 index 000000000..c695c62cd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_buzz_saw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_buzz_saw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_buzz_saw.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_buzz_saw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_buzz_saw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_buzz_saw_overlay.png new file mode 100644 index 000000000..f318c10ea Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_buzz_saw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_buzz_saw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_buzz_saw_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_buzz_saw_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_buzz_saw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_buzz_saw_secondary.png new file mode 100644 index 000000000..c6363e4bc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_buzz_saw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_buzz_saw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_buzz_saw_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_buzz_saw_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_chainsaw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_chainsaw.png new file mode 100644 index 000000000..f3ab29d03 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_chainsaw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_chainsaw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_chainsaw.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_chainsaw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_chainsaw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_chainsaw_secondary.png new file mode 100644 index 000000000..65486d5b4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_chainsaw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_chainsaw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_chainsaw_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_chainsaw_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_drill.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_drill.png new file mode 100644 index 000000000..7264f3a2f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_drill.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_drill.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_drill.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_drill.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_drill_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_drill_secondary.png new file mode 100644 index 000000000..5ab22d885 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_drill_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_drill_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_drill_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_drill_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_screwdriver.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_screwdriver.png new file mode 100644 index 000000000..4d6a961c6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_screwdriver.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_screwdriver.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_screwdriver.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_screwdriver.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_screwdriver_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_screwdriver_overlay.png new file mode 100644 index 000000000..5259cd011 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_screwdriver_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_screwdriver_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_screwdriver_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_screwdriver_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_screwdriver_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_screwdriver_secondary.png new file mode 100644 index 000000000..69c452c1e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_screwdriver_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_screwdriver_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_screwdriver_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_screwdriver_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wirecutter.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wirecutter.png new file mode 100644 index 000000000..827b81a94 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wirecutter.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wirecutter.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wirecutter.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wirecutter.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wrench.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wrench.png new file mode 100644 index 000000000..725136536 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wrench.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wrench.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wrench.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wrench.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wrench_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wrench_overlay.png new file mode 100644 index 000000000..0ba2382f2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wrench_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wrench_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wrench_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wrench_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wrench_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wrench_secondary.png new file mode 100644 index 000000000..bf4d13d55 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wrench_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wrench_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wrench_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/tool_head_wrench_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/turbine_blade.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/turbine_blade.png new file mode 100644 index 000000000..4f07f8bcb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/turbine_blade.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/turbine_blade.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/turbine_blade.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/turbine_blade.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/turbine_blade_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/turbine_blade_overlay.png new file mode 100644 index 000000000..042acd6dc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/turbine_blade_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/turbine_blade_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/turbine_blade_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/turbine_blade_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/turbine_blade_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/turbine_blade_secondary.png new file mode 100644 index 000000000..7b2f3d973 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/turbine_blade_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/turbine_blade_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/turbine_blade_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/turbine_blade_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ultradense_plate.png new file mode 100644 index 000000000..163ef5ef9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ultradense_plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ultradense_plate.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ultradense_plate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ultradense_plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ultradense_plate_overlay.png new file mode 100644 index 000000000..9fa42788d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ultradense_plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ultradense_plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ultradense_plate_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/ultradense_plate_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_end.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_end.png new file mode 100644 index 000000000..477e63bc4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_end.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_end.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_end.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_end.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_fine.png new file mode 100644 index 000000000..e78e25ad6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_fine.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_fine.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_fine.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_fine_overlay.png new file mode 100644 index 000000000..fa105df26 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_fine_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_fine_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_fine_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_fine_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_fine_secondary.png new file mode 100644 index 000000000..5a32e5326 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_fine_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_fine_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_fine_secondary.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_fine_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_side.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_side.png new file mode 100644 index 000000000..6659847bd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_side.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_side.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_side.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_side.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_spool.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_spool.png new file mode 100644 index 000000000..8c6f6bf6b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_spool.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_spool.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_spool.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_spool.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_spool_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_spool_overlay.png new file mode 100644 index 000000000..03303e63b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_spool_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_spool_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_spool_overlay.png.mcmeta new file mode 100644 index 000000000..b53077e2f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/sol/wire_spool_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/bolt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/bolt.png new file mode 100644 index 000000000..d06e3be68 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/bolt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/bolt.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/bolt.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/bolt.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/bolt_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/bolt_overlay.png new file mode 100644 index 000000000..6b234b5a1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/bolt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/bolt_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/bolt_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/bolt_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/bolt_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/bolt_secondary.png new file mode 100644 index 000000000..0ce10807c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/bolt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/bolt_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/bolt_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/bolt_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed.png new file mode 100644 index 000000000..0171f1b45 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_overlay.png new file mode 100644 index 000000000..6784b0e79 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_purified.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_purified.png new file mode 100644 index 000000000..0171f1b45 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_purified.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_purified.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_purified.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_purified.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_purified_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_purified_secondary.png new file mode 100644 index 000000000..0b1ca78f3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_purified_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_purified_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_purified_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_purified_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_refined.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_refined.png new file mode 100644 index 000000000..0171f1b45 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_refined.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_refined.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_refined.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_refined.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_refined_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_refined_overlay.png new file mode 100644 index 000000000..6b263773c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_refined_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_refined_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_refined_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_refined_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_refined_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_refined_secondary.png new file mode 100644 index 000000000..0b1ca78f3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_refined_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_refined_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_refined_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_refined_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_secondary.png new file mode 100644 index 000000000..0b1ca78f3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/crushed_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust.png new file mode 100644 index 000000000..72fa0c44b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_impure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_impure.png new file mode 100644 index 000000000..72fa0c44b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_impure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_impure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_impure.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_impure.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_impure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_impure_overlay.png new file mode 100644 index 000000000..a940cb7bf Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_impure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_impure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_impure_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_impure_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_impure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_impure_secondary.png new file mode 100644 index 000000000..05096d3a9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_impure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_impure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_impure_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_impure_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_pure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_pure.png new file mode 100644 index 000000000..88ba4888a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_pure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_pure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_pure.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_pure.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_pure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_pure_overlay.png new file mode 100644 index 000000000..c349885f7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_pure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_pure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_pure_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_pure_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_pure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_pure_secondary.png new file mode 100644 index 000000000..246cb8937 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_pure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_pure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_pure_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_pure_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_secondary.png new file mode 100644 index 000000000..05096d3a9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_small.png new file mode 100644 index 000000000..f8957def7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_small.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_small_secondary.png new file mode 100644 index 000000000..c84221cb5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_small_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_small_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_tiny.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_tiny.png new file mode 100644 index 000000000..7793b70b6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_tiny.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_tiny.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_tiny.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_tiny.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_tiny_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_tiny_secondary.png new file mode 100644 index 000000000..4f4940215 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_tiny_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_tiny_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_tiny_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/dust_tiny_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/foil.png new file mode 100644 index 000000000..eb1eac575 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/foil.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/foil.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/foil_overlay.png new file mode 100644 index 000000000..85d8ca543 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/foil_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/foil_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/foil_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/foil_secondary.png new file mode 100644 index 000000000..a8841dddc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/foil_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/foil_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/foil_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear.png new file mode 100644 index 000000000..108824f45 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_overlay.png new file mode 100644 index 000000000..c403190c0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_secondary.png new file mode 100644 index 000000000..bece5ffd8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_small.png new file mode 100644 index 000000000..04afa02b8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_small.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_small_overlay.png new file mode 100644 index 000000000..e418e2f16 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_small_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_small_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_small_secondary.png new file mode 100644 index 000000000..9a19d7c6f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_small_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gear_small_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem.png new file mode 100644 index 000000000..d41b51711 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_chipped.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_chipped.png new file mode 100644 index 000000000..b44e26428 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_chipped.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_chipped.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_chipped.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_chipped.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_chipped_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_chipped_overlay.png new file mode 100644 index 000000000..838e7ca52 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_chipped_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_chipped_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_chipped_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_chipped_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_chipped_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_chipped_secondary.png new file mode 100644 index 000000000..f8f594035 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_chipped_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_chipped_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_chipped_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_chipped_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawed.png new file mode 100644 index 000000000..7b5279733 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawed.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawed.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawed_overlay.png new file mode 100644 index 000000000..c81f370d2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawed_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawed_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawed_secondary.png new file mode 100644 index 000000000..7a35416e2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawed_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawed_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawless.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawless.png new file mode 100644 index 000000000..726b65b05 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawless.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawless.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawless.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawless.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawless_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawless_overlay.png new file mode 100644 index 000000000..c32e271ad Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawless_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawless_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawless_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawless_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawless_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawless_secondary.png new file mode 100644 index 000000000..b0030b677 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawless_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawless_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawless_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_flawless_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_overlay.png new file mode 100644 index 000000000..411179295 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_secondary.png new file mode 100644 index 000000000..fbd7a6488 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/gem_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/heavy_beam.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/heavy_beam.png new file mode 100644 index 000000000..fdeb5f05a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/heavy_beam.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/heavy_beam.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/heavy_beam.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/heavy_beam.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot.png new file mode 100644 index 000000000..8503827d1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_double.png new file mode 100644 index 000000000..1542141c6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_double.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_double.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_double_overlay.png new file mode 100644 index 000000000..67919919b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_double_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_double_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_double_secondary.png new file mode 100644 index 000000000..73d1978bf Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_double_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_double_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_hot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_hot.png new file mode 100644 index 000000000..93dde566e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_hot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_hot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_hot.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_hot.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_hot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_hot_overlay.png new file mode 100644 index 000000000..7f3afd1e7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_hot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_hot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_hot_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_hot_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_hot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_hot_secondary.png new file mode 100644 index 000000000..55365f15f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_hot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_hot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_hot_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_hot_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_overlay.png new file mode 100644 index 000000000..542c916ac Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_secondary.png new file mode 100644 index 000000000..2aa557859 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ingot_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/lens.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/lens.png new file mode 100644 index 000000000..29a5a5f57 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/lens.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/lens.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/lens.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/lens.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/lens_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/lens_overlay.png new file mode 100644 index 000000000..2b83fbc06 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/lens_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/lens_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/lens_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/lens_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/lens_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/lens_secondary.png new file mode 100644 index 000000000..52d0d6ce8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/lens_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/lens_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/lens_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/lens_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/modular_shelling.png new file mode 100644 index 000000000..5880328d3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/modular_shelling.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/modular_shelling.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/modular_shelling.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/nugget.png new file mode 100644 index 000000000..a7e004543 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/nugget.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/nugget.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/nugget.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/nugget_overlay.png new file mode 100644 index 000000000..7bf6eba4d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/nugget_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/nugget_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/nugget_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/nugget_secondary.png new file mode 100644 index 000000000..98fa10f97 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/nugget_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/nugget_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/nugget_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plasmites.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plasmites.png new file mode 100644 index 000000000..5110a0d19 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plasmites.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plasmites.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plasmites.png.mcmeta new file mode 100644 index 000000000..6a199bf8f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plasmites.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate.png new file mode 100644 index 000000000..35d5ef641 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_dense.png new file mode 100644 index 000000000..b6fb3891d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_dense.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_dense.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_dense.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_dense_overlay.png new file mode 100644 index 000000000..1ad67078c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_dense_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_dense_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_dense_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_dense_secondary.png new file mode 100644 index 000000000..3db4675d9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_dense_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_dense_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_dense_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_double.png new file mode 100644 index 000000000..5e5ac0983 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_double.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_double.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_double_overlay.png new file mode 100644 index 000000000..b9f34b264 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_double_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_double_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_double_secondary.png new file mode 100644 index 000000000..be8dde83e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_double_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_double_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_overlay.png new file mode 100644 index 000000000..5a5d5fb17 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_secondary.png new file mode 100644 index 000000000..e58170795 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/plate_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/raw_ore.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/raw_ore.png new file mode 100644 index 000000000..ffb5a6498 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/raw_ore.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/raw_ore.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/raw_ore.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/raw_ore.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/raw_ore_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/raw_ore_secondary.png new file mode 100644 index 000000000..f2ce928cf Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/raw_ore_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/raw_ore_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/raw_ore_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/raw_ore_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ring.png new file mode 100644 index 000000000..4c3f95bf6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ring.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ring.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ring_overlay.png new file mode 100644 index 000000000..138ef3a61 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ring_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ring_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ring_secondary.png new file mode 100644 index 000000000..845d9e09b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ring_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ring_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod.png new file mode 100644 index 000000000..c13b11a17 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod_long.png new file mode 100644 index 000000000..af1a0f4f1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod_long.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod_long.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod_long.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod_long_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod_long_secondary.png new file mode 100644 index 000000000..65c6ed6ae Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod_long_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod_long_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod_long_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod_long_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod_secondary.png new file mode 100644 index 000000000..fee8c6caa Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rod_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rotor.png new file mode 100644 index 000000000..ef9db34f4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rotor.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rotor.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rotor.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rotor_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rotor_overlay.png new file mode 100644 index 000000000..7dff0bace Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rotor_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rotor_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rotor_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rotor_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rotor_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rotor_secondary.png new file mode 100644 index 000000000..1aeaee494 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rotor_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rotor_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rotor_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/rotor_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/round.png new file mode 100644 index 000000000..4262afbf5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/round.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/round.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/round.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/round_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/round_secondary.png new file mode 100644 index 000000000..42f891095 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/round_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/round_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/round_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/round_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/screw.png new file mode 100644 index 000000000..d42c3a194 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/screw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/screw.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/screw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/screw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/screw_overlay.png new file mode 100644 index 000000000..ce46b8e2e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/screw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/screw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/screw_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/screw_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/screw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/screw_secondary.png new file mode 100644 index 000000000..5cd44f377 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/screw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/screw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/screw_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/screw_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring.png new file mode 100644 index 000000000..d5dad3640 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_overlay.png new file mode 100644 index 000000000..4ac643248 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_secondary.png new file mode 100644 index 000000000..0f6faf635 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_small.png new file mode 100644 index 000000000..a226c8df4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_small.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_small_overlay.png new file mode 100644 index 000000000..70b638c81 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_small_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_small_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_small_secondary.png new file mode 100644 index 000000000..d85f35472 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_small_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/spring_small_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_buzz_saw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_buzz_saw.png new file mode 100644 index 000000000..afc9e0587 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_buzz_saw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_buzz_saw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_buzz_saw.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_buzz_saw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_buzz_saw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_buzz_saw_overlay.png new file mode 100644 index 000000000..3564fccb8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_buzz_saw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_buzz_saw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_buzz_saw_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_buzz_saw_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_buzz_saw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_buzz_saw_secondary.png new file mode 100644 index 000000000..1de8bc1df Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_buzz_saw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_buzz_saw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_buzz_saw_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_buzz_saw_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_chainsaw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_chainsaw.png new file mode 100644 index 000000000..e474d1e49 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_chainsaw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_chainsaw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_chainsaw.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_chainsaw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_chainsaw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_chainsaw_secondary.png new file mode 100644 index 000000000..4d24e6849 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_chainsaw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_chainsaw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_chainsaw_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_chainsaw_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_drill.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_drill.png new file mode 100644 index 000000000..a1f24f87b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_drill.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_drill.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_drill.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_drill.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_drill_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_drill_secondary.png new file mode 100644 index 000000000..fcdd2f3a7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_drill_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_drill_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_drill_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_drill_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_screwdriver.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_screwdriver.png new file mode 100644 index 000000000..67fa0c5d5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_screwdriver.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_screwdriver.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_screwdriver.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_screwdriver.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_screwdriver_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_screwdriver_overlay.png new file mode 100644 index 000000000..d617c1f7d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_screwdriver_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_screwdriver_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_screwdriver_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_screwdriver_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_screwdriver_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_screwdriver_secondary.png new file mode 100644 index 000000000..659219e76 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_screwdriver_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_screwdriver_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_screwdriver_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_screwdriver_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wirecutter.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wirecutter.png new file mode 100644 index 000000000..42dae182d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wirecutter.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wirecutter.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wirecutter.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wirecutter.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wrench.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wrench.png new file mode 100644 index 000000000..bb0065f23 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wrench.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wrench.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wrench.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wrench.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wrench_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wrench_overlay.png new file mode 100644 index 000000000..50fa43a61 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wrench_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wrench_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wrench_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wrench_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wrench_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wrench_secondary.png new file mode 100644 index 000000000..b3a8f8f85 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wrench_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wrench_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wrench_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/tool_head_wrench_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/turbine_blade.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/turbine_blade.png new file mode 100644 index 000000000..89968f3db Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/turbine_blade.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/turbine_blade.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/turbine_blade.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/turbine_blade.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/turbine_blade_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/turbine_blade_overlay.png new file mode 100644 index 000000000..87c5ee918 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/turbine_blade_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/turbine_blade_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/turbine_blade_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/turbine_blade_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/turbine_blade_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/turbine_blade_secondary.png new file mode 100644 index 000000000..cf3826ee8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/turbine_blade_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/turbine_blade_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/turbine_blade_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/turbine_blade_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ultradense_plate.png new file mode 100644 index 000000000..9462514c6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ultradense_plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ultradense_plate.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/ultradense_plate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_fine.png new file mode 100644 index 000000000..a8584eacf Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_fine.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_fine.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_fine.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_fine_overlay.png new file mode 100644 index 000000000..49cdcfe82 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_fine_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_fine_overlay.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_fine_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_fine_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_fine_secondary.png new file mode 100644 index 000000000..7b54297b9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_fine_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_fine_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_fine_secondary.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_fine_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_spool.png b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_spool.png new file mode 100644 index 000000000..1e4129e52 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_spool.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_spool.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_spool.png.mcmeta new file mode 100644 index 000000000..4e7430cd7 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/starmetal/wire_spool.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/bolt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/bolt.png new file mode 100644 index 000000000..b26f8db3f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/bolt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/bolt.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/bolt.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/bolt.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/bolt_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/bolt_overlay.png new file mode 100644 index 000000000..6f450dd14 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/bolt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/bolt_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/bolt_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/bolt_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/bolt_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/bolt_secondary.png new file mode 100644 index 000000000..fb642ca3b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/bolt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/bolt_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/bolt_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/bolt_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed.png new file mode 100644 index 000000000..849788ac9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_overlay.png new file mode 100644 index 000000000..8d9c1e290 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_purified.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_purified.png new file mode 100644 index 000000000..849788ac9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_purified.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_purified.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_purified.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_purified.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_purified_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_purified_secondary.png new file mode 100644 index 000000000..96350cbac Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_purified_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_purified_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_purified_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_purified_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_refined.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_refined.png new file mode 100644 index 000000000..849788ac9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_refined.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_refined.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_refined.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_refined.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_refined_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_refined_overlay.png new file mode 100644 index 000000000..76f1bc4f2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_refined_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_refined_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_refined_secondary.png new file mode 100644 index 000000000..96350cbac Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_refined_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_refined_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_refined_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_refined_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_secondary.png new file mode 100644 index 000000000..96350cbac Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/crushed_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust.png new file mode 100644 index 000000000..179300e3d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_impure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_impure.png new file mode 100644 index 000000000..c57b4042f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_impure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_impure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_impure.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_impure.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_impure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_impure_overlay.png new file mode 100644 index 000000000..67b9e6558 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_impure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_impure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_impure_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_impure_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_impure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_impure_secondary.png new file mode 100644 index 000000000..02d56c0a1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_impure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_impure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_impure_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_impure_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_pure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_pure.png new file mode 100644 index 000000000..8ee8a99ee Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_pure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_pure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_pure.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_pure.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_pure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_pure_overlay.png new file mode 100644 index 000000000..016f5b629 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_pure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_pure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_pure_secondary.png new file mode 100644 index 000000000..ee9558b4a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_pure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_pure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_pure_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_pure_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_secondary.png new file mode 100644 index 000000000..b9bc6b53c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_small.png new file mode 100644 index 000000000..9d8c6a5d4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_small.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_small_secondary.png new file mode 100644 index 000000000..a3713ba4c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_small_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_small_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_tiny.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_tiny.png new file mode 100644 index 000000000..7ca271037 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_tiny.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_tiny.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_tiny.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_tiny.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_tiny_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_tiny_secondary.png new file mode 100644 index 000000000..4c48e17ba Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_tiny_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_tiny_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_tiny_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/dust_tiny_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/foil.png new file mode 100644 index 000000000..ec5677473 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/foil.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/foil.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/foil_overlay.png new file mode 100644 index 000000000..6483f7fe2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/foil_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/foil_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/foil_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/foil_secondary.png new file mode 100644 index 000000000..5b702a3e3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/foil_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/foil_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/foil_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear.png new file mode 100644 index 000000000..c0e0f34d9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear_secondary.png new file mode 100644 index 000000000..4c487b920 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear_small.png new file mode 100644 index 000000000..4bee9e93d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear_small.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear_small_secondary.png new file mode 100644 index 000000000..2e2e6df10 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear_small_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/gear_small_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/heavy_beam.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/heavy_beam.png new file mode 100644 index 000000000..47311a4af Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/heavy_beam.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/heavy_beam.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/heavy_beam.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/heavy_beam.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot.png new file mode 100644 index 000000000..6bb0a4239 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_double.png new file mode 100644 index 000000000..a44f50f0e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_double.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_double.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_double_overlay.png new file mode 100644 index 000000000..8f9196cdf Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_double_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_double_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_double_secondary.png new file mode 100644 index 000000000..a5b63e403 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_double_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_double_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_hot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_hot.png new file mode 100644 index 000000000..00614d483 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_hot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_hot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_hot.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_hot.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_hot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_hot_overlay.png new file mode 100644 index 000000000..73b00fd78 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_hot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_overlay.png new file mode 100644 index 000000000..ed865fbbe Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_secondary.png new file mode 100644 index 000000000..c566203ab Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ingot_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/modular_shelling.png new file mode 100644 index 000000000..72f2bf21a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/modular_shelling.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/modular_shelling.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/modular_shelling.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/nugget.png new file mode 100644 index 000000000..93cefe3a4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/nugget.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/nugget.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/nugget.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/nugget_overlay.png new file mode 100644 index 000000000..e7231625c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/nugget_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/nugget_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/nugget_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/nugget_secondary.png new file mode 100644 index 000000000..f85561b36 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/nugget_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/nugget_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/nugget_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plasmites.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plasmites.png new file mode 100644 index 000000000..5110a0d19 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plasmites.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plasmites.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plasmites.png.mcmeta new file mode 100644 index 000000000..6a199bf8f --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plasmites.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 1 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate.png new file mode 100644 index 000000000..7d5273d08 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_dense.png new file mode 100644 index 000000000..366d370a3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_dense.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_dense.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_dense.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_dense_overlay.png new file mode 100644 index 000000000..5f53c84ca Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_dense_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_dense_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_dense_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_dense_secondary.png new file mode 100644 index 000000000..6803e14fb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_dense_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_dense_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_dense_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_double.png new file mode 100644 index 000000000..5714bc674 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_double.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_double.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_double_overlay.png new file mode 100644 index 000000000..4a439d731 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_double_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_double_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_double_secondary.png new file mode 100644 index 000000000..90b5b7f6a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_double_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_double_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_overlay.png new file mode 100644 index 000000000..6ab0baa6d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_secondary.png new file mode 100644 index 000000000..8ea76e959 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/plate_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/raw_ore.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/raw_ore.png new file mode 100644 index 000000000..d99ecc1fd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/raw_ore.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/raw_ore.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/raw_ore.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/raw_ore.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/raw_ore_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/raw_ore_secondary.png new file mode 100644 index 000000000..5ea6f5c0f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/raw_ore_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/raw_ore_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/raw_ore_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/raw_ore_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ring.png new file mode 100644 index 000000000..b0e7270e2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ring.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ring.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ring_overlay.png new file mode 100644 index 000000000..6825ddad4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ring_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ring_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ring_secondary.png new file mode 100644 index 000000000..1b33a16d3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ring_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ring_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod.png new file mode 100644 index 000000000..54fce9312 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_long.png new file mode 100644 index 000000000..3b3e5d339 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_long.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_long.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_long.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_long_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_long_overlay.png new file mode 100644 index 000000000..ba9fb43c5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_long_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_long_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_long_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_long_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_long_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_long_secondary.png new file mode 100644 index 000000000..6e6af6759 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_long_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_long_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_long_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_long_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_overlay.png new file mode 100644 index 000000000..06cc774e7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_secondary.png new file mode 100644 index 000000000..04ecc1229 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rod_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rotor.png new file mode 100644 index 000000000..da8f3a099 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rotor.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rotor.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rotor.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rotor_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rotor_overlay.png new file mode 100644 index 000000000..06680c939 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rotor_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rotor_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rotor_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rotor_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rotor_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rotor_secondary.png new file mode 100644 index 000000000..7392889a7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rotor_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rotor_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rotor_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/rotor_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/round.png new file mode 100644 index 000000000..fa955da62 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/round.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/round.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/round.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/round_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/round_overlay.png new file mode 100644 index 000000000..673e3960d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/round_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/round_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/round_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/round_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/round_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/round_secondary.png new file mode 100644 index 000000000..1d9e09585 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/round_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/round_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/round_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/round_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/screw.png new file mode 100644 index 000000000..f783220a6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/screw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/screw.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/screw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/screw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/screw_overlay.png new file mode 100644 index 000000000..b17a76a79 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/screw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/screw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/screw_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/screw_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/screw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/screw_secondary.png new file mode 100644 index 000000000..406e35dd0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/screw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/screw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/screw_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/screw_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring.png new file mode 100644 index 000000000..50351a0a6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_overlay.png new file mode 100644 index 000000000..74e43e73c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_secondary.png new file mode 100644 index 000000000..38d124f45 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_small.png new file mode 100644 index 000000000..14df3ecbe Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_small.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_small_overlay.png new file mode 100644 index 000000000..e35dfb468 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_small_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_small_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_small_secondary.png new file mode 100644 index 000000000..217901e30 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_small_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/spring_small_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_buzz_saw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_buzz_saw.png new file mode 100644 index 000000000..e99660fca Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_buzz_saw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_buzz_saw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_buzz_saw.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_buzz_saw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_buzz_saw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_buzz_saw_overlay.png new file mode 100644 index 000000000..beb19da24 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_buzz_saw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_buzz_saw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_buzz_saw_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_buzz_saw_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_buzz_saw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_buzz_saw_secondary.png new file mode 100644 index 000000000..e82337d2b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_buzz_saw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_buzz_saw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_buzz_saw_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_buzz_saw_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_chainsaw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_chainsaw.png new file mode 100644 index 000000000..3f8f4c37b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_chainsaw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_chainsaw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_chainsaw.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_chainsaw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_chainsaw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_chainsaw_secondary.png new file mode 100644 index 000000000..d2d65a527 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_chainsaw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_chainsaw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_chainsaw_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_chainsaw_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_drill.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_drill.png new file mode 100644 index 000000000..e25e93a81 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_drill.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_drill.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_drill.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_drill.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_drill_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_drill_secondary.png new file mode 100644 index 000000000..b6645bbd2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_drill_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_drill_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_drill_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_drill_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_screwdriver.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_screwdriver.png new file mode 100644 index 000000000..8120890e3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_screwdriver.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_screwdriver.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_screwdriver.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_screwdriver.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_screwdriver_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_screwdriver_overlay.png new file mode 100644 index 000000000..3191ef3ee Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_screwdriver_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_screwdriver_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_screwdriver_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_screwdriver_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_screwdriver_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_screwdriver_secondary.png new file mode 100644 index 000000000..f745365c4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_screwdriver_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_screwdriver_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_screwdriver_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_screwdriver_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wirecutter.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wirecutter.png new file mode 100644 index 000000000..0cad5a434 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wirecutter.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wirecutter.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wirecutter.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wirecutter.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wrench.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wrench.png new file mode 100644 index 000000000..e7674614d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wrench.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wrench.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wrench.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wrench.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wrench_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wrench_overlay.png new file mode 100644 index 000000000..8384a48f6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wrench_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wrench_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wrench_overlay.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wrench_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wrench_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wrench_secondary.png new file mode 100644 index 000000000..781e3e3ff Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wrench_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wrench_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wrench_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/tool_head_wrench_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ultradense_plate.png new file mode 100644 index 000000000..a5e762969 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ultradense_plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ultradense_plate.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/ultradense_plate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_fine.png new file mode 100644 index 000000000..300c5aec4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_fine.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_fine.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_fine.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_fine_overlay.png new file mode 100644 index 000000000..5ce9335a1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_fine_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_fine_secondary.png new file mode 100644 index 000000000..77fe9a893 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_fine_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_fine_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_fine_secondary.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_fine_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_spool.png b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_spool.png new file mode 100644 index 000000000..3ef312c0b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_spool.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_spool.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_spool.png.mcmeta new file mode 100644 index 000000000..278593081 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/trinavine/wire_spool.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 2 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/blank.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/blank.png new file mode 100644 index 000000000..13531cb81 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/blank.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/blank.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/blank.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/blank.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/bolt.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/bolt.png new file mode 100644 index 000000000..2a22b36aa Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/bolt.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/bolt.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/bolt.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/bolt.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/bolt_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/bolt_overlay.png new file mode 100644 index 000000000..4998575b6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/bolt_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/bolt_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/bolt_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/bolt_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/bolt_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/bolt_secondary.png new file mode 100644 index 000000000..0008e60de Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/bolt_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/bolt_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/bolt_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/bolt_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed.png new file mode 100644 index 000000000..4a2e59a5a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_overlay.png new file mode 100644 index 000000000..c721d35b5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_purified.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_purified.png new file mode 100644 index 000000000..4a2e59a5a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_purified.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_purified.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_purified.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_purified.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_purified_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_purified_secondary.png new file mode 100644 index 000000000..061315295 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_purified_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_purified_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_purified_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_purified_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_refined.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_refined.png new file mode 100644 index 000000000..4a2e59a5a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_refined.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_refined.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_refined.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_refined.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_refined_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_refined_overlay.png new file mode 100644 index 000000000..95e32f835 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_refined_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_refined_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_refined_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_refined_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_refined_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_refined_secondary.png new file mode 100644 index 000000000..061315295 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_refined_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_refined_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_refined_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_refined_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_secondary.png new file mode 100644 index 000000000..061315295 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/crushed_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust.png new file mode 100644 index 000000000..6e2d8be47 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_impure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_impure.png new file mode 100644 index 000000000..6e2d8be47 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_impure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_impure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_impure.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_impure.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_impure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_impure_overlay.png new file mode 100644 index 000000000..26e1e65a8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_impure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_impure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_impure_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_impure_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_impure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_impure_secondary.png new file mode 100644 index 000000000..1a2bde5b8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_impure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_impure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_impure_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_impure_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_pure.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_pure.png new file mode 100644 index 000000000..315165d14 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_pure.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_pure.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_pure.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_pure.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_pure_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_pure_overlay.png new file mode 100644 index 000000000..b7c2e3fb4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_pure_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_pure_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_pure_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_pure_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_pure_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_pure_secondary.png new file mode 100644 index 000000000..ff0559369 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_pure_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_pure_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_pure_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_pure_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_secondary.png new file mode 100644 index 000000000..1a2bde5b8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_small.png new file mode 100644 index 000000000..cb39ab59e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_small.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_small_secondary.png new file mode 100644 index 000000000..77330b0be Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_small_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_small_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_tiny.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_tiny.png new file mode 100644 index 000000000..bd3c840ee Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_tiny.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_tiny.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_tiny.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_tiny.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_tiny_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_tiny_secondary.png new file mode 100644 index 000000000..dbc1d2ef6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_tiny_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_tiny_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_tiny_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/dust_tiny_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/foil.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/foil.png new file mode 100644 index 000000000..1c249ed38 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/foil.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/foil.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/foil.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/foil.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/foil_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/foil_overlay.png new file mode 100644 index 000000000..3a94b19f1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/foil_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/foil_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/foil_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/foil_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/foil_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/foil_secondary.png new file mode 100644 index 000000000..a0146c35f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/foil_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/foil_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/foil_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/foil_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/frothed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/frothed.png new file mode 100644 index 000000000..e2354237f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/frothed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/frothed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/frothed.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/frothed.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/frothed_overlay_glint.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/frothed_overlay_glint.png new file mode 100644 index 000000000..8a4bc6078 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/frothed_overlay_glint.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/frothed_overlay_glint.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/frothed_overlay_glint.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/frothed_overlay_glint.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/frothed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/frothed_secondary.png new file mode 100644 index 000000000..e760ffea6 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/frothed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/frothed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/frothed_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/frothed_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear.png new file mode 100644 index 000000000..48474f92a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_overlay.png new file mode 100644 index 000000000..68238502b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_secondary.png new file mode 100644 index 000000000..a18d80df3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_small.png new file mode 100644 index 000000000..c3cc06263 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_small.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_small_overlay.png new file mode 100644 index 000000000..07343e5f1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_small_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_small_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_small_secondary.png new file mode 100644 index 000000000..1846339bc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_small_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gear_small_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem.png new file mode 100644 index 000000000..8b28f0c43 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_chipped.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_chipped.png new file mode 100644 index 000000000..eb1c3582d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_chipped.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_chipped.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_chipped.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_chipped.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_chipped_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_chipped_overlay.png new file mode 100644 index 000000000..b5e44e407 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_chipped_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_chipped_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_chipped_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_chipped_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_chipped_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_chipped_secondary.png new file mode 100644 index 000000000..031021c9a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_chipped_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_chipped_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_chipped_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_chipped_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawed.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawed.png new file mode 100644 index 000000000..4be04cc9d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawed.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawed.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawed.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawed_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawed_overlay.png new file mode 100644 index 000000000..c1cad1358 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawed_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawed_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawed_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawed_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawed_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawed_secondary.png new file mode 100644 index 000000000..0911fb74c Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawed_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawed_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawed_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawed_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawless.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawless.png new file mode 100644 index 000000000..96f0c1356 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawless.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawless.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawless.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawless.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawless_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawless_overlay.png new file mode 100644 index 000000000..b78340e95 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawless_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawless_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawless_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawless_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawless_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawless_secondary.png new file mode 100644 index 000000000..2f7ca8e52 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawless_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawless_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawless_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_flawless_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_overlay.png new file mode 100644 index 000000000..30649fc53 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_secondary.png new file mode 100644 index 000000000..d7e9550ac Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/gem_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/heavy_beam.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/heavy_beam.png new file mode 100644 index 000000000..318719947 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/heavy_beam.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/heavy_beam.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/heavy_beam.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/heavy_beam.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot.png new file mode 100644 index 000000000..efbbf4ba8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_double.png new file mode 100644 index 000000000..d0a58f997 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_double.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_double.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_double_overlay.png new file mode 100644 index 000000000..207e520e4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_double_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_double_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_double_secondary.png new file mode 100644 index 000000000..7764ca2f2 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_double_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_double_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_hot.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_hot.png new file mode 100644 index 000000000..c0a5be9b7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_hot.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_hot.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_hot.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_hot.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_hot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_hot_overlay.png new file mode 100644 index 000000000..de3ae8ae7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_hot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_hot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_hot_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_hot_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_hot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_hot_secondary.png new file mode 100644 index 000000000..647286fe8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_hot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_hot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_hot_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_hot_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_overlay.png new file mode 100644 index 000000000..e664a10b9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_secondary.png new file mode 100644 index 000000000..c5240eecb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ingot_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/leached.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/leached.png new file mode 100644 index 000000000..1b035deb9 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/leached.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/leached.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/leached.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/leached.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/leached_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/leached_secondary.png new file mode 100644 index 000000000..d1068ed0f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/leached_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/leached_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/leached_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/leached_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/lens.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/lens.png new file mode 100644 index 000000000..374776bdc Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/lens.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/lens.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/lens.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/lens.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/lens_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/lens_overlay.png new file mode 100644 index 000000000..04c0010e0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/lens_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/lens_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/lens_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/lens_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/lens_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/lens_secondary.png new file mode 100644 index 000000000..869943f6e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/lens_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/lens_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/lens_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/lens_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/modular_shelling.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/modular_shelling.png new file mode 100644 index 000000000..c86a7b028 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/modular_shelling.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/modular_shelling.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/modular_shelling.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/modular_shelling.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/nugget.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/nugget.png new file mode 100644 index 000000000..f0014da53 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/nugget.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/nugget.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/nugget.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/nugget.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/nugget_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/nugget_overlay.png new file mode 100644 index 000000000..eadf58de1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/nugget_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/nugget_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/nugget_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/nugget_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/nugget_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/nugget_secondary.png new file mode 100644 index 000000000..a40c5634a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/nugget_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/nugget_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/nugget_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/nugget_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plasmites.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plasmites.png new file mode 100644 index 000000000..5110a0d19 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plasmites.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plasmites.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plasmites.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plasmites.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate.png new file mode 100644 index 000000000..a381ba1db Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_dense.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_dense.png new file mode 100644 index 000000000..14570868f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_dense.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_dense.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_dense.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_dense.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_dense_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_dense_overlay.png new file mode 100644 index 000000000..369ed1164 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_dense_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_dense_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_dense_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_dense_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_dense_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_dense_secondary.png new file mode 100644 index 000000000..8b7bacc93 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_dense_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_dense_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_dense_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_dense_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_double.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_double.png new file mode 100644 index 000000000..7fae2bc1b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_double.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_double.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_double.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_double.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_double_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_double_overlay.png new file mode 100644 index 000000000..bc78e3c28 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_double_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_double_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_double_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_double_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_double_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_double_secondary.png new file mode 100644 index 000000000..0a365b36b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_double_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_double_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_double_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_double_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_overlay.png new file mode 100644 index 000000000..a92d334ed Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_secondary.png new file mode 100644 index 000000000..fba40036e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/plate_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/raw_ore.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/raw_ore.png new file mode 100644 index 000000000..8170d1b97 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/raw_ore.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/raw_ore.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/raw_ore.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/raw_ore.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/raw_ore_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/raw_ore_secondary.png new file mode 100644 index 000000000..d9435cb34 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/raw_ore_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/raw_ore_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/raw_ore_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/raw_ore_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ring.png new file mode 100644 index 000000000..d3cfc8e39 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ring.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ring.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ring_overlay.png new file mode 100644 index 000000000..d261e4e27 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ring_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ring_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ring_secondary.png new file mode 100644 index 000000000..d469f8869 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ring_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ring_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod.png new file mode 100644 index 000000000..1e4d321ef Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod_long.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod_long.png new file mode 100644 index 000000000..e5c08e601 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod_long.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod_long.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod_long.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod_long.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod_long_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod_long_secondary.png new file mode 100644 index 000000000..79072d3d3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod_long_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod_long_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod_long_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod_long_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod_secondary.png new file mode 100644 index 000000000..5f2e7bbba Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rod_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rotor.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rotor.png new file mode 100644 index 000000000..74a76af13 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rotor.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rotor.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rotor.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rotor.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rotor_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rotor_overlay.png new file mode 100644 index 000000000..191ba2b64 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rotor_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rotor_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rotor_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rotor_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rotor_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rotor_secondary.png new file mode 100644 index 000000000..618e4cc73 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rotor_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rotor_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rotor_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/rotor_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/round.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/round.png new file mode 100644 index 000000000..5ea712f3b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/round.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/round.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/round.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/round.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/round_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/round_secondary.png new file mode 100644 index 000000000..15db9d399 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/round_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/round_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/round_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/round_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/screw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/screw.png new file mode 100644 index 000000000..2c93d86b0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/screw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/screw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/screw.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/screw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/screw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/screw_overlay.png new file mode 100644 index 000000000..4f8d72672 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/screw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/screw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/screw_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/screw_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/screw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/screw_secondary.png new file mode 100644 index 000000000..ec65c9b60 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/screw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/screw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/screw_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/screw_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring.png new file mode 100644 index 000000000..67ee515d3 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_overlay.png new file mode 100644 index 000000000..0d93dde3f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_secondary.png new file mode 100644 index 000000000..5fe116cb1 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_small.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_small.png new file mode 100644 index 000000000..dec47de81 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_small.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_small.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_small.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_small.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_small_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_small_overlay.png new file mode 100644 index 000000000..72389db67 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_small_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_small_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_small_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_small_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_small_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_small_secondary.png new file mode 100644 index 000000000..f40f373aa Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_small_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_small_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_small_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/spring_small_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_buzz_saw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_buzz_saw.png new file mode 100644 index 000000000..10ec47b59 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_buzz_saw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_buzz_saw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_buzz_saw.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_buzz_saw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_buzz_saw_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_buzz_saw_overlay.png new file mode 100644 index 000000000..11c62c7a8 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_buzz_saw_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_buzz_saw_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_buzz_saw_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_buzz_saw_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_buzz_saw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_buzz_saw_secondary.png new file mode 100644 index 000000000..1d6bc63ec Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_buzz_saw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_buzz_saw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_buzz_saw_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_buzz_saw_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_chainsaw.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_chainsaw.png new file mode 100644 index 000000000..b5667e3e4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_chainsaw.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_chainsaw.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_chainsaw.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_chainsaw.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_chainsaw_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_chainsaw_secondary.png new file mode 100644 index 000000000..a09f3a743 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_chainsaw_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_chainsaw_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_chainsaw_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_chainsaw_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_drill.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_drill.png new file mode 100644 index 000000000..e26950c29 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_drill.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_drill.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_drill.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_drill.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_drill_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_drill_secondary.png new file mode 100644 index 000000000..045defdc0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_drill_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_drill_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_drill_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_drill_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_screwdriver.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_screwdriver.png new file mode 100644 index 000000000..b7fcf34eb Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_screwdriver.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_screwdriver.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_screwdriver.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_screwdriver.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_screwdriver_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_screwdriver_overlay.png new file mode 100644 index 000000000..687e2bade Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_screwdriver_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_screwdriver_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_screwdriver_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_screwdriver_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_screwdriver_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_screwdriver_secondary.png new file mode 100644 index 000000000..6dc6f9017 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_screwdriver_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_screwdriver_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_screwdriver_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_screwdriver_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wirecutter.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wirecutter.png new file mode 100644 index 000000000..45ee0b34d Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wirecutter.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wirecutter.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wirecutter.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wirecutter.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wrench.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wrench.png new file mode 100644 index 000000000..486f6e9fd Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wrench.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wrench.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wrench.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wrench.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wrench_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wrench_overlay.png new file mode 100644 index 000000000..0c20814f4 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wrench_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wrench_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wrench_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wrench_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wrench_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wrench_secondary.png new file mode 100644 index 000000000..50bbd524f Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wrench_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wrench_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wrench_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/tool_head_wrench_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/turbine_blade.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/turbine_blade.png new file mode 100644 index 000000000..5436c724b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/turbine_blade.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/turbine_blade.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/turbine_blade.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/turbine_blade.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/turbine_blade_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/turbine_blade_overlay.png new file mode 100644 index 000000000..acab93c68 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/turbine_blade_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/turbine_blade_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/turbine_blade_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/turbine_blade_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/turbine_blade_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/turbine_blade_secondary.png new file mode 100644 index 000000000..413d3fdd5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/turbine_blade_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/turbine_blade_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/turbine_blade_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/turbine_blade_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ultradense_plate.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ultradense_plate.png new file mode 100644 index 000000000..205c1ae5e Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ultradense_plate.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ultradense_plate.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ultradense_plate.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ultradense_plate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ultradense_plate_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ultradense_plate_overlay.png new file mode 100644 index 000000000..482d9c75b Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ultradense_plate_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ultradense_plate_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ultradense_plate_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/ultradense_plate_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_fine.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_fine.png new file mode 100644 index 000000000..271a99838 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_fine.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_fine.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_fine.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_fine.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_fine_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_fine_overlay.png new file mode 100644 index 000000000..3a82e24d0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_fine_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_fine_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_fine_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_fine_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_fine_secondary.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_fine_secondary.png new file mode 100644 index 000000000..6305ecec5 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_fine_secondary.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_fine_secondary.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_fine_secondary.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_fine_secondary.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_spool.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_spool.png new file mode 100644 index 000000000..30de2a66a Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_spool.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_spool.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_spool.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_spool.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_spool_overlay.png b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_spool_overlay.png new file mode 100644 index 000000000..1740408a7 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_spool_overlay.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_spool_overlay.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_spool_overlay.png.mcmeta new file mode 100644 index 000000000..e9dd963e0 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/material_sets/voidspark/wire_spool_overlay.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 2 + } +} diff --git a/src/main/resources/assets/gtceu/textures/item/tools/meld.png b/src/main/resources/assets/gtceu/textures/item/tools/meld.png new file mode 100644 index 000000000..634e25949 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/tools/meld.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/tools/meld.png.mcmeta b/src/main/resources/assets/gtceu/textures/item/tools/meld.png.mcmeta new file mode 100644 index 000000000..c5d457f93 --- /dev/null +++ b/src/main/resources/assets/gtceu/textures/item/tools/meld.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 1 + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtceu/ui/recipe_type/celestial_bore.rtui b/src/main/resources/assets/gtceu/ui/recipe_type/celestial_bore.rtui new file mode 100644 index 000000000..39202c083 Binary files /dev/null and b/src/main/resources/assets/gtceu/ui/recipe_type/celestial_bore.rtui differ diff --git a/src/main/resources/assets/gtceu/ui/recipe_type/hellfire_foundry.rtui b/src/main/resources/assets/gtceu/ui/recipe_type/hellfire_foundry.rtui new file mode 100644 index 000000000..5249e65e8 Binary files /dev/null and b/src/main/resources/assets/gtceu/ui/recipe_type/hellfire_foundry.rtui differ diff --git a/src/main/resources/assets/gtceu/ui/recipe_type/industrial_primitive_blast_furnace.rtui b/src/main/resources/assets/gtceu/ui/recipe_type/industrial_primitive_blast_furnace.rtui new file mode 100644 index 000000000..829c4b185 Binary files /dev/null and b/src/main/resources/assets/gtceu/ui/recipe_type/industrial_primitive_blast_furnace.rtui differ diff --git a/src/main/resources/assets/gtceu/ui/recipe_type/industrial_stoneworks.rtui b/src/main/resources/assets/gtceu/ui/recipe_type/industrial_stoneworks.rtui new file mode 100644 index 000000000..e91610d1f Binary files /dev/null and b/src/main/resources/assets/gtceu/ui/recipe_type/industrial_stoneworks.rtui differ diff --git a/src/main/resources/cosmiccore.mixins.json b/src/main/resources/cosmiccore.mixins.json index 2e73a3a38..2f99701b5 100644 --- a/src/main/resources/cosmiccore.mixins.json +++ b/src/main/resources/cosmiccore.mixins.json @@ -1,18 +1,51 @@ { "required": true, + "refmap": "cosmiccore.refmap.json", "package": "com.ghostipedia.cosmiccore.mixin", - "compatibilityLevel": "JAVA_17", + "compatibilityLevel": "JAVA_21", "minVersion": "0.8", + "plugin": "com.ghostipedia.cosmiccore.mixin.CosmicCoreMixinPlugin", + "client": [ + "StarKillerMixin", + "quake.QuakeMovementMixin", + "accessor.MBPatternAccessor", + "client.MinecraftMixin", + "client.PatternPreviewWidgetMixin", + "client.SoundManagerMixin", + "emi.EmiFavoritesMixin", + "emi.EmiScreenManagerMixin", + "emi.RecipeScreenMixin", + "emi.ScreenSpaceMixin", + "emi.SidebarPanelMixin", + "jei.TagInfoRecipeCategoryMixin" + ], "mixins": [ - "AdAstraOverlayScreenMixin", - "AdAstraSpaceSuitItemMixin", + "BlockPatternMixin", + "BlocksMixin", + "ComponentItemMixin", "DivingHelmetItemMixin", + "GTValuesMixin", "PlayerBreathingMixin", - "client.CosmicCoreRemainingAirOverlayMixin" - ], - "client": [ + "TagPrefixItemMixin", + "frontiers.MinecraftRemoveOxygenMixin", + "accessor.GTMMEBufferAccessor", + "accessor.LivingEntityAccessor", + "accessor.CubicSplineMultipointAccessor", + "accessor.LootTableAccessor", + "client.CosmicCoreRemainingAirOverlayMixin", + "gtceu.ElectricContainerBlockProviderMixin", + "gtceu.GTOreDefinitionMixin", + "gtceu.MetaMachinePaintMixin", + "gtceu.ParallelProviderMixin", + "gtceu.RecipeLogicProviderMixin", + "gtceu.RecipeOutputProviderMixin", + "gtceu.WorkableBlockProviderMixin", + "lso.FrostbiteEffectMixin", + "lso.HeatstrokeEffectMixin", + "worldgen.CubicSplineMultipointMixin" ], "injectors": { - "defaultRequire": 1 + "defaultRequire": 1, + "maxShiftBy": 5 } } diff --git a/src/main/resources/data/cosmiccore/curios/entities/back.json b/src/main/resources/data/cosmiccore/curios/entities/back.json new file mode 100644 index 000000000..6cd82c21a --- /dev/null +++ b/src/main/resources/data/cosmiccore/curios/entities/back.json @@ -0,0 +1,4 @@ +{ + "entities": ["player"], + "slots": ["back"] +} diff --git a/src/main/resources/data/cosmiccore/curios/entities/ring.json b/src/main/resources/data/cosmiccore/curios/entities/ring.json new file mode 100644 index 000000000..fa9469be5 --- /dev/null +++ b/src/main/resources/data/cosmiccore/curios/entities/ring.json @@ -0,0 +1,4 @@ +{ + "entities": ["player"], + "slots": ["ring"] +} diff --git a/src/main/resources/data/cosmiccore/curios/slots/back.json b/src/main/resources/data/cosmiccore/curios/slots/back.json new file mode 100644 index 000000000..66a689dc0 --- /dev/null +++ b/src/main/resources/data/cosmiccore/curios/slots/back.json @@ -0,0 +1,4 @@ +{ + "size": 2, + "icon": "curios:slot/empty_curio_slot" +} diff --git a/src/main/resources/data/cosmiccore/loot_modifiers/no_silk_touch_ore.json b/src/main/resources/data/cosmiccore/loot_modifiers/no_silk_touch_ore.json new file mode 100644 index 000000000..c8516f772 --- /dev/null +++ b/src/main/resources/data/cosmiccore/loot_modifiers/no_silk_touch_ore.json @@ -0,0 +1,4 @@ +{ + "type": "cosmiccore:no_silk_touch_ore", + "conditions": [] +} diff --git a/src/main/resources/data/cosmiccore/loot_modifiers/the_one_ring_fishing.json b/src/main/resources/data/cosmiccore/loot_modifiers/the_one_ring_fishing.json new file mode 100644 index 000000000..88f53ae97 --- /dev/null +++ b/src/main/resources/data/cosmiccore/loot_modifiers/the_one_ring_fishing.json @@ -0,0 +1,23 @@ +{ + "type": "cosmiccore:generic", + "conditions": [ + + ], + "loot_table_id": "minecraft:gameplay/fishing", + "injected_loot": [ + { + "rolls": { + "type": "uniform", + "min": 0.0, + "max": 0.6 + }, + "bonus_rolls": 0.0, + "entries": [ + { + "type": "minecraft:item", + "name": "cosmiccore:the_one_ring" + } + ] + } + ] +} diff --git a/src/main/resources/data/cosmiccore/recipes/enchanting/the_one_ring.json b/src/main/resources/data/cosmiccore/recipes/enchanting/the_one_ring.json new file mode 100644 index 000000000..253948c14 --- /dev/null +++ b/src/main/resources/data/cosmiccore/recipes/enchanting/the_one_ring.json @@ -0,0 +1,16 @@ +{ + "type": "apotheosis:enchanting", + "input": { + "item": "gtceu:gold_ring" + }, + "requirements": { + "eterna": 50, + "quanta": 85, + "arcana": 100 + }, + "display_level": 5, + "result": { + "item": "cosmiccore:the_one_ring", + "count": 1 + } +} diff --git a/src/main/resources/data/curios/tags/items/back.json b/src/main/resources/data/curios/tags/items/back.json new file mode 100644 index 000000000..78896137f --- /dev/null +++ b/src/main/resources/data/curios/tags/items/back.json @@ -0,0 +1,6 @@ +{ + "values": [ + "cosmiccore:bronze_supply_tank", + "cosmiccore:steel_supply_tank" + ] +} diff --git a/src/main/resources/data/curios/tags/items/head.json b/src/main/resources/data/curios/tags/items/head.json new file mode 100644 index 000000000..1df6d8775 --- /dev/null +++ b/src/main/resources/data/curios/tags/items/head.json @@ -0,0 +1,7 @@ +{ + "values": [ + "cosmiccore:space_radio", + "cosmiccore:simple_rebreather", + "cosmiccore:pressurized_rebreather" + ] +} diff --git a/src/main/resources/data/curios/tags/items/ring.json b/src/main/resources/data/curios/tags/items/ring.json new file mode 100644 index 000000000..8c805b617 --- /dev/null +++ b/src/main/resources/data/curios/tags/items/ring.json @@ -0,0 +1,5 @@ +{ + "values": [ + "cosmiccore:the_one_ring" + ] +} diff --git a/src/main/resources/data/forge/loot_modifiers/global_loot_modifiers.json b/src/main/resources/data/forge/loot_modifiers/global_loot_modifiers.json new file mode 100644 index 000000000..a67bac61d --- /dev/null +++ b/src/main/resources/data/forge/loot_modifiers/global_loot_modifiers.json @@ -0,0 +1,7 @@ +{ + "replace": false, + "entries": [ + "cosmiccore:the_one_ring_fishing", + "cosmiccore:no_silk_touch_ore" + ] +} diff --git a/src/main/templates/META-INF/neoforge.mods.toml b/src/main/templates/META-INF/neoforge.mods.toml new file mode 100644 index 000000000..bb6efc39f --- /dev/null +++ b/src/main/templates/META-INF/neoforge.mods.toml @@ -0,0 +1,35 @@ +modLoader = "javafml" +loaderVersion = "[${loader_version},)" +issueTrackerURL = "${mod_issue_tracker}" +license = "${mod_license}" + +[[mods]] +modId = "${mod_id}" +version = "${version}" +displayName = "${mod_name}" +authors = "${mod_authors}" +description = '''${mod_description}''' + +[[mixins]] +config = "cosmiccore.mixins.json" + +[[dependencies.${mod_id}]] + modId = "neoforge" + type = "required" + versionRange = "[${neo_version},)" + ordering = "NONE" + side = "BOTH" + +[[dependencies.${mod_id}]] + modId = "minecraft" + type = "required" + versionRange = "[${minecraft_version},)" + ordering = "NONE" + side = "BOTH" + +[[dependencies.${mod_id}]] + modId = "gtceu" + type = "required" + versionRange = "[${gtceu_version},)" + ordering = "AFTER" + side = "BOTH"